diff --git a/Gopkg.lock b/Gopkg.lock index dbfff2e93..c3e598ce4 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -145,6 +145,12 @@ revision = "925541529c1fa6821df4e44ce2723319eb2be768" version = "v1.0.0" +[[projects]] + branch = "master" + name = "github.com/google/btree" + packages = ["."] + revision = "e89373fe6b4a7413d7acd6da1725b83ef713e6e4" + [[projects]] branch = "master" name = "github.com/google/gofuzz" @@ -161,6 +167,15 @@ revision = "ee43cbb60db7bd22502942cccbc39059117352ab" version = "v0.1.0" +[[projects]] + branch = "master" + name = "github.com/gregjones/httpcache" + packages = [ + ".", + "diskcache" + ] + revision = "9cad4c3443a7200dd6400aef47183728de563a38" + [[projects]] branch = "master" name = "github.com/hashicorp/go-version" @@ -176,12 +191,6 @@ ] revision = "0fb14efe8c47ae851c0034ed7a448854d3d34cf3" -[[projects]] - branch = "master" - name = "github.com/howeyc/gopass" - packages = ["."] - revision = "bf9dde6d0d2c004a008c27aaee91170c786f6db8" - [[projects]] name = "github.com/imdario/mergo" packages = ["."] @@ -200,8 +209,7 @@ [[projects]] name = "github.com/json-iterator/go" packages = ["."] - revision = "ca39e5af3ece67bbcda3d0f4f56a8e24d9f2dad4" - version = "1.1.3" + revision = "f2b4162afba35581b6d4a50d3b8f34e33c144682" [[projects]] branch = "master" @@ -252,6 +260,18 @@ revision = "4dadeb3030eda0273a12382bb2348ffc7c9d1a39" version = "v1.0.0" +[[projects]] + branch = "master" + name = "github.com/petar/GoLLRB" + packages = ["llrb"] + revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4" + +[[projects]] + name = "github.com/peterbourgon/diskv" + packages = ["."] + revision = "5f041e8faa004a95c88a202771f4cc3e991971e6" + version = "v2.0.1" + [[projects]] name = "github.com/pkg/errors" packages = ["."] @@ -421,13 +441,14 @@ "rbac/v1alpha1", "rbac/v1beta1", "scheduling/v1alpha1", + "scheduling/v1beta1", "settings/v1alpha1", "storage/v1", "storage/v1alpha1", "storage/v1beta1" ] - revision = "73d903622b7391f3312dcbac6483fed484e185f8" - version = "kubernetes-1.10.0" + revision = "072894a440bdee3a891dea811fe42902311cd2a3" + version = "kubernetes-1.11.0" [[projects]] name = "k8s.io/apiextensions-apiserver" @@ -438,10 +459,11 @@ "pkg/client/clientset/clientset/scheme", "pkg/client/clientset/clientset/typed/apiextensions/v1beta1" ] - revision = "750feebe2038bad00fdf68ba37c31f62c4f1f891" - version = "kubernetes-1.10.0" + revision = "3de98c57bc05a81cf463e0ad7a0af4cec8a5b510" + version = "kubernetes-1.11.0" [[projects]] + branch = "release-1.11" name = "k8s.io/apimachinery" packages = [ "pkg/api/errors", @@ -483,12 +505,12 @@ "pkg/watch", "third_party/forked/golang/reflect" ] - revision = "302974c03f7e50f16561ba237db776ab93594ef6" - version = "kubernetes-1.10.0" + revision = "103fd098999dc9c0c88536f5c9ad2e5da39373ae" [[projects]] name = "k8s.io/client-go" packages = [ + "deprecated-dynamic", "discovery", "dynamic", "kubernetes", @@ -517,12 +539,14 @@ "kubernetes/typed/rbac/v1alpha1", "kubernetes/typed/rbac/v1beta1", "kubernetes/typed/scheduling/v1alpha1", + "kubernetes/typed/scheduling/v1beta1", "kubernetes/typed/settings/v1alpha1", "kubernetes/typed/storage/v1", "kubernetes/typed/storage/v1alpha1", "kubernetes/typed/storage/v1beta1", "pkg/apis/clientauthentication", "pkg/apis/clientauthentication/v1alpha1", + "pkg/apis/clientauthentication/v1beta1", "pkg/version", "plugin/pkg/client/auth/exec", "rest", @@ -539,14 +563,15 @@ "transport", "util/buffer", "util/cert", + "util/connrotation", "util/flowcontrol", "util/homedir", "util/integer", "util/retry", "util/workqueue" ] - revision = "23781f4d6632d88e869066eaebb743857aa1ef9b" - version = "v7.0.0" + revision = "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" + version = "v8.0.0" [[projects]] branch = "master" @@ -557,6 +582,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "a163ed58d0f9c69709808679f6106fbbc4720f28a81444e57d272f9baf87e0a5" + inputs-digest = "eb0f9a91407cdea861e700c673ef2bd4cb7ead5975c66dd2e67de08429bf94cf" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 4edf34f6c..c6f964846 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -34,19 +34,19 @@ [[constraint]] name = "k8s.io/api" - version = "kubernetes-1.10.0" + version = "kubernetes-1.11.0" [[constraint]] name = "k8s.io/apiextensions-apiserver" - version = "kubernetes-1.10.0" + version = "kubernetes-1.11.0" [[constraint]] name = "k8s.io/apimachinery" - version = "kubernetes-1.10.0" + version = "kubernetes-1.11.0" [[constraint]] name = "k8s.io/client-go" - version = "7.0.0" + version = "8.0.0" [[constraint]] branch = "master" @@ -59,3 +59,7 @@ [[constraint]] branch = "master" name = "github.com/kylelemons/godebug" + +[[override]] + name = "github.com/json-iterator/go" + revision = "f2b4162afba35581b6d4a50d3b8f34e33c144682" diff --git a/Makefile b/Makefile index 6de602d5b..9087f27aa 100644 --- a/Makefile +++ b/Makefile @@ -215,12 +215,12 @@ $(PO_DOCGEN_BINARY): cmd/po-docgen/**.go $(OPENAPI_GEN_BINARY): go get -u -v -d k8s.io/code-generator/cmd/openapi-gen - cd $(GOPATH)/src/k8s.io/code-generator; git checkout release-1.10 + cd $(GOPATH)/src/k8s.io/code-generator; git checkout release-1.11 go install k8s.io/code-generator/cmd/openapi-gen $(DEEPCOPY_GEN_BINARY): go get -u -v -d k8s.io/code-generator/cmd/deepcopy-gen - cd $(GOPATH)/src/k8s.io/code-generator; git checkout release-1.10 + cd $(GOPATH)/src/k8s.io/code-generator; git checkout release-1.11 go install k8s.io/code-generator/cmd/deepcopy-gen $(GOJSONTOYAML_BINARY): diff --git a/contrib/kube-prometheus/manifests/0prometheus-operator-0alertmanagerCustomResourceDefinition.yaml b/contrib/kube-prometheus/manifests/0prometheus-operator-0alertmanagerCustomResourceDefinition.yaml index 560eb6ef8..b95a4509a 100644 --- a/contrib/kube-prometheus/manifests/0prometheus-operator-0alertmanagerCustomResourceDefinition.yaml +++ b/contrib/kube-prometheus/manifests/0prometheus-operator-0alertmanagerCustomResourceDefinition.yaml @@ -53,11 +53,46 @@ spec: properties: preference: description: A null or empty node selector term matches - no objects. + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. properties: matchExpressions: - description: Required. A list of node selector requirements. - The requirements are ANDed. + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: array + matchFields: + description: A list of node selector requirements + by node's fields. items: description: A node selector requirement is a selector that contains values, a key, and an operator that @@ -88,8 +123,6 @@ spec: - key - operator type: array - required: - - matchExpressions weight: description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. @@ -110,11 +143,46 @@ spec: terms are ORed. items: description: A null or empty node selector term matches - no objects. + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. properties: matchExpressions: - description: Required. A list of node selector requirements. - The requirements are ANDed. + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: array + matchFields: + description: A list of node selector requirements + by node's fields. items: description: A node selector requirement is a selector that contains values, a key, and an operator that @@ -145,8 +213,6 @@ spec: - key - operator type: array - required: - - matchExpressions type: array required: - nodeSelectorTerms @@ -1673,6 +1739,23 @@ spec: format: int64 type: integer type: array + sysctls: + description: Sysctls hold a list of namespaced sysctls used for + the pod. Pods with unsupported sysctls (by the container runtime) + might fail to launch. + items: + description: Sysctl defines a kernel parameter to be set + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + type: array serviceAccountName: description: ServiceAccountName is the name of the ServiceAccount to use to run the Prometheus Pods. @@ -2282,3 +2365,4 @@ status: kind: "" plural: "" conditions: null + storedVersions: null diff --git a/contrib/kube-prometheus/manifests/0prometheus-operator-0prometheusCustomResourceDefinition.yaml b/contrib/kube-prometheus/manifests/0prometheus-operator-0prometheusCustomResourceDefinition.yaml index 1af66f0f0..3e11d52fb 100644 --- a/contrib/kube-prometheus/manifests/0prometheus-operator-0prometheusCustomResourceDefinition.yaml +++ b/contrib/kube-prometheus/manifests/0prometheus-operator-0prometheusCustomResourceDefinition.yaml @@ -83,11 +83,46 @@ spec: properties: preference: description: A null or empty node selector term matches - no objects. + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. properties: matchExpressions: - description: Required. A list of node selector requirements. - The requirements are ANDed. + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: array + matchFields: + description: A list of node selector requirements + by node's fields. items: description: A node selector requirement is a selector that contains values, a key, and an operator that @@ -118,8 +153,6 @@ spec: - key - operator type: array - required: - - matchExpressions weight: description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. @@ -140,11 +173,46 @@ spec: terms are ORed. items: description: A null or empty node selector term matches - no objects. + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. properties: matchExpressions: - description: Required. A list of node selector requirements. - The requirements are ANDed. + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: array + matchFields: + description: A list of node selector requirements + by node's fields. items: description: A node selector requirement is a selector that contains values, a key, and an operator that @@ -175,8 +243,6 @@ spec: - key - operator type: array - required: - - matchExpressions type: array required: - nodeSelectorTerms @@ -2100,6 +2166,23 @@ spec: format: int64 type: integer type: array + sysctls: + description: Sysctls hold a list of namespaced sysctls used for + the pod. Pods with unsupported sysctls (by the container runtime) + might fail to launch. + items: + description: Sysctl defines a kernel parameter to be set + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + type: array serviceAccountName: description: ServiceAccountName is the name of the ServiceAccount to use to run the Prometheus Pods. @@ -2864,3 +2947,4 @@ status: kind: "" plural: "" conditions: null + storedVersions: null diff --git a/contrib/kube-prometheus/manifests/0prometheus-operator-0prometheusruleCustomResourceDefinition.yaml b/contrib/kube-prometheus/manifests/0prometheus-operator-0prometheusruleCustomResourceDefinition.yaml index 43f98251e..baba968ca 100644 --- a/contrib/kube-prometheus/manifests/0prometheus-operator-0prometheusruleCustomResourceDefinition.yaml +++ b/contrib/kube-prometheus/manifests/0prometheus-operator-0prometheusruleCustomResourceDefinition.yaml @@ -339,3 +339,4 @@ status: kind: "" plural: "" conditions: null + storedVersions: null diff --git a/contrib/kube-prometheus/manifests/0prometheus-operator-0servicemonitorCustomResourceDefinition.yaml b/contrib/kube-prometheus/manifests/0prometheus-operator-0servicemonitorCustomResourceDefinition.yaml index c6bc96a19..018a612d0 100644 --- a/contrib/kube-prometheus/manifests/0prometheus-operator-0servicemonitorCustomResourceDefinition.yaml +++ b/contrib/kube-prometheus/manifests/0prometheus-operator-0servicemonitorCustomResourceDefinition.yaml @@ -238,3 +238,4 @@ status: kind: "" plural: "" conditions: null + storedVersions: null diff --git a/example/prometheus-operator-crd/alertmanager.crd.yaml b/example/prometheus-operator-crd/alertmanager.crd.yaml index 031465e7c..1635c359e 100644 --- a/example/prometheus-operator-crd/alertmanager.crd.yaml +++ b/example/prometheus-operator-crd/alertmanager.crd.yaml @@ -54,11 +54,46 @@ spec: properties: preference: description: A null or empty node selector term matches - no objects. + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. properties: matchExpressions: - description: Required. A list of node selector requirements. - The requirements are ANDed. + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: array + matchFields: + description: A list of node selector requirements + by node's fields. items: description: A node selector requirement is a selector that contains values, a key, and an operator that @@ -89,8 +124,6 @@ spec: - key - operator type: array - required: - - matchExpressions weight: description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. @@ -111,11 +144,46 @@ spec: terms are ORed. items: description: A null or empty node selector term matches - no objects. + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. properties: matchExpressions: - description: Required. A list of node selector requirements. - The requirements are ANDed. + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: array + matchFields: + description: A list of node selector requirements + by node's fields. items: description: A node selector requirement is a selector that contains values, a key, and an operator that @@ -146,8 +214,6 @@ spec: - key - operator type: array - required: - - matchExpressions type: array required: - nodeSelectorTerms @@ -1674,6 +1740,23 @@ spec: format: int64 type: integer type: array + sysctls: + description: Sysctls hold a list of namespaced sysctls used for + the pod. Pods with unsupported sysctls (by the container runtime) + might fail to launch. + items: + description: Sysctl defines a kernel parameter to be set + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + type: array serviceAccountName: description: ServiceAccountName is the name of the ServiceAccount to use to run the Prometheus Pods. @@ -2283,3 +2366,4 @@ status: kind: "" plural: "" conditions: null + storedVersions: null diff --git a/example/prometheus-operator-crd/prometheus.crd.yaml b/example/prometheus-operator-crd/prometheus.crd.yaml index 2be564acb..c401c8bde 100644 --- a/example/prometheus-operator-crd/prometheus.crd.yaml +++ b/example/prometheus-operator-crd/prometheus.crd.yaml @@ -84,11 +84,46 @@ spec: properties: preference: description: A null or empty node selector term matches - no objects. + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. properties: matchExpressions: - description: Required. A list of node selector requirements. - The requirements are ANDed. + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: array + matchFields: + description: A list of node selector requirements + by node's fields. items: description: A node selector requirement is a selector that contains values, a key, and an operator that @@ -119,8 +154,6 @@ spec: - key - operator type: array - required: - - matchExpressions weight: description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. @@ -141,11 +174,46 @@ spec: terms are ORed. items: description: A null or empty node selector term matches - no objects. + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. properties: matchExpressions: - description: Required. A list of node selector requirements. - The requirements are ANDed. + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the + operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be + empty. If the operator is Gt or Lt, the values + array must have a single element, which will + be interpreted as an integer. This array is + replaced during a strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: array + matchFields: + description: A list of node selector requirements + by node's fields. items: description: A node selector requirement is a selector that contains values, a key, and an operator that @@ -176,8 +244,6 @@ spec: - key - operator type: array - required: - - matchExpressions type: array required: - nodeSelectorTerms @@ -2101,6 +2167,23 @@ spec: format: int64 type: integer type: array + sysctls: + description: Sysctls hold a list of namespaced sysctls used for + the pod. Pods with unsupported sysctls (by the container runtime) + might fail to launch. + items: + description: Sysctl defines a kernel parameter to be set + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + type: array serviceAccountName: description: ServiceAccountName is the name of the ServiceAccount to use to run the Prometheus Pods. @@ -2865,3 +2948,4 @@ status: kind: "" plural: "" conditions: null + storedVersions: null diff --git a/example/prometheus-operator-crd/prometheusrule.crd.yaml b/example/prometheus-operator-crd/prometheusrule.crd.yaml index 07055cd16..845bd252c 100644 --- a/example/prometheus-operator-crd/prometheusrule.crd.yaml +++ b/example/prometheus-operator-crd/prometheusrule.crd.yaml @@ -340,3 +340,4 @@ status: kind: "" plural: "" conditions: null + storedVersions: null diff --git a/example/prometheus-operator-crd/servicemonitor.crd.yaml b/example/prometheus-operator-crd/servicemonitor.crd.yaml index a707811d3..f4540a490 100644 --- a/example/prometheus-operator-crd/servicemonitor.crd.yaml +++ b/example/prometheus-operator-crd/servicemonitor.crd.yaml @@ -239,3 +239,4 @@ status: kind: "" plural: "" conditions: null + storedVersions: null diff --git a/jsonnet/prometheus-operator/alertmanager-crd.libsonnet b/jsonnet/prometheus-operator/alertmanager-crd.libsonnet index 4a4224636..3346552ce 100644 --- a/jsonnet/prometheus-operator/alertmanager-crd.libsonnet +++ b/jsonnet/prometheus-operator/alertmanager-crd.libsonnet @@ -1 +1 @@ -{"apiVersion":"apiextensions.k8s.io/v1beta1","kind":"CustomResourceDefinition","metadata":{"creationTimestamp":null,"name":"alertmanagers.monitoring.coreos.com"},"spec":{"group":"monitoring.coreos.com","names":{"kind":"Alertmanager","plural":"alertmanagers"},"scope":"Namespaced","validation":{"openAPIV3Schema":{"description":"Alertmanager describes an Alertmanager cluster.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"spec":{"description":"Specification of the desired behavior of the Alertmanager cluster. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status","properties":{"affinity":{"description":"Affinity is a group of affinity scheduling rules.","properties":{"nodeAffinity":{"description":"Node affinity is a group of node affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.","items":{"description":"An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).","properties":{"preference":{"description":"A null or empty node selector term matches no objects.","properties":{"matchExpressions":{"description":"Required. A list of node selector requirements. The requirements are ANDed.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"}},"required":["matchExpressions"]},"weight":{"description":"Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","preference"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"A node selector represents the union of the results of one or more label queries over a set of nodes; that is, it represents the OR of the selectors represented by the node selector terms.","properties":{"nodeSelectorTerms":{"description":"Required. A list of node selector terms. The terms are ORed.","items":{"description":"A null or empty node selector term matches no objects.","properties":{"matchExpressions":{"description":"Required. A list of node selector requirements. The requirements are ANDed.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"}},"required":["matchExpressions"]},"type":"array"}},"required":["nodeSelectorTerms"]}}},"podAffinity":{"description":"Pod affinity is a group of inter pod affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.","items":{"description":"The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)","properties":{"podAffinityTerm":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"weight":{"description":"weight associated with matching the corresponding podAffinityTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","podAffinityTerm"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.","items":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"type":"array"}}},"podAntiAffinity":{"description":"Pod anti affinity is a group of inter pod anti affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.","items":{"description":"The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)","properties":{"podAffinityTerm":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"weight":{"description":"weight associated with matching the corresponding podAffinityTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","podAffinityTerm"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.","items":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"type":"array"}}}}},"baseImage":{"description":"Base image that is used to deploy pods, without tag.","type":"string"},"containers":{"description":"Containers allows injecting additional containers. This is meant to allow adding an authentication proxy to an Alertmanager pod.","items":{"description":"A single application container that you want to run within a pod.","properties":{"args":{"description":"Arguments to the entrypoint. The docker image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell","items":{"type":"string"},"type":"array"},"command":{"description":"Entrypoint array. Not executed within a shell. The docker image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell","items":{"type":"string"},"type":"array"},"env":{"description":"List of environment variables to set in the container. Cannot be updated.","items":{"description":"EnvVar represents an environment variable present in a Container.","properties":{"name":{"description":"Name of the environment variable. Must be a C_IDENTIFIER.","type":"string"},"value":{"description":"Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to \"\".","type":"string"},"valueFrom":{"description":"EnvVarSource represents a source for the value of an EnvVar.","properties":{"configMapKeyRef":{"description":"Selects a key from a ConfigMap.","properties":{"key":{"description":"The key to select.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the ConfigMap or it's key must be defined","type":"boolean"}},"required":["key"]},"fieldRef":{"description":"ObjectFieldSelector selects an APIVersioned field of an object.","properties":{"apiVersion":{"description":"Version of the schema the FieldPath is written in terms of, defaults to \"v1\".","type":"string"},"fieldPath":{"description":"Path of the field to select in the specified API version.","type":"string"}},"required":["fieldPath"]},"resourceFieldRef":{"description":"ResourceFieldSelector represents container resources (cpu, memory) and their output format","properties":{"containerName":{"description":"Container name: required for volumes, optional for env vars","type":"string"},"divisor":{},"resource":{"description":"Required: resource to select","type":"string"}},"required":["resource"]},"secretKeyRef":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]}}}},"required":["name"]},"type":"array"},"envFrom":{"description":"List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.","items":{"description":"EnvFromSource represents the source of a set of ConfigMaps","properties":{"configMapRef":{"description":"ConfigMapEnvSource selects a ConfigMap to populate the environment variables with.\n\nThe contents of the target ConfigMap's Data field will represent the key-value pairs as environment variables.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the ConfigMap must be defined","type":"boolean"}}},"prefix":{"description":"An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.","type":"string"},"secretRef":{"description":"SecretEnvSource selects a Secret to populate the environment variables with.\n\nThe contents of the target Secret's Data field will represent the key-value pairs as environment variables.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret must be defined","type":"boolean"}}}}},"type":"array"},"image":{"description":"Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.","type":"string"},"imagePullPolicy":{"description":"Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images","type":"string"},"lifecycle":{"description":"Lifecycle describes actions that the management system should take in response to container lifecycle events. For the PostStart and PreStop lifecycle handlers, management of the container blocks until the action is complete, unless the container process fails, in which case the handler is aborted.","properties":{"postStart":{"description":"Handler defines a specific action that should be taken","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]}}},"preStop":{"description":"Handler defines a specific action that should be taken","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]}}}}},"livenessProbe":{"description":"Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"failureThreshold":{"description":"Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.","format":"int32","type":"integer"},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"initialDelaySeconds":{"description":"Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"},"periodSeconds":{"description":"How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.","format":"int32","type":"integer"},"successThreshold":{"description":"Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness. Minimum value is 1.","format":"int32","type":"integer"},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]},"timeoutSeconds":{"description":"Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"}}},"name":{"description":"Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated.","type":"string"},"ports":{"description":"List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.","items":{"description":"ContainerPort represents a network port in a single container.","properties":{"containerPort":{"description":"Number of port to expose on the pod's IP address. This must be a valid port number, 0 \u003c x \u003c 65536.","format":"int32","type":"integer"},"hostIP":{"description":"What host IP to bind the external port to.","type":"string"},"hostPort":{"description":"Number of port to expose on the host. If specified, this must be a valid port number, 0 \u003c x \u003c 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.","format":"int32","type":"integer"},"name":{"description":"If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.","type":"string"},"protocol":{"description":"Protocol for port. Must be UDP or TCP. Defaults to \"TCP\".","type":"string"}},"required":["containerPort"]},"type":"array"},"readinessProbe":{"description":"Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"failureThreshold":{"description":"Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.","format":"int32","type":"integer"},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"initialDelaySeconds":{"description":"Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"},"periodSeconds":{"description":"How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.","format":"int32","type":"integer"},"successThreshold":{"description":"Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness. Minimum value is 1.","format":"int32","type":"integer"},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]},"timeoutSeconds":{"description":"Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"}}},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"securityContext":{"description":"SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.","properties":{"allowPrivilegeEscalation":{"description":"AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN","type":"boolean"},"capabilities":{"description":"Adds and removes POSIX capabilities from running containers.","properties":{"add":{"description":"Added capabilities","items":{"type":"string"},"type":"array"},"drop":{"description":"Removed capabilities","items":{"type":"string"},"type":"array"}}},"privileged":{"description":"Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false.","type":"boolean"},"readOnlyRootFilesystem":{"description":"Whether this container has a read-only root filesystem. Default is false.","type":"boolean"},"runAsGroup":{"description":"The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","format":"int64","type":"integer"},"runAsNonRoot":{"description":"Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","type":"boolean"},"runAsUser":{"description":"The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","format":"int64","type":"integer"},"seLinuxOptions":{"description":"SELinuxOptions are the labels to be applied to the container","properties":{"level":{"description":"Level is SELinux level label that applies to the container.","type":"string"},"role":{"description":"Role is a SELinux role label that applies to the container.","type":"string"},"type":{"description":"Type is a SELinux type label that applies to the container.","type":"string"},"user":{"description":"User is a SELinux user label that applies to the container.","type":"string"}}}}},"stdin":{"description":"Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.","type":"boolean"},"stdinOnce":{"description":"Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false","type":"boolean"},"terminationMessagePath":{"description":"Optional: Path at which the file to which the container's termination message will be written is mounted into the container's filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.","type":"string"},"terminationMessagePolicy":{"description":"Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated.","type":"string"},"tty":{"description":"Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false.","type":"boolean"},"volumeDevices":{"description":"volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.","items":{"description":"volumeDevice describes a mapping of a raw block device within a container.","properties":{"devicePath":{"description":"devicePath is the path inside of the container that the device will be mapped to.","type":"string"},"name":{"description":"name must match the name of a persistentVolumeClaim in the pod","type":"string"}},"required":["name","devicePath"]},"type":"array"},"volumeMounts":{"description":"Pod volumes to mount into the container's filesystem. Cannot be updated.","items":{"description":"VolumeMount describes a mounting of a Volume within a container.","properties":{"mountPath":{"description":"Path within the container at which the volume should be mounted. Must not contain ':'.","type":"string"},"mountPropagation":{"description":"mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationHostToContainer is used. This field is beta in 1.10.","type":"string"},"name":{"description":"This must match the Name of a Volume.","type":"string"},"readOnly":{"description":"Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false.","type":"boolean"},"subPath":{"description":"Path within the volume from which the container's volume should be mounted. Defaults to \"\" (volume's root).","type":"string"}},"required":["name","mountPath"]},"type":"array"},"workingDir":{"description":"Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.","type":"string"}},"required":["name"]},"type":"array"},"externalUrl":{"description":"The external URL the Alertmanager instances will be available under. This is necessary to generate correct URLs. This is necessary if Alertmanager is not served from root of a DNS name.","type":"string"},"imagePullSecrets":{"description":"An optional list of references to secrets in the same namespace to use for pulling prometheus and alertmanager images from registries see http://kubernetes.io/docs/user-guide/images#specifying-imagepullsecrets-on-a-pod","items":{"description":"LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"}}},"type":"array"},"listenLocal":{"description":"ListenLocal makes the Alertmanager server listen on loopback, so that it does not bind against the Pod IP. Note this is only for the Alertmanager UI, not the gossip communication.","type":"boolean"},"logLevel":{"description":"Log level for Alertmanager to be configured with.","type":"string"},"nodeSelector":{"description":"Define which Nodes the Pods are scheduled on.","type":"object"},"paused":{"description":"If set to true all actions on the underlaying managed objects are not goint to be performed, except for delete actions.","type":"boolean"},"podMetadata":{"description":"ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.","properties":{"annotations":{"description":"Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations","type":"object"},"clusterName":{"description":"The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.","type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"description":"Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.","format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"description":"Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.","items":{"type":"string"},"type":"array"},"generateName":{"description":"GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency","type":"string"},"generation":{"description":"A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.","format":"int64","type":"integer"},"initializers":{"description":"Initializers tracks the progress of initialization.","properties":{"pending":{"description":"Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients.","items":{"description":"Initializer is information about an initializer that has not yet completed.","properties":{"name":{"description":"name of the process that is responsible for initializing this object.","type":"string"}},"required":["name"]},"type":"array"},"result":{"description":"Status is a return value for calls that don't return other objects.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"code":{"description":"Suggested HTTP return code for this status, 0 if not set.","format":"int32","type":"integer"},"details":{"description":"StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.","properties":{"causes":{"description":"The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.","items":{"description":"StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.","properties":{"field":{"description":"The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"","type":"string"},"message":{"description":"A human-readable description of the cause of the error. This field may be presented as-is to a reader.","type":"string"},"reason":{"description":"A machine-readable description of the cause of the error. If this value is empty there is no information available.","type":"string"}}},"type":"array"},"group":{"description":"The group attribute of the resource associated with the status StatusReason.","type":"string"},"kind":{"description":"The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).","type":"string"},"retryAfterSeconds":{"description":"If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.","format":"int32","type":"integer"},"uid":{"description":"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"message":{"description":"A human-readable description of the status of this operation.","type":"string"},"metadata":{"description":"ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.","properties":{"continue":{"description":"continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response.","type":"string"},"resourceVersion":{"description":"String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"selfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"}}},"reason":{"description":"A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.","type":"string"},"status":{"description":"Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status","type":"string"}}}},"required":["pending"]},"labels":{"description":"Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels","type":"object"},"name":{"description":"Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"namespace":{"description":"Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces","type":"string"},"ownerReferences":{"description":"List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.","items":{"description":"OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.","properties":{"apiVersion":{"description":"API version of the referent.","type":"string"},"blockOwnerDeletion":{"description":"If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.","type":"boolean"},"controller":{"description":"If true, this reference points to the managing controller.","type":"boolean"},"kind":{"description":"Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"uid":{"description":"UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array"},"resourceVersion":{"description":"An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"SelfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"},"uid":{"description":"UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"replicas":{"description":"Size is the expected size of the alertmanager cluster. The controller will eventually make the size of the running cluster equal to the expected size.","format":"int32","type":"integer"},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"routePrefix":{"description":"The route prefix Alertmanager registers HTTP handlers for. This is useful, if using ExternalURL and a proxy is rewriting HTTP routes of a request, and the actual ExternalURL is still true, but the server serves requests under a different route prefix. For example for use with `kubectl proxy`.","type":"string"},"secrets":{"description":"Secrets is a list of Secrets in the same namespace as the Alertmanager object, which shall be mounted into the Alertmanager Pods. The Secrets are mounted into /etc/alertmanager/secrets/\u003csecret-name\u003e.","items":{"type":"string"},"type":"array"},"securityContext":{"description":"PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.","properties":{"fsGroup":{"description":"A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod:\n\n1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw----\n\nIf unset, the Kubelet will not modify the ownership and permissions of any volume.","format":"int64","type":"integer"},"runAsGroup":{"description":"The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.","format":"int64","type":"integer"},"runAsNonRoot":{"description":"Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","type":"boolean"},"runAsUser":{"description":"The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.","format":"int64","type":"integer"},"seLinuxOptions":{"description":"SELinuxOptions are the labels to be applied to the container","properties":{"level":{"description":"Level is SELinux level label that applies to the container.","type":"string"},"role":{"description":"Role is a SELinux role label that applies to the container.","type":"string"},"type":{"description":"Type is a SELinux type label that applies to the container.","type":"string"},"user":{"description":"User is a SELinux user label that applies to the container.","type":"string"}}},"supplementalGroups":{"description":"A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container.","items":{"format":"int64","type":"integer"},"type":"array"}}},"serviceAccountName":{"description":"ServiceAccountName is the name of the ServiceAccount to use to run the Prometheus Pods.","type":"string"},"storage":{"description":"StorageSpec defines the configured storage for a group Prometheus servers.","properties":{"class":{"description":"Name of the StorageClass to use when requesting storage provisioning. More info: https://kubernetes.io/docs/user-guide/persistent-volumes/#storageclasses DEPRECATED","type":"string"},"emptyDir":{"description":"Represents an empty directory for a pod. Empty directory volumes support ownership management and SELinux relabeling.","properties":{"medium":{"description":"What type of storage medium should back this directory. The default is \"\" which means to use the node's default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir","type":"string"},"sizeLimit":{}}},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"selector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"volumeClaimTemplate":{"description":"PersistentVolumeClaim is a user's request for and claim to a persistent volume","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"metadata":{"description":"ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.","properties":{"annotations":{"description":"Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations","type":"object"},"clusterName":{"description":"The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.","type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"description":"Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.","format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"description":"Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.","items":{"type":"string"},"type":"array"},"generateName":{"description":"GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency","type":"string"},"generation":{"description":"A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.","format":"int64","type":"integer"},"initializers":{"description":"Initializers tracks the progress of initialization.","properties":{"pending":{"description":"Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients.","items":{"description":"Initializer is information about an initializer that has not yet completed.","properties":{"name":{"description":"name of the process that is responsible for initializing this object.","type":"string"}},"required":["name"]},"type":"array"},"result":{"description":"Status is a return value for calls that don't return other objects.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"code":{"description":"Suggested HTTP return code for this status, 0 if not set.","format":"int32","type":"integer"},"details":{"description":"StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.","properties":{"causes":{"description":"The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.","items":{"description":"StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.","properties":{"field":{"description":"The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"","type":"string"},"message":{"description":"A human-readable description of the cause of the error. This field may be presented as-is to a reader.","type":"string"},"reason":{"description":"A machine-readable description of the cause of the error. If this value is empty there is no information available.","type":"string"}}},"type":"array"},"group":{"description":"The group attribute of the resource associated with the status StatusReason.","type":"string"},"kind":{"description":"The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).","type":"string"},"retryAfterSeconds":{"description":"If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.","format":"int32","type":"integer"},"uid":{"description":"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"message":{"description":"A human-readable description of the status of this operation.","type":"string"},"metadata":{"description":"ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.","properties":{"continue":{"description":"continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response.","type":"string"},"resourceVersion":{"description":"String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"selfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"}}},"reason":{"description":"A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.","type":"string"},"status":{"description":"Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status","type":"string"}}}},"required":["pending"]},"labels":{"description":"Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels","type":"object"},"name":{"description":"Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"namespace":{"description":"Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces","type":"string"},"ownerReferences":{"description":"List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.","items":{"description":"OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.","properties":{"apiVersion":{"description":"API version of the referent.","type":"string"},"blockOwnerDeletion":{"description":"If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.","type":"boolean"},"controller":{"description":"If true, this reference points to the managing controller.","type":"boolean"},"kind":{"description":"Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"uid":{"description":"UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array"},"resourceVersion":{"description":"An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"SelfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"},"uid":{"description":"UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"spec":{"description":"PersistentVolumeClaimSpec describes the common attributes of storage devices and allows a Source for provider-specific attributes","properties":{"accessModes":{"description":"AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1","items":{"type":"string"},"type":"array"},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"selector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"storageClassName":{"description":"Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1","type":"string"},"volumeMode":{"description":"volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.","type":"string"},"volumeName":{"description":"VolumeName is the binding reference to the PersistentVolume backing this claim.","type":"string"}}},"status":{"description":"PersistentVolumeClaimStatus is the current status of a persistent volume claim.","properties":{"accessModes":{"description":"AccessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1","items":{"type":"string"},"type":"array"},"capacity":{"description":"Represents the actual resources of the underlying volume.","type":"object"},"conditions":{"description":"Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.","items":{"description":"PersistentVolumeClaimCondition contails details about state of pvc","properties":{"lastProbeTime":{"format":"date-time","type":"string"},"lastTransitionTime":{"format":"date-time","type":"string"},"message":{"description":"Human-readable message indicating details about last transition.","type":"string"},"reason":{"description":"Unique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports \"ResizeStarted\" that means the underlying persistent volume is being resized.","type":"string"},"status":{"type":"string"},"type":{"type":"string"}},"required":["type","status"]},"type":"array"},"phase":{"description":"Phase represents the current phase of PersistentVolumeClaim.","type":"string"}}}}}}},"tolerations":{"description":"If specified, the pod's tolerations.","items":{"description":"The pod this Toleration is attached to tolerates any taint that matches the triple \u003ckey,value,effect\u003e using the matching operator \u003coperator\u003e.","properties":{"effect":{"description":"Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.","type":"string"},"key":{"description":"Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.","type":"string"},"operator":{"description":"Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.","type":"string"},"tolerationSeconds":{"description":"TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.","format":"int64","type":"integer"},"value":{"description":"Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.","type":"string"}}},"type":"array"},"version":{"description":"Version the cluster should be on.","type":"string"}}},"status":{"description":"Most recent observed status of the Alertmanager cluster. Read-only. Not included when requesting from the apiserver, only from the Prometheus Operator API itself. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status","properties":{"availableReplicas":{"description":"Total number of available pods (ready for at least minReadySeconds) targeted by this Alertmanager cluster.","format":"int32","type":"integer"},"paused":{"description":"Represents whether any actions on the underlaying managed objects are being performed. Only delete actions will be performed.","type":"boolean"},"replicas":{"description":"Total number of non-terminated pods targeted by this Alertmanager cluster (their labels match the selector).","format":"int32","type":"integer"},"unavailableReplicas":{"description":"Total number of unavailable pods targeted by this Alertmanager cluster.","format":"int32","type":"integer"},"updatedReplicas":{"description":"Total number of non-terminated pods targeted by this Alertmanager cluster that have the desired version spec.","format":"int32","type":"integer"}},"required":["paused","replicas","updatedReplicas","availableReplicas","unavailableReplicas"]}},"required":["spec"]}},"version":"v1"},"status":{"acceptedNames":{"kind":"","plural":""},"conditions":null}} \ No newline at end of file +{"apiVersion":"apiextensions.k8s.io/v1beta1","kind":"CustomResourceDefinition","metadata":{"creationTimestamp":null,"name":"alertmanagers.monitoring.coreos.com"},"spec":{"group":"monitoring.coreos.com","names":{"kind":"Alertmanager","plural":"alertmanagers"},"scope":"Namespaced","validation":{"openAPIV3Schema":{"description":"Alertmanager describes an Alertmanager cluster.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"spec":{"description":"Specification of the desired behavior of the Alertmanager cluster. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status","properties":{"affinity":{"description":"Affinity is a group of affinity scheduling rules.","properties":{"nodeAffinity":{"description":"Node affinity is a group of node affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.","items":{"description":"An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).","properties":{"preference":{"description":"A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.","properties":{"matchExpressions":{"description":"A list of node selector requirements by node's labels.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchFields":{"description":"A list of node selector requirements by node's fields.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"}}},"weight":{"description":"Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","preference"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"A node selector represents the union of the results of one or more label queries over a set of nodes; that is, it represents the OR of the selectors represented by the node selector terms.","properties":{"nodeSelectorTerms":{"description":"Required. A list of node selector terms. The terms are ORed.","items":{"description":"A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.","properties":{"matchExpressions":{"description":"A list of node selector requirements by node's labels.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchFields":{"description":"A list of node selector requirements by node's fields.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"}}},"type":"array"}},"required":["nodeSelectorTerms"]}}},"podAffinity":{"description":"Pod affinity is a group of inter pod affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.","items":{"description":"The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)","properties":{"podAffinityTerm":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"weight":{"description":"weight associated with matching the corresponding podAffinityTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","podAffinityTerm"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.","items":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"type":"array"}}},"podAntiAffinity":{"description":"Pod anti affinity is a group of inter pod anti affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.","items":{"description":"The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)","properties":{"podAffinityTerm":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"weight":{"description":"weight associated with matching the corresponding podAffinityTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","podAffinityTerm"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.","items":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"type":"array"}}}}},"baseImage":{"description":"Base image that is used to deploy pods, without tag.","type":"string"},"containers":{"description":"Containers allows injecting additional containers. This is meant to allow adding an authentication proxy to an Alertmanager pod.","items":{"description":"A single application container that you want to run within a pod.","properties":{"args":{"description":"Arguments to the entrypoint. The docker image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell","items":{"type":"string"},"type":"array"},"command":{"description":"Entrypoint array. Not executed within a shell. The docker image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell","items":{"type":"string"},"type":"array"},"env":{"description":"List of environment variables to set in the container. Cannot be updated.","items":{"description":"EnvVar represents an environment variable present in a Container.","properties":{"name":{"description":"Name of the environment variable. Must be a C_IDENTIFIER.","type":"string"},"value":{"description":"Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to \"\".","type":"string"},"valueFrom":{"description":"EnvVarSource represents a source for the value of an EnvVar.","properties":{"configMapKeyRef":{"description":"Selects a key from a ConfigMap.","properties":{"key":{"description":"The key to select.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the ConfigMap or it's key must be defined","type":"boolean"}},"required":["key"]},"fieldRef":{"description":"ObjectFieldSelector selects an APIVersioned field of an object.","properties":{"apiVersion":{"description":"Version of the schema the FieldPath is written in terms of, defaults to \"v1\".","type":"string"},"fieldPath":{"description":"Path of the field to select in the specified API version.","type":"string"}},"required":["fieldPath"]},"resourceFieldRef":{"description":"ResourceFieldSelector represents container resources (cpu, memory) and their output format","properties":{"containerName":{"description":"Container name: required for volumes, optional for env vars","type":"string"},"divisor":{},"resource":{"description":"Required: resource to select","type":"string"}},"required":["resource"]},"secretKeyRef":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]}}}},"required":["name"]},"type":"array"},"envFrom":{"description":"List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.","items":{"description":"EnvFromSource represents the source of a set of ConfigMaps","properties":{"configMapRef":{"description":"ConfigMapEnvSource selects a ConfigMap to populate the environment variables with.\n\nThe contents of the target ConfigMap's Data field will represent the key-value pairs as environment variables.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the ConfigMap must be defined","type":"boolean"}}},"prefix":{"description":"An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.","type":"string"},"secretRef":{"description":"SecretEnvSource selects a Secret to populate the environment variables with.\n\nThe contents of the target Secret's Data field will represent the key-value pairs as environment variables.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret must be defined","type":"boolean"}}}}},"type":"array"},"image":{"description":"Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.","type":"string"},"imagePullPolicy":{"description":"Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images","type":"string"},"lifecycle":{"description":"Lifecycle describes actions that the management system should take in response to container lifecycle events. For the PostStart and PreStop lifecycle handlers, management of the container blocks until the action is complete, unless the container process fails, in which case the handler is aborted.","properties":{"postStart":{"description":"Handler defines a specific action that should be taken","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]}}},"preStop":{"description":"Handler defines a specific action that should be taken","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]}}}}},"livenessProbe":{"description":"Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"failureThreshold":{"description":"Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.","format":"int32","type":"integer"},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"initialDelaySeconds":{"description":"Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"},"periodSeconds":{"description":"How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.","format":"int32","type":"integer"},"successThreshold":{"description":"Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness. Minimum value is 1.","format":"int32","type":"integer"},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]},"timeoutSeconds":{"description":"Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"}}},"name":{"description":"Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated.","type":"string"},"ports":{"description":"List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.","items":{"description":"ContainerPort represents a network port in a single container.","properties":{"containerPort":{"description":"Number of port to expose on the pod's IP address. This must be a valid port number, 0 \u003c x \u003c 65536.","format":"int32","type":"integer"},"hostIP":{"description":"What host IP to bind the external port to.","type":"string"},"hostPort":{"description":"Number of port to expose on the host. If specified, this must be a valid port number, 0 \u003c x \u003c 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.","format":"int32","type":"integer"},"name":{"description":"If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.","type":"string"},"protocol":{"description":"Protocol for port. Must be UDP or TCP. Defaults to \"TCP\".","type":"string"}},"required":["containerPort"]},"type":"array"},"readinessProbe":{"description":"Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"failureThreshold":{"description":"Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.","format":"int32","type":"integer"},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"initialDelaySeconds":{"description":"Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"},"periodSeconds":{"description":"How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.","format":"int32","type":"integer"},"successThreshold":{"description":"Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness. Minimum value is 1.","format":"int32","type":"integer"},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]},"timeoutSeconds":{"description":"Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"}}},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"securityContext":{"description":"SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.","properties":{"allowPrivilegeEscalation":{"description":"AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN","type":"boolean"},"capabilities":{"description":"Adds and removes POSIX capabilities from running containers.","properties":{"add":{"description":"Added capabilities","items":{"type":"string"},"type":"array"},"drop":{"description":"Removed capabilities","items":{"type":"string"},"type":"array"}}},"privileged":{"description":"Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false.","type":"boolean"},"readOnlyRootFilesystem":{"description":"Whether this container has a read-only root filesystem. Default is false.","type":"boolean"},"runAsGroup":{"description":"The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","format":"int64","type":"integer"},"runAsNonRoot":{"description":"Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","type":"boolean"},"runAsUser":{"description":"The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","format":"int64","type":"integer"},"seLinuxOptions":{"description":"SELinuxOptions are the labels to be applied to the container","properties":{"level":{"description":"Level is SELinux level label that applies to the container.","type":"string"},"role":{"description":"Role is a SELinux role label that applies to the container.","type":"string"},"type":{"description":"Type is a SELinux type label that applies to the container.","type":"string"},"user":{"description":"User is a SELinux user label that applies to the container.","type":"string"}}}}},"stdin":{"description":"Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.","type":"boolean"},"stdinOnce":{"description":"Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false","type":"boolean"},"terminationMessagePath":{"description":"Optional: Path at which the file to which the container's termination message will be written is mounted into the container's filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.","type":"string"},"terminationMessagePolicy":{"description":"Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated.","type":"string"},"tty":{"description":"Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false.","type":"boolean"},"volumeDevices":{"description":"volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.","items":{"description":"volumeDevice describes a mapping of a raw block device within a container.","properties":{"devicePath":{"description":"devicePath is the path inside of the container that the device will be mapped to.","type":"string"},"name":{"description":"name must match the name of a persistentVolumeClaim in the pod","type":"string"}},"required":["name","devicePath"]},"type":"array"},"volumeMounts":{"description":"Pod volumes to mount into the container's filesystem. Cannot be updated.","items":{"description":"VolumeMount describes a mounting of a Volume within a container.","properties":{"mountPath":{"description":"Path within the container at which the volume should be mounted. Must not contain ':'.","type":"string"},"mountPropagation":{"description":"mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationHostToContainer is used. This field is beta in 1.10.","type":"string"},"name":{"description":"This must match the Name of a Volume.","type":"string"},"readOnly":{"description":"Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false.","type":"boolean"},"subPath":{"description":"Path within the volume from which the container's volume should be mounted. Defaults to \"\" (volume's root).","type":"string"}},"required":["name","mountPath"]},"type":"array"},"workingDir":{"description":"Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.","type":"string"}},"required":["name"]},"type":"array"},"externalUrl":{"description":"The external URL the Alertmanager instances will be available under. This is necessary to generate correct URLs. This is necessary if Alertmanager is not served from root of a DNS name.","type":"string"},"imagePullSecrets":{"description":"An optional list of references to secrets in the same namespace to use for pulling prometheus and alertmanager images from registries see http://kubernetes.io/docs/user-guide/images#specifying-imagepullsecrets-on-a-pod","items":{"description":"LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"}}},"type":"array"},"listenLocal":{"description":"ListenLocal makes the Alertmanager server listen on loopback, so that it does not bind against the Pod IP. Note this is only for the Alertmanager UI, not the gossip communication.","type":"boolean"},"logLevel":{"description":"Log level for Alertmanager to be configured with.","type":"string"},"nodeSelector":{"description":"Define which Nodes the Pods are scheduled on.","type":"object"},"paused":{"description":"If set to true all actions on the underlaying managed objects are not goint to be performed, except for delete actions.","type":"boolean"},"podMetadata":{"description":"ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.","properties":{"annotations":{"description":"Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations","type":"object"},"clusterName":{"description":"The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.","type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"description":"Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.","format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"description":"Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.","items":{"type":"string"},"type":"array"},"generateName":{"description":"GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency","type":"string"},"generation":{"description":"A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.","format":"int64","type":"integer"},"initializers":{"description":"Initializers tracks the progress of initialization.","properties":{"pending":{"description":"Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients.","items":{"description":"Initializer is information about an initializer that has not yet completed.","properties":{"name":{"description":"name of the process that is responsible for initializing this object.","type":"string"}},"required":["name"]},"type":"array"},"result":{"description":"Status is a return value for calls that don't return other objects.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"code":{"description":"Suggested HTTP return code for this status, 0 if not set.","format":"int32","type":"integer"},"details":{"description":"StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.","properties":{"causes":{"description":"The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.","items":{"description":"StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.","properties":{"field":{"description":"The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"","type":"string"},"message":{"description":"A human-readable description of the cause of the error. This field may be presented as-is to a reader.","type":"string"},"reason":{"description":"A machine-readable description of the cause of the error. If this value is empty there is no information available.","type":"string"}}},"type":"array"},"group":{"description":"The group attribute of the resource associated with the status StatusReason.","type":"string"},"kind":{"description":"The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).","type":"string"},"retryAfterSeconds":{"description":"If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.","format":"int32","type":"integer"},"uid":{"description":"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"message":{"description":"A human-readable description of the status of this operation.","type":"string"},"metadata":{"description":"ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.","properties":{"continue":{"description":"continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response.","type":"string"},"resourceVersion":{"description":"String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"selfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"}}},"reason":{"description":"A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.","type":"string"},"status":{"description":"Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status","type":"string"}}}},"required":["pending"]},"labels":{"description":"Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels","type":"object"},"name":{"description":"Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"namespace":{"description":"Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces","type":"string"},"ownerReferences":{"description":"List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.","items":{"description":"OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.","properties":{"apiVersion":{"description":"API version of the referent.","type":"string"},"blockOwnerDeletion":{"description":"If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.","type":"boolean"},"controller":{"description":"If true, this reference points to the managing controller.","type":"boolean"},"kind":{"description":"Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"uid":{"description":"UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array"},"resourceVersion":{"description":"An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"SelfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"},"uid":{"description":"UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"replicas":{"description":"Size is the expected size of the alertmanager cluster. The controller will eventually make the size of the running cluster equal to the expected size.","format":"int32","type":"integer"},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"routePrefix":{"description":"The route prefix Alertmanager registers HTTP handlers for. This is useful, if using ExternalURL and a proxy is rewriting HTTP routes of a request, and the actual ExternalURL is still true, but the server serves requests under a different route prefix. For example for use with `kubectl proxy`.","type":"string"},"secrets":{"description":"Secrets is a list of Secrets in the same namespace as the Alertmanager object, which shall be mounted into the Alertmanager Pods. The Secrets are mounted into /etc/alertmanager/secrets/\u003csecret-name\u003e.","items":{"type":"string"},"type":"array"},"securityContext":{"description":"PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.","properties":{"fsGroup":{"description":"A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod:\n\n1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw----\n\nIf unset, the Kubelet will not modify the ownership and permissions of any volume.","format":"int64","type":"integer"},"runAsGroup":{"description":"The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.","format":"int64","type":"integer"},"runAsNonRoot":{"description":"Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","type":"boolean"},"runAsUser":{"description":"The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.","format":"int64","type":"integer"},"seLinuxOptions":{"description":"SELinuxOptions are the labels to be applied to the container","properties":{"level":{"description":"Level is SELinux level label that applies to the container.","type":"string"},"role":{"description":"Role is a SELinux role label that applies to the container.","type":"string"},"type":{"description":"Type is a SELinux type label that applies to the container.","type":"string"},"user":{"description":"User is a SELinux user label that applies to the container.","type":"string"}}},"supplementalGroups":{"description":"A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container.","items":{"format":"int64","type":"integer"},"type":"array"},"sysctls":{"description":"Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch.","items":{"description":"Sysctl defines a kernel parameter to be set","properties":{"name":{"description":"Name of a property to set","type":"string"},"value":{"description":"Value of a property to set","type":"string"}},"required":["name","value"]},"type":"array"}}},"serviceAccountName":{"description":"ServiceAccountName is the name of the ServiceAccount to use to run the Prometheus Pods.","type":"string"},"storage":{"description":"StorageSpec defines the configured storage for a group Prometheus servers.","properties":{"class":{"description":"Name of the StorageClass to use when requesting storage provisioning. More info: https://kubernetes.io/docs/user-guide/persistent-volumes/#storageclasses DEPRECATED","type":"string"},"emptyDir":{"description":"Represents an empty directory for a pod. Empty directory volumes support ownership management and SELinux relabeling.","properties":{"medium":{"description":"What type of storage medium should back this directory. The default is \"\" which means to use the node's default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir","type":"string"},"sizeLimit":{}}},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"selector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"volumeClaimTemplate":{"description":"PersistentVolumeClaim is a user's request for and claim to a persistent volume","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"metadata":{"description":"ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.","properties":{"annotations":{"description":"Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations","type":"object"},"clusterName":{"description":"The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.","type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"description":"Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.","format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"description":"Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.","items":{"type":"string"},"type":"array"},"generateName":{"description":"GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency","type":"string"},"generation":{"description":"A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.","format":"int64","type":"integer"},"initializers":{"description":"Initializers tracks the progress of initialization.","properties":{"pending":{"description":"Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients.","items":{"description":"Initializer is information about an initializer that has not yet completed.","properties":{"name":{"description":"name of the process that is responsible for initializing this object.","type":"string"}},"required":["name"]},"type":"array"},"result":{"description":"Status is a return value for calls that don't return other objects.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"code":{"description":"Suggested HTTP return code for this status, 0 if not set.","format":"int32","type":"integer"},"details":{"description":"StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.","properties":{"causes":{"description":"The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.","items":{"description":"StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.","properties":{"field":{"description":"The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"","type":"string"},"message":{"description":"A human-readable description of the cause of the error. This field may be presented as-is to a reader.","type":"string"},"reason":{"description":"A machine-readable description of the cause of the error. If this value is empty there is no information available.","type":"string"}}},"type":"array"},"group":{"description":"The group attribute of the resource associated with the status StatusReason.","type":"string"},"kind":{"description":"The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).","type":"string"},"retryAfterSeconds":{"description":"If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.","format":"int32","type":"integer"},"uid":{"description":"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"message":{"description":"A human-readable description of the status of this operation.","type":"string"},"metadata":{"description":"ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.","properties":{"continue":{"description":"continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response.","type":"string"},"resourceVersion":{"description":"String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"selfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"}}},"reason":{"description":"A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.","type":"string"},"status":{"description":"Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status","type":"string"}}}},"required":["pending"]},"labels":{"description":"Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels","type":"object"},"name":{"description":"Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"namespace":{"description":"Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces","type":"string"},"ownerReferences":{"description":"List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.","items":{"description":"OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.","properties":{"apiVersion":{"description":"API version of the referent.","type":"string"},"blockOwnerDeletion":{"description":"If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.","type":"boolean"},"controller":{"description":"If true, this reference points to the managing controller.","type":"boolean"},"kind":{"description":"Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"uid":{"description":"UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array"},"resourceVersion":{"description":"An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"SelfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"},"uid":{"description":"UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"spec":{"description":"PersistentVolumeClaimSpec describes the common attributes of storage devices and allows a Source for provider-specific attributes","properties":{"accessModes":{"description":"AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1","items":{"type":"string"},"type":"array"},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"selector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"storageClassName":{"description":"Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1","type":"string"},"volumeMode":{"description":"volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.","type":"string"},"volumeName":{"description":"VolumeName is the binding reference to the PersistentVolume backing this claim.","type":"string"}}},"status":{"description":"PersistentVolumeClaimStatus is the current status of a persistent volume claim.","properties":{"accessModes":{"description":"AccessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1","items":{"type":"string"},"type":"array"},"capacity":{"description":"Represents the actual resources of the underlying volume.","type":"object"},"conditions":{"description":"Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.","items":{"description":"PersistentVolumeClaimCondition contails details about state of pvc","properties":{"lastProbeTime":{"format":"date-time","type":"string"},"lastTransitionTime":{"format":"date-time","type":"string"},"message":{"description":"Human-readable message indicating details about last transition.","type":"string"},"reason":{"description":"Unique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports \"ResizeStarted\" that means the underlying persistent volume is being resized.","type":"string"},"status":{"type":"string"},"type":{"type":"string"}},"required":["type","status"]},"type":"array"},"phase":{"description":"Phase represents the current phase of PersistentVolumeClaim.","type":"string"}}}}}}},"tolerations":{"description":"If specified, the pod's tolerations.","items":{"description":"The pod this Toleration is attached to tolerates any taint that matches the triple \u003ckey,value,effect\u003e using the matching operator \u003coperator\u003e.","properties":{"effect":{"description":"Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.","type":"string"},"key":{"description":"Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.","type":"string"},"operator":{"description":"Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.","type":"string"},"tolerationSeconds":{"description":"TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.","format":"int64","type":"integer"},"value":{"description":"Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.","type":"string"}}},"type":"array"},"version":{"description":"Version the cluster should be on.","type":"string"}}},"status":{"description":"Most recent observed status of the Alertmanager cluster. Read-only. Not included when requesting from the apiserver, only from the Prometheus Operator API itself. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status","properties":{"availableReplicas":{"description":"Total number of available pods (ready for at least minReadySeconds) targeted by this Alertmanager cluster.","format":"int32","type":"integer"},"paused":{"description":"Represents whether any actions on the underlaying managed objects are being performed. Only delete actions will be performed.","type":"boolean"},"replicas":{"description":"Total number of non-terminated pods targeted by this Alertmanager cluster (their labels match the selector).","format":"int32","type":"integer"},"unavailableReplicas":{"description":"Total number of unavailable pods targeted by this Alertmanager cluster.","format":"int32","type":"integer"},"updatedReplicas":{"description":"Total number of non-terminated pods targeted by this Alertmanager cluster that have the desired version spec.","format":"int32","type":"integer"}},"required":["paused","replicas","updatedReplicas","availableReplicas","unavailableReplicas"]}},"required":["spec"]}},"version":"v1"},"status":{"acceptedNames":{"kind":"","plural":""},"conditions":null,"storedVersions":null}} \ No newline at end of file diff --git a/jsonnet/prometheus-operator/prometheus-crd.libsonnet b/jsonnet/prometheus-operator/prometheus-crd.libsonnet index 0c76cbebb..2763a5f17 100644 --- a/jsonnet/prometheus-operator/prometheus-crd.libsonnet +++ b/jsonnet/prometheus-operator/prometheus-crd.libsonnet @@ -1 +1 @@ -{"apiVersion":"apiextensions.k8s.io/v1beta1","kind":"CustomResourceDefinition","metadata":{"creationTimestamp":null,"name":"prometheuses.monitoring.coreos.com"},"spec":{"group":"monitoring.coreos.com","names":{"kind":"Prometheus","plural":"prometheuses"},"scope":"Namespaced","validation":{"openAPIV3Schema":{"description":"Prometheus defines a Prometheus deployment.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"spec":{"description":"Specification of the desired behavior of the Prometheus cluster. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status","properties":{"additionalAlertManagerConfigs":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"additionalScrapeConfigs":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"affinity":{"description":"Affinity is a group of affinity scheduling rules.","properties":{"nodeAffinity":{"description":"Node affinity is a group of node affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.","items":{"description":"An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).","properties":{"preference":{"description":"A null or empty node selector term matches no objects.","properties":{"matchExpressions":{"description":"Required. A list of node selector requirements. The requirements are ANDed.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"}},"required":["matchExpressions"]},"weight":{"description":"Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","preference"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"A node selector represents the union of the results of one or more label queries over a set of nodes; that is, it represents the OR of the selectors represented by the node selector terms.","properties":{"nodeSelectorTerms":{"description":"Required. A list of node selector terms. The terms are ORed.","items":{"description":"A null or empty node selector term matches no objects.","properties":{"matchExpressions":{"description":"Required. A list of node selector requirements. The requirements are ANDed.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"}},"required":["matchExpressions"]},"type":"array"}},"required":["nodeSelectorTerms"]}}},"podAffinity":{"description":"Pod affinity is a group of inter pod affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.","items":{"description":"The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)","properties":{"podAffinityTerm":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"weight":{"description":"weight associated with matching the corresponding podAffinityTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","podAffinityTerm"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.","items":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"type":"array"}}},"podAntiAffinity":{"description":"Pod anti affinity is a group of inter pod anti affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.","items":{"description":"The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)","properties":{"podAffinityTerm":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"weight":{"description":"weight associated with matching the corresponding podAffinityTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","podAffinityTerm"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.","items":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"type":"array"}}}}},"alerting":{"description":"AlertingSpec defines parameters for alerting configuration of Prometheus servers.","properties":{"alertmanagers":{"description":"AlertmanagerEndpoints Prometheus should fire alerts against.","items":{"description":"AlertmanagerEndpoints defines a selection of a single Endpoints object containing alertmanager IPs to fire alerts against.","properties":{"bearerTokenFile":{"description":"BearerTokenFile to read from filesystem to use when authenticating to Alertmanager.","type":"string"},"name":{"description":"Name of Endpoints object in Namespace.","type":"string"},"namespace":{"description":"Namespace of Endpoints object.","type":"string"},"pathPrefix":{"description":"Prefix for the HTTP path alerts are pushed to.","type":"string"},"port":{},"scheme":{"description":"Scheme to use when firing alerts.","type":"string"},"tlsConfig":{"description":"TLSConfig specifies TLS configuration parameters.","properties":{"caFile":{"description":"The CA cert to use for the targets.","type":"string"},"certFile":{"description":"The client cert file for the targets.","type":"string"},"insecureSkipVerify":{"description":"Disable target certificate validation.","type":"boolean"},"keyFile":{"description":"The client key file for the targets.","type":"string"},"serverName":{"description":"Used to verify the hostname for the targets.","type":"string"}}}},"required":["namespace","name","port"]},"type":"array"}},"required":["alertmanagers"]},"baseImage":{"description":"Base image to use for a Prometheus deployment.","type":"string"},"containers":{"description":"Containers allows injecting additional containers. This is meant to allow adding an authentication proxy to a Prometheus pod.","items":{"description":"A single application container that you want to run within a pod.","properties":{"args":{"description":"Arguments to the entrypoint. The docker image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell","items":{"type":"string"},"type":"array"},"command":{"description":"Entrypoint array. Not executed within a shell. The docker image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell","items":{"type":"string"},"type":"array"},"env":{"description":"List of environment variables to set in the container. Cannot be updated.","items":{"description":"EnvVar represents an environment variable present in a Container.","properties":{"name":{"description":"Name of the environment variable. Must be a C_IDENTIFIER.","type":"string"},"value":{"description":"Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to \"\".","type":"string"},"valueFrom":{"description":"EnvVarSource represents a source for the value of an EnvVar.","properties":{"configMapKeyRef":{"description":"Selects a key from a ConfigMap.","properties":{"key":{"description":"The key to select.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the ConfigMap or it's key must be defined","type":"boolean"}},"required":["key"]},"fieldRef":{"description":"ObjectFieldSelector selects an APIVersioned field of an object.","properties":{"apiVersion":{"description":"Version of the schema the FieldPath is written in terms of, defaults to \"v1\".","type":"string"},"fieldPath":{"description":"Path of the field to select in the specified API version.","type":"string"}},"required":["fieldPath"]},"resourceFieldRef":{"description":"ResourceFieldSelector represents container resources (cpu, memory) and their output format","properties":{"containerName":{"description":"Container name: required for volumes, optional for env vars","type":"string"},"divisor":{},"resource":{"description":"Required: resource to select","type":"string"}},"required":["resource"]},"secretKeyRef":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]}}}},"required":["name"]},"type":"array"},"envFrom":{"description":"List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.","items":{"description":"EnvFromSource represents the source of a set of ConfigMaps","properties":{"configMapRef":{"description":"ConfigMapEnvSource selects a ConfigMap to populate the environment variables with.\n\nThe contents of the target ConfigMap's Data field will represent the key-value pairs as environment variables.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the ConfigMap must be defined","type":"boolean"}}},"prefix":{"description":"An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.","type":"string"},"secretRef":{"description":"SecretEnvSource selects a Secret to populate the environment variables with.\n\nThe contents of the target Secret's Data field will represent the key-value pairs as environment variables.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret must be defined","type":"boolean"}}}}},"type":"array"},"image":{"description":"Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.","type":"string"},"imagePullPolicy":{"description":"Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images","type":"string"},"lifecycle":{"description":"Lifecycle describes actions that the management system should take in response to container lifecycle events. For the PostStart and PreStop lifecycle handlers, management of the container blocks until the action is complete, unless the container process fails, in which case the handler is aborted.","properties":{"postStart":{"description":"Handler defines a specific action that should be taken","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]}}},"preStop":{"description":"Handler defines a specific action that should be taken","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]}}}}},"livenessProbe":{"description":"Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"failureThreshold":{"description":"Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.","format":"int32","type":"integer"},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"initialDelaySeconds":{"description":"Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"},"periodSeconds":{"description":"How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.","format":"int32","type":"integer"},"successThreshold":{"description":"Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness. Minimum value is 1.","format":"int32","type":"integer"},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]},"timeoutSeconds":{"description":"Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"}}},"name":{"description":"Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated.","type":"string"},"ports":{"description":"List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.","items":{"description":"ContainerPort represents a network port in a single container.","properties":{"containerPort":{"description":"Number of port to expose on the pod's IP address. This must be a valid port number, 0 \u003c x \u003c 65536.","format":"int32","type":"integer"},"hostIP":{"description":"What host IP to bind the external port to.","type":"string"},"hostPort":{"description":"Number of port to expose on the host. If specified, this must be a valid port number, 0 \u003c x \u003c 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.","format":"int32","type":"integer"},"name":{"description":"If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.","type":"string"},"protocol":{"description":"Protocol for port. Must be UDP or TCP. Defaults to \"TCP\".","type":"string"}},"required":["containerPort"]},"type":"array"},"readinessProbe":{"description":"Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"failureThreshold":{"description":"Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.","format":"int32","type":"integer"},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"initialDelaySeconds":{"description":"Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"},"periodSeconds":{"description":"How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.","format":"int32","type":"integer"},"successThreshold":{"description":"Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness. Minimum value is 1.","format":"int32","type":"integer"},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]},"timeoutSeconds":{"description":"Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"}}},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"securityContext":{"description":"SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.","properties":{"allowPrivilegeEscalation":{"description":"AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN","type":"boolean"},"capabilities":{"description":"Adds and removes POSIX capabilities from running containers.","properties":{"add":{"description":"Added capabilities","items":{"type":"string"},"type":"array"},"drop":{"description":"Removed capabilities","items":{"type":"string"},"type":"array"}}},"privileged":{"description":"Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false.","type":"boolean"},"readOnlyRootFilesystem":{"description":"Whether this container has a read-only root filesystem. Default is false.","type":"boolean"},"runAsGroup":{"description":"The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","format":"int64","type":"integer"},"runAsNonRoot":{"description":"Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","type":"boolean"},"runAsUser":{"description":"The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","format":"int64","type":"integer"},"seLinuxOptions":{"description":"SELinuxOptions are the labels to be applied to the container","properties":{"level":{"description":"Level is SELinux level label that applies to the container.","type":"string"},"role":{"description":"Role is a SELinux role label that applies to the container.","type":"string"},"type":{"description":"Type is a SELinux type label that applies to the container.","type":"string"},"user":{"description":"User is a SELinux user label that applies to the container.","type":"string"}}}}},"stdin":{"description":"Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.","type":"boolean"},"stdinOnce":{"description":"Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false","type":"boolean"},"terminationMessagePath":{"description":"Optional: Path at which the file to which the container's termination message will be written is mounted into the container's filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.","type":"string"},"terminationMessagePolicy":{"description":"Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated.","type":"string"},"tty":{"description":"Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false.","type":"boolean"},"volumeDevices":{"description":"volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.","items":{"description":"volumeDevice describes a mapping of a raw block device within a container.","properties":{"devicePath":{"description":"devicePath is the path inside of the container that the device will be mapped to.","type":"string"},"name":{"description":"name must match the name of a persistentVolumeClaim in the pod","type":"string"}},"required":["name","devicePath"]},"type":"array"},"volumeMounts":{"description":"Pod volumes to mount into the container's filesystem. Cannot be updated.","items":{"description":"VolumeMount describes a mounting of a Volume within a container.","properties":{"mountPath":{"description":"Path within the container at which the volume should be mounted. Must not contain ':'.","type":"string"},"mountPropagation":{"description":"mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationHostToContainer is used. This field is beta in 1.10.","type":"string"},"name":{"description":"This must match the Name of a Volume.","type":"string"},"readOnly":{"description":"Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false.","type":"boolean"},"subPath":{"description":"Path within the volume from which the container's volume should be mounted. Defaults to \"\" (volume's root).","type":"string"}},"required":["name","mountPath"]},"type":"array"},"workingDir":{"description":"Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.","type":"string"}},"required":["name"]},"type":"array"},"evaluationInterval":{"description":"Interval between consecutive evaluations.","type":"string"},"externalLabels":{"description":"The labels to add to any time series or alerts when communicating with external systems (federation, remote storage, Alertmanager).","type":"object"},"externalUrl":{"description":"The external URL the Prometheus instances will be available under. This is necessary to generate correct URLs. This is necessary if Prometheus is not served from root of a DNS name.","type":"string"},"imagePullSecrets":{"description":"An optional list of references to secrets in the same namespace to use for pulling prometheus and alertmanager images from registries see http://kubernetes.io/docs/user-guide/images#specifying-imagepullsecrets-on-a-pod","items":{"description":"LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"}}},"type":"array"},"listenLocal":{"description":"ListenLocal makes the Prometheus server listen on loopback, so that it does not bind against the Pod IP.","type":"boolean"},"logLevel":{"description":"Log level for Prometheus to be configured with.","type":"string"},"nodeSelector":{"description":"Define which Nodes the Pods are scheduled on.","type":"object"},"paused":{"description":"When a Prometheus deployment is paused, no actions except for deletion will be performed on the underlying objects.","type":"boolean"},"podMetadata":{"description":"ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.","properties":{"annotations":{"description":"Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations","type":"object"},"clusterName":{"description":"The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.","type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"description":"Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.","format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"description":"Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.","items":{"type":"string"},"type":"array"},"generateName":{"description":"GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency","type":"string"},"generation":{"description":"A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.","format":"int64","type":"integer"},"initializers":{"description":"Initializers tracks the progress of initialization.","properties":{"pending":{"description":"Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients.","items":{"description":"Initializer is information about an initializer that has not yet completed.","properties":{"name":{"description":"name of the process that is responsible for initializing this object.","type":"string"}},"required":["name"]},"type":"array"},"result":{"description":"Status is a return value for calls that don't return other objects.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"code":{"description":"Suggested HTTP return code for this status, 0 if not set.","format":"int32","type":"integer"},"details":{"description":"StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.","properties":{"causes":{"description":"The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.","items":{"description":"StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.","properties":{"field":{"description":"The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"","type":"string"},"message":{"description":"A human-readable description of the cause of the error. This field may be presented as-is to a reader.","type":"string"},"reason":{"description":"A machine-readable description of the cause of the error. If this value is empty there is no information available.","type":"string"}}},"type":"array"},"group":{"description":"The group attribute of the resource associated with the status StatusReason.","type":"string"},"kind":{"description":"The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).","type":"string"},"retryAfterSeconds":{"description":"If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.","format":"int32","type":"integer"},"uid":{"description":"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"message":{"description":"A human-readable description of the status of this operation.","type":"string"},"metadata":{"description":"ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.","properties":{"continue":{"description":"continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response.","type":"string"},"resourceVersion":{"description":"String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"selfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"}}},"reason":{"description":"A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.","type":"string"},"status":{"description":"Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status","type":"string"}}}},"required":["pending"]},"labels":{"description":"Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels","type":"object"},"name":{"description":"Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"namespace":{"description":"Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces","type":"string"},"ownerReferences":{"description":"List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.","items":{"description":"OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.","properties":{"apiVersion":{"description":"API version of the referent.","type":"string"},"blockOwnerDeletion":{"description":"If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.","type":"boolean"},"controller":{"description":"If true, this reference points to the managing controller.","type":"boolean"},"kind":{"description":"Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"uid":{"description":"UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array"},"resourceVersion":{"description":"An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"SelfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"},"uid":{"description":"UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"remoteRead":{"description":"If specified, the remote_read spec. This is an experimental feature, it may change in any upcoming release in a breaking way.","items":{"description":"RemoteReadSpec defines the remote_read configuration for prometheus.","properties":{"basicAuth":{"description":"BasicAuth allow an endpoint to authenticate over basic authentication More info: https://prometheus.io/docs/operating/configuration/#endpoints","properties":{"password":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"username":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]}}},"bearerToken":{"description":"bearer token for remote read.","type":"string"},"bearerTokenFile":{"description":"File to read bearer token for remote read.","type":"string"},"proxyUrl":{"description":"Optional ProxyURL","type":"string"},"readRecent":{"description":"Whether reads should be made for queries for time ranges that the local storage should have complete data for.","type":"boolean"},"remoteTimeout":{"description":"Timeout for requests to the remote read endpoint.","type":"string"},"requiredMatchers":{"description":"An optional list of equality matchers which have to be present in a selector to query the remote read endpoint.","type":"object"},"tlsConfig":{"description":"TLSConfig specifies TLS configuration parameters.","properties":{"caFile":{"description":"The CA cert to use for the targets.","type":"string"},"certFile":{"description":"The client cert file for the targets.","type":"string"},"insecureSkipVerify":{"description":"Disable target certificate validation.","type":"boolean"},"keyFile":{"description":"The client key file for the targets.","type":"string"},"serverName":{"description":"Used to verify the hostname for the targets.","type":"string"}}},"url":{"description":"The URL of the endpoint to send samples to.","type":"string"}},"required":["url"]},"type":"array"},"remoteWrite":{"description":"If specified, the remote_write spec. This is an experimental feature, it may change in any upcoming release in a breaking way.","items":{"description":"RemoteWriteSpec defines the remote_write configuration for prometheus.","properties":{"basicAuth":{"description":"BasicAuth allow an endpoint to authenticate over basic authentication More info: https://prometheus.io/docs/operating/configuration/#endpoints","properties":{"password":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"username":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]}}},"bearerToken":{"description":"File to read bearer token for remote write.","type":"string"},"bearerTokenFile":{"description":"File to read bearer token for remote write.","type":"string"},"proxyUrl":{"description":"Optional ProxyURL","type":"string"},"queueConfig":{"description":"QueueConfig allows the tuning of remote_write queue_config parameters. This object is referenced in the RemoteWriteSpec object.","properties":{"batchSendDeadline":{"description":"BatchSendDeadline is the maximum time a sample will wait in buffer.","type":"string"},"capacity":{"description":"Capacity is the number of samples to buffer per shard before we start dropping them.","format":"int32","type":"integer"},"maxBackoff":{"description":"MaxBackoff is the maximum retry delay.","type":"string"},"maxRetries":{"description":"MaxRetries is the maximum number of times to retry a batch on recoverable errors.","format":"int32","type":"integer"},"maxSamplesPerSend":{"description":"MaxSamplesPerSend is the maximum number of samples per send.","format":"int32","type":"integer"},"maxShards":{"description":"MaxShards is the maximum number of shards, i.e. amount of concurrency.","format":"int32","type":"integer"},"minBackoff":{"description":"MinBackoff is the initial retry delay. Gets doubled for every retry.","type":"string"}}},"remoteTimeout":{"description":"Timeout for requests to the remote write endpoint.","type":"string"},"tlsConfig":{"description":"TLSConfig specifies TLS configuration parameters.","properties":{"caFile":{"description":"The CA cert to use for the targets.","type":"string"},"certFile":{"description":"The client cert file for the targets.","type":"string"},"insecureSkipVerify":{"description":"Disable target certificate validation.","type":"boolean"},"keyFile":{"description":"The client key file for the targets.","type":"string"},"serverName":{"description":"Used to verify the hostname for the targets.","type":"string"}}},"url":{"description":"The URL of the endpoint to send samples to.","type":"string"},"writeRelabelConfigs":{"description":"The list of remote write relabel configurations.","items":{"description":"RelabelConfig allows dynamic rewriting of the label set, being applied to samples before ingestion. It defines `\u003cmetric_relabel_configs\u003e`-section of Prometheus configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs","properties":{"action":{"description":"Action to perform based on regex matching. Default is 'replace'","type":"string"},"modulus":{"description":"Modulus to take of the hash of the source label values.","format":"int64","type":"integer"},"regex":{"description":"Regular expression against which the extracted value is matched. defailt is '(.*)'","type":"string"},"replacement":{"description":"Replacement value against which a regex replace is performed if the regular expression matches. Regex capture groups are available. Default is '$1'","type":"string"},"separator":{"description":"Separator placed between concatenated source label values. default is ';'.","type":"string"},"sourceLabels":{"description":"The source labels select values from existing labels. Their content is concatenated using the configured separator and matched against the configured regular expression for the replace, keep, and drop actions.","items":{"type":"string"},"type":"array"},"targetLabel":{"description":"Label to which the resulting value is written in a replace action. It is mandatory for replace actions. Regex capture groups are available.","type":"string"}}},"type":"array"}},"required":["url"]},"type":"array"},"replicas":{"description":"Number of instances to deploy for a Prometheus deployment.","format":"int32","type":"integer"},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"retention":{"description":"Time duration Prometheus shall retain data for.","type":"string"},"routePrefix":{"description":"The route prefix Prometheus registers HTTP handlers for. This is useful, if using ExternalURL and a proxy is rewriting HTTP routes of a request, and the actual ExternalURL is still true, but the server serves requests under a different route prefix. For example for use with `kubectl proxy`.","type":"string"},"ruleNamespaceSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"ruleSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"scrapeInterval":{"description":"Interval between consecutive scrapes.","type":"string"},"secrets":{"description":"Secrets is a list of Secrets in the same namespace as the Prometheus object, which shall be mounted into the Prometheus Pods. The Secrets are mounted into /etc/prometheus/secrets/\u003csecret-name\u003e. Secrets changes after initial creation of a Prometheus object are not reflected in the running Pods. To change the secrets mounted into the Prometheus Pods, the object must be deleted and recreated with the new list of secrets.","items":{"type":"string"},"type":"array"},"securityContext":{"description":"PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.","properties":{"fsGroup":{"description":"A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod:\n\n1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw----\n\nIf unset, the Kubelet will not modify the ownership and permissions of any volume.","format":"int64","type":"integer"},"runAsGroup":{"description":"The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.","format":"int64","type":"integer"},"runAsNonRoot":{"description":"Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","type":"boolean"},"runAsUser":{"description":"The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.","format":"int64","type":"integer"},"seLinuxOptions":{"description":"SELinuxOptions are the labels to be applied to the container","properties":{"level":{"description":"Level is SELinux level label that applies to the container.","type":"string"},"role":{"description":"Role is a SELinux role label that applies to the container.","type":"string"},"type":{"description":"Type is a SELinux type label that applies to the container.","type":"string"},"user":{"description":"User is a SELinux user label that applies to the container.","type":"string"}}},"supplementalGroups":{"description":"A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container.","items":{"format":"int64","type":"integer"},"type":"array"}}},"serviceAccountName":{"description":"ServiceAccountName is the name of the ServiceAccount to use to run the Prometheus Pods.","type":"string"},"serviceMonitorNamespaceSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"serviceMonitorSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"storage":{"description":"StorageSpec defines the configured storage for a group Prometheus servers.","properties":{"class":{"description":"Name of the StorageClass to use when requesting storage provisioning. More info: https://kubernetes.io/docs/user-guide/persistent-volumes/#storageclasses DEPRECATED","type":"string"},"emptyDir":{"description":"Represents an empty directory for a pod. Empty directory volumes support ownership management and SELinux relabeling.","properties":{"medium":{"description":"What type of storage medium should back this directory. The default is \"\" which means to use the node's default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir","type":"string"},"sizeLimit":{}}},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"selector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"volumeClaimTemplate":{"description":"PersistentVolumeClaim is a user's request for and claim to a persistent volume","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"metadata":{"description":"ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.","properties":{"annotations":{"description":"Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations","type":"object"},"clusterName":{"description":"The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.","type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"description":"Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.","format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"description":"Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.","items":{"type":"string"},"type":"array"},"generateName":{"description":"GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency","type":"string"},"generation":{"description":"A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.","format":"int64","type":"integer"},"initializers":{"description":"Initializers tracks the progress of initialization.","properties":{"pending":{"description":"Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients.","items":{"description":"Initializer is information about an initializer that has not yet completed.","properties":{"name":{"description":"name of the process that is responsible for initializing this object.","type":"string"}},"required":["name"]},"type":"array"},"result":{"description":"Status is a return value for calls that don't return other objects.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"code":{"description":"Suggested HTTP return code for this status, 0 if not set.","format":"int32","type":"integer"},"details":{"description":"StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.","properties":{"causes":{"description":"The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.","items":{"description":"StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.","properties":{"field":{"description":"The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"","type":"string"},"message":{"description":"A human-readable description of the cause of the error. This field may be presented as-is to a reader.","type":"string"},"reason":{"description":"A machine-readable description of the cause of the error. If this value is empty there is no information available.","type":"string"}}},"type":"array"},"group":{"description":"The group attribute of the resource associated with the status StatusReason.","type":"string"},"kind":{"description":"The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).","type":"string"},"retryAfterSeconds":{"description":"If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.","format":"int32","type":"integer"},"uid":{"description":"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"message":{"description":"A human-readable description of the status of this operation.","type":"string"},"metadata":{"description":"ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.","properties":{"continue":{"description":"continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response.","type":"string"},"resourceVersion":{"description":"String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"selfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"}}},"reason":{"description":"A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.","type":"string"},"status":{"description":"Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status","type":"string"}}}},"required":["pending"]},"labels":{"description":"Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels","type":"object"},"name":{"description":"Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"namespace":{"description":"Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces","type":"string"},"ownerReferences":{"description":"List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.","items":{"description":"OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.","properties":{"apiVersion":{"description":"API version of the referent.","type":"string"},"blockOwnerDeletion":{"description":"If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.","type":"boolean"},"controller":{"description":"If true, this reference points to the managing controller.","type":"boolean"},"kind":{"description":"Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"uid":{"description":"UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array"},"resourceVersion":{"description":"An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"SelfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"},"uid":{"description":"UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"spec":{"description":"PersistentVolumeClaimSpec describes the common attributes of storage devices and allows a Source for provider-specific attributes","properties":{"accessModes":{"description":"AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1","items":{"type":"string"},"type":"array"},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"selector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"storageClassName":{"description":"Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1","type":"string"},"volumeMode":{"description":"volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.","type":"string"},"volumeName":{"description":"VolumeName is the binding reference to the PersistentVolume backing this claim.","type":"string"}}},"status":{"description":"PersistentVolumeClaimStatus is the current status of a persistent volume claim.","properties":{"accessModes":{"description":"AccessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1","items":{"type":"string"},"type":"array"},"capacity":{"description":"Represents the actual resources of the underlying volume.","type":"object"},"conditions":{"description":"Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.","items":{"description":"PersistentVolumeClaimCondition contails details about state of pvc","properties":{"lastProbeTime":{"format":"date-time","type":"string"},"lastTransitionTime":{"format":"date-time","type":"string"},"message":{"description":"Human-readable message indicating details about last transition.","type":"string"},"reason":{"description":"Unique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports \"ResizeStarted\" that means the underlying persistent volume is being resized.","type":"string"},"status":{"type":"string"},"type":{"type":"string"}},"required":["type","status"]},"type":"array"},"phase":{"description":"Phase represents the current phase of PersistentVolumeClaim.","type":"string"}}}}}}},"thanos":{"description":"ThanosSpec defines parameters for a Prometheus server within a Thanos deployment.","properties":{"baseImage":{"description":"Thanos base image if other than default.","type":"string"},"gcs":{"description":"ThanosGCSSpec defines parameters for use of Google Cloud Storage (GCS) with Thanos.","properties":{"bucket":{"description":"Google Cloud Storage bucket name for stored blocks. If empty it won't store any block inside Google Cloud Storage.","type":"string"}}},"peers":{"description":"Peers is a DNS name for Thanos to discover peers through.","type":"string"},"s3":{"description":"ThanosSpec defines parameters for of AWS Simple Storage Service (S3) with Thanos. (S3 compatible services apply as well)","properties":{"accessKey":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"bucket":{"description":"S3-Compatible API bucket name for stored blocks.","type":"string"},"endpoint":{"description":"S3-Compatible API endpoint for stored blocks.","type":"string"},"insecure":{"description":"Whether to use an insecure connection with an S3-Compatible API.","type":"boolean"},"secretKey":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"signatureVersion2":{"description":"Whether to use S3 Signature Version 2; otherwise Signature Version 4 will be used.","type":"boolean"}}},"version":{"description":"Version describes the version of Thanos to use.","type":"string"}}},"tolerations":{"description":"If specified, the pod's tolerations.","items":{"description":"The pod this Toleration is attached to tolerates any taint that matches the triple \u003ckey,value,effect\u003e using the matching operator \u003coperator\u003e.","properties":{"effect":{"description":"Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.","type":"string"},"key":{"description":"Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.","type":"string"},"operator":{"description":"Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.","type":"string"},"tolerationSeconds":{"description":"TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.","format":"int64","type":"integer"},"value":{"description":"Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.","type":"string"}}},"type":"array"},"version":{"description":"Version of Prometheus to be deployed.","type":"string"}}},"status":{"description":"Most recent observed status of the Prometheus cluster. Read-only. Not included when requesting from the apiserver, only from the Prometheus Operator API itself. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status","properties":{"availableReplicas":{"description":"Total number of available pods (ready for at least minReadySeconds) targeted by this Prometheus deployment.","format":"int32","type":"integer"},"paused":{"description":"Represents whether any actions on the underlaying managed objects are being performed. Only delete actions will be performed.","type":"boolean"},"replicas":{"description":"Total number of non-terminated pods targeted by this Prometheus deployment (their labels match the selector).","format":"int32","type":"integer"},"unavailableReplicas":{"description":"Total number of unavailable pods targeted by this Prometheus deployment.","format":"int32","type":"integer"},"updatedReplicas":{"description":"Total number of non-terminated pods targeted by this Prometheus deployment that have the desired version spec.","format":"int32","type":"integer"}},"required":["paused","replicas","updatedReplicas","availableReplicas","unavailableReplicas"]}},"required":["spec"]}},"version":"v1"},"status":{"acceptedNames":{"kind":"","plural":""},"conditions":null}} \ No newline at end of file +{"apiVersion":"apiextensions.k8s.io/v1beta1","kind":"CustomResourceDefinition","metadata":{"creationTimestamp":null,"name":"prometheuses.monitoring.coreos.com"},"spec":{"group":"monitoring.coreos.com","names":{"kind":"Prometheus","plural":"prometheuses"},"scope":"Namespaced","validation":{"openAPIV3Schema":{"description":"Prometheus defines a Prometheus deployment.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"spec":{"description":"Specification of the desired behavior of the Prometheus cluster. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status","properties":{"additionalAlertManagerConfigs":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"additionalScrapeConfigs":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"affinity":{"description":"Affinity is a group of affinity scheduling rules.","properties":{"nodeAffinity":{"description":"Node affinity is a group of node affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.","items":{"description":"An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).","properties":{"preference":{"description":"A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.","properties":{"matchExpressions":{"description":"A list of node selector requirements by node's labels.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchFields":{"description":"A list of node selector requirements by node's fields.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"}}},"weight":{"description":"Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","preference"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"A node selector represents the union of the results of one or more label queries over a set of nodes; that is, it represents the OR of the selectors represented by the node selector terms.","properties":{"nodeSelectorTerms":{"description":"Required. A list of node selector terms. The terms are ORed.","items":{"description":"A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.","properties":{"matchExpressions":{"description":"A list of node selector requirements by node's labels.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchFields":{"description":"A list of node selector requirements by node's fields.","items":{"description":"A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"The label key that the selector applies to.","type":"string"},"operator":{"description":"Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.","type":"string"},"values":{"description":"An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"}}},"type":"array"}},"required":["nodeSelectorTerms"]}}},"podAffinity":{"description":"Pod affinity is a group of inter pod affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.","items":{"description":"The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)","properties":{"podAffinityTerm":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"weight":{"description":"weight associated with matching the corresponding podAffinityTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","podAffinityTerm"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.","items":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"type":"array"}}},"podAntiAffinity":{"description":"Pod anti affinity is a group of inter pod anti affinity scheduling rules.","properties":{"preferredDuringSchedulingIgnoredDuringExecution":{"description":"The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.","items":{"description":"The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)","properties":{"podAffinityTerm":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"weight":{"description":"weight associated with matching the corresponding podAffinityTerm, in the range 1-100.","format":"int32","type":"integer"}},"required":["weight","podAffinityTerm"]},"type":"array"},"requiredDuringSchedulingIgnoredDuringExecution":{"description":"If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.","items":{"description":"Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key \u003ctopologyKey\u003e matches that of any node on which a pod of the set of pods is running","properties":{"labelSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"namespaces":{"description":"namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means \"this pod's namespace\"","items":{"type":"string"},"type":"array"},"topologyKey":{"description":"This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.","type":"string"}},"required":["topologyKey"]},"type":"array"}}}}},"alerting":{"description":"AlertingSpec defines parameters for alerting configuration of Prometheus servers.","properties":{"alertmanagers":{"description":"AlertmanagerEndpoints Prometheus should fire alerts against.","items":{"description":"AlertmanagerEndpoints defines a selection of a single Endpoints object containing alertmanager IPs to fire alerts against.","properties":{"bearerTokenFile":{"description":"BearerTokenFile to read from filesystem to use when authenticating to Alertmanager.","type":"string"},"name":{"description":"Name of Endpoints object in Namespace.","type":"string"},"namespace":{"description":"Namespace of Endpoints object.","type":"string"},"pathPrefix":{"description":"Prefix for the HTTP path alerts are pushed to.","type":"string"},"port":{},"scheme":{"description":"Scheme to use when firing alerts.","type":"string"},"tlsConfig":{"description":"TLSConfig specifies TLS configuration parameters.","properties":{"caFile":{"description":"The CA cert to use for the targets.","type":"string"},"certFile":{"description":"The client cert file for the targets.","type":"string"},"insecureSkipVerify":{"description":"Disable target certificate validation.","type":"boolean"},"keyFile":{"description":"The client key file for the targets.","type":"string"},"serverName":{"description":"Used to verify the hostname for the targets.","type":"string"}}}},"required":["namespace","name","port"]},"type":"array"}},"required":["alertmanagers"]},"baseImage":{"description":"Base image to use for a Prometheus deployment.","type":"string"},"containers":{"description":"Containers allows injecting additional containers. This is meant to allow adding an authentication proxy to a Prometheus pod.","items":{"description":"A single application container that you want to run within a pod.","properties":{"args":{"description":"Arguments to the entrypoint. The docker image's CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell","items":{"type":"string"},"type":"array"},"command":{"description":"Entrypoint array. Not executed within a shell. The docker image's ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container's environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell","items":{"type":"string"},"type":"array"},"env":{"description":"List of environment variables to set in the container. Cannot be updated.","items":{"description":"EnvVar represents an environment variable present in a Container.","properties":{"name":{"description":"Name of the environment variable. Must be a C_IDENTIFIER.","type":"string"},"value":{"description":"Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to \"\".","type":"string"},"valueFrom":{"description":"EnvVarSource represents a source for the value of an EnvVar.","properties":{"configMapKeyRef":{"description":"Selects a key from a ConfigMap.","properties":{"key":{"description":"The key to select.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the ConfigMap or it's key must be defined","type":"boolean"}},"required":["key"]},"fieldRef":{"description":"ObjectFieldSelector selects an APIVersioned field of an object.","properties":{"apiVersion":{"description":"Version of the schema the FieldPath is written in terms of, defaults to \"v1\".","type":"string"},"fieldPath":{"description":"Path of the field to select in the specified API version.","type":"string"}},"required":["fieldPath"]},"resourceFieldRef":{"description":"ResourceFieldSelector represents container resources (cpu, memory) and their output format","properties":{"containerName":{"description":"Container name: required for volumes, optional for env vars","type":"string"},"divisor":{},"resource":{"description":"Required: resource to select","type":"string"}},"required":["resource"]},"secretKeyRef":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]}}}},"required":["name"]},"type":"array"},"envFrom":{"description":"List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.","items":{"description":"EnvFromSource represents the source of a set of ConfigMaps","properties":{"configMapRef":{"description":"ConfigMapEnvSource selects a ConfigMap to populate the environment variables with.\n\nThe contents of the target ConfigMap's Data field will represent the key-value pairs as environment variables.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the ConfigMap must be defined","type":"boolean"}}},"prefix":{"description":"An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.","type":"string"},"secretRef":{"description":"SecretEnvSource selects a Secret to populate the environment variables with.\n\nThe contents of the target Secret's Data field will represent the key-value pairs as environment variables.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret must be defined","type":"boolean"}}}}},"type":"array"},"image":{"description":"Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.","type":"string"},"imagePullPolicy":{"description":"Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images","type":"string"},"lifecycle":{"description":"Lifecycle describes actions that the management system should take in response to container lifecycle events. For the PostStart and PreStop lifecycle handlers, management of the container blocks until the action is complete, unless the container process fails, in which case the handler is aborted.","properties":{"postStart":{"description":"Handler defines a specific action that should be taken","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]}}},"preStop":{"description":"Handler defines a specific action that should be taken","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]}}}}},"livenessProbe":{"description":"Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"failureThreshold":{"description":"Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.","format":"int32","type":"integer"},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"initialDelaySeconds":{"description":"Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"},"periodSeconds":{"description":"How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.","format":"int32","type":"integer"},"successThreshold":{"description":"Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness. Minimum value is 1.","format":"int32","type":"integer"},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]},"timeoutSeconds":{"description":"Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"}}},"name":{"description":"Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated.","type":"string"},"ports":{"description":"List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default \"0.0.0.0\" address inside a container will be accessible from the network. Cannot be updated.","items":{"description":"ContainerPort represents a network port in a single container.","properties":{"containerPort":{"description":"Number of port to expose on the pod's IP address. This must be a valid port number, 0 \u003c x \u003c 65536.","format":"int32","type":"integer"},"hostIP":{"description":"What host IP to bind the external port to.","type":"string"},"hostPort":{"description":"Number of port to expose on the host. If specified, this must be a valid port number, 0 \u003c x \u003c 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.","format":"int32","type":"integer"},"name":{"description":"If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.","type":"string"},"protocol":{"description":"Protocol for port. Must be UDP or TCP. Defaults to \"TCP\".","type":"string"}},"required":["containerPort"]},"type":"array"},"readinessProbe":{"description":"Probe describes a health check to be performed against a container to determine whether it is alive or ready to receive traffic.","properties":{"exec":{"description":"ExecAction describes a \"run in container\" action.","properties":{"command":{"description":"Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy.","items":{"type":"string"},"type":"array"}}},"failureThreshold":{"description":"Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1.","format":"int32","type":"integer"},"httpGet":{"description":"HTTPGetAction describes an action based on HTTP Get requests.","properties":{"host":{"description":"Host name to connect to, defaults to the pod IP. You probably want to set \"Host\" in httpHeaders instead.","type":"string"},"httpHeaders":{"description":"Custom headers to set in the request. HTTP allows repeated headers.","items":{"description":"HTTPHeader describes a custom header to be used in HTTP probes","properties":{"name":{"description":"The header field name","type":"string"},"value":{"description":"The header field value","type":"string"}},"required":["name","value"]},"type":"array"},"path":{"description":"Path to access on the HTTP server.","type":"string"},"port":{},"scheme":{"description":"Scheme to use for connecting to the host. Defaults to HTTP.","type":"string"}},"required":["port"]},"initialDelaySeconds":{"description":"Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"},"periodSeconds":{"description":"How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1.","format":"int32","type":"integer"},"successThreshold":{"description":"Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness. Minimum value is 1.","format":"int32","type":"integer"},"tcpSocket":{"description":"TCPSocketAction describes an action based on opening a socket","properties":{"host":{"description":"Optional: Host name to connect to, defaults to the pod IP.","type":"string"},"port":{}},"required":["port"]},"timeoutSeconds":{"description":"Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes","format":"int32","type":"integer"}}},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"securityContext":{"description":"SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.","properties":{"allowPrivilegeEscalation":{"description":"AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN","type":"boolean"},"capabilities":{"description":"Adds and removes POSIX capabilities from running containers.","properties":{"add":{"description":"Added capabilities","items":{"type":"string"},"type":"array"},"drop":{"description":"Removed capabilities","items":{"type":"string"},"type":"array"}}},"privileged":{"description":"Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false.","type":"boolean"},"readOnlyRootFilesystem":{"description":"Whether this container has a read-only root filesystem. Default is false.","type":"boolean"},"runAsGroup":{"description":"The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","format":"int64","type":"integer"},"runAsNonRoot":{"description":"Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","type":"boolean"},"runAsUser":{"description":"The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","format":"int64","type":"integer"},"seLinuxOptions":{"description":"SELinuxOptions are the labels to be applied to the container","properties":{"level":{"description":"Level is SELinux level label that applies to the container.","type":"string"},"role":{"description":"Role is a SELinux role label that applies to the container.","type":"string"},"type":{"description":"Type is a SELinux type label that applies to the container.","type":"string"},"user":{"description":"User is a SELinux user label that applies to the container.","type":"string"}}}}},"stdin":{"description":"Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false.","type":"boolean"},"stdinOnce":{"description":"Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false","type":"boolean"},"terminationMessagePath":{"description":"Optional: Path at which the file to which the container's termination message will be written is mounted into the container's filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.","type":"string"},"terminationMessagePolicy":{"description":"Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated.","type":"string"},"tty":{"description":"Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false.","type":"boolean"},"volumeDevices":{"description":"volumeDevices is the list of block devices to be used by the container. This is an alpha feature and may change in the future.","items":{"description":"volumeDevice describes a mapping of a raw block device within a container.","properties":{"devicePath":{"description":"devicePath is the path inside of the container that the device will be mapped to.","type":"string"},"name":{"description":"name must match the name of a persistentVolumeClaim in the pod","type":"string"}},"required":["name","devicePath"]},"type":"array"},"volumeMounts":{"description":"Pod volumes to mount into the container's filesystem. Cannot be updated.","items":{"description":"VolumeMount describes a mounting of a Volume within a container.","properties":{"mountPath":{"description":"Path within the container at which the volume should be mounted. Must not contain ':'.","type":"string"},"mountPropagation":{"description":"mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationHostToContainer is used. This field is beta in 1.10.","type":"string"},"name":{"description":"This must match the Name of a Volume.","type":"string"},"readOnly":{"description":"Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false.","type":"boolean"},"subPath":{"description":"Path within the volume from which the container's volume should be mounted. Defaults to \"\" (volume's root).","type":"string"}},"required":["name","mountPath"]},"type":"array"},"workingDir":{"description":"Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated.","type":"string"}},"required":["name"]},"type":"array"},"evaluationInterval":{"description":"Interval between consecutive evaluations.","type":"string"},"externalLabels":{"description":"The labels to add to any time series or alerts when communicating with external systems (federation, remote storage, Alertmanager).","type":"object"},"externalUrl":{"description":"The external URL the Prometheus instances will be available under. This is necessary to generate correct URLs. This is necessary if Prometheus is not served from root of a DNS name.","type":"string"},"imagePullSecrets":{"description":"An optional list of references to secrets in the same namespace to use for pulling prometheus and alertmanager images from registries see http://kubernetes.io/docs/user-guide/images#specifying-imagepullsecrets-on-a-pod","items":{"description":"LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace.","properties":{"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"}}},"type":"array"},"listenLocal":{"description":"ListenLocal makes the Prometheus server listen on loopback, so that it does not bind against the Pod IP.","type":"boolean"},"logLevel":{"description":"Log level for Prometheus to be configured with.","type":"string"},"nodeSelector":{"description":"Define which Nodes the Pods are scheduled on.","type":"object"},"paused":{"description":"When a Prometheus deployment is paused, no actions except for deletion will be performed on the underlying objects.","type":"boolean"},"podMetadata":{"description":"ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.","properties":{"annotations":{"description":"Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations","type":"object"},"clusterName":{"description":"The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.","type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"description":"Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.","format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"description":"Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.","items":{"type":"string"},"type":"array"},"generateName":{"description":"GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency","type":"string"},"generation":{"description":"A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.","format":"int64","type":"integer"},"initializers":{"description":"Initializers tracks the progress of initialization.","properties":{"pending":{"description":"Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients.","items":{"description":"Initializer is information about an initializer that has not yet completed.","properties":{"name":{"description":"name of the process that is responsible for initializing this object.","type":"string"}},"required":["name"]},"type":"array"},"result":{"description":"Status is a return value for calls that don't return other objects.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"code":{"description":"Suggested HTTP return code for this status, 0 if not set.","format":"int32","type":"integer"},"details":{"description":"StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.","properties":{"causes":{"description":"The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.","items":{"description":"StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.","properties":{"field":{"description":"The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"","type":"string"},"message":{"description":"A human-readable description of the cause of the error. This field may be presented as-is to a reader.","type":"string"},"reason":{"description":"A machine-readable description of the cause of the error. If this value is empty there is no information available.","type":"string"}}},"type":"array"},"group":{"description":"The group attribute of the resource associated with the status StatusReason.","type":"string"},"kind":{"description":"The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).","type":"string"},"retryAfterSeconds":{"description":"If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.","format":"int32","type":"integer"},"uid":{"description":"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"message":{"description":"A human-readable description of the status of this operation.","type":"string"},"metadata":{"description":"ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.","properties":{"continue":{"description":"continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response.","type":"string"},"resourceVersion":{"description":"String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"selfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"}}},"reason":{"description":"A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.","type":"string"},"status":{"description":"Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status","type":"string"}}}},"required":["pending"]},"labels":{"description":"Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels","type":"object"},"name":{"description":"Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"namespace":{"description":"Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces","type":"string"},"ownerReferences":{"description":"List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.","items":{"description":"OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.","properties":{"apiVersion":{"description":"API version of the referent.","type":"string"},"blockOwnerDeletion":{"description":"If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.","type":"boolean"},"controller":{"description":"If true, this reference points to the managing controller.","type":"boolean"},"kind":{"description":"Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"uid":{"description":"UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array"},"resourceVersion":{"description":"An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"SelfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"},"uid":{"description":"UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"remoteRead":{"description":"If specified, the remote_read spec. This is an experimental feature, it may change in any upcoming release in a breaking way.","items":{"description":"RemoteReadSpec defines the remote_read configuration for prometheus.","properties":{"basicAuth":{"description":"BasicAuth allow an endpoint to authenticate over basic authentication More info: https://prometheus.io/docs/operating/configuration/#endpoints","properties":{"password":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"username":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]}}},"bearerToken":{"description":"bearer token for remote read.","type":"string"},"bearerTokenFile":{"description":"File to read bearer token for remote read.","type":"string"},"proxyUrl":{"description":"Optional ProxyURL","type":"string"},"readRecent":{"description":"Whether reads should be made for queries for time ranges that the local storage should have complete data for.","type":"boolean"},"remoteTimeout":{"description":"Timeout for requests to the remote read endpoint.","type":"string"},"requiredMatchers":{"description":"An optional list of equality matchers which have to be present in a selector to query the remote read endpoint.","type":"object"},"tlsConfig":{"description":"TLSConfig specifies TLS configuration parameters.","properties":{"caFile":{"description":"The CA cert to use for the targets.","type":"string"},"certFile":{"description":"The client cert file for the targets.","type":"string"},"insecureSkipVerify":{"description":"Disable target certificate validation.","type":"boolean"},"keyFile":{"description":"The client key file for the targets.","type":"string"},"serverName":{"description":"Used to verify the hostname for the targets.","type":"string"}}},"url":{"description":"The URL of the endpoint to send samples to.","type":"string"}},"required":["url"]},"type":"array"},"remoteWrite":{"description":"If specified, the remote_write spec. This is an experimental feature, it may change in any upcoming release in a breaking way.","items":{"description":"RemoteWriteSpec defines the remote_write configuration for prometheus.","properties":{"basicAuth":{"description":"BasicAuth allow an endpoint to authenticate over basic authentication More info: https://prometheus.io/docs/operating/configuration/#endpoints","properties":{"password":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"username":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]}}},"bearerToken":{"description":"File to read bearer token for remote write.","type":"string"},"bearerTokenFile":{"description":"File to read bearer token for remote write.","type":"string"},"proxyUrl":{"description":"Optional ProxyURL","type":"string"},"queueConfig":{"description":"QueueConfig allows the tuning of remote_write queue_config parameters. This object is referenced in the RemoteWriteSpec object.","properties":{"batchSendDeadline":{"description":"BatchSendDeadline is the maximum time a sample will wait in buffer.","type":"string"},"capacity":{"description":"Capacity is the number of samples to buffer per shard before we start dropping them.","format":"int32","type":"integer"},"maxBackoff":{"description":"MaxBackoff is the maximum retry delay.","type":"string"},"maxRetries":{"description":"MaxRetries is the maximum number of times to retry a batch on recoverable errors.","format":"int32","type":"integer"},"maxSamplesPerSend":{"description":"MaxSamplesPerSend is the maximum number of samples per send.","format":"int32","type":"integer"},"maxShards":{"description":"MaxShards is the maximum number of shards, i.e. amount of concurrency.","format":"int32","type":"integer"},"minBackoff":{"description":"MinBackoff is the initial retry delay. Gets doubled for every retry.","type":"string"}}},"remoteTimeout":{"description":"Timeout for requests to the remote write endpoint.","type":"string"},"tlsConfig":{"description":"TLSConfig specifies TLS configuration parameters.","properties":{"caFile":{"description":"The CA cert to use for the targets.","type":"string"},"certFile":{"description":"The client cert file for the targets.","type":"string"},"insecureSkipVerify":{"description":"Disable target certificate validation.","type":"boolean"},"keyFile":{"description":"The client key file for the targets.","type":"string"},"serverName":{"description":"Used to verify the hostname for the targets.","type":"string"}}},"url":{"description":"The URL of the endpoint to send samples to.","type":"string"},"writeRelabelConfigs":{"description":"The list of remote write relabel configurations.","items":{"description":"RelabelConfig allows dynamic rewriting of the label set, being applied to samples before ingestion. It defines `\u003cmetric_relabel_configs\u003e`-section of Prometheus configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs","properties":{"action":{"description":"Action to perform based on regex matching. Default is 'replace'","type":"string"},"modulus":{"description":"Modulus to take of the hash of the source label values.","format":"int64","type":"integer"},"regex":{"description":"Regular expression against which the extracted value is matched. defailt is '(.*)'","type":"string"},"replacement":{"description":"Replacement value against which a regex replace is performed if the regular expression matches. Regex capture groups are available. Default is '$1'","type":"string"},"separator":{"description":"Separator placed between concatenated source label values. default is ';'.","type":"string"},"sourceLabels":{"description":"The source labels select values from existing labels. Their content is concatenated using the configured separator and matched against the configured regular expression for the replace, keep, and drop actions.","items":{"type":"string"},"type":"array"},"targetLabel":{"description":"Label to which the resulting value is written in a replace action. It is mandatory for replace actions. Regex capture groups are available.","type":"string"}}},"type":"array"}},"required":["url"]},"type":"array"},"replicas":{"description":"Number of instances to deploy for a Prometheus deployment.","format":"int32","type":"integer"},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"retention":{"description":"Time duration Prometheus shall retain data for.","type":"string"},"routePrefix":{"description":"The route prefix Prometheus registers HTTP handlers for. This is useful, if using ExternalURL and a proxy is rewriting HTTP routes of a request, and the actual ExternalURL is still true, but the server serves requests under a different route prefix. For example for use with `kubectl proxy`.","type":"string"},"ruleNamespaceSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"ruleSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"scrapeInterval":{"description":"Interval between consecutive scrapes.","type":"string"},"secrets":{"description":"Secrets is a list of Secrets in the same namespace as the Prometheus object, which shall be mounted into the Prometheus Pods. The Secrets are mounted into /etc/prometheus/secrets/\u003csecret-name\u003e. Secrets changes after initial creation of a Prometheus object are not reflected in the running Pods. To change the secrets mounted into the Prometheus Pods, the object must be deleted and recreated with the new list of secrets.","items":{"type":"string"},"type":"array"},"securityContext":{"description":"PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.","properties":{"fsGroup":{"description":"A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod:\n\n1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw----\n\nIf unset, the Kubelet will not modify the ownership and permissions of any volume.","format":"int64","type":"integer"},"runAsGroup":{"description":"The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.","format":"int64","type":"integer"},"runAsNonRoot":{"description":"Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.","type":"boolean"},"runAsUser":{"description":"The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.","format":"int64","type":"integer"},"seLinuxOptions":{"description":"SELinuxOptions are the labels to be applied to the container","properties":{"level":{"description":"Level is SELinux level label that applies to the container.","type":"string"},"role":{"description":"Role is a SELinux role label that applies to the container.","type":"string"},"type":{"description":"Type is a SELinux type label that applies to the container.","type":"string"},"user":{"description":"User is a SELinux user label that applies to the container.","type":"string"}}},"supplementalGroups":{"description":"A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container.","items":{"format":"int64","type":"integer"},"type":"array"},"sysctls":{"description":"Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch.","items":{"description":"Sysctl defines a kernel parameter to be set","properties":{"name":{"description":"Name of a property to set","type":"string"},"value":{"description":"Value of a property to set","type":"string"}},"required":["name","value"]},"type":"array"}}},"serviceAccountName":{"description":"ServiceAccountName is the name of the ServiceAccount to use to run the Prometheus Pods.","type":"string"},"serviceMonitorNamespaceSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"serviceMonitorSelector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"storage":{"description":"StorageSpec defines the configured storage for a group Prometheus servers.","properties":{"class":{"description":"Name of the StorageClass to use when requesting storage provisioning. More info: https://kubernetes.io/docs/user-guide/persistent-volumes/#storageclasses DEPRECATED","type":"string"},"emptyDir":{"description":"Represents an empty directory for a pod. Empty directory volumes support ownership management and SELinux relabeling.","properties":{"medium":{"description":"What type of storage medium should back this directory. The default is \"\" which means to use the node's default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir","type":"string"},"sizeLimit":{}}},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"selector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"volumeClaimTemplate":{"description":"PersistentVolumeClaim is a user's request for and claim to a persistent volume","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"metadata":{"description":"ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.","properties":{"annotations":{"description":"Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations","type":"object"},"clusterName":{"description":"The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.","type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"description":"Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.","format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"description":"Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.","items":{"type":"string"},"type":"array"},"generateName":{"description":"GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency","type":"string"},"generation":{"description":"A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.","format":"int64","type":"integer"},"initializers":{"description":"Initializers tracks the progress of initialization.","properties":{"pending":{"description":"Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients.","items":{"description":"Initializer is information about an initializer that has not yet completed.","properties":{"name":{"description":"name of the process that is responsible for initializing this object.","type":"string"}},"required":["name"]},"type":"array"},"result":{"description":"Status is a return value for calls that don't return other objects.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"code":{"description":"Suggested HTTP return code for this status, 0 if not set.","format":"int32","type":"integer"},"details":{"description":"StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.","properties":{"causes":{"description":"The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.","items":{"description":"StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.","properties":{"field":{"description":"The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"","type":"string"},"message":{"description":"A human-readable description of the cause of the error. This field may be presented as-is to a reader.","type":"string"},"reason":{"description":"A machine-readable description of the cause of the error. If this value is empty there is no information available.","type":"string"}}},"type":"array"},"group":{"description":"The group attribute of the resource associated with the status StatusReason.","type":"string"},"kind":{"description":"The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).","type":"string"},"retryAfterSeconds":{"description":"If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.","format":"int32","type":"integer"},"uid":{"description":"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"message":{"description":"A human-readable description of the status of this operation.","type":"string"},"metadata":{"description":"ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.","properties":{"continue":{"description":"continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response.","type":"string"},"resourceVersion":{"description":"String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"selfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"}}},"reason":{"description":"A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.","type":"string"},"status":{"description":"Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status","type":"string"}}}},"required":["pending"]},"labels":{"description":"Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels","type":"object"},"name":{"description":"Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"namespace":{"description":"Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces","type":"string"},"ownerReferences":{"description":"List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.","items":{"description":"OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.","properties":{"apiVersion":{"description":"API version of the referent.","type":"string"},"blockOwnerDeletion":{"description":"If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.","type":"boolean"},"controller":{"description":"If true, this reference points to the managing controller.","type":"boolean"},"kind":{"description":"Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"uid":{"description":"UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array"},"resourceVersion":{"description":"An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"SelfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"},"uid":{"description":"UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"spec":{"description":"PersistentVolumeClaimSpec describes the common attributes of storage devices and allows a Source for provider-specific attributes","properties":{"accessModes":{"description":"AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1","items":{"type":"string"},"type":"array"},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"limits":{"description":"Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"},"requests":{"description":"Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/","type":"object"}}},"selector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"storageClassName":{"description":"Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1","type":"string"},"volumeMode":{"description":"volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. This is an alpha feature and may change in the future.","type":"string"},"volumeName":{"description":"VolumeName is the binding reference to the PersistentVolume backing this claim.","type":"string"}}},"status":{"description":"PersistentVolumeClaimStatus is the current status of a persistent volume claim.","properties":{"accessModes":{"description":"AccessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1","items":{"type":"string"},"type":"array"},"capacity":{"description":"Represents the actual resources of the underlying volume.","type":"object"},"conditions":{"description":"Current Condition of persistent volume claim. If underlying persistent volume is being resized then the Condition will be set to 'ResizeStarted'.","items":{"description":"PersistentVolumeClaimCondition contails details about state of pvc","properties":{"lastProbeTime":{"format":"date-time","type":"string"},"lastTransitionTime":{"format":"date-time","type":"string"},"message":{"description":"Human-readable message indicating details about last transition.","type":"string"},"reason":{"description":"Unique, this should be a short, machine understandable string that gives the reason for condition's last transition. If it reports \"ResizeStarted\" that means the underlying persistent volume is being resized.","type":"string"},"status":{"type":"string"},"type":{"type":"string"}},"required":["type","status"]},"type":"array"},"phase":{"description":"Phase represents the current phase of PersistentVolumeClaim.","type":"string"}}}}}}},"thanos":{"description":"ThanosSpec defines parameters for a Prometheus server within a Thanos deployment.","properties":{"baseImage":{"description":"Thanos base image if other than default.","type":"string"},"gcs":{"description":"ThanosGCSSpec defines parameters for use of Google Cloud Storage (GCS) with Thanos.","properties":{"bucket":{"description":"Google Cloud Storage bucket name for stored blocks. If empty it won't store any block inside Google Cloud Storage.","type":"string"}}},"peers":{"description":"Peers is a DNS name for Thanos to discover peers through.","type":"string"},"s3":{"description":"ThanosSpec defines parameters for of AWS Simple Storage Service (S3) with Thanos. (S3 compatible services apply as well)","properties":{"accessKey":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"bucket":{"description":"S3-Compatible API bucket name for stored blocks.","type":"string"},"endpoint":{"description":"S3-Compatible API endpoint for stored blocks.","type":"string"},"insecure":{"description":"Whether to use an insecure connection with an S3-Compatible API.","type":"boolean"},"secretKey":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"signatureVersion2":{"description":"Whether to use S3 Signature Version 2; otherwise Signature Version 4 will be used.","type":"boolean"}}},"version":{"description":"Version describes the version of Thanos to use.","type":"string"}}},"tolerations":{"description":"If specified, the pod's tolerations.","items":{"description":"The pod this Toleration is attached to tolerates any taint that matches the triple \u003ckey,value,effect\u003e using the matching operator \u003coperator\u003e.","properties":{"effect":{"description":"Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.","type":"string"},"key":{"description":"Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.","type":"string"},"operator":{"description":"Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.","type":"string"},"tolerationSeconds":{"description":"TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.","format":"int64","type":"integer"},"value":{"description":"Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.","type":"string"}}},"type":"array"},"version":{"description":"Version of Prometheus to be deployed.","type":"string"}}},"status":{"description":"Most recent observed status of the Prometheus cluster. Read-only. Not included when requesting from the apiserver, only from the Prometheus Operator API itself. More info: https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md#spec-and-status","properties":{"availableReplicas":{"description":"Total number of available pods (ready for at least minReadySeconds) targeted by this Prometheus deployment.","format":"int32","type":"integer"},"paused":{"description":"Represents whether any actions on the underlaying managed objects are being performed. Only delete actions will be performed.","type":"boolean"},"replicas":{"description":"Total number of non-terminated pods targeted by this Prometheus deployment (their labels match the selector).","format":"int32","type":"integer"},"unavailableReplicas":{"description":"Total number of unavailable pods targeted by this Prometheus deployment.","format":"int32","type":"integer"},"updatedReplicas":{"description":"Total number of non-terminated pods targeted by this Prometheus deployment that have the desired version spec.","format":"int32","type":"integer"}},"required":["paused","replicas","updatedReplicas","availableReplicas","unavailableReplicas"]}},"required":["spec"]}},"version":"v1"},"status":{"acceptedNames":{"kind":"","plural":""},"conditions":null,"storedVersions":null}} \ No newline at end of file diff --git a/jsonnet/prometheus-operator/prometheusrule-crd.libsonnet b/jsonnet/prometheus-operator/prometheusrule-crd.libsonnet index 969e81098..87f11b815 100644 --- a/jsonnet/prometheus-operator/prometheusrule-crd.libsonnet +++ b/jsonnet/prometheus-operator/prometheusrule-crd.libsonnet @@ -1 +1 @@ -{"apiVersion":"apiextensions.k8s.io/v1beta1","kind":"CustomResourceDefinition","metadata":{"creationTimestamp":null,"name":"prometheusrules.monitoring.coreos.com"},"spec":{"group":"monitoring.coreos.com","names":{"kind":"PrometheusRule","plural":"prometheusrules"},"scope":"Namespaced","validation":{"openAPIV3Schema":{"description":"PrometheusRule defines alerting rules for a Prometheus instance","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"metadata":{"description":"ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.","properties":{"annotations":{"description":"Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations","type":"object"},"clusterName":{"description":"The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.","type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"description":"Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.","format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"description":"Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.","items":{"type":"string"},"type":"array"},"generateName":{"description":"GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency","type":"string"},"generation":{"description":"A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.","format":"int64","type":"integer"},"initializers":{"description":"Initializers tracks the progress of initialization.","properties":{"pending":{"description":"Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients.","items":{"description":"Initializer is information about an initializer that has not yet completed.","properties":{"name":{"description":"name of the process that is responsible for initializing this object.","type":"string"}},"required":["name"]},"type":"array"},"result":{"description":"Status is a return value for calls that don't return other objects.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"code":{"description":"Suggested HTTP return code for this status, 0 if not set.","format":"int32","type":"integer"},"details":{"description":"StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.","properties":{"causes":{"description":"The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.","items":{"description":"StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.","properties":{"field":{"description":"The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"","type":"string"},"message":{"description":"A human-readable description of the cause of the error. This field may be presented as-is to a reader.","type":"string"},"reason":{"description":"A machine-readable description of the cause of the error. If this value is empty there is no information available.","type":"string"}}},"type":"array"},"group":{"description":"The group attribute of the resource associated with the status StatusReason.","type":"string"},"kind":{"description":"The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).","type":"string"},"retryAfterSeconds":{"description":"If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.","format":"int32","type":"integer"},"uid":{"description":"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"message":{"description":"A human-readable description of the status of this operation.","type":"string"},"metadata":{"description":"ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.","properties":{"continue":{"description":"continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response.","type":"string"},"resourceVersion":{"description":"String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"selfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"}}},"reason":{"description":"A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.","type":"string"},"status":{"description":"Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status","type":"string"}}}},"required":["pending"]},"labels":{"description":"Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels","type":"object"},"name":{"description":"Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"namespace":{"description":"Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces","type":"string"},"ownerReferences":{"description":"List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.","items":{"description":"OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.","properties":{"apiVersion":{"description":"API version of the referent.","type":"string"},"blockOwnerDeletion":{"description":"If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.","type":"boolean"},"controller":{"description":"If true, this reference points to the managing controller.","type":"boolean"},"kind":{"description":"Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"uid":{"description":"UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array"},"resourceVersion":{"description":"An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"SelfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"},"uid":{"description":"UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"spec":{"description":"PrometheusRuleSpec contains specification parameters for a Rule.","properties":{"groups":{"description":"Content of Prometheus rule file","items":{"description":"RuleGroup is a list of sequentially evaluated recording and alerting rules.","properties":{"interval":{"type":"string"},"name":{"type":"string"},"rules":{"items":{"description":"Rule describes an alerting or recording rule.","properties":{"alert":{"type":"string"},"annotations":{"type":"object"},"expr":{"type":"string"},"for":{"type":"string"},"labels":{"type":"object"},"record":{"type":"string"}},"required":["expr"]},"type":"array"}},"required":["name","rules"]},"type":"array"}}}},"required":["spec"]}},"version":"v1"},"status":{"acceptedNames":{"kind":"","plural":""},"conditions":null}} \ No newline at end of file +{"apiVersion":"apiextensions.k8s.io/v1beta1","kind":"CustomResourceDefinition","metadata":{"creationTimestamp":null,"name":"prometheusrules.monitoring.coreos.com"},"spec":{"group":"monitoring.coreos.com","names":{"kind":"PrometheusRule","plural":"prometheusrules"},"scope":"Namespaced","validation":{"openAPIV3Schema":{"description":"PrometheusRule defines alerting rules for a Prometheus instance","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"metadata":{"description":"ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.","properties":{"annotations":{"description":"Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations","type":"object"},"clusterName":{"description":"The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.","type":"string"},"creationTimestamp":{"format":"date-time","type":"string"},"deletionGracePeriodSeconds":{"description":"Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.","format":"int64","type":"integer"},"deletionTimestamp":{"format":"date-time","type":"string"},"finalizers":{"description":"Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.","items":{"type":"string"},"type":"array"},"generateName":{"description":"GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency","type":"string"},"generation":{"description":"A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.","format":"int64","type":"integer"},"initializers":{"description":"Initializers tracks the progress of initialization.","properties":{"pending":{"description":"Pending is a list of initializers that must execute in order before this object is visible. When the last pending initializer is removed, and no failing result is set, the initializers struct will be set to nil and the object is considered as initialized and visible to all clients.","items":{"description":"Initializer is information about an initializer that has not yet completed.","properties":{"name":{"description":"name of the process that is responsible for initializing this object.","type":"string"}},"required":["name"]},"type":"array"},"result":{"description":"Status is a return value for calls that don't return other objects.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"code":{"description":"Suggested HTTP return code for this status, 0 if not set.","format":"int32","type":"integer"},"details":{"description":"StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.","properties":{"causes":{"description":"The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.","items":{"description":"StatusCause provides more information about an api.Status failure, including cases when multiple errors are encountered.","properties":{"field":{"description":"The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional.\n\nExamples:\n \"name\" - the field \"name\" on the current resource\n \"items[0].name\" - the field \"name\" on the first array entry in \"items\"","type":"string"},"message":{"description":"A human-readable description of the cause of the error. This field may be presented as-is to a reader.","type":"string"},"reason":{"description":"A machine-readable description of the cause of the error. If this value is empty there is no information available.","type":"string"}}},"type":"array"},"group":{"description":"The group attribute of the resource associated with the status StatusReason.","type":"string"},"kind":{"description":"The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).","type":"string"},"retryAfterSeconds":{"description":"If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action.","format":"int32","type":"integer"},"uid":{"description":"UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"message":{"description":"A human-readable description of the status of this operation.","type":"string"},"metadata":{"description":"ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.","properties":{"continue":{"description":"continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response.","type":"string"},"resourceVersion":{"description":"String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"selfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"}}},"reason":{"description":"A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.","type":"string"},"status":{"description":"Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status","type":"string"}}}},"required":["pending"]},"labels":{"description":"Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels","type":"object"},"name":{"description":"Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"namespace":{"description":"Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces","type":"string"},"ownerReferences":{"description":"List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.","items":{"description":"OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.","properties":{"apiVersion":{"description":"API version of the referent.","type":"string"},"blockOwnerDeletion":{"description":"If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.","type":"boolean"},"controller":{"description":"If true, this reference points to the managing controller.","type":"boolean"},"kind":{"description":"Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"name":{"description":"Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names","type":"string"},"uid":{"description":"UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}},"required":["apiVersion","kind","name","uid"]},"type":"array"},"resourceVersion":{"description":"An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency","type":"string"},"selfLink":{"description":"SelfLink is a URL representing this object. Populated by the system. Read-only.","type":"string"},"uid":{"description":"UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids","type":"string"}}},"spec":{"description":"PrometheusRuleSpec contains specification parameters for a Rule.","properties":{"groups":{"description":"Content of Prometheus rule file","items":{"description":"RuleGroup is a list of sequentially evaluated recording and alerting rules.","properties":{"interval":{"type":"string"},"name":{"type":"string"},"rules":{"items":{"description":"Rule describes an alerting or recording rule.","properties":{"alert":{"type":"string"},"annotations":{"type":"object"},"expr":{"type":"string"},"for":{"type":"string"},"labels":{"type":"object"},"record":{"type":"string"}},"required":["expr"]},"type":"array"}},"required":["name","rules"]},"type":"array"}}}},"required":["spec"]}},"version":"v1"},"status":{"acceptedNames":{"kind":"","plural":""},"conditions":null,"storedVersions":null}} \ No newline at end of file diff --git a/jsonnet/prometheus-operator/servicemonitor-crd.libsonnet b/jsonnet/prometheus-operator/servicemonitor-crd.libsonnet index 94a82be0e..6e68935b7 100644 --- a/jsonnet/prometheus-operator/servicemonitor-crd.libsonnet +++ b/jsonnet/prometheus-operator/servicemonitor-crd.libsonnet @@ -1 +1 @@ -{"apiVersion":"apiextensions.k8s.io/v1beta1","kind":"CustomResourceDefinition","metadata":{"creationTimestamp":null,"name":"servicemonitors.monitoring.coreos.com"},"spec":{"group":"monitoring.coreos.com","names":{"kind":"ServiceMonitor","plural":"servicemonitors"},"scope":"Namespaced","validation":{"openAPIV3Schema":{"description":"ServiceMonitor defines monitoring for a set of services.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"spec":{"description":"ServiceMonitorSpec contains specification parameters for a ServiceMonitor.","properties":{"endpoints":{"description":"A list of endpoints allowed as part of this ServiceMonitor.","items":{"description":"Endpoint defines a scrapeable endpoint serving Prometheus metrics.","properties":{"basicAuth":{"description":"BasicAuth allow an endpoint to authenticate over basic authentication More info: https://prometheus.io/docs/operating/configuration/#endpoints","properties":{"password":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"username":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]}}},"bearerTokenFile":{"description":"File to read bearer token for scraping targets.","type":"string"},"honorLabels":{"description":"HonorLabels chooses the metric's labels on collisions with target labels.","type":"boolean"},"interval":{"description":"Interval at which metrics should be scraped","type":"string"},"metricRelabelings":{"description":"MetricRelabelConfigs to apply to samples before ingestion.","items":{"description":"RelabelConfig allows dynamic rewriting of the label set, being applied to samples before ingestion. It defines `\u003cmetric_relabel_configs\u003e`-section of Prometheus configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs","properties":{"action":{"description":"Action to perform based on regex matching. Default is 'replace'","type":"string"},"modulus":{"description":"Modulus to take of the hash of the source label values.","format":"int64","type":"integer"},"regex":{"description":"Regular expression against which the extracted value is matched. defailt is '(.*)'","type":"string"},"replacement":{"description":"Replacement value against which a regex replace is performed if the regular expression matches. Regex capture groups are available. Default is '$1'","type":"string"},"separator":{"description":"Separator placed between concatenated source label values. default is ';'.","type":"string"},"sourceLabels":{"description":"The source labels select values from existing labels. Their content is concatenated using the configured separator and matched against the configured regular expression for the replace, keep, and drop actions.","items":{"type":"string"},"type":"array"},"targetLabel":{"description":"Label to which the resulting value is written in a replace action. It is mandatory for replace actions. Regex capture groups are available.","type":"string"}}},"type":"array"},"params":{"description":"Optional HTTP URL parameters","type":"object"},"path":{"description":"HTTP path to scrape for metrics.","type":"string"},"port":{"description":"Name of the service port this endpoint refers to. Mutually exclusive with targetPort.","type":"string"},"proxyUrl":{"description":"ProxyURL eg http://proxyserver:2195 Directs scrapes to proxy through this endpoint.","type":"string"},"scheme":{"description":"HTTP scheme to use for scraping.","type":"string"},"scrapeTimeout":{"description":"Timeout after which the scrape is ended","type":"string"},"targetPort":{},"tlsConfig":{"description":"TLSConfig specifies TLS configuration parameters.","properties":{"caFile":{"description":"The CA cert to use for the targets.","type":"string"},"certFile":{"description":"The client cert file for the targets.","type":"string"},"insecureSkipVerify":{"description":"Disable target certificate validation.","type":"boolean"},"keyFile":{"description":"The client key file for the targets.","type":"string"},"serverName":{"description":"Used to verify the hostname for the targets.","type":"string"}}}}},"type":"array"},"jobLabel":{"description":"The label to use to retrieve the job name from.","type":"string"},"namespaceSelector":{"description":"A selector for selecting namespaces either selecting all namespaces or a list of namespaces.","properties":{"any":{"description":"Boolean describing whether all namespaces are selected in contrast to a list restricting them.","type":"boolean"},"matchNames":{"description":"List of namespace names.","items":{"type":"string"},"type":"array"}}},"selector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"targetLabels":{"description":"TargetLabels transfers labels on the Kubernetes Service onto the target.","items":{"type":"string"},"type":"array"}},"required":["endpoints","selector"]}},"required":["spec"]}},"version":"v1"},"status":{"acceptedNames":{"kind":"","plural":""},"conditions":null}} \ No newline at end of file +{"apiVersion":"apiextensions.k8s.io/v1beta1","kind":"CustomResourceDefinition","metadata":{"creationTimestamp":null,"name":"servicemonitors.monitoring.coreos.com"},"spec":{"group":"monitoring.coreos.com","names":{"kind":"ServiceMonitor","plural":"servicemonitors"},"scope":"Namespaced","validation":{"openAPIV3Schema":{"description":"ServiceMonitor defines monitoring for a set of services.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds","type":"string"},"spec":{"description":"ServiceMonitorSpec contains specification parameters for a ServiceMonitor.","properties":{"endpoints":{"description":"A list of endpoints allowed as part of this ServiceMonitor.","items":{"description":"Endpoint defines a scrapeable endpoint serving Prometheus metrics.","properties":{"basicAuth":{"description":"BasicAuth allow an endpoint to authenticate over basic authentication More info: https://prometheus.io/docs/operating/configuration/#endpoints","properties":{"password":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]},"username":{"description":"SecretKeySelector selects a key of a Secret.","properties":{"key":{"description":"The key of the secret to select from. Must be a valid secret key.","type":"string"},"name":{"description":"Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names","type":"string"},"optional":{"description":"Specify whether the Secret or it's key must be defined","type":"boolean"}},"required":["key"]}}},"bearerTokenFile":{"description":"File to read bearer token for scraping targets.","type":"string"},"honorLabels":{"description":"HonorLabels chooses the metric's labels on collisions with target labels.","type":"boolean"},"interval":{"description":"Interval at which metrics should be scraped","type":"string"},"metricRelabelings":{"description":"MetricRelabelConfigs to apply to samples before ingestion.","items":{"description":"RelabelConfig allows dynamic rewriting of the label set, being applied to samples before ingestion. It defines `\u003cmetric_relabel_configs\u003e`-section of Prometheus configuration. More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs","properties":{"action":{"description":"Action to perform based on regex matching. Default is 'replace'","type":"string"},"modulus":{"description":"Modulus to take of the hash of the source label values.","format":"int64","type":"integer"},"regex":{"description":"Regular expression against which the extracted value is matched. defailt is '(.*)'","type":"string"},"replacement":{"description":"Replacement value against which a regex replace is performed if the regular expression matches. Regex capture groups are available. Default is '$1'","type":"string"},"separator":{"description":"Separator placed between concatenated source label values. default is ';'.","type":"string"},"sourceLabels":{"description":"The source labels select values from existing labels. Their content is concatenated using the configured separator and matched against the configured regular expression for the replace, keep, and drop actions.","items":{"type":"string"},"type":"array"},"targetLabel":{"description":"Label to which the resulting value is written in a replace action. It is mandatory for replace actions. Regex capture groups are available.","type":"string"}}},"type":"array"},"params":{"description":"Optional HTTP URL parameters","type":"object"},"path":{"description":"HTTP path to scrape for metrics.","type":"string"},"port":{"description":"Name of the service port this endpoint refers to. Mutually exclusive with targetPort.","type":"string"},"proxyUrl":{"description":"ProxyURL eg http://proxyserver:2195 Directs scrapes to proxy through this endpoint.","type":"string"},"scheme":{"description":"HTTP scheme to use for scraping.","type":"string"},"scrapeTimeout":{"description":"Timeout after which the scrape is ended","type":"string"},"targetPort":{},"tlsConfig":{"description":"TLSConfig specifies TLS configuration parameters.","properties":{"caFile":{"description":"The CA cert to use for the targets.","type":"string"},"certFile":{"description":"The client cert file for the targets.","type":"string"},"insecureSkipVerify":{"description":"Disable target certificate validation.","type":"boolean"},"keyFile":{"description":"The client key file for the targets.","type":"string"},"serverName":{"description":"Used to verify the hostname for the targets.","type":"string"}}}}},"type":"array"},"jobLabel":{"description":"The label to use to retrieve the job name from.","type":"string"},"namespaceSelector":{"description":"A selector for selecting namespaces either selecting all namespaces or a list of namespaces.","properties":{"any":{"description":"Boolean describing whether all namespaces are selected in contrast to a list restricting them.","type":"boolean"},"matchNames":{"description":"List of namespace names.","items":{"type":"string"},"type":"array"}}},"selector":{"description":"A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects.","properties":{"matchExpressions":{"description":"matchExpressions is a list of label selector requirements. The requirements are ANDed.","items":{"description":"A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.","properties":{"key":{"description":"key is the label key that the selector applies to.","type":"string"},"operator":{"description":"operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.","type":"string"},"values":{"description":"values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.","items":{"type":"string"},"type":"array"}},"required":["key","operator"]},"type":"array"},"matchLabels":{"description":"matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is \"key\", the operator is \"In\", and the values array contains only \"value\". The requirements are ANDed.","type":"object"}}},"targetLabels":{"description":"TargetLabels transfers labels on the Kubernetes Service onto the target.","items":{"type":"string"},"type":"array"}},"required":["endpoints","selector"]}},"required":["spec"]}},"version":"v1"},"status":{"acceptedNames":{"kind":"","plural":""},"conditions":null,"storedVersions":null}} \ No newline at end of file diff --git a/pkg/client/monitoring/v1/alertmanager.go b/pkg/client/monitoring/v1/alertmanager.go index 8030fdc35..d2c80f132 100644 --- a/pkg/client/monitoring/v1/alertmanager.go +++ b/pkg/client/monitoring/v1/alertmanager.go @@ -23,7 +23,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/dynamic" + dynamic "k8s.io/client-go/deprecated-dynamic" "k8s.io/client-go/rest" ) diff --git a/pkg/client/monitoring/v1/client.go b/pkg/client/monitoring/v1/client.go index f655108e5..2c249a61f 100644 --- a/pkg/client/monitoring/v1/client.go +++ b/pkg/client/monitoring/v1/client.go @@ -20,7 +20,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/client-go/dynamic" + dynamic "k8s.io/client-go/deprecated-dynamic" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" ) @@ -139,7 +139,10 @@ func NewForConfig(crdKinds *CrdKinds, apiGroup string, c *rest.Config) (*Monitor return nil, err } - dynamicClient, err := dynamic.NewClient(&config) + dynamicClient, err := dynamic.NewClient(&config, schema.GroupVersion{ + Group: apiGroup, + Version: Version, + }) if err != nil { return nil, err } diff --git a/pkg/client/monitoring/v1/openapi_generated.go b/pkg/client/monitoring/v1/openapi_generated.go index abc2800ec..2105527a3 100644 --- a/pkg/client/monitoring/v1/openapi_generated.go +++ b/pkg/client/monitoring/v1/openapi_generated.go @@ -2324,6 +2324,45 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Dependencies: []string{ "k8s.io/api/core/v1.LocalObjectReference"}, }, + "k8s.io/api/core/v1.CinderPersistentVolumeSource": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. The volume must also be in the same region as the kubelet. Cinder volumes support ownership management and SELinux relabeling.", + Properties: map[string]spec.Schema{ + "volumeID": { + SchemaProps: spec.SchemaProps{ + Description: "volume id used to identify the volume in cinder More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", + Type: []string{"string"}, + Format: "", + }, + }, + "fsType": { + SchemaProps: spec.SchemaProps{ + Description: "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", + Type: []string{"string"}, + Format: "", + }, + }, + "readOnly": { + SchemaProps: spec.SchemaProps{ + Description: "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", + Type: []string{"boolean"}, + Format: "", + }, + }, + "secretRef": { + SchemaProps: spec.SchemaProps{ + Description: "Optional: points to a secret object containing parameters used to connect to OpenStack.", + Ref: ref("k8s.io/api/core/v1.SecretReference"), + }, + }, + }, + Required: []string{"volumeID"}, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.SecretReference"}, + }, "k8s.io/api/core/v1.CinderVolumeSource": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -2350,11 +2389,18 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Format: "", }, }, + "secretRef": { + SchemaProps: spec.SchemaProps{ + Description: "Optional: points to a secret object containing parameters used to connect to OpenStack.", + Ref: ref("k8s.io/api/core/v1.LocalObjectReference"), + }, + }, }, Required: []string{"volumeID"}, }, }, - Dependencies: []string{}, + Dependencies: []string{ + "k8s.io/api/core/v1.LocalObjectReference"}, }, "k8s.io/api/core/v1.ClientIPConfig": { Schema: spec.Schema{ @@ -2667,6 +2713,52 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Dependencies: []string{ "k8s.io/api/core/v1.ConfigMap", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, }, + "k8s.io/api/core/v1.ConfigMapNodeConfigSource": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node.", + Properties: map[string]spec.Schema{ + "namespace": { + SchemaProps: spec.SchemaProps{ + Description: "Namespace is the metadata.namespace of the referenced ConfigMap. This field is required in all cases.", + Type: []string{"string"}, + Format: "", + }, + }, + "name": { + SchemaProps: spec.SchemaProps{ + Description: "Name is the metadata.name of the referenced ConfigMap. This field is required in all cases.", + Type: []string{"string"}, + Format: "", + }, + }, + "uid": { + SchemaProps: spec.SchemaProps{ + Description: "UID is the metadata.UID of the referenced ConfigMap. This field is forbidden in Node.Spec, and required in Node.Status.", + Type: []string{"string"}, + Format: "", + }, + }, + "resourceVersion": { + SchemaProps: spec.SchemaProps{ + Description: "ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap. This field is forbidden in Node.Spec, and required in Node.Status.", + Type: []string{"string"}, + Format: "", + }, + }, + "kubeletConfigKey": { + SchemaProps: spec.SchemaProps{ + Description: "KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure This field is required in all cases.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"namespace", "name", "kubeletConfigKey"}, + }, + }, + Dependencies: []string{}, + }, "k8s.io/api/core/v1.ConfigMapProjection": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -4165,7 +4257,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/core/v1.GitRepoVolumeSource": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "Represents a volume that is populated with the contents of a git repository. Git repo volumes do not support ownership management. Git repo volumes support SELinux relabeling.", + Description: "Represents a volume that is populated with the contents of a git repository. Git repo volumes do not support ownership management. Git repo volumes support SELinux relabeling.\n\nDEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container.", Properties: map[string]spec.Schema{ "repository": { SchemaProps: spec.SchemaProps{ @@ -4936,11 +5028,11 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/core/v1.LocalVolumeSource": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "Local represents directly-attached storage with node affinity", + Description: "Local represents directly-attached storage with node affinity (Beta feature)", Properties: map[string]spec.Schema{ "path": { SchemaProps: spec.SchemaProps{ - Description: "The full path to the volume on the node For alpha, this path must be a directory Once block as a source is supported, then this path can point to a block device", + Description: "The full path to the volume on the node. It can be either a directory or block device (disk, partition, ...). Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. Block devices can be represented only by VolumeMode=Block, which also requires the BlockVolume alpha feature gate to be enabled.", Type: []string{"string"}, Format: "", }, @@ -5267,30 +5359,53 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA SchemaProps: spec.SchemaProps{ Description: "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.", Properties: map[string]spec.Schema{ - "kind": { + "configMap": { SchemaProps: spec.SchemaProps{ - Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", - Type: []string{"string"}, - Format: "", - }, - }, - "apiVersion": { - SchemaProps: spec.SchemaProps{ - Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", - Type: []string{"string"}, - Format: "", - }, - }, - "configMapRef": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/api/core/v1.ObjectReference"), + Description: "ConfigMap is a reference to a Node's ConfigMap", + Ref: ref("k8s.io/api/core/v1.ConfigMapNodeConfigSource"), }, }, }, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.ObjectReference"}, + "k8s.io/api/core/v1.ConfigMapNodeConfigSource"}, + }, + "k8s.io/api/core/v1.NodeConfigStatus": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "NodeConfigStatus describes the status of the config assigned by Node.Spec.ConfigSource.", + Properties: map[string]spec.Schema{ + "assigned": { + SchemaProps: spec.SchemaProps{ + Description: "Assigned reports the checkpointed config the node will try to use. When Node.Spec.ConfigSource is updated, the node checkpoints the associated config payload to local disk, along with a record indicating intended config. The node refers to this record to choose its config checkpoint, and reports this record in Assigned. Assigned only updates in the status after the record has been checkpointed to disk. When the Kubelet is restarted, it tries to make the Assigned config the Active config by loading and validating the checkpointed payload identified by Assigned.", + Ref: ref("k8s.io/api/core/v1.NodeConfigSource"), + }, + }, + "active": { + SchemaProps: spec.SchemaProps{ + Description: "Active reports the checkpointed config the node is actively using. Active will represent either the current version of the Assigned config, or the current LastKnownGood config, depending on whether attempting to use the Assigned config results in an error.", + Ref: ref("k8s.io/api/core/v1.NodeConfigSource"), + }, + }, + "lastKnownGood": { + SchemaProps: spec.SchemaProps{ + Description: "LastKnownGood reports the checkpointed config the node will fall back to when it encounters an error attempting to use the Assigned config. The Assigned config becomes the LastKnownGood config when the node determines that the Assigned config is stable and correct. This is currently implemented as a 10-minute soak period starting when the local record of Assigned config is updated. If the Assigned config is Active at the end of this period, it becomes the LastKnownGood. Note that if Spec.ConfigSource is reset to nil (use local defaults), the LastKnownGood is also immediately reset to nil, because the local default config is always assumed good. You should not make assumptions about the node's method of determining config stability and correctness, as this may change or become configurable in the future.", + Ref: ref("k8s.io/api/core/v1.NodeConfigSource"), + }, + }, + "error": { + SchemaProps: spec.SchemaProps{ + Description: "Error describes any problems reconciling the Spec.ConfigSource to the Active config. Errors may occur, for example, attempting to checkpoint Spec.ConfigSource to the local Assigned record, attempting to checkpoint the payload associated with Spec.ConfigSource, attempting to load or validate the Assigned config, etc. Errors may occur at different points while syncing config. Earlier errors (e.g. download or checkpointing errors) will not result in a rollback to LastKnownGood, and may resolve across Kubelet retries. Later errors (e.g. loading or validating a checkpointed config) will result in a rollback to LastKnownGood. In the latter case, it is usually possible to resolve the error by fixing the config assigned in Spec.ConfigSource. You can find additional information for debugging by searching the error message in the Kubelet log. Error is a human-readable description of the error state; machines can check whether or not Error is empty, but should not rely on the stability of the Error text across Kubelet versions.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.NodeConfigSource"}, }, "k8s.io/api/core/v1.NodeDaemonEndpoints": { Schema: spec.Schema{ @@ -5477,11 +5592,24 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/core/v1.NodeSelectorTerm": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "A null or empty node selector term matches no objects.", + Description: "A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.", Properties: map[string]spec.Schema{ "matchExpressions": { SchemaProps: spec.SchemaProps{ - Description: "Required. A list of node selector requirements. The requirements are ANDed.", + Description: "A list of node selector requirements by node's labels.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/api/core/v1.NodeSelectorRequirement"), + }, + }, + }, + }, + }, + "matchFields": { + SchemaProps: spec.SchemaProps{ + Description: "A list of node selector requirements by node's fields.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -5493,7 +5621,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, }, }, - Required: []string{"matchExpressions"}, }, }, Dependencies: []string{ @@ -5511,13 +5638,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Format: "", }, }, - "externalID": { - SchemaProps: spec.SchemaProps{ - Description: "External ID of the node assigned by some machine database (e.g. a cloud provider). Deprecated.", - Type: []string{"string"}, - Format: "", - }, - }, "providerID": { SchemaProps: spec.SchemaProps{ Description: "ID of the node assigned by the cloud provider in the format: ://", @@ -5551,6 +5671,13 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Ref: ref("k8s.io/api/core/v1.NodeConfigSource"), }, }, + "externalID": { + SchemaProps: spec.SchemaProps{ + Description: "Deprecated. Not all kubelets will set this field. Remove field after 1.13. see: https://issues.k8s.io/61966", + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, @@ -5685,11 +5812,17 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, }, }, + "config": { + SchemaProps: spec.SchemaProps{ + Description: "Status of the config assigned to the node via the dynamic Kubelet config feature.", + Ref: ref("k8s.io/api/core/v1.NodeConfigStatus"), + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.AttachedVolume", "k8s.io/api/core/v1.ContainerImage", "k8s.io/api/core/v1.NodeAddress", "k8s.io/api/core/v1.NodeCondition", "k8s.io/api/core/v1.NodeDaemonEndpoints", "k8s.io/api/core/v1.NodeSystemInfo", "k8s.io/apimachinery/pkg/api/resource.Quantity"}, + "k8s.io/api/core/v1.AttachedVolume", "k8s.io/api/core/v1.ContainerImage", "k8s.io/api/core/v1.NodeAddress", "k8s.io/api/core/v1.NodeCondition", "k8s.io/api/core/v1.NodeConfigStatus", "k8s.io/api/core/v1.NodeDaemonEndpoints", "k8s.io/api/core/v1.NodeSystemInfo", "k8s.io/apimachinery/pkg/api/resource.Quantity"}, }, "k8s.io/api/core/v1.NodeSystemInfo": { Schema: spec.Schema{ @@ -6279,7 +6412,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "cinder": { SchemaProps: spec.SchemaProps{ Description: "Cinder represents a cinder volume attached and mounted on kubelets host machine More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", - Ref: ref("k8s.io/api/core/v1.CinderVolumeSource"), + Ref: ref("k8s.io/api/core/v1.CinderPersistentVolumeSource"), }, }, "cephfs": { @@ -6370,7 +6503,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, }, Dependencies: []string{ - "k8s.io/api/core/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/api/core/v1.AzureDiskVolumeSource", "k8s.io/api/core/v1.AzureFilePersistentVolumeSource", "k8s.io/api/core/v1.CSIPersistentVolumeSource", "k8s.io/api/core/v1.CephFSPersistentVolumeSource", "k8s.io/api/core/v1.CinderVolumeSource", "k8s.io/api/core/v1.FCVolumeSource", "k8s.io/api/core/v1.FlexPersistentVolumeSource", "k8s.io/api/core/v1.FlockerVolumeSource", "k8s.io/api/core/v1.GCEPersistentDiskVolumeSource", "k8s.io/api/core/v1.GlusterfsVolumeSource", "k8s.io/api/core/v1.HostPathVolumeSource", "k8s.io/api/core/v1.ISCSIPersistentVolumeSource", "k8s.io/api/core/v1.LocalVolumeSource", "k8s.io/api/core/v1.NFSVolumeSource", "k8s.io/api/core/v1.PhotonPersistentDiskVolumeSource", "k8s.io/api/core/v1.PortworxVolumeSource", "k8s.io/api/core/v1.QuobyteVolumeSource", "k8s.io/api/core/v1.RBDPersistentVolumeSource", "k8s.io/api/core/v1.ScaleIOPersistentVolumeSource", "k8s.io/api/core/v1.StorageOSPersistentVolumeSource", "k8s.io/api/core/v1.VsphereVirtualDiskVolumeSource"}, + "k8s.io/api/core/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/api/core/v1.AzureDiskVolumeSource", "k8s.io/api/core/v1.AzureFilePersistentVolumeSource", "k8s.io/api/core/v1.CSIPersistentVolumeSource", "k8s.io/api/core/v1.CephFSPersistentVolumeSource", "k8s.io/api/core/v1.CinderPersistentVolumeSource", "k8s.io/api/core/v1.FCVolumeSource", "k8s.io/api/core/v1.FlexPersistentVolumeSource", "k8s.io/api/core/v1.FlockerVolumeSource", "k8s.io/api/core/v1.GCEPersistentDiskVolumeSource", "k8s.io/api/core/v1.GlusterfsVolumeSource", "k8s.io/api/core/v1.HostPathVolumeSource", "k8s.io/api/core/v1.ISCSIPersistentVolumeSource", "k8s.io/api/core/v1.LocalVolumeSource", "k8s.io/api/core/v1.NFSVolumeSource", "k8s.io/api/core/v1.PhotonPersistentDiskVolumeSource", "k8s.io/api/core/v1.PortworxVolumeSource", "k8s.io/api/core/v1.QuobyteVolumeSource", "k8s.io/api/core/v1.RBDPersistentVolumeSource", "k8s.io/api/core/v1.ScaleIOPersistentVolumeSource", "k8s.io/api/core/v1.StorageOSPersistentVolumeSource", "k8s.io/api/core/v1.VsphereVirtualDiskVolumeSource"}, }, "k8s.io/api/core/v1.PersistentVolumeSpec": { Schema: spec.Schema{ @@ -6435,7 +6568,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "cinder": { SchemaProps: spec.SchemaProps{ Description: "Cinder represents a cinder volume attached and mounted on kubelets host machine More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", - Ref: ref("k8s.io/api/core/v1.CinderVolumeSource"), + Ref: ref("k8s.io/api/core/v1.CinderPersistentVolumeSource"), }, }, "cephfs": { @@ -6587,7 +6720,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, }, Dependencies: []string{ - "k8s.io/api/core/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/api/core/v1.AzureDiskVolumeSource", "k8s.io/api/core/v1.AzureFilePersistentVolumeSource", "k8s.io/api/core/v1.CSIPersistentVolumeSource", "k8s.io/api/core/v1.CephFSPersistentVolumeSource", "k8s.io/api/core/v1.CinderVolumeSource", "k8s.io/api/core/v1.FCVolumeSource", "k8s.io/api/core/v1.FlexPersistentVolumeSource", "k8s.io/api/core/v1.FlockerVolumeSource", "k8s.io/api/core/v1.GCEPersistentDiskVolumeSource", "k8s.io/api/core/v1.GlusterfsVolumeSource", "k8s.io/api/core/v1.HostPathVolumeSource", "k8s.io/api/core/v1.ISCSIPersistentVolumeSource", "k8s.io/api/core/v1.LocalVolumeSource", "k8s.io/api/core/v1.NFSVolumeSource", "k8s.io/api/core/v1.ObjectReference", "k8s.io/api/core/v1.PhotonPersistentDiskVolumeSource", "k8s.io/api/core/v1.PortworxVolumeSource", "k8s.io/api/core/v1.QuobyteVolumeSource", "k8s.io/api/core/v1.RBDPersistentVolumeSource", "k8s.io/api/core/v1.ScaleIOPersistentVolumeSource", "k8s.io/api/core/v1.StorageOSPersistentVolumeSource", "k8s.io/api/core/v1.VolumeNodeAffinity", "k8s.io/api/core/v1.VsphereVirtualDiskVolumeSource", "k8s.io/apimachinery/pkg/api/resource.Quantity"}, + "k8s.io/api/core/v1.AWSElasticBlockStoreVolumeSource", "k8s.io/api/core/v1.AzureDiskVolumeSource", "k8s.io/api/core/v1.AzureFilePersistentVolumeSource", "k8s.io/api/core/v1.CSIPersistentVolumeSource", "k8s.io/api/core/v1.CephFSPersistentVolumeSource", "k8s.io/api/core/v1.CinderPersistentVolumeSource", "k8s.io/api/core/v1.FCVolumeSource", "k8s.io/api/core/v1.FlexPersistentVolumeSource", "k8s.io/api/core/v1.FlockerVolumeSource", "k8s.io/api/core/v1.GCEPersistentDiskVolumeSource", "k8s.io/api/core/v1.GlusterfsVolumeSource", "k8s.io/api/core/v1.HostPathVolumeSource", "k8s.io/api/core/v1.ISCSIPersistentVolumeSource", "k8s.io/api/core/v1.LocalVolumeSource", "k8s.io/api/core/v1.NFSVolumeSource", "k8s.io/api/core/v1.ObjectReference", "k8s.io/api/core/v1.PhotonPersistentDiskVolumeSource", "k8s.io/api/core/v1.PortworxVolumeSource", "k8s.io/api/core/v1.QuobyteVolumeSource", "k8s.io/api/core/v1.RBDPersistentVolumeSource", "k8s.io/api/core/v1.ScaleIOPersistentVolumeSource", "k8s.io/api/core/v1.StorageOSPersistentVolumeSource", "k8s.io/api/core/v1.VolumeNodeAffinity", "k8s.io/api/core/v1.VsphereVirtualDiskVolumeSource", "k8s.io/apimachinery/pkg/api/resource.Quantity"}, }, "k8s.io/api/core/v1.PersistentVolumeStatus": { Schema: spec.Schema{ @@ -6867,7 +7000,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Properties: map[string]spec.Schema{ "type": { SchemaProps: spec.SchemaProps{ - Description: "Type is the type of the condition. Currently only Ready. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", + Description: "Type is the type of the condition. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", Type: []string{"string"}, Format: "", }, @@ -7255,6 +7388,24 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, Dependencies: []string{}, }, + "k8s.io/api/core/v1.PodReadinessGate": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "PodReadinessGate contains the reference to a pod condition", + Properties: map[string]spec.Schema{ + "conditionType": { + SchemaProps: spec.SchemaProps{ + Description: "ConditionType refers to a condition in the pod's condition list with matching type.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"conditionType"}, + }, + }, + Dependencies: []string{}, + }, "k8s.io/api/core/v1.PodSecurityContext": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -7308,11 +7459,24 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Format: "int64", }, }, + "sysctls": { + SchemaProps: spec.SchemaProps{ + Description: "Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/api/core/v1.Sysctl"), + }, + }, + }, + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.SELinuxOptions"}, + "k8s.io/api/core/v1.SELinuxOptions", "k8s.io/api/core/v1.Sysctl"}, }, "k8s.io/api/core/v1.PodSignature": { Schema: spec.Schema{ @@ -7595,21 +7759,34 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Ref: ref("k8s.io/api/core/v1.PodDNSConfig"), }, }, + "readinessGates": { + SchemaProps: spec.SchemaProps{ + Description: "If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/api/core/v1.PodReadinessGate"), + }, + }, + }, + }, + }, }, Required: []string{"containers"}, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.Container", "k8s.io/api/core/v1.HostAlias", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PodDNSConfig", "k8s.io/api/core/v1.PodSecurityContext", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.Volume"}, + "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.Container", "k8s.io/api/core/v1.HostAlias", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PodDNSConfig", "k8s.io/api/core/v1.PodReadinessGate", "k8s.io/api/core/v1.PodSecurityContext", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.Volume"}, }, "k8s.io/api/core/v1.PodStatus": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ - Description: "PodStatus represents information about the status of a pod. Status may trail the actual state of a system.", + Description: "PodStatus represents information about the status of a pod. Status may trail the actual state of a system, especially if the node that hosts the pod cannot contact the control plane.", Properties: map[string]spec.Schema{ "phase": { SchemaProps: spec.SchemaProps{ - Description: "Current condition of the pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase", + Description: "The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. The conditions array, the reason and message fields, and the individual container status arrays contain more detail about the pod's status. There are five possible phase values:\n\nPending: The pod has been accepted by the Kubernetes system, but one or more of the container images has not been created. This includes time before being scheduled as well as time spent downloading images over the network, which could take a while. Running: The pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. Succeeded: All containers in the pod have terminated in success, and will not be restarted. Failed: All containers in the pod have terminated, and at least one container has terminated in failure. The container either exited with non-zero status or was terminated by the system. Unknown: For some reason the state of the pod could not be obtained, typically due to an error in communicating with the host of the pod.\n\nMore info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase", Type: []string{"string"}, Format: "", }, @@ -8658,7 +8835,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Properties: map[string]spec.Schema{ "hard": { SchemaProps: spec.SchemaProps{ - Description: "Hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/", + Description: "hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/", Type: []string{"object"}, AdditionalProperties: &spec.SchemaOrBool{ Schema: &spec.Schema{ @@ -8683,11 +8860,17 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, }, }, + "scopeSelector": { + SchemaProps: spec.SchemaProps{ + Description: "scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota but expressed using ScopeSelectorOperator in combination with possible values. For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched.", + Ref: ref("k8s.io/api/core/v1.ScopeSelector"), + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/apimachinery/pkg/api/resource.Quantity"}, + "k8s.io/api/core/v1.ScopeSelector", "k8s.io/apimachinery/pkg/api/resource.Quantity"}, }, "k8s.io/api/core/v1.ResourceQuotaStatus": { Schema: spec.Schema{ @@ -8963,6 +9146,69 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Dependencies: []string{ "k8s.io/api/core/v1.LocalObjectReference"}, }, + "k8s.io/api/core/v1.ScopeSelector": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "A scope selector represents the AND of the selectors represented by the scoped-resource selector requirements.", + Properties: map[string]spec.Schema{ + "matchExpressions": { + SchemaProps: spec.SchemaProps{ + Description: "A list of scope selector requirements by scope of the resources.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/api/core/v1.ScopedResourceSelectorRequirement"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.ScopedResourceSelectorRequirement"}, + }, + "k8s.io/api/core/v1.ScopedResourceSelectorRequirement": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator that relates the scope name and values.", + Properties: map[string]spec.Schema{ + "scopeName": { + SchemaProps: spec.SchemaProps{ + Description: "The name of the scope that the selector applies to.", + Type: []string{"string"}, + Format: "", + }, + }, + "operator": { + SchemaProps: spec.SchemaProps{ + Description: "Represents a scope's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist.", + Type: []string{"string"}, + Format: "", + }, + }, + "values": { + SchemaProps: spec.SchemaProps{ + Description: "An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + }, + Required: []string{"scopeName", "operator"}, + }, + }, + Dependencies: []string{}, + }, "k8s.io/api/core/v1.Secret": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -9491,6 +9737,38 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Dependencies: []string{ "k8s.io/api/core/v1.ServiceAccount", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, }, + "k8s.io/api/core/v1.ServiceAccountTokenProjection": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "ServiceAccountTokenProjection represents a projected service account token volume. This projection can be used to insert a service account token into the pods runtime filesystem for use against APIs (Kubernetes API Server or otherwise).", + Properties: map[string]spec.Schema{ + "audience": { + SchemaProps: spec.SchemaProps{ + Description: "Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver.", + Type: []string{"string"}, + Format: "", + }, + }, + "expirationSeconds": { + SchemaProps: spec.SchemaProps{ + Description: "ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes.", + Type: []string{"integer"}, + Format: "int64", + }, + }, + "path": { + SchemaProps: spec.SchemaProps{ + Description: "Path is the path relative to the mount point of the file to project the token into.", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"path"}, + }, + }, + Dependencies: []string{}, + }, "k8s.io/api/core/v1.ServiceList": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -9730,7 +10008,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, "publishNotReadyAddresses": { SchemaProps: spec.SchemaProps{ - Description: "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field.", + Description: "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery.", Type: []string{"boolean"}, Format: "", }, @@ -9876,14 +10154,14 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA SchemaProps: spec.SchemaProps{ Description: "Sysctl defines a kernel parameter to be set", Properties: map[string]spec.Schema{ - "Name": { + "name": { SchemaProps: spec.SchemaProps{ Description: "Name of a property to set", Type: []string{"string"}, Format: "", }, }, - "Value": { + "value": { SchemaProps: spec.SchemaProps{ Description: "Value of a property to set", Type: []string{"string"}, @@ -9891,7 +10169,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, }, }, - Required: []string{"Name", "Value"}, + Required: []string{"name", "value"}, }, }, Dependencies: []string{}, @@ -10005,6 +10283,62 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, Dependencies: []string{}, }, + "k8s.io/api/core/v1.TopologySelectorLabelRequirement": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "A topology selector requirement is a selector that matches given label. This is an alpha feature and may change in the future.", + Properties: map[string]spec.Schema{ + "key": { + SchemaProps: spec.SchemaProps{ + Description: "The label key that the selector applies to.", + Type: []string{"string"}, + Format: "", + }, + }, + "values": { + SchemaProps: spec.SchemaProps{ + Description: "An array of string values. One value must match the label to be selected. Each entry in Values is ORed.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + }, + Required: []string{"key", "values"}, + }, + }, + Dependencies: []string{}, + }, + "k8s.io/api/core/v1.TopologySelectorTerm": { + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "A topology selector term represents the result of label queries. A null or empty topology selector term matches no objects. The requirements of them are ANDed. It provides a subset of functionality as NodeSelectorTerm. This is an alpha feature and may change in the future.", + Properties: map[string]spec.Schema{ + "matchLabelExpressions": { + SchemaProps: spec.SchemaProps{ + Description: "A list of topology selector requirements by labels.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/api/core/v1.TopologySelectorLabelRequirement"), + }, + }, + }, + }, + }, + }, + }, + }, + Dependencies: []string{ + "k8s.io/api/core/v1.TopologySelectorLabelRequirement"}, + }, "k8s.io/api/core/v1.Volume": { Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -10043,7 +10377,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, "gitRepo": { SchemaProps: spec.SchemaProps{ - Description: "GitRepo represents a git repository at a particular revision.", + Description: "GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container.", Ref: ref("k8s.io/api/core/v1.GitRepoVolumeSource"), }, }, @@ -10297,11 +10631,17 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA Ref: ref("k8s.io/api/core/v1.ConfigMapProjection"), }, }, + "serviceAccountToken": { + SchemaProps: spec.SchemaProps{ + Description: "information about the serviceAccountToken data to project", + Ref: ref("k8s.io/api/core/v1.ServiceAccountTokenProjection"), + }, + }, }, }, }, Dependencies: []string{ - "k8s.io/api/core/v1.ConfigMapProjection", "k8s.io/api/core/v1.DownwardAPIProjection", "k8s.io/api/core/v1.SecretProjection"}, + "k8s.io/api/core/v1.ConfigMapProjection", "k8s.io/api/core/v1.DownwardAPIProjection", "k8s.io/api/core/v1.SecretProjection", "k8s.io/api/core/v1.ServiceAccountTokenProjection"}, }, "k8s.io/api/core/v1.VolumeSource": { Schema: spec.Schema{ @@ -10334,7 +10674,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, "gitRepo": { SchemaProps: spec.SchemaProps{ - Description: "GitRepo represents a git repository at a particular revision.", + Description: "GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container.", Ref: ref("k8s.io/api/core/v1.GitRepoVolumeSource"), }, }, @@ -10599,7 +10939,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA }, }, }, - Required: []string{"name", "versions", "serverAddressByClientCIDRs"}, + Required: []string{"name", "versions"}, }, }, Dependencies: []string{ diff --git a/pkg/client/monitoring/v1/prometheus.go b/pkg/client/monitoring/v1/prometheus.go index b494ce306..b18d9a057 100644 --- a/pkg/client/monitoring/v1/prometheus.go +++ b/pkg/client/monitoring/v1/prometheus.go @@ -23,7 +23,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/dynamic" + dynamic "k8s.io/client-go/deprecated-dynamic" "k8s.io/client-go/rest" ) diff --git a/pkg/client/monitoring/v1/prometheusrule.go b/pkg/client/monitoring/v1/prometheusrule.go index 3fbc7ef40..4adb04d76 100644 --- a/pkg/client/monitoring/v1/prometheusrule.go +++ b/pkg/client/monitoring/v1/prometheusrule.go @@ -23,7 +23,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/dynamic" + dynamic "k8s.io/client-go/deprecated-dynamic" "k8s.io/client-go/rest" ) diff --git a/pkg/client/monitoring/v1/servicemonitor.go b/pkg/client/monitoring/v1/servicemonitor.go index 4c8ecbfe0..243046993 100644 --- a/pkg/client/monitoring/v1/servicemonitor.go +++ b/pkg/client/monitoring/v1/servicemonitor.go @@ -23,7 +23,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/dynamic" + dynamic "k8s.io/client-go/deprecated-dynamic" "k8s.io/client-go/rest" ) diff --git a/pkg/client/monitoring/v1alpha1/alertmanager.go b/pkg/client/monitoring/v1alpha1/alertmanager.go index a03e94071..1f9a9dcce 100644 --- a/pkg/client/monitoring/v1alpha1/alertmanager.go +++ b/pkg/client/monitoring/v1alpha1/alertmanager.go @@ -23,7 +23,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/dynamic" + dynamic "k8s.io/client-go/deprecated-dynamic" "k8s.io/client-go/rest" ) diff --git a/pkg/client/monitoring/v1alpha1/client.go b/pkg/client/monitoring/v1alpha1/client.go index 86caf46fc..265cbcbf0 100644 --- a/pkg/client/monitoring/v1alpha1/client.go +++ b/pkg/client/monitoring/v1alpha1/client.go @@ -17,7 +17,7 @@ package v1alpha1 import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/client-go/dynamic" + dynamic "k8s.io/client-go/deprecated-dynamic" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" ) @@ -63,7 +63,10 @@ func NewForConfig(c *rest.Config) (*MonitoringV1alpha1Client, error) { return nil, err } - dynamicClient, err := dynamic.NewClient(&config) + dynamicClient, err := dynamic.NewClient(&config, schema.GroupVersion{ + Group: Group, + Version: Version, + }) if err != nil { return nil, err } diff --git a/pkg/client/monitoring/v1alpha1/prometheus.go b/pkg/client/monitoring/v1alpha1/prometheus.go index 7a95f3a4c..66a3d850b 100644 --- a/pkg/client/monitoring/v1alpha1/prometheus.go +++ b/pkg/client/monitoring/v1alpha1/prometheus.go @@ -23,7 +23,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/dynamic" + dynamic "k8s.io/client-go/deprecated-dynamic" "k8s.io/client-go/rest" ) diff --git a/pkg/client/monitoring/v1alpha1/servicemonitor.go b/pkg/client/monitoring/v1alpha1/servicemonitor.go index 6ef55410d..adc2a5b9e 100644 --- a/pkg/client/monitoring/v1alpha1/servicemonitor.go +++ b/pkg/client/monitoring/v1alpha1/servicemonitor.go @@ -23,7 +23,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/dynamic" + dynamic "k8s.io/client-go/deprecated-dynamic" "k8s.io/client-go/rest" ) diff --git a/vendor/github.com/google/btree/.travis.yml b/vendor/github.com/google/btree/.travis.yml new file mode 100644 index 000000000..4f2ee4d97 --- /dev/null +++ b/vendor/github.com/google/btree/.travis.yml @@ -0,0 +1 @@ +language: go diff --git a/vendor/github.com/google/btree/LICENSE b/vendor/github.com/google/btree/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/github.com/google/btree/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/google/btree/README.md b/vendor/github.com/google/btree/README.md new file mode 100644 index 000000000..6062a4dac --- /dev/null +++ b/vendor/github.com/google/btree/README.md @@ -0,0 +1,12 @@ +# BTree implementation for Go + +![Travis CI Build Status](https://api.travis-ci.org/google/btree.svg?branch=master) + +This package provides an in-memory B-Tree implementation for Go, useful as +an ordered, mutable data structure. + +The API is based off of the wonderful +http://godoc.org/github.com/petar/GoLLRB/llrb, and is meant to allow btree to +act as a drop-in replacement for gollrb trees. + +See http://godoc.org/github.com/google/btree for documentation. diff --git a/vendor/github.com/google/btree/btree.go b/vendor/github.com/google/btree/btree.go new file mode 100644 index 000000000..7e4551d73 --- /dev/null +++ b/vendor/github.com/google/btree/btree.go @@ -0,0 +1,881 @@ +// Copyright 2014 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package btree implements in-memory B-Trees of arbitrary degree. +// +// btree implements an in-memory B-Tree for use as an ordered data structure. +// It is not meant for persistent storage solutions. +// +// It has a flatter structure than an equivalent red-black or other binary tree, +// which in some cases yields better memory usage and/or performance. +// See some discussion on the matter here: +// http://google-opensource.blogspot.com/2013/01/c-containers-that-save-memory-and-time.html +// Note, though, that this project is in no way related to the C++ B-Tree +// implementation written about there. +// +// Within this tree, each node contains a slice of items and a (possibly nil) +// slice of children. For basic numeric values or raw structs, this can cause +// efficiency differences when compared to equivalent C++ template code that +// stores values in arrays within the node: +// * Due to the overhead of storing values as interfaces (each +// value needs to be stored as the value itself, then 2 words for the +// interface pointing to that value and its type), resulting in higher +// memory use. +// * Since interfaces can point to values anywhere in memory, values are +// most likely not stored in contiguous blocks, resulting in a higher +// number of cache misses. +// These issues don't tend to matter, though, when working with strings or other +// heap-allocated structures, since C++-equivalent structures also must store +// pointers and also distribute their values across the heap. +// +// This implementation is designed to be a drop-in replacement to gollrb.LLRB +// trees, (http://github.com/petar/gollrb), an excellent and probably the most +// widely used ordered tree implementation in the Go ecosystem currently. +// Its functions, therefore, exactly mirror those of +// llrb.LLRB where possible. Unlike gollrb, though, we currently don't +// support storing multiple equivalent values. +package btree + +import ( + "fmt" + "io" + "sort" + "strings" + "sync" +) + +// Item represents a single object in the tree. +type Item interface { + // Less tests whether the current item is less than the given argument. + // + // This must provide a strict weak ordering. + // If !a.Less(b) && !b.Less(a), we treat this to mean a == b (i.e. we can only + // hold one of either a or b in the tree). + Less(than Item) bool +} + +const ( + DefaultFreeListSize = 32 +) + +var ( + nilItems = make(items, 16) + nilChildren = make(children, 16) +) + +// FreeList represents a free list of btree nodes. By default each +// BTree has its own FreeList, but multiple BTrees can share the same +// FreeList. +// Two Btrees using the same freelist are safe for concurrent write access. +type FreeList struct { + mu sync.Mutex + freelist []*node +} + +// NewFreeList creates a new free list. +// size is the maximum size of the returned free list. +func NewFreeList(size int) *FreeList { + return &FreeList{freelist: make([]*node, 0, size)} +} + +func (f *FreeList) newNode() (n *node) { + f.mu.Lock() + index := len(f.freelist) - 1 + if index < 0 { + f.mu.Unlock() + return new(node) + } + n = f.freelist[index] + f.freelist[index] = nil + f.freelist = f.freelist[:index] + f.mu.Unlock() + return +} + +// freeNode adds the given node to the list, returning true if it was added +// and false if it was discarded. +func (f *FreeList) freeNode(n *node) (out bool) { + f.mu.Lock() + if len(f.freelist) < cap(f.freelist) { + f.freelist = append(f.freelist, n) + out = true + } + f.mu.Unlock() + return +} + +// ItemIterator allows callers of Ascend* to iterate in-order over portions of +// the tree. When this function returns false, iteration will stop and the +// associated Ascend* function will immediately return. +type ItemIterator func(i Item) bool + +// New creates a new B-Tree with the given degree. +// +// New(2), for example, will create a 2-3-4 tree (each node contains 1-3 items +// and 2-4 children). +func New(degree int) *BTree { + return NewWithFreeList(degree, NewFreeList(DefaultFreeListSize)) +} + +// NewWithFreeList creates a new B-Tree that uses the given node free list. +func NewWithFreeList(degree int, f *FreeList) *BTree { + if degree <= 1 { + panic("bad degree") + } + return &BTree{ + degree: degree, + cow: ©OnWriteContext{freelist: f}, + } +} + +// items stores items in a node. +type items []Item + +// insertAt inserts a value into the given index, pushing all subsequent values +// forward. +func (s *items) insertAt(index int, item Item) { + *s = append(*s, nil) + if index < len(*s) { + copy((*s)[index+1:], (*s)[index:]) + } + (*s)[index] = item +} + +// removeAt removes a value at a given index, pulling all subsequent values +// back. +func (s *items) removeAt(index int) Item { + item := (*s)[index] + copy((*s)[index:], (*s)[index+1:]) + (*s)[len(*s)-1] = nil + *s = (*s)[:len(*s)-1] + return item +} + +// pop removes and returns the last element in the list. +func (s *items) pop() (out Item) { + index := len(*s) - 1 + out = (*s)[index] + (*s)[index] = nil + *s = (*s)[:index] + return +} + +// truncate truncates this instance at index so that it contains only the +// first index items. index must be less than or equal to length. +func (s *items) truncate(index int) { + var toClear items + *s, toClear = (*s)[:index], (*s)[index:] + for len(toClear) > 0 { + toClear = toClear[copy(toClear, nilItems):] + } +} + +// find returns the index where the given item should be inserted into this +// list. 'found' is true if the item already exists in the list at the given +// index. +func (s items) find(item Item) (index int, found bool) { + i := sort.Search(len(s), func(i int) bool { + return item.Less(s[i]) + }) + if i > 0 && !s[i-1].Less(item) { + return i - 1, true + } + return i, false +} + +// children stores child nodes in a node. +type children []*node + +// insertAt inserts a value into the given index, pushing all subsequent values +// forward. +func (s *children) insertAt(index int, n *node) { + *s = append(*s, nil) + if index < len(*s) { + copy((*s)[index+1:], (*s)[index:]) + } + (*s)[index] = n +} + +// removeAt removes a value at a given index, pulling all subsequent values +// back. +func (s *children) removeAt(index int) *node { + n := (*s)[index] + copy((*s)[index:], (*s)[index+1:]) + (*s)[len(*s)-1] = nil + *s = (*s)[:len(*s)-1] + return n +} + +// pop removes and returns the last element in the list. +func (s *children) pop() (out *node) { + index := len(*s) - 1 + out = (*s)[index] + (*s)[index] = nil + *s = (*s)[:index] + return +} + +// truncate truncates this instance at index so that it contains only the +// first index children. index must be less than or equal to length. +func (s *children) truncate(index int) { + var toClear children + *s, toClear = (*s)[:index], (*s)[index:] + for len(toClear) > 0 { + toClear = toClear[copy(toClear, nilChildren):] + } +} + +// node is an internal node in a tree. +// +// It must at all times maintain the invariant that either +// * len(children) == 0, len(items) unconstrained +// * len(children) == len(items) + 1 +type node struct { + items items + children children + cow *copyOnWriteContext +} + +func (n *node) mutableFor(cow *copyOnWriteContext) *node { + if n.cow == cow { + return n + } + out := cow.newNode() + if cap(out.items) >= len(n.items) { + out.items = out.items[:len(n.items)] + } else { + out.items = make(items, len(n.items), cap(n.items)) + } + copy(out.items, n.items) + // Copy children + if cap(out.children) >= len(n.children) { + out.children = out.children[:len(n.children)] + } else { + out.children = make(children, len(n.children), cap(n.children)) + } + copy(out.children, n.children) + return out +} + +func (n *node) mutableChild(i int) *node { + c := n.children[i].mutableFor(n.cow) + n.children[i] = c + return c +} + +// split splits the given node at the given index. The current node shrinks, +// and this function returns the item that existed at that index and a new node +// containing all items/children after it. +func (n *node) split(i int) (Item, *node) { + item := n.items[i] + next := n.cow.newNode() + next.items = append(next.items, n.items[i+1:]...) + n.items.truncate(i) + if len(n.children) > 0 { + next.children = append(next.children, n.children[i+1:]...) + n.children.truncate(i + 1) + } + return item, next +} + +// maybeSplitChild checks if a child should be split, and if so splits it. +// Returns whether or not a split occurred. +func (n *node) maybeSplitChild(i, maxItems int) bool { + if len(n.children[i].items) < maxItems { + return false + } + first := n.mutableChild(i) + item, second := first.split(maxItems / 2) + n.items.insertAt(i, item) + n.children.insertAt(i+1, second) + return true +} + +// insert inserts an item into the subtree rooted at this node, making sure +// no nodes in the subtree exceed maxItems items. Should an equivalent item be +// be found/replaced by insert, it will be returned. +func (n *node) insert(item Item, maxItems int) Item { + i, found := n.items.find(item) + if found { + out := n.items[i] + n.items[i] = item + return out + } + if len(n.children) == 0 { + n.items.insertAt(i, item) + return nil + } + if n.maybeSplitChild(i, maxItems) { + inTree := n.items[i] + switch { + case item.Less(inTree): + // no change, we want first split node + case inTree.Less(item): + i++ // we want second split node + default: + out := n.items[i] + n.items[i] = item + return out + } + } + return n.mutableChild(i).insert(item, maxItems) +} + +// get finds the given key in the subtree and returns it. +func (n *node) get(key Item) Item { + i, found := n.items.find(key) + if found { + return n.items[i] + } else if len(n.children) > 0 { + return n.children[i].get(key) + } + return nil +} + +// min returns the first item in the subtree. +func min(n *node) Item { + if n == nil { + return nil + } + for len(n.children) > 0 { + n = n.children[0] + } + if len(n.items) == 0 { + return nil + } + return n.items[0] +} + +// max returns the last item in the subtree. +func max(n *node) Item { + if n == nil { + return nil + } + for len(n.children) > 0 { + n = n.children[len(n.children)-1] + } + if len(n.items) == 0 { + return nil + } + return n.items[len(n.items)-1] +} + +// toRemove details what item to remove in a node.remove call. +type toRemove int + +const ( + removeItem toRemove = iota // removes the given item + removeMin // removes smallest item in the subtree + removeMax // removes largest item in the subtree +) + +// remove removes an item from the subtree rooted at this node. +func (n *node) remove(item Item, minItems int, typ toRemove) Item { + var i int + var found bool + switch typ { + case removeMax: + if len(n.children) == 0 { + return n.items.pop() + } + i = len(n.items) + case removeMin: + if len(n.children) == 0 { + return n.items.removeAt(0) + } + i = 0 + case removeItem: + i, found = n.items.find(item) + if len(n.children) == 0 { + if found { + return n.items.removeAt(i) + } + return nil + } + default: + panic("invalid type") + } + // If we get to here, we have children. + if len(n.children[i].items) <= minItems { + return n.growChildAndRemove(i, item, minItems, typ) + } + child := n.mutableChild(i) + // Either we had enough items to begin with, or we've done some + // merging/stealing, because we've got enough now and we're ready to return + // stuff. + if found { + // The item exists at index 'i', and the child we've selected can give us a + // predecessor, since if we've gotten here it's got > minItems items in it. + out := n.items[i] + // We use our special-case 'remove' call with typ=maxItem to pull the + // predecessor of item i (the rightmost leaf of our immediate left child) + // and set it into where we pulled the item from. + n.items[i] = child.remove(nil, minItems, removeMax) + return out + } + // Final recursive call. Once we're here, we know that the item isn't in this + // node and that the child is big enough to remove from. + return child.remove(item, minItems, typ) +} + +// growChildAndRemove grows child 'i' to make sure it's possible to remove an +// item from it while keeping it at minItems, then calls remove to actually +// remove it. +// +// Most documentation says we have to do two sets of special casing: +// 1) item is in this node +// 2) item is in child +// In both cases, we need to handle the two subcases: +// A) node has enough values that it can spare one +// B) node doesn't have enough values +// For the latter, we have to check: +// a) left sibling has node to spare +// b) right sibling has node to spare +// c) we must merge +// To simplify our code here, we handle cases #1 and #2 the same: +// If a node doesn't have enough items, we make sure it does (using a,b,c). +// We then simply redo our remove call, and the second time (regardless of +// whether we're in case 1 or 2), we'll have enough items and can guarantee +// that we hit case A. +func (n *node) growChildAndRemove(i int, item Item, minItems int, typ toRemove) Item { + if i > 0 && len(n.children[i-1].items) > minItems { + // Steal from left child + child := n.mutableChild(i) + stealFrom := n.mutableChild(i - 1) + stolenItem := stealFrom.items.pop() + child.items.insertAt(0, n.items[i-1]) + n.items[i-1] = stolenItem + if len(stealFrom.children) > 0 { + child.children.insertAt(0, stealFrom.children.pop()) + } + } else if i < len(n.items) && len(n.children[i+1].items) > minItems { + // steal from right child + child := n.mutableChild(i) + stealFrom := n.mutableChild(i + 1) + stolenItem := stealFrom.items.removeAt(0) + child.items = append(child.items, n.items[i]) + n.items[i] = stolenItem + if len(stealFrom.children) > 0 { + child.children = append(child.children, stealFrom.children.removeAt(0)) + } + } else { + if i >= len(n.items) { + i-- + } + child := n.mutableChild(i) + // merge with right child + mergeItem := n.items.removeAt(i) + mergeChild := n.children.removeAt(i + 1) + child.items = append(child.items, mergeItem) + child.items = append(child.items, mergeChild.items...) + child.children = append(child.children, mergeChild.children...) + n.cow.freeNode(mergeChild) + } + return n.remove(item, minItems, typ) +} + +type direction int + +const ( + descend = direction(-1) + ascend = direction(+1) +) + +// iterate provides a simple method for iterating over elements in the tree. +// +// When ascending, the 'start' should be less than 'stop' and when descending, +// the 'start' should be greater than 'stop'. Setting 'includeStart' to true +// will force the iterator to include the first item when it equals 'start', +// thus creating a "greaterOrEqual" or "lessThanEqual" rather than just a +// "greaterThan" or "lessThan" queries. +func (n *node) iterate(dir direction, start, stop Item, includeStart bool, hit bool, iter ItemIterator) (bool, bool) { + var ok bool + switch dir { + case ascend: + for i := 0; i < len(n.items); i++ { + if start != nil && n.items[i].Less(start) { + continue + } + if len(n.children) > 0 { + if hit, ok = n.children[i].iterate(dir, start, stop, includeStart, hit, iter); !ok { + return hit, false + } + } + if !includeStart && !hit && start != nil && !start.Less(n.items[i]) { + hit = true + continue + } + hit = true + if stop != nil && !n.items[i].Less(stop) { + return hit, false + } + if !iter(n.items[i]) { + return hit, false + } + } + if len(n.children) > 0 { + if hit, ok = n.children[len(n.children)-1].iterate(dir, start, stop, includeStart, hit, iter); !ok { + return hit, false + } + } + case descend: + for i := len(n.items) - 1; i >= 0; i-- { + if start != nil && !n.items[i].Less(start) { + if !includeStart || hit || start.Less(n.items[i]) { + continue + } + } + if len(n.children) > 0 { + if hit, ok = n.children[i+1].iterate(dir, start, stop, includeStart, hit, iter); !ok { + return hit, false + } + } + if stop != nil && !stop.Less(n.items[i]) { + return hit, false // continue + } + hit = true + if !iter(n.items[i]) { + return hit, false + } + } + if len(n.children) > 0 { + if hit, ok = n.children[0].iterate(dir, start, stop, includeStart, hit, iter); !ok { + return hit, false + } + } + } + return hit, true +} + +// Used for testing/debugging purposes. +func (n *node) print(w io.Writer, level int) { + fmt.Fprintf(w, "%sNODE:%v\n", strings.Repeat(" ", level), n.items) + for _, c := range n.children { + c.print(w, level+1) + } +} + +// BTree is an implementation of a B-Tree. +// +// BTree stores Item instances in an ordered structure, allowing easy insertion, +// removal, and iteration. +// +// Write operations are not safe for concurrent mutation by multiple +// goroutines, but Read operations are. +type BTree struct { + degree int + length int + root *node + cow *copyOnWriteContext +} + +// copyOnWriteContext pointers determine node ownership... a tree with a write +// context equivalent to a node's write context is allowed to modify that node. +// A tree whose write context does not match a node's is not allowed to modify +// it, and must create a new, writable copy (IE: it's a Clone). +// +// When doing any write operation, we maintain the invariant that the current +// node's context is equal to the context of the tree that requested the write. +// We do this by, before we descend into any node, creating a copy with the +// correct context if the contexts don't match. +// +// Since the node we're currently visiting on any write has the requesting +// tree's context, that node is modifiable in place. Children of that node may +// not share context, but before we descend into them, we'll make a mutable +// copy. +type copyOnWriteContext struct { + freelist *FreeList +} + +// Clone clones the btree, lazily. Clone should not be called concurrently, +// but the original tree (t) and the new tree (t2) can be used concurrently +// once the Clone call completes. +// +// The internal tree structure of b is marked read-only and shared between t and +// t2. Writes to both t and t2 use copy-on-write logic, creating new nodes +// whenever one of b's original nodes would have been modified. Read operations +// should have no performance degredation. Write operations for both t and t2 +// will initially experience minor slow-downs caused by additional allocs and +// copies due to the aforementioned copy-on-write logic, but should converge to +// the original performance characteristics of the original tree. +func (t *BTree) Clone() (t2 *BTree) { + // Create two entirely new copy-on-write contexts. + // This operation effectively creates three trees: + // the original, shared nodes (old b.cow) + // the new b.cow nodes + // the new out.cow nodes + cow1, cow2 := *t.cow, *t.cow + out := *t + t.cow = &cow1 + out.cow = &cow2 + return &out +} + +// maxItems returns the max number of items to allow per node. +func (t *BTree) maxItems() int { + return t.degree*2 - 1 +} + +// minItems returns the min number of items to allow per node (ignored for the +// root node). +func (t *BTree) minItems() int { + return t.degree - 1 +} + +func (c *copyOnWriteContext) newNode() (n *node) { + n = c.freelist.newNode() + n.cow = c + return +} + +type freeType int + +const ( + ftFreelistFull freeType = iota // node was freed (available for GC, not stored in freelist) + ftStored // node was stored in the freelist for later use + ftNotOwned // node was ignored by COW, since it's owned by another one +) + +// freeNode frees a node within a given COW context, if it's owned by that +// context. It returns what happened to the node (see freeType const +// documentation). +func (c *copyOnWriteContext) freeNode(n *node) freeType { + if n.cow == c { + // clear to allow GC + n.items.truncate(0) + n.children.truncate(0) + n.cow = nil + if c.freelist.freeNode(n) { + return ftStored + } else { + return ftFreelistFull + } + } else { + return ftNotOwned + } +} + +// ReplaceOrInsert adds the given item to the tree. If an item in the tree +// already equals the given one, it is removed from the tree and returned. +// Otherwise, nil is returned. +// +// nil cannot be added to the tree (will panic). +func (t *BTree) ReplaceOrInsert(item Item) Item { + if item == nil { + panic("nil item being added to BTree") + } + if t.root == nil { + t.root = t.cow.newNode() + t.root.items = append(t.root.items, item) + t.length++ + return nil + } else { + t.root = t.root.mutableFor(t.cow) + if len(t.root.items) >= t.maxItems() { + item2, second := t.root.split(t.maxItems() / 2) + oldroot := t.root + t.root = t.cow.newNode() + t.root.items = append(t.root.items, item2) + t.root.children = append(t.root.children, oldroot, second) + } + } + out := t.root.insert(item, t.maxItems()) + if out == nil { + t.length++ + } + return out +} + +// Delete removes an item equal to the passed in item from the tree, returning +// it. If no such item exists, returns nil. +func (t *BTree) Delete(item Item) Item { + return t.deleteItem(item, removeItem) +} + +// DeleteMin removes the smallest item in the tree and returns it. +// If no such item exists, returns nil. +func (t *BTree) DeleteMin() Item { + return t.deleteItem(nil, removeMin) +} + +// DeleteMax removes the largest item in the tree and returns it. +// If no such item exists, returns nil. +func (t *BTree) DeleteMax() Item { + return t.deleteItem(nil, removeMax) +} + +func (t *BTree) deleteItem(item Item, typ toRemove) Item { + if t.root == nil || len(t.root.items) == 0 { + return nil + } + t.root = t.root.mutableFor(t.cow) + out := t.root.remove(item, t.minItems(), typ) + if len(t.root.items) == 0 && len(t.root.children) > 0 { + oldroot := t.root + t.root = t.root.children[0] + t.cow.freeNode(oldroot) + } + if out != nil { + t.length-- + } + return out +} + +// AscendRange calls the iterator for every value in the tree within the range +// [greaterOrEqual, lessThan), until iterator returns false. +func (t *BTree) AscendRange(greaterOrEqual, lessThan Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(ascend, greaterOrEqual, lessThan, true, false, iterator) +} + +// AscendLessThan calls the iterator for every value in the tree within the range +// [first, pivot), until iterator returns false. +func (t *BTree) AscendLessThan(pivot Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(ascend, nil, pivot, false, false, iterator) +} + +// AscendGreaterOrEqual calls the iterator for every value in the tree within +// the range [pivot, last], until iterator returns false. +func (t *BTree) AscendGreaterOrEqual(pivot Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(ascend, pivot, nil, true, false, iterator) +} + +// Ascend calls the iterator for every value in the tree within the range +// [first, last], until iterator returns false. +func (t *BTree) Ascend(iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(ascend, nil, nil, false, false, iterator) +} + +// DescendRange calls the iterator for every value in the tree within the range +// [lessOrEqual, greaterThan), until iterator returns false. +func (t *BTree) DescendRange(lessOrEqual, greaterThan Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(descend, lessOrEqual, greaterThan, true, false, iterator) +} + +// DescendLessOrEqual calls the iterator for every value in the tree within the range +// [pivot, first], until iterator returns false. +func (t *BTree) DescendLessOrEqual(pivot Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(descend, pivot, nil, true, false, iterator) +} + +// DescendGreaterThan calls the iterator for every value in the tree within +// the range (pivot, last], until iterator returns false. +func (t *BTree) DescendGreaterThan(pivot Item, iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(descend, nil, pivot, false, false, iterator) +} + +// Descend calls the iterator for every value in the tree within the range +// [last, first], until iterator returns false. +func (t *BTree) Descend(iterator ItemIterator) { + if t.root == nil { + return + } + t.root.iterate(descend, nil, nil, false, false, iterator) +} + +// Get looks for the key item in the tree, returning it. It returns nil if +// unable to find that item. +func (t *BTree) Get(key Item) Item { + if t.root == nil { + return nil + } + return t.root.get(key) +} + +// Min returns the smallest item in the tree, or nil if the tree is empty. +func (t *BTree) Min() Item { + return min(t.root) +} + +// Max returns the largest item in the tree, or nil if the tree is empty. +func (t *BTree) Max() Item { + return max(t.root) +} + +// Has returns true if the given key is in the tree. +func (t *BTree) Has(key Item) bool { + return t.Get(key) != nil +} + +// Len returns the number of items currently in the tree. +func (t *BTree) Len() int { + return t.length +} + +// Clear removes all items from the btree. If addNodesToFreelist is true, +// t's nodes are added to its freelist as part of this call, until the freelist +// is full. Otherwise, the root node is simply dereferenced and the subtree +// left to Go's normal GC processes. +// +// This can be much faster +// than calling Delete on all elements, because that requires finding/removing +// each element in the tree and updating the tree accordingly. It also is +// somewhat faster than creating a new tree to replace the old one, because +// nodes from the old tree are reclaimed into the freelist for use by the new +// one, instead of being lost to the garbage collector. +// +// This call takes: +// O(1): when addNodesToFreelist is false, this is a single operation. +// O(1): when the freelist is already full, it breaks out immediately +// O(freelist size): when the freelist is empty and the nodes are all owned +// by this tree, nodes are added to the freelist until full. +// O(tree size): when all nodes are owned by another tree, all nodes are +// iterated over looking for nodes to add to the freelist, and due to +// ownership, none are. +func (t *BTree) Clear(addNodesToFreelist bool) { + if t.root != nil && addNodesToFreelist { + t.root.reset(t.cow) + } + t.root, t.length = nil, 0 +} + +// reset returns a subtree to the freelist. It breaks out immediately if the +// freelist is full, since the only benefit of iterating is to fill that +// freelist up. Returns true if parent reset call should continue. +func (n *node) reset(c *copyOnWriteContext) bool { + for _, child := range n.children { + if !child.reset(c) { + return false + } + } + return c.freeNode(n) != ftFreelistFull +} + +// Int implements the Item interface for integers. +type Int int + +// Less returns true if int(a) < int(b). +func (a Int) Less(b Item) bool { + return a < b.(Int) +} diff --git a/vendor/github.com/google/btree/btree_mem.go b/vendor/github.com/google/btree/btree_mem.go new file mode 100644 index 000000000..cb95b7fa1 --- /dev/null +++ b/vendor/github.com/google/btree/btree_mem.go @@ -0,0 +1,76 @@ +// Copyright 2014 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build ignore + +// This binary compares memory usage between btree and gollrb. +package main + +import ( + "flag" + "fmt" + "math/rand" + "runtime" + "time" + + "github.com/google/btree" + "github.com/petar/GoLLRB/llrb" +) + +var ( + size = flag.Int("size", 1000000, "size of the tree to build") + degree = flag.Int("degree", 8, "degree of btree") + gollrb = flag.Bool("llrb", false, "use llrb instead of btree") +) + +func main() { + flag.Parse() + vals := rand.Perm(*size) + var t, v interface{} + v = vals + var stats runtime.MemStats + for i := 0; i < 10; i++ { + runtime.GC() + } + fmt.Println("-------- BEFORE ----------") + runtime.ReadMemStats(&stats) + fmt.Printf("%+v\n", stats) + start := time.Now() + if *gollrb { + tr := llrb.New() + for _, v := range vals { + tr.ReplaceOrInsert(llrb.Int(v)) + } + t = tr // keep it around + } else { + tr := btree.New(*degree) + for _, v := range vals { + tr.ReplaceOrInsert(btree.Int(v)) + } + t = tr // keep it around + } + fmt.Printf("%v inserts in %v\n", *size, time.Since(start)) + fmt.Println("-------- AFTER ----------") + runtime.ReadMemStats(&stats) + fmt.Printf("%+v\n", stats) + for i := 0; i < 10; i++ { + runtime.GC() + } + fmt.Println("-------- AFTER GC ----------") + runtime.ReadMemStats(&stats) + fmt.Printf("%+v\n", stats) + if t == v { + fmt.Println("to make sure vals and tree aren't GC'd") + } +} diff --git a/vendor/github.com/google/btree/btree_test.go b/vendor/github.com/google/btree/btree_test.go new file mode 100644 index 000000000..9eeb136a5 --- /dev/null +++ b/vendor/github.com/google/btree/btree_test.go @@ -0,0 +1,770 @@ +// Copyright 2014 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package btree + +import ( + "flag" + "fmt" + "math/rand" + "reflect" + "sort" + "sync" + "testing" + "time" +) + +func init() { + seed := time.Now().Unix() + fmt.Println(seed) + rand.Seed(seed) +} + +// perm returns a random permutation of n Int items in the range [0, n). +func perm(n int) (out []Item) { + for _, v := range rand.Perm(n) { + out = append(out, Int(v)) + } + return +} + +// rang returns an ordered list of Int items in the range [0, n). +func rang(n int) (out []Item) { + for i := 0; i < n; i++ { + out = append(out, Int(i)) + } + return +} + +// all extracts all items from a tree in order as a slice. +func all(t *BTree) (out []Item) { + t.Ascend(func(a Item) bool { + out = append(out, a) + return true + }) + return +} + +// rangerev returns a reversed ordered list of Int items in the range [0, n). +func rangrev(n int) (out []Item) { + for i := n - 1; i >= 0; i-- { + out = append(out, Int(i)) + } + return +} + +// allrev extracts all items from a tree in reverse order as a slice. +func allrev(t *BTree) (out []Item) { + t.Descend(func(a Item) bool { + out = append(out, a) + return true + }) + return +} + +var btreeDegree = flag.Int("degree", 32, "B-Tree degree") + +func TestBTree(t *testing.T) { + tr := New(*btreeDegree) + const treeSize = 10000 + for i := 0; i < 10; i++ { + if min := tr.Min(); min != nil { + t.Fatalf("empty min, got %+v", min) + } + if max := tr.Max(); max != nil { + t.Fatalf("empty max, got %+v", max) + } + for _, item := range perm(treeSize) { + if x := tr.ReplaceOrInsert(item); x != nil { + t.Fatal("insert found item", item) + } + } + for _, item := range perm(treeSize) { + if x := tr.ReplaceOrInsert(item); x == nil { + t.Fatal("insert didn't find item", item) + } + } + if min, want := tr.Min(), Item(Int(0)); min != want { + t.Fatalf("min: want %+v, got %+v", want, min) + } + if max, want := tr.Max(), Item(Int(treeSize-1)); max != want { + t.Fatalf("max: want %+v, got %+v", want, max) + } + got := all(tr) + want := rang(treeSize) + if !reflect.DeepEqual(got, want) { + t.Fatalf("mismatch:\n got: %v\nwant: %v", got, want) + } + + gotrev := allrev(tr) + wantrev := rangrev(treeSize) + if !reflect.DeepEqual(gotrev, wantrev) { + t.Fatalf("mismatch:\n got: %v\nwant: %v", got, want) + } + + for _, item := range perm(treeSize) { + if x := tr.Delete(item); x == nil { + t.Fatalf("didn't find %v", item) + } + } + if got = all(tr); len(got) > 0 { + t.Fatalf("some left!: %v", got) + } + } +} + +func ExampleBTree() { + tr := New(*btreeDegree) + for i := Int(0); i < 10; i++ { + tr.ReplaceOrInsert(i) + } + fmt.Println("len: ", tr.Len()) + fmt.Println("get3: ", tr.Get(Int(3))) + fmt.Println("get100: ", tr.Get(Int(100))) + fmt.Println("del4: ", tr.Delete(Int(4))) + fmt.Println("del100: ", tr.Delete(Int(100))) + fmt.Println("replace5: ", tr.ReplaceOrInsert(Int(5))) + fmt.Println("replace100:", tr.ReplaceOrInsert(Int(100))) + fmt.Println("min: ", tr.Min()) + fmt.Println("delmin: ", tr.DeleteMin()) + fmt.Println("max: ", tr.Max()) + fmt.Println("delmax: ", tr.DeleteMax()) + fmt.Println("len: ", tr.Len()) + // Output: + // len: 10 + // get3: 3 + // get100: + // del4: 4 + // del100: + // replace5: 5 + // replace100: + // min: 0 + // delmin: 0 + // max: 100 + // delmax: 100 + // len: 8 +} + +func TestDeleteMin(t *testing.T) { + tr := New(3) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + for v := tr.DeleteMin(); v != nil; v = tr.DeleteMin() { + got = append(got, v) + } + if want := rang(100); !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } +} + +func TestDeleteMax(t *testing.T) { + tr := New(3) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + for v := tr.DeleteMax(); v != nil; v = tr.DeleteMax() { + got = append(got, v) + } + // Reverse our list. + for i := 0; i < len(got)/2; i++ { + got[i], got[len(got)-i-1] = got[len(got)-i-1], got[i] + } + if want := rang(100); !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } +} + +func TestAscendRange(t *testing.T) { + tr := New(2) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.AscendRange(Int(40), Int(60), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rang(100)[40:60]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.AscendRange(Int(40), Int(60), func(a Item) bool { + if a.(Int) > 50 { + return false + } + got = append(got, a) + return true + }) + if want := rang(100)[40:51]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } +} + +func TestDescendRange(t *testing.T) { + tr := New(2) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.DescendRange(Int(60), Int(40), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rangrev(100)[39:59]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendrange:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.DescendRange(Int(60), Int(40), func(a Item) bool { + if a.(Int) < 50 { + return false + } + got = append(got, a) + return true + }) + if want := rangrev(100)[39:50]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendrange:\n got: %v\nwant: %v", got, want) + } +} +func TestAscendLessThan(t *testing.T) { + tr := New(*btreeDegree) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.AscendLessThan(Int(60), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rang(100)[:60]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.AscendLessThan(Int(60), func(a Item) bool { + if a.(Int) > 50 { + return false + } + got = append(got, a) + return true + }) + if want := rang(100)[:51]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } +} + +func TestDescendLessOrEqual(t *testing.T) { + tr := New(*btreeDegree) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.DescendLessOrEqual(Int(40), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rangrev(100)[59:]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendlessorequal:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.DescendLessOrEqual(Int(60), func(a Item) bool { + if a.(Int) < 50 { + return false + } + got = append(got, a) + return true + }) + if want := rangrev(100)[39:50]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendlessorequal:\n got: %v\nwant: %v", got, want) + } +} +func TestAscendGreaterOrEqual(t *testing.T) { + tr := New(*btreeDegree) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.AscendGreaterOrEqual(Int(40), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rang(100)[40:]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.AscendGreaterOrEqual(Int(40), func(a Item) bool { + if a.(Int) > 50 { + return false + } + got = append(got, a) + return true + }) + if want := rang(100)[40:51]; !reflect.DeepEqual(got, want) { + t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) + } +} + +func TestDescendGreaterThan(t *testing.T) { + tr := New(*btreeDegree) + for _, v := range perm(100) { + tr.ReplaceOrInsert(v) + } + var got []Item + tr.DescendGreaterThan(Int(40), func(a Item) bool { + got = append(got, a) + return true + }) + if want := rangrev(100)[:59]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendgreaterthan:\n got: %v\nwant: %v", got, want) + } + got = got[:0] + tr.DescendGreaterThan(Int(40), func(a Item) bool { + if a.(Int) < 50 { + return false + } + got = append(got, a) + return true + }) + if want := rangrev(100)[:50]; !reflect.DeepEqual(got, want) { + t.Fatalf("descendgreaterthan:\n got: %v\nwant: %v", got, want) + } +} + +const benchmarkTreeSize = 10000 + +func BenchmarkInsert(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + b.StartTimer() + i := 0 + for i < b.N { + tr := New(*btreeDegree) + for _, item := range insertP { + tr.ReplaceOrInsert(item) + i++ + if i >= b.N { + return + } + } + } +} + +func BenchmarkDeleteInsert(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, item := range insertP { + tr.ReplaceOrInsert(item) + } + b.StartTimer() + for i := 0; i < b.N; i++ { + tr.Delete(insertP[i%benchmarkTreeSize]) + tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) + } +} + +func BenchmarkDeleteInsertCloneOnce(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, item := range insertP { + tr.ReplaceOrInsert(item) + } + tr = tr.Clone() + b.StartTimer() + for i := 0; i < b.N; i++ { + tr.Delete(insertP[i%benchmarkTreeSize]) + tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) + } +} + +func BenchmarkDeleteInsertCloneEachTime(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, item := range insertP { + tr.ReplaceOrInsert(item) + } + b.StartTimer() + for i := 0; i < b.N; i++ { + tr = tr.Clone() + tr.Delete(insertP[i%benchmarkTreeSize]) + tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) + } +} + +func BenchmarkDelete(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + removeP := perm(benchmarkTreeSize) + b.StartTimer() + i := 0 + for i < b.N { + b.StopTimer() + tr := New(*btreeDegree) + for _, v := range insertP { + tr.ReplaceOrInsert(v) + } + b.StartTimer() + for _, item := range removeP { + tr.Delete(item) + i++ + if i >= b.N { + return + } + } + if tr.Len() > 0 { + panic(tr.Len()) + } + } +} + +func BenchmarkGet(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + removeP := perm(benchmarkTreeSize) + b.StartTimer() + i := 0 + for i < b.N { + b.StopTimer() + tr := New(*btreeDegree) + for _, v := range insertP { + tr.ReplaceOrInsert(v) + } + b.StartTimer() + for _, item := range removeP { + tr.Get(item) + i++ + if i >= b.N { + return + } + } + } +} + +func BenchmarkGetCloneEachTime(b *testing.B) { + b.StopTimer() + insertP := perm(benchmarkTreeSize) + removeP := perm(benchmarkTreeSize) + b.StartTimer() + i := 0 + for i < b.N { + b.StopTimer() + tr := New(*btreeDegree) + for _, v := range insertP { + tr.ReplaceOrInsert(v) + } + b.StartTimer() + for _, item := range removeP { + tr = tr.Clone() + tr.Get(item) + i++ + if i >= b.N { + return + } + } + } +} + +type byInts []Item + +func (a byInts) Len() int { + return len(a) +} + +func (a byInts) Less(i, j int) bool { + return a[i].(Int) < a[j].(Int) +} + +func (a byInts) Swap(i, j int) { + a[i], a[j] = a[j], a[i] +} + +func BenchmarkAscend(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := 0 + tr.Ascend(func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j++ + return true + }) + } +} + +func BenchmarkDescend(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := len(arr) - 1 + tr.Descend(func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j-- + return true + }) + } +} +func BenchmarkAscendRange(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := 100 + tr.AscendRange(Int(100), arr[len(arr)-100], func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j++ + return true + }) + if j != len(arr)-100 { + b.Fatalf("expected: %v, got %v", len(arr)-100, j) + } + } +} + +func BenchmarkDescendRange(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := len(arr) - 100 + tr.DescendRange(arr[len(arr)-100], Int(100), func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j-- + return true + }) + if j != 100 { + b.Fatalf("expected: %v, got %v", len(arr)-100, j) + } + } +} +func BenchmarkAscendGreaterOrEqual(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := 100 + k := 0 + tr.AscendGreaterOrEqual(Int(100), func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j++ + k++ + return true + }) + if j != len(arr) { + b.Fatalf("expected: %v, got %v", len(arr), j) + } + if k != len(arr)-100 { + b.Fatalf("expected: %v, got %v", len(arr)-100, k) + } + } +} +func BenchmarkDescendLessOrEqual(b *testing.B) { + arr := perm(benchmarkTreeSize) + tr := New(*btreeDegree) + for _, v := range arr { + tr.ReplaceOrInsert(v) + } + sort.Sort(byInts(arr)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + j := len(arr) - 100 + k := len(arr) + tr.DescendLessOrEqual(arr[len(arr)-100], func(item Item) bool { + if item.(Int) != arr[j].(Int) { + b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) + } + j-- + k-- + return true + }) + if j != -1 { + b.Fatalf("expected: %v, got %v", -1, j) + } + if k != 99 { + b.Fatalf("expected: %v, got %v", 99, k) + } + } +} + +const cloneTestSize = 10000 + +func cloneTest(t *testing.T, b *BTree, start int, p []Item, wg *sync.WaitGroup, trees *[]*BTree) { + t.Logf("Starting new clone at %v", start) + *trees = append(*trees, b) + for i := start; i < cloneTestSize; i++ { + b.ReplaceOrInsert(p[i]) + if i%(cloneTestSize/5) == 0 { + wg.Add(1) + go cloneTest(t, b.Clone(), i+1, p, wg, trees) + } + } + wg.Done() +} + +func TestCloneConcurrentOperations(t *testing.T) { + b := New(*btreeDegree) + trees := []*BTree{} + p := perm(cloneTestSize) + var wg sync.WaitGroup + wg.Add(1) + go cloneTest(t, b, 0, p, &wg, &trees) + wg.Wait() + want := rang(cloneTestSize) + t.Logf("Starting equality checks on %d trees", len(trees)) + for i, tree := range trees { + if !reflect.DeepEqual(want, all(tree)) { + t.Errorf("tree %v mismatch", i) + } + } + t.Log("Removing half from first half") + toRemove := rang(cloneTestSize)[cloneTestSize/2:] + for i := 0; i < len(trees)/2; i++ { + tree := trees[i] + wg.Add(1) + go func() { + for _, item := range toRemove { + tree.Delete(item) + } + wg.Done() + }() + } + wg.Wait() + t.Log("Checking all values again") + for i, tree := range trees { + var wantpart []Item + if i < len(trees)/2 { + wantpart = want[:cloneTestSize/2] + } else { + wantpart = want + } + if got := all(tree); !reflect.DeepEqual(wantpart, got) { + t.Errorf("tree %v mismatch, want %v got %v", i, len(want), len(got)) + } + } +} + +func BenchmarkDeleteAndRestore(b *testing.B) { + items := perm(16392) + b.ResetTimer() + b.Run(`CopyBigFreeList`, func(b *testing.B) { + fl := NewFreeList(16392) + tr := NewWithFreeList(*btreeDegree, fl) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + dels := make([]Item, 0, tr.Len()) + tr.Ascend(ItemIterator(func(b Item) bool { + dels = append(dels, b) + return true + })) + for _, del := range dels { + tr.Delete(del) + } + // tr is now empty, we make a new empty copy of it. + tr = NewWithFreeList(*btreeDegree, fl) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + } + }) + b.Run(`Copy`, func(b *testing.B) { + tr := New(*btreeDegree) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + dels := make([]Item, 0, tr.Len()) + tr.Ascend(ItemIterator(func(b Item) bool { + dels = append(dels, b) + return true + })) + for _, del := range dels { + tr.Delete(del) + } + // tr is now empty, we make a new empty copy of it. + tr = New(*btreeDegree) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + } + }) + b.Run(`ClearBigFreelist`, func(b *testing.B) { + fl := NewFreeList(16392) + tr := NewWithFreeList(*btreeDegree, fl) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + tr.Clear(true) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + } + }) + b.Run(`Clear`, func(b *testing.B) { + tr := New(*btreeDegree) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + tr.Clear(true) + for _, v := range items { + tr.ReplaceOrInsert(v) + } + } + }) +} diff --git a/vendor/github.com/gregjones/httpcache/.travis.yml b/vendor/github.com/gregjones/httpcache/.travis.yml new file mode 100644 index 000000000..b5ffbe03d --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/.travis.yml @@ -0,0 +1,19 @@ +sudo: false +language: go +go: + - 1.6.x + - 1.7.x + - 1.8.x + - 1.9.x + - master +matrix: + allow_failures: + - go: master + fast_finish: true +install: + - # Do nothing. This is needed to prevent default install action "go get -t -v ./..." from happening here (we want it to happen inside script step). +script: + - go get -t -v ./... + - diff -u <(echo -n) <(gofmt -d .) + - go tool vet . + - go test -v -race ./... diff --git a/vendor/github.com/gregjones/httpcache/LICENSE.txt b/vendor/github.com/gregjones/httpcache/LICENSE.txt new file mode 100644 index 000000000..81316beb0 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/LICENSE.txt @@ -0,0 +1,7 @@ +Copyright © 2012 Greg Jones (greg.jones@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Softwareâ€), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/gregjones/httpcache/README.md b/vendor/github.com/gregjones/httpcache/README.md new file mode 100644 index 000000000..09c9e7c17 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/README.md @@ -0,0 +1,25 @@ +httpcache +========= + +[![Build Status](https://travis-ci.org/gregjones/httpcache.svg?branch=master)](https://travis-ci.org/gregjones/httpcache) [![GoDoc](https://godoc.org/github.com/gregjones/httpcache?status.svg)](https://godoc.org/github.com/gregjones/httpcache) + +Package httpcache provides a http.RoundTripper implementation that works as a mostly [RFC 7234](https://tools.ietf.org/html/rfc7234) compliant cache for http responses. + +It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client and not for a shared proxy). + +Cache Backends +-------------- + +- The built-in 'memory' cache stores responses in an in-memory map. +- [`github.com/gregjones/httpcache/diskcache`](https://github.com/gregjones/httpcache/tree/master/diskcache) provides a filesystem-backed cache using the [diskv](https://github.com/peterbourgon/diskv) library. +- [`github.com/gregjones/httpcache/memcache`](https://github.com/gregjones/httpcache/tree/master/memcache) provides memcache implementations, for both App Engine and 'normal' memcache servers. +- [`sourcegraph.com/sourcegraph/s3cache`](https://sourcegraph.com/github.com/sourcegraph/s3cache) uses Amazon S3 for storage. +- [`github.com/gregjones/httpcache/leveldbcache`](https://github.com/gregjones/httpcache/tree/master/leveldbcache) provides a filesystem-backed cache using [leveldb](https://github.com/syndtr/goleveldb/leveldb). +- [`github.com/die-net/lrucache`](https://github.com/die-net/lrucache) provides an in-memory cache that will evict least-recently used entries. +- [`github.com/die-net/lrucache/twotier`](https://github.com/die-net/lrucache/tree/master/twotier) allows caches to be combined, for example to use lrucache above with a persistent disk-cache. +- [`github.com/birkelund/boltdbcache`](https://github.com/birkelund/boltdbcache) provides a BoltDB implementation (based on the [bbolt](https://github.com/coreos/bbolt) fork). + +License +------- + +- [MIT License](LICENSE.txt) diff --git a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go b/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go new file mode 100644 index 000000000..42e3129d8 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go @@ -0,0 +1,61 @@ +// Package diskcache provides an implementation of httpcache.Cache that uses the diskv package +// to supplement an in-memory map with persistent storage +// +package diskcache + +import ( + "bytes" + "crypto/md5" + "encoding/hex" + "github.com/peterbourgon/diskv" + "io" +) + +// Cache is an implementation of httpcache.Cache that supplements the in-memory map with persistent storage +type Cache struct { + d *diskv.Diskv +} + +// Get returns the response corresponding to key if present +func (c *Cache) Get(key string) (resp []byte, ok bool) { + key = keyToFilename(key) + resp, err := c.d.Read(key) + if err != nil { + return []byte{}, false + } + return resp, true +} + +// Set saves a response to the cache as key +func (c *Cache) Set(key string, resp []byte) { + key = keyToFilename(key) + c.d.WriteStream(key, bytes.NewReader(resp), true) +} + +// Delete removes the response with key from the cache +func (c *Cache) Delete(key string) { + key = keyToFilename(key) + c.d.Erase(key) +} + +func keyToFilename(key string) string { + h := md5.New() + io.WriteString(h, key) + return hex.EncodeToString(h.Sum(nil)) +} + +// New returns a new Cache that will store files in basePath +func New(basePath string) *Cache { + return &Cache{ + d: diskv.New(diskv.Options{ + BasePath: basePath, + CacheSizeMax: 100 * 1024 * 1024, // 100MB + }), + } +} + +// NewWithDiskv returns a new Cache using the provided Diskv as underlying +// storage. +func NewWithDiskv(d *diskv.Diskv) *Cache { + return &Cache{d} +} diff --git a/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go b/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go new file mode 100644 index 000000000..35c76cbd1 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go @@ -0,0 +1,42 @@ +package diskcache + +import ( + "bytes" + "io/ioutil" + "os" + "testing" +) + +func TestDiskCache(t *testing.T) { + tempDir, err := ioutil.TempDir("", "httpcache") + if err != nil { + t.Fatalf("TempDir: %v", err) + } + defer os.RemoveAll(tempDir) + + cache := New(tempDir) + + key := "testKey" + _, ok := cache.Get(key) + if ok { + t.Fatal("retrieved key before adding it") + } + + val := []byte("some bytes") + cache.Set(key, val) + + retVal, ok := cache.Get(key) + if !ok { + t.Fatal("could not retrieve an element we just added") + } + if !bytes.Equal(retVal, val) { + t.Fatal("retrieved a different value than what we put in") + } + + cache.Delete(key) + + _, ok = cache.Get(key) + if ok { + t.Fatal("deleted key still present") + } +} diff --git a/vendor/github.com/gregjones/httpcache/httpcache.go b/vendor/github.com/gregjones/httpcache/httpcache.go new file mode 100644 index 000000000..f6a2ec4a5 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/httpcache.go @@ -0,0 +1,551 @@ +// Package httpcache provides a http.RoundTripper implementation that works as a +// mostly RFC-compliant cache for http responses. +// +// It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client +// and not for a shared proxy). +// +package httpcache + +import ( + "bufio" + "bytes" + "errors" + "io" + "io/ioutil" + "net/http" + "net/http/httputil" + "strings" + "sync" + "time" +) + +const ( + stale = iota + fresh + transparent + // XFromCache is the header added to responses that are returned from the cache + XFromCache = "X-From-Cache" +) + +// A Cache interface is used by the Transport to store and retrieve responses. +type Cache interface { + // Get returns the []byte representation of a cached response and a bool + // set to true if the value isn't empty + Get(key string) (responseBytes []byte, ok bool) + // Set stores the []byte representation of a response against a key + Set(key string, responseBytes []byte) + // Delete removes the value associated with the key + Delete(key string) +} + +// cacheKey returns the cache key for req. +func cacheKey(req *http.Request) string { + if req.Method == http.MethodGet { + return req.URL.String() + } else { + return req.Method + " " + req.URL.String() + } +} + +// CachedResponse returns the cached http.Response for req if present, and nil +// otherwise. +func CachedResponse(c Cache, req *http.Request) (resp *http.Response, err error) { + cachedVal, ok := c.Get(cacheKey(req)) + if !ok { + return + } + + b := bytes.NewBuffer(cachedVal) + return http.ReadResponse(bufio.NewReader(b), req) +} + +// MemoryCache is an implemtation of Cache that stores responses in an in-memory map. +type MemoryCache struct { + mu sync.RWMutex + items map[string][]byte +} + +// Get returns the []byte representation of the response and true if present, false if not +func (c *MemoryCache) Get(key string) (resp []byte, ok bool) { + c.mu.RLock() + resp, ok = c.items[key] + c.mu.RUnlock() + return resp, ok +} + +// Set saves response resp to the cache with key +func (c *MemoryCache) Set(key string, resp []byte) { + c.mu.Lock() + c.items[key] = resp + c.mu.Unlock() +} + +// Delete removes key from the cache +func (c *MemoryCache) Delete(key string) { + c.mu.Lock() + delete(c.items, key) + c.mu.Unlock() +} + +// NewMemoryCache returns a new Cache that will store items in an in-memory map +func NewMemoryCache() *MemoryCache { + c := &MemoryCache{items: map[string][]byte{}} + return c +} + +// Transport is an implementation of http.RoundTripper that will return values from a cache +// where possible (avoiding a network request) and will additionally add validators (etag/if-modified-since) +// to repeated requests allowing servers to return 304 / Not Modified +type Transport struct { + // The RoundTripper interface actually used to make requests + // If nil, http.DefaultTransport is used + Transport http.RoundTripper + Cache Cache + // If true, responses returned from the cache will be given an extra header, X-From-Cache + MarkCachedResponses bool +} + +// NewTransport returns a new Transport with the +// provided Cache implementation and MarkCachedResponses set to true +func NewTransport(c Cache) *Transport { + return &Transport{Cache: c, MarkCachedResponses: true} +} + +// Client returns an *http.Client that caches responses. +func (t *Transport) Client() *http.Client { + return &http.Client{Transport: t} +} + +// varyMatches will return false unless all of the cached values for the headers listed in Vary +// match the new request +func varyMatches(cachedResp *http.Response, req *http.Request) bool { + for _, header := range headerAllCommaSepValues(cachedResp.Header, "vary") { + header = http.CanonicalHeaderKey(header) + if header != "" && req.Header.Get(header) != cachedResp.Header.Get("X-Varied-"+header) { + return false + } + } + return true +} + +// RoundTrip takes a Request and returns a Response +// +// If there is a fresh Response already in cache, then it will be returned without connecting to +// the server. +// +// If there is a stale Response, then any validators it contains will be set on the new request +// to give the server a chance to respond with NotModified. If this happens, then the cached Response +// will be returned. +func (t *Transport) RoundTrip(req *http.Request) (resp *http.Response, err error) { + cacheKey := cacheKey(req) + cacheable := (req.Method == "GET" || req.Method == "HEAD") && req.Header.Get("range") == "" + var cachedResp *http.Response + if cacheable { + cachedResp, err = CachedResponse(t.Cache, req) + } else { + // Need to invalidate an existing value + t.Cache.Delete(cacheKey) + } + + transport := t.Transport + if transport == nil { + transport = http.DefaultTransport + } + + if cacheable && cachedResp != nil && err == nil { + if t.MarkCachedResponses { + cachedResp.Header.Set(XFromCache, "1") + } + + if varyMatches(cachedResp, req) { + // Can only use cached value if the new request doesn't Vary significantly + freshness := getFreshness(cachedResp.Header, req.Header) + if freshness == fresh { + return cachedResp, nil + } + + if freshness == stale { + var req2 *http.Request + // Add validators if caller hasn't already done so + etag := cachedResp.Header.Get("etag") + if etag != "" && req.Header.Get("etag") == "" { + req2 = cloneRequest(req) + req2.Header.Set("if-none-match", etag) + } + lastModified := cachedResp.Header.Get("last-modified") + if lastModified != "" && req.Header.Get("last-modified") == "" { + if req2 == nil { + req2 = cloneRequest(req) + } + req2.Header.Set("if-modified-since", lastModified) + } + if req2 != nil { + req = req2 + } + } + } + + resp, err = transport.RoundTrip(req) + if err == nil && req.Method == "GET" && resp.StatusCode == http.StatusNotModified { + // Replace the 304 response with the one from cache, but update with some new headers + endToEndHeaders := getEndToEndHeaders(resp.Header) + for _, header := range endToEndHeaders { + cachedResp.Header[header] = resp.Header[header] + } + resp = cachedResp + } else if (err != nil || (cachedResp != nil && resp.StatusCode >= 500)) && + req.Method == "GET" && canStaleOnError(cachedResp.Header, req.Header) { + // In case of transport failure and stale-if-error activated, returns cached content + // when available + return cachedResp, nil + } else { + if err != nil || resp.StatusCode != http.StatusOK { + t.Cache.Delete(cacheKey) + } + if err != nil { + return nil, err + } + } + } else { + reqCacheControl := parseCacheControl(req.Header) + if _, ok := reqCacheControl["only-if-cached"]; ok { + resp = newGatewayTimeoutResponse(req) + } else { + resp, err = transport.RoundTrip(req) + if err != nil { + return nil, err + } + } + } + + if cacheable && canStore(parseCacheControl(req.Header), parseCacheControl(resp.Header)) { + for _, varyKey := range headerAllCommaSepValues(resp.Header, "vary") { + varyKey = http.CanonicalHeaderKey(varyKey) + fakeHeader := "X-Varied-" + varyKey + reqValue := req.Header.Get(varyKey) + if reqValue != "" { + resp.Header.Set(fakeHeader, reqValue) + } + } + switch req.Method { + case "GET": + // Delay caching until EOF is reached. + resp.Body = &cachingReadCloser{ + R: resp.Body, + OnEOF: func(r io.Reader) { + resp := *resp + resp.Body = ioutil.NopCloser(r) + respBytes, err := httputil.DumpResponse(&resp, true) + if err == nil { + t.Cache.Set(cacheKey, respBytes) + } + }, + } + default: + respBytes, err := httputil.DumpResponse(resp, true) + if err == nil { + t.Cache.Set(cacheKey, respBytes) + } + } + } else { + t.Cache.Delete(cacheKey) + } + return resp, nil +} + +// ErrNoDateHeader indicates that the HTTP headers contained no Date header. +var ErrNoDateHeader = errors.New("no Date header") + +// Date parses and returns the value of the Date header. +func Date(respHeaders http.Header) (date time.Time, err error) { + dateHeader := respHeaders.Get("date") + if dateHeader == "" { + err = ErrNoDateHeader + return + } + + return time.Parse(time.RFC1123, dateHeader) +} + +type realClock struct{} + +func (c *realClock) since(d time.Time) time.Duration { + return time.Since(d) +} + +type timer interface { + since(d time.Time) time.Duration +} + +var clock timer = &realClock{} + +// getFreshness will return one of fresh/stale/transparent based on the cache-control +// values of the request and the response +// +// fresh indicates the response can be returned +// stale indicates that the response needs validating before it is returned +// transparent indicates the response should not be used to fulfil the request +// +// Because this is only a private cache, 'public' and 'private' in cache-control aren't +// signficant. Similarly, smax-age isn't used. +func getFreshness(respHeaders, reqHeaders http.Header) (freshness int) { + respCacheControl := parseCacheControl(respHeaders) + reqCacheControl := parseCacheControl(reqHeaders) + if _, ok := reqCacheControl["no-cache"]; ok { + return transparent + } + if _, ok := respCacheControl["no-cache"]; ok { + return stale + } + if _, ok := reqCacheControl["only-if-cached"]; ok { + return fresh + } + + date, err := Date(respHeaders) + if err != nil { + return stale + } + currentAge := clock.since(date) + + var lifetime time.Duration + var zeroDuration time.Duration + + // If a response includes both an Expires header and a max-age directive, + // the max-age directive overrides the Expires header, even if the Expires header is more restrictive. + if maxAge, ok := respCacheControl["max-age"]; ok { + lifetime, err = time.ParseDuration(maxAge + "s") + if err != nil { + lifetime = zeroDuration + } + } else { + expiresHeader := respHeaders.Get("Expires") + if expiresHeader != "" { + expires, err := time.Parse(time.RFC1123, expiresHeader) + if err != nil { + lifetime = zeroDuration + } else { + lifetime = expires.Sub(date) + } + } + } + + if maxAge, ok := reqCacheControl["max-age"]; ok { + // the client is willing to accept a response whose age is no greater than the specified time in seconds + lifetime, err = time.ParseDuration(maxAge + "s") + if err != nil { + lifetime = zeroDuration + } + } + if minfresh, ok := reqCacheControl["min-fresh"]; ok { + // the client wants a response that will still be fresh for at least the specified number of seconds. + minfreshDuration, err := time.ParseDuration(minfresh + "s") + if err == nil { + currentAge = time.Duration(currentAge + minfreshDuration) + } + } + + if maxstale, ok := reqCacheControl["max-stale"]; ok { + // Indicates that the client is willing to accept a response that has exceeded its expiration time. + // If max-stale is assigned a value, then the client is willing to accept a response that has exceeded + // its expiration time by no more than the specified number of seconds. + // If no value is assigned to max-stale, then the client is willing to accept a stale response of any age. + // + // Responses served only because of a max-stale value are supposed to have a Warning header added to them, + // but that seems like a hassle, and is it actually useful? If so, then there needs to be a different + // return-value available here. + if maxstale == "" { + return fresh + } + maxstaleDuration, err := time.ParseDuration(maxstale + "s") + if err == nil { + currentAge = time.Duration(currentAge - maxstaleDuration) + } + } + + if lifetime > currentAge { + return fresh + } + + return stale +} + +// Returns true if either the request or the response includes the stale-if-error +// cache control extension: https://tools.ietf.org/html/rfc5861 +func canStaleOnError(respHeaders, reqHeaders http.Header) bool { + respCacheControl := parseCacheControl(respHeaders) + reqCacheControl := parseCacheControl(reqHeaders) + + var err error + lifetime := time.Duration(-1) + + if staleMaxAge, ok := respCacheControl["stale-if-error"]; ok { + if staleMaxAge != "" { + lifetime, err = time.ParseDuration(staleMaxAge + "s") + if err != nil { + return false + } + } else { + return true + } + } + if staleMaxAge, ok := reqCacheControl["stale-if-error"]; ok { + if staleMaxAge != "" { + lifetime, err = time.ParseDuration(staleMaxAge + "s") + if err != nil { + return false + } + } else { + return true + } + } + + if lifetime >= 0 { + date, err := Date(respHeaders) + if err != nil { + return false + } + currentAge := clock.since(date) + if lifetime > currentAge { + return true + } + } + + return false +} + +func getEndToEndHeaders(respHeaders http.Header) []string { + // These headers are always hop-by-hop + hopByHopHeaders := map[string]struct{}{ + "Connection": struct{}{}, + "Keep-Alive": struct{}{}, + "Proxy-Authenticate": struct{}{}, + "Proxy-Authorization": struct{}{}, + "Te": struct{}{}, + "Trailers": struct{}{}, + "Transfer-Encoding": struct{}{}, + "Upgrade": struct{}{}, + } + + for _, extra := range strings.Split(respHeaders.Get("connection"), ",") { + // any header listed in connection, if present, is also considered hop-by-hop + if strings.Trim(extra, " ") != "" { + hopByHopHeaders[http.CanonicalHeaderKey(extra)] = struct{}{} + } + } + endToEndHeaders := []string{} + for respHeader, _ := range respHeaders { + if _, ok := hopByHopHeaders[respHeader]; !ok { + endToEndHeaders = append(endToEndHeaders, respHeader) + } + } + return endToEndHeaders +} + +func canStore(reqCacheControl, respCacheControl cacheControl) (canStore bool) { + if _, ok := respCacheControl["no-store"]; ok { + return false + } + if _, ok := reqCacheControl["no-store"]; ok { + return false + } + return true +} + +func newGatewayTimeoutResponse(req *http.Request) *http.Response { + var braw bytes.Buffer + braw.WriteString("HTTP/1.1 504 Gateway Timeout\r\n\r\n") + resp, err := http.ReadResponse(bufio.NewReader(&braw), req) + if err != nil { + panic(err) + } + return resp +} + +// cloneRequest returns a clone of the provided *http.Request. +// The clone is a shallow copy of the struct and its Header map. +// (This function copyright goauth2 authors: https://code.google.com/p/goauth2) +func cloneRequest(r *http.Request) *http.Request { + // shallow copy of the struct + r2 := new(http.Request) + *r2 = *r + // deep copy of the Header + r2.Header = make(http.Header) + for k, s := range r.Header { + r2.Header[k] = s + } + return r2 +} + +type cacheControl map[string]string + +func parseCacheControl(headers http.Header) cacheControl { + cc := cacheControl{} + ccHeader := headers.Get("Cache-Control") + for _, part := range strings.Split(ccHeader, ",") { + part = strings.Trim(part, " ") + if part == "" { + continue + } + if strings.ContainsRune(part, '=') { + keyval := strings.Split(part, "=") + cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",") + } else { + cc[part] = "" + } + } + return cc +} + +// headerAllCommaSepValues returns all comma-separated values (each +// with whitespace trimmed) for header name in headers. According to +// Section 4.2 of the HTTP/1.1 spec +// (http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2), +// values from multiple occurrences of a header should be concatenated, if +// the header's value is a comma-separated list. +func headerAllCommaSepValues(headers http.Header, name string) []string { + var vals []string + for _, val := range headers[http.CanonicalHeaderKey(name)] { + fields := strings.Split(val, ",") + for i, f := range fields { + fields[i] = strings.TrimSpace(f) + } + vals = append(vals, fields...) + } + return vals +} + +// cachingReadCloser is a wrapper around ReadCloser R that calls OnEOF +// handler with a full copy of the content read from R when EOF is +// reached. +type cachingReadCloser struct { + // Underlying ReadCloser. + R io.ReadCloser + // OnEOF is called with a copy of the content of R when EOF is reached. + OnEOF func(io.Reader) + + buf bytes.Buffer // buf stores a copy of the content of R. +} + +// Read reads the next len(p) bytes from R or until R is drained. The +// return value n is the number of bytes read. If R has no data to +// return, err is io.EOF and OnEOF is called with a full copy of what +// has been read so far. +func (r *cachingReadCloser) Read(p []byte) (n int, err error) { + n, err = r.R.Read(p) + r.buf.Write(p[:n]) + if err == io.EOF { + r.OnEOF(bytes.NewReader(r.buf.Bytes())) + } + return n, err +} + +func (r *cachingReadCloser) Close() error { + return r.R.Close() +} + +// NewMemoryCacheTransport returns a new Transport using the in-memory cache implementation +func NewMemoryCacheTransport() *Transport { + c := NewMemoryCache() + t := NewTransport(c) + return t +} diff --git a/vendor/github.com/gregjones/httpcache/httpcache_test.go b/vendor/github.com/gregjones/httpcache/httpcache_test.go new file mode 100644 index 000000000..a50464180 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/httpcache_test.go @@ -0,0 +1,1475 @@ +package httpcache + +import ( + "bytes" + "errors" + "flag" + "io" + "io/ioutil" + "net/http" + "net/http/httptest" + "os" + "strconv" + "testing" + "time" +) + +var s struct { + server *httptest.Server + client http.Client + transport *Transport + done chan struct{} // Closed to unlock infinite handlers. +} + +type fakeClock struct { + elapsed time.Duration +} + +func (c *fakeClock) since(t time.Time) time.Duration { + return c.elapsed +} + +func TestMain(m *testing.M) { + flag.Parse() + setup() + code := m.Run() + teardown() + os.Exit(code) +} + +func setup() { + tp := NewMemoryCacheTransport() + client := http.Client{Transport: tp} + s.transport = tp + s.client = client + s.done = make(chan struct{}) + + mux := http.NewServeMux() + s.server = httptest.NewServer(mux) + + mux.HandleFunc("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + })) + + mux.HandleFunc("/method", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + w.Write([]byte(r.Method)) + })) + + mux.HandleFunc("/range", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + lm := "Fri, 14 Dec 2010 01:01:50 GMT" + if r.Header.Get("if-modified-since") == lm { + w.WriteHeader(http.StatusNotModified) + return + } + w.Header().Set("last-modified", lm) + if r.Header.Get("range") == "bytes=4-9" { + w.WriteHeader(http.StatusPartialContent) + w.Write([]byte(" text ")) + return + } + w.Write([]byte("Some text content")) + })) + + mux.HandleFunc("/nostore", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "no-store") + })) + + mux.HandleFunc("/etag", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + etag := "124567" + if r.Header.Get("if-none-match") == etag { + w.WriteHeader(http.StatusNotModified) + return + } + w.Header().Set("etag", etag) + })) + + mux.HandleFunc("/lastmodified", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + lm := "Fri, 14 Dec 2010 01:01:50 GMT" + if r.Header.Get("if-modified-since") == lm { + w.WriteHeader(http.StatusNotModified) + return + } + w.Header().Set("last-modified", lm) + })) + + mux.HandleFunc("/varyaccept", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + w.Header().Set("Content-Type", "text/plain") + w.Header().Set("Vary", "Accept") + w.Write([]byte("Some text content")) + })) + + mux.HandleFunc("/doublevary", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + w.Header().Set("Content-Type", "text/plain") + w.Header().Set("Vary", "Accept, Accept-Language") + w.Write([]byte("Some text content")) + })) + mux.HandleFunc("/2varyheaders", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + w.Header().Set("Content-Type", "text/plain") + w.Header().Add("Vary", "Accept") + w.Header().Add("Vary", "Accept-Language") + w.Write([]byte("Some text content")) + })) + mux.HandleFunc("/varyunused", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "max-age=3600") + w.Header().Set("Content-Type", "text/plain") + w.Header().Set("Vary", "X-Madeup-Header") + w.Write([]byte("Some text content")) + })) + + mux.HandleFunc("/cachederror", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + etag := "abc" + if r.Header.Get("if-none-match") == etag { + w.WriteHeader(http.StatusNotModified) + return + } + w.Header().Set("etag", etag) + w.WriteHeader(http.StatusNotFound) + w.Write([]byte("Not found")) + })) + + updateFieldsCounter := 0 + mux.HandleFunc("/updatefields", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("X-Counter", strconv.Itoa(updateFieldsCounter)) + w.Header().Set("Etag", `"e"`) + updateFieldsCounter++ + if r.Header.Get("if-none-match") != "" { + w.WriteHeader(http.StatusNotModified) + return + } + w.Write([]byte("Some text content")) + })) + + // Take 3 seconds to return 200 OK (for testing client timeouts). + mux.HandleFunc("/3seconds", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + time.Sleep(3 * time.Second) + })) + + mux.HandleFunc("/infinite", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + for { + select { + case <-s.done: + return + default: + w.Write([]byte{0}) + } + } + })) +} + +func teardown() { + close(s.done) + s.server.Close() +} + +func resetTest() { + s.transport.Cache = NewMemoryCache() + clock = &realClock{} +} + +// TestCacheableMethod ensures that uncacheable method does not get stored +// in cache and get incorrectly used for a following cacheable method request. +func TestCacheableMethod(t *testing.T) { + resetTest() + { + req, err := http.NewRequest("POST", s.server.URL+"/method", nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), "POST"; got != want { + t.Errorf("got %q, want %q", got, want) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) + } + } + { + req, err := http.NewRequest("GET", s.server.URL+"/method", nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), "GET"; got != want { + t.Errorf("got wrong body %q, want %q", got, want) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) + } + if resp.Header.Get(XFromCache) != "" { + t.Errorf("XFromCache header isn't blank") + } + } +} + +func TestDontServeHeadResponseToGetRequest(t *testing.T) { + resetTest() + url := s.server.URL + "/" + req, err := http.NewRequest(http.MethodHead, url, nil) + if err != nil { + t.Fatal(err) + } + _, err = s.client.Do(req) + if err != nil { + t.Fatal(err) + } + req, err = http.NewRequest(http.MethodGet, url, nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + if resp.Header.Get(XFromCache) != "" { + t.Errorf("Cache should not match") + } +} + +func TestDontStorePartialRangeInCache(t *testing.T) { + resetTest() + { + req, err := http.NewRequest("GET", s.server.URL+"/range", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("range", "bytes=4-9") + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), " text "; got != want { + t.Errorf("got %q, want %q", got, want) + } + if resp.StatusCode != http.StatusPartialContent { + t.Errorf("response status code isn't 206 Partial Content: %v", resp.StatusCode) + } + } + { + req, err := http.NewRequest("GET", s.server.URL+"/range", nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), "Some text content"; got != want { + t.Errorf("got %q, want %q", got, want) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) + } + if resp.Header.Get(XFromCache) != "" { + t.Error("XFromCache header isn't blank") + } + } + { + req, err := http.NewRequest("GET", s.server.URL+"/range", nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), "Some text content"; got != want { + t.Errorf("got %q, want %q", got, want) + } + if resp.StatusCode != http.StatusOK { + t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) + } + if resp.Header.Get(XFromCache) != "1" { + t.Errorf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } + { + req, err := http.NewRequest("GET", s.server.URL+"/range", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("range", "bytes=4-9") + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + var buf bytes.Buffer + _, err = io.Copy(&buf, resp.Body) + if err != nil { + t.Fatal(err) + } + err = resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if got, want := buf.String(), " text "; got != want { + t.Errorf("got %q, want %q", got, want) + } + if resp.StatusCode != http.StatusPartialContent { + t.Errorf("response status code isn't 206 Partial Content: %v", resp.StatusCode) + } + } +} + +func TestCacheOnlyIfBodyRead(t *testing.T) { + resetTest() + { + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + // We do not read the body + resp.Body.Close() + } + { + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatalf("XFromCache header isn't blank") + } + } +} + +func TestOnlyReadBodyOnDemand(t *testing.T) { + resetTest() + + req, err := http.NewRequest("GET", s.server.URL+"/infinite", nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) // This shouldn't hang forever. + if err != nil { + t.Fatal(err) + } + buf := make([]byte, 10) // Only partially read the body. + _, err = resp.Body.Read(buf) + if err != nil { + t.Fatal(err) + } + resp.Body.Close() +} + +func TestGetOnlyIfCachedHit(t *testing.T) { + resetTest() + { + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + req.Header.Add("cache-control", "only-if-cached") + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + if resp.StatusCode != http.StatusOK { + t.Fatalf("response status code isn't 200 OK: %v", resp.StatusCode) + } + } +} + +func TestGetOnlyIfCachedMiss(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + req.Header.Add("cache-control", "only-if-cached") + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + if resp.StatusCode != http.StatusGatewayTimeout { + t.Fatalf("response status code isn't 504 GatewayTimeout: %v", resp.StatusCode) + } +} + +func TestGetNoStoreRequest(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL, nil) + if err != nil { + t.Fatal(err) + } + req.Header.Add("Cache-Control", "no-store") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } +} + +func TestGetNoStoreResponse(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/nostore", nil) + if err != nil { + t.Fatal(err) + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } +} + +func TestGetWithEtag(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/etag", nil) + if err != nil { + t.Fatal(err) + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + // additional assertions to verify that 304 response is converted properly + if resp.StatusCode != http.StatusOK { + t.Fatalf("response status code isn't 200 OK: %v", resp.StatusCode) + } + if _, ok := resp.Header["Connection"]; ok { + t.Fatalf("Connection header isn't absent") + } + } +} + +func TestGetWithLastModified(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/lastmodified", nil) + if err != nil { + t.Fatal(err) + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } +} + +func TestGetWithVary(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/varyaccept", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("Accept", "text/plain") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get("Vary") != "Accept" { + t.Fatalf(`Vary header isn't "Accept": %v`, resp.Header.Get("Vary")) + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } + req.Header.Set("Accept", "text/html") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + req.Header.Set("Accept", "") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } +} + +func TestGetWithDoubleVary(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/doublevary", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("Accept", "text/plain") + req.Header.Set("Accept-Language", "da, en-gb;q=0.8, en;q=0.7") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get("Vary") == "" { + t.Fatalf(`Vary header is blank`) + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } + req.Header.Set("Accept-Language", "") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + req.Header.Set("Accept-Language", "da") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } +} + +func TestGetWith2VaryHeaders(t *testing.T) { + resetTest() + // Tests that multiple Vary headers' comma-separated lists are + // merged. See https://github.com/gregjones/httpcache/issues/27. + const ( + accept = "text/plain" + acceptLanguage = "da, en-gb;q=0.8, en;q=0.7" + ) + req, err := http.NewRequest("GET", s.server.URL+"/2varyheaders", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("Accept", accept) + req.Header.Set("Accept-Language", acceptLanguage) + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get("Vary") == "" { + t.Fatalf(`Vary header is blank`) + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } + req.Header.Set("Accept-Language", "") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + req.Header.Set("Accept-Language", "da") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + req.Header.Set("Accept-Language", acceptLanguage) + req.Header.Set("Accept", "") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + } + req.Header.Set("Accept", "image/png") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "" { + t.Fatal("XFromCache header isn't blank") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } +} + +func TestGetVaryUnused(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/varyunused", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("Accept", "text/plain") + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get("Vary") == "" { + t.Fatalf(`Vary header is blank`) + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + } +} + +func TestUpdateFields(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/updatefields", nil) + if err != nil { + t.Fatal(err) + } + var counter, counter2 string + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + counter = resp.Header.Get("x-counter") + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.Header.Get(XFromCache) != "1" { + t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) + } + counter2 = resp.Header.Get("x-counter") + } + if counter == counter2 { + t.Fatalf(`both "x-counter" values are equal: %v %v`, counter, counter2) + } +} + +// This tests the fix for https://github.com/gregjones/httpcache/issues/74. +// Previously, after validating a cached response, its StatusCode +// was incorrectly being replaced. +func TestCachedErrorsKeepStatus(t *testing.T) { + resetTest() + req, err := http.NewRequest("GET", s.server.URL+"/cachederror", nil) + if err != nil { + t.Fatal(err) + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + io.Copy(ioutil.Discard, resp.Body) + } + { + resp, err := s.client.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusNotFound { + t.Fatalf("Status code isn't 404: %d", resp.StatusCode) + } + } +} + +func TestParseCacheControl(t *testing.T) { + resetTest() + h := http.Header{} + for range parseCacheControl(h) { + t.Fatal("cacheControl should be empty") + } + + h.Set("cache-control", "no-cache") + { + cc := parseCacheControl(h) + if _, ok := cc["foo"]; ok { + t.Error(`Value "foo" shouldn't exist`) + } + noCache, ok := cc["no-cache"] + if !ok { + t.Fatalf(`"no-cache" value isn't set`) + } + if noCache != "" { + t.Fatalf(`"no-cache" value isn't blank: %v`, noCache) + } + } + h.Set("cache-control", "no-cache, max-age=3600") + { + cc := parseCacheControl(h) + noCache, ok := cc["no-cache"] + if !ok { + t.Fatalf(`"no-cache" value isn't set`) + } + if noCache != "" { + t.Fatalf(`"no-cache" value isn't blank: %v`, noCache) + } + if cc["max-age"] != "3600" { + t.Fatalf(`"max-age" value isn't "3600": %v`, cc["max-age"]) + } + } +} + +func TestNoCacheRequestExpiration(t *testing.T) { + resetTest() + respHeaders := http.Header{} + respHeaders.Set("Cache-Control", "max-age=7200") + + reqHeaders := http.Header{} + reqHeaders.Set("Cache-Control", "no-cache") + if getFreshness(respHeaders, reqHeaders) != transparent { + t.Fatal("freshness isn't transparent") + } +} + +func TestNoCacheResponseExpiration(t *testing.T) { + resetTest() + respHeaders := http.Header{} + respHeaders.Set("Cache-Control", "no-cache") + respHeaders.Set("Expires", "Wed, 19 Apr 3000 11:43:00 GMT") + + reqHeaders := http.Header{} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestReqMustRevalidate(t *testing.T) { + resetTest() + // not paying attention to request setting max-stale means never returning stale + // responses, so always acting as if must-revalidate is set + respHeaders := http.Header{} + + reqHeaders := http.Header{} + reqHeaders.Set("Cache-Control", "must-revalidate") + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestRespMustRevalidate(t *testing.T) { + resetTest() + respHeaders := http.Header{} + respHeaders.Set("Cache-Control", "must-revalidate") + + reqHeaders := http.Header{} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestFreshExpiration(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("expires", now.Add(time.Duration(2)*time.Second).Format(time.RFC1123)) + + reqHeaders := http.Header{} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + clock = &fakeClock{elapsed: 3 * time.Second} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestMaxAge(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("cache-control", "max-age=2") + + reqHeaders := http.Header{} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + clock = &fakeClock{elapsed: 3 * time.Second} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestMaxAgeZero(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("cache-control", "max-age=0") + + reqHeaders := http.Header{} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestBothMaxAge(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("cache-control", "max-age=2") + + reqHeaders := http.Header{} + reqHeaders.Set("cache-control", "max-age=0") + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestMinFreshWithExpires(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("expires", now.Add(time.Duration(2)*time.Second).Format(time.RFC1123)) + + reqHeaders := http.Header{} + reqHeaders.Set("cache-control", "min-fresh=1") + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + reqHeaders = http.Header{} + reqHeaders.Set("cache-control", "min-fresh=2") + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func TestEmptyMaxStale(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("cache-control", "max-age=20") + + reqHeaders := http.Header{} + reqHeaders.Set("cache-control", "max-stale") + clock = &fakeClock{elapsed: 10 * time.Second} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + clock = &fakeClock{elapsed: 60 * time.Second} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } +} + +func TestMaxStaleValue(t *testing.T) { + resetTest() + now := time.Now() + respHeaders := http.Header{} + respHeaders.Set("date", now.Format(time.RFC1123)) + respHeaders.Set("cache-control", "max-age=10") + + reqHeaders := http.Header{} + reqHeaders.Set("cache-control", "max-stale=20") + clock = &fakeClock{elapsed: 5 * time.Second} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + clock = &fakeClock{elapsed: 15 * time.Second} + if getFreshness(respHeaders, reqHeaders) != fresh { + t.Fatal("freshness isn't fresh") + } + + clock = &fakeClock{elapsed: 30 * time.Second} + if getFreshness(respHeaders, reqHeaders) != stale { + t.Fatal("freshness isn't stale") + } +} + +func containsHeader(headers []string, header string) bool { + for _, v := range headers { + if http.CanonicalHeaderKey(v) == http.CanonicalHeaderKey(header) { + return true + } + } + return false +} + +func TestGetEndToEndHeaders(t *testing.T) { + resetTest() + var ( + headers http.Header + end2end []string + ) + + headers = http.Header{} + headers.Set("content-type", "text/html") + headers.Set("te", "deflate") + + end2end = getEndToEndHeaders(headers) + if !containsHeader(end2end, "content-type") { + t.Fatal(`doesn't contain "content-type" header`) + } + if containsHeader(end2end, "te") { + t.Fatal(`doesn't contain "te" header`) + } + + headers = http.Header{} + headers.Set("connection", "content-type") + headers.Set("content-type", "text/csv") + headers.Set("te", "deflate") + end2end = getEndToEndHeaders(headers) + if containsHeader(end2end, "connection") { + t.Fatal(`doesn't contain "connection" header`) + } + if containsHeader(end2end, "content-type") { + t.Fatal(`doesn't contain "content-type" header`) + } + if containsHeader(end2end, "te") { + t.Fatal(`doesn't contain "te" header`) + } + + headers = http.Header{} + end2end = getEndToEndHeaders(headers) + if len(end2end) != 0 { + t.Fatal(`non-zero end2end headers`) + } + + headers = http.Header{} + headers.Set("connection", "content-type") + end2end = getEndToEndHeaders(headers) + if len(end2end) != 0 { + t.Fatal(`non-zero end2end headers`) + } +} + +type transportMock struct { + response *http.Response + err error +} + +func (t transportMock) RoundTrip(req *http.Request) (resp *http.Response, err error) { + return t.response, t.err +} + +func TestStaleIfErrorRequest(t *testing.T) { + resetTest() + now := time.Now() + tmock := transportMock{ + response: &http.Response{ + Status: http.StatusText(http.StatusOK), + StatusCode: http.StatusOK, + Header: http.Header{ + "Date": []string{now.Format(time.RFC1123)}, + "Cache-Control": []string{"no-cache"}, + }, + Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), + }, + err: nil, + } + tp := NewMemoryCacheTransport() + tp.Transport = &tmock + + // First time, response is cached on success + r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) + r.Header.Set("Cache-Control", "stale-if-error") + resp, err := tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + // On failure, response is returned from the cache + tmock.response = nil + tmock.err = errors.New("some error") + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } +} + +func TestStaleIfErrorRequestLifetime(t *testing.T) { + resetTest() + now := time.Now() + tmock := transportMock{ + response: &http.Response{ + Status: http.StatusText(http.StatusOK), + StatusCode: http.StatusOK, + Header: http.Header{ + "Date": []string{now.Format(time.RFC1123)}, + "Cache-Control": []string{"no-cache"}, + }, + Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), + }, + err: nil, + } + tp := NewMemoryCacheTransport() + tp.Transport = &tmock + + // First time, response is cached on success + r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) + r.Header.Set("Cache-Control", "stale-if-error=100") + resp, err := tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + // On failure, response is returned from the cache + tmock.response = nil + tmock.err = errors.New("some error") + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + + // Same for http errors + tmock.response = &http.Response{StatusCode: http.StatusInternalServerError} + tmock.err = nil + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + + // If failure last more than max stale, error is returned + clock = &fakeClock{elapsed: 200 * time.Second} + _, err = tp.RoundTrip(r) + if err != tmock.err { + t.Fatalf("got err %v, want %v", err, tmock.err) + } +} + +func TestStaleIfErrorResponse(t *testing.T) { + resetTest() + now := time.Now() + tmock := transportMock{ + response: &http.Response{ + Status: http.StatusText(http.StatusOK), + StatusCode: http.StatusOK, + Header: http.Header{ + "Date": []string{now.Format(time.RFC1123)}, + "Cache-Control": []string{"no-cache, stale-if-error"}, + }, + Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), + }, + err: nil, + } + tp := NewMemoryCacheTransport() + tp.Transport = &tmock + + // First time, response is cached on success + r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) + resp, err := tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + // On failure, response is returned from the cache + tmock.response = nil + tmock.err = errors.New("some error") + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } +} + +func TestStaleIfErrorResponseLifetime(t *testing.T) { + resetTest() + now := time.Now() + tmock := transportMock{ + response: &http.Response{ + Status: http.StatusText(http.StatusOK), + StatusCode: http.StatusOK, + Header: http.Header{ + "Date": []string{now.Format(time.RFC1123)}, + "Cache-Control": []string{"no-cache, stale-if-error=100"}, + }, + Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), + }, + err: nil, + } + tp := NewMemoryCacheTransport() + tp.Transport = &tmock + + // First time, response is cached on success + r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) + resp, err := tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + // On failure, response is returned from the cache + tmock.response = nil + tmock.err = errors.New("some error") + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + + // If failure last more than max stale, error is returned + clock = &fakeClock{elapsed: 200 * time.Second} + _, err = tp.RoundTrip(r) + if err != tmock.err { + t.Fatalf("got err %v, want %v", err, tmock.err) + } +} + +// This tests the fix for https://github.com/gregjones/httpcache/issues/74. +// Previously, after a stale response was used after encountering an error, +// its StatusCode was being incorrectly replaced. +func TestStaleIfErrorKeepsStatus(t *testing.T) { + resetTest() + now := time.Now() + tmock := transportMock{ + response: &http.Response{ + Status: http.StatusText(http.StatusNotFound), + StatusCode: http.StatusNotFound, + Header: http.Header{ + "Date": []string{now.Format(time.RFC1123)}, + "Cache-Control": []string{"no-cache"}, + }, + Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), + }, + err: nil, + } + tp := NewMemoryCacheTransport() + tp.Transport = &tmock + + // First time, response is cached on success + r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) + r.Header.Set("Cache-Control", "stale-if-error") + resp, err := tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + _, err = ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + + // On failure, response is returned from the cache + tmock.response = nil + tmock.err = errors.New("some error") + resp, err = tp.RoundTrip(r) + if err != nil { + t.Fatal(err) + } + if resp == nil { + t.Fatal("resp is nil") + } + if resp.StatusCode != http.StatusNotFound { + t.Fatalf("Status wasn't 404: %d", resp.StatusCode) + } +} + +// Test that http.Client.Timeout is respected when cache transport is used. +// That is so as long as request cancellation is propagated correctly. +// In the past, that required CancelRequest to be implemented correctly, +// but modern http.Client uses Request.Cancel (or request context) instead, +// so we don't have to do anything. +func TestClientTimeout(t *testing.T) { + if testing.Short() { + t.Skip("skipping timeout test in short mode") // Because it takes at least 3 seconds to run. + } + resetTest() + client := &http.Client{ + Transport: NewMemoryCacheTransport(), + Timeout: time.Second, + } + started := time.Now() + resp, err := client.Get(s.server.URL + "/3seconds") + taken := time.Since(started) + if err == nil { + t.Error("got nil error, want timeout error") + } + if resp != nil { + t.Error("got non-nil resp, want nil resp") + } + if taken >= 2*time.Second { + t.Error("client.Do took 2+ seconds, want < 2 seconds") + } +} diff --git a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go new file mode 100644 index 000000000..9bcb7e277 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go @@ -0,0 +1,51 @@ +// Package leveldbcache provides an implementation of httpcache.Cache that +// uses github.com/syndtr/goleveldb/leveldb +package leveldbcache + +import ( + "github.com/syndtr/goleveldb/leveldb" +) + +// Cache is an implementation of httpcache.Cache with leveldb storage +type Cache struct { + db *leveldb.DB +} + +// Get returns the response corresponding to key if present +func (c *Cache) Get(key string) (resp []byte, ok bool) { + var err error + resp, err = c.db.Get([]byte(key), nil) + if err != nil { + return []byte{}, false + } + return resp, true +} + +// Set saves a response to the cache as key +func (c *Cache) Set(key string, resp []byte) { + c.db.Put([]byte(key), resp, nil) +} + +// Delete removes the response with key from the cache +func (c *Cache) Delete(key string) { + c.db.Delete([]byte(key), nil) +} + +// New returns a new Cache that will store leveldb in path +func New(path string) (*Cache, error) { + cache := &Cache{} + + var err error + cache.db, err = leveldb.OpenFile(path, nil) + + if err != nil { + return nil, err + } + return cache, nil +} + +// NewWithDB returns a new Cache using the provided leveldb as underlying +// storage. +func NewWithDB(db *leveldb.DB) *Cache { + return &Cache{db} +} diff --git a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go new file mode 100644 index 000000000..b885c0169 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go @@ -0,0 +1,46 @@ +package leveldbcache + +import ( + "bytes" + "io/ioutil" + "os" + "path/filepath" + "testing" +) + +func TestDiskCache(t *testing.T) { + tempDir, err := ioutil.TempDir("", "httpcache") + if err != nil { + t.Fatalf("TempDir: %v", err) + } + defer os.RemoveAll(tempDir) + + cache, err := New(filepath.Join(tempDir, "db")) + if err != nil { + t.Fatalf("New leveldb,: %v", err) + } + + key := "testKey" + _, ok := cache.Get(key) + if ok { + t.Fatal("retrieved key before adding it") + } + + val := []byte("some bytes") + cache.Set(key, val) + + retVal, ok := cache.Get(key) + if !ok { + t.Fatal("could not retrieve an element we just added") + } + if !bytes.Equal(retVal, val) { + t.Fatal("retrieved a different value than what we put in") + } + + cache.Delete(key) + + _, ok = cache.Get(key) + if ok { + t.Fatal("deleted key still present") + } +} diff --git a/vendor/github.com/gregjones/httpcache/memcache/appengine.go b/vendor/github.com/gregjones/httpcache/memcache/appengine.go new file mode 100644 index 000000000..e68d9bc09 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/memcache/appengine.go @@ -0,0 +1,61 @@ +// +build appengine + +// Package memcache provides an implementation of httpcache.Cache that uses App +// Engine's memcache package to store cached responses. +// +// When not built for Google App Engine, this package will provide an +// implementation that connects to a specified memcached server. See the +// memcache.go file in this package for details. +package memcache + +import ( + "appengine" + "appengine/memcache" +) + +// Cache is an implementation of httpcache.Cache that caches responses in App +// Engine's memcache. +type Cache struct { + appengine.Context +} + +// cacheKey modifies an httpcache key for use in memcache. Specifically, it +// prefixes keys to avoid collision with other data stored in memcache. +func cacheKey(key string) string { + return "httpcache:" + key +} + +// Get returns the response corresponding to key if present. +func (c *Cache) Get(key string) (resp []byte, ok bool) { + item, err := memcache.Get(c.Context, cacheKey(key)) + if err != nil { + if err != memcache.ErrCacheMiss { + c.Context.Errorf("error getting cached response: %v", err) + } + return nil, false + } + return item.Value, true +} + +// Set saves a response to the cache as key. +func (c *Cache) Set(key string, resp []byte) { + item := &memcache.Item{ + Key: cacheKey(key), + Value: resp, + } + if err := memcache.Set(c.Context, item); err != nil { + c.Context.Errorf("error caching response: %v", err) + } +} + +// Delete removes the response with key from the cache. +func (c *Cache) Delete(key string) { + if err := memcache.Delete(c.Context, cacheKey(key)); err != nil { + c.Context.Errorf("error deleting cached response: %v", err) + } +} + +// New returns a new Cache for the given context. +func New(ctx appengine.Context) *Cache { + return &Cache{ctx} +} diff --git a/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go b/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go new file mode 100644 index 000000000..818b2776e --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go @@ -0,0 +1,44 @@ +// +build appengine + +package memcache + +import ( + "bytes" + "testing" + + "appengine/aetest" +) + +func TestAppEngine(t *testing.T) { + ctx, err := aetest.NewContext(nil) + if err != nil { + t.Fatal(err) + } + defer ctx.Close() + + cache := New(ctx) + + key := "testKey" + _, ok := cache.Get(key) + if ok { + t.Fatal("retrieved key before adding it") + } + + val := []byte("some bytes") + cache.Set(key, val) + + retVal, ok := cache.Get(key) + if !ok { + t.Fatal("could not retrieve an element we just added") + } + if !bytes.Equal(retVal, val) { + t.Fatal("retrieved a different value than what we put in") + } + + cache.Delete(key) + + _, ok = cache.Get(key) + if ok { + t.Fatal("deleted key still present") + } +} diff --git a/vendor/github.com/gregjones/httpcache/memcache/memcache.go b/vendor/github.com/gregjones/httpcache/memcache/memcache.go new file mode 100644 index 000000000..462f0e541 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/memcache/memcache.go @@ -0,0 +1,60 @@ +// +build !appengine + +// Package memcache provides an implementation of httpcache.Cache that uses +// gomemcache to store cached responses. +// +// When built for Google App Engine, this package will provide an +// implementation that uses App Engine's memcache service. See the +// appengine.go file in this package for details. +package memcache + +import ( + "github.com/bradfitz/gomemcache/memcache" +) + +// Cache is an implementation of httpcache.Cache that caches responses in a +// memcache server. +type Cache struct { + *memcache.Client +} + +// cacheKey modifies an httpcache key for use in memcache. Specifically, it +// prefixes keys to avoid collision with other data stored in memcache. +func cacheKey(key string) string { + return "httpcache:" + key +} + +// Get returns the response corresponding to key if present. +func (c *Cache) Get(key string) (resp []byte, ok bool) { + item, err := c.Client.Get(cacheKey(key)) + if err != nil { + return nil, false + } + return item.Value, true +} + +// Set saves a response to the cache as key. +func (c *Cache) Set(key string, resp []byte) { + item := &memcache.Item{ + Key: cacheKey(key), + Value: resp, + } + c.Client.Set(item) +} + +// Delete removes the response with key from the cache. +func (c *Cache) Delete(key string) { + c.Client.Delete(cacheKey(key)) +} + +// New returns a new Cache using the provided memcache server(s) with equal +// weight. If a server is listed multiple times, it gets a proportional amount +// of weight. +func New(server ...string) *Cache { + return NewWithClient(memcache.New(server...)) +} + +// NewWithClient returns a new Cache with the given memcache client. +func NewWithClient(client *memcache.Client) *Cache { + return &Cache{client} +} diff --git a/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go b/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go new file mode 100644 index 000000000..4dcc547c6 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go @@ -0,0 +1,47 @@ +// +build !appengine + +package memcache + +import ( + "bytes" + "net" + "testing" +) + +const testServer = "localhost:11211" + +func TestMemCache(t *testing.T) { + conn, err := net.Dial("tcp", testServer) + if err != nil { + // TODO: rather than skip the test, fall back to a faked memcached server + t.Skipf("skipping test; no server running at %s", testServer) + } + conn.Write([]byte("flush_all\r\n")) // flush memcache + conn.Close() + + cache := New(testServer) + + key := "testKey" + _, ok := cache.Get(key) + if ok { + t.Fatal("retrieved key before adding it") + } + + val := []byte("some bytes") + cache.Set(key, val) + + retVal, ok := cache.Get(key) + if !ok { + t.Fatal("could not retrieve an element we just added") + } + if !bytes.Equal(retVal, val) { + t.Fatal("retrieved a different value than what we put in") + } + + cache.Delete(key) + + _, ok = cache.Get(key) + if ok { + t.Fatal("deleted key still present") + } +} diff --git a/vendor/github.com/gregjones/httpcache/redis/redis.go b/vendor/github.com/gregjones/httpcache/redis/redis.go new file mode 100644 index 000000000..3143d4438 --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/redis/redis.go @@ -0,0 +1,43 @@ +// Package redis provides a redis interface for http caching. +package redis + +import ( + "github.com/garyburd/redigo/redis" + "github.com/gregjones/httpcache" +) + +// cache is an implementation of httpcache.Cache that caches responses in a +// redis server. +type cache struct { + redis.Conn +} + +// cacheKey modifies an httpcache key for use in redis. Specifically, it +// prefixes keys to avoid collision with other data stored in redis. +func cacheKey(key string) string { + return "rediscache:" + key +} + +// Get returns the response corresponding to key if present. +func (c cache) Get(key string) (resp []byte, ok bool) { + item, err := redis.Bytes(c.Do("GET", cacheKey(key))) + if err != nil { + return nil, false + } + return item, true +} + +// Set saves a response to the cache as key. +func (c cache) Set(key string, resp []byte) { + c.Do("SET", cacheKey(key), resp) +} + +// Delete removes the response with key from the cache. +func (c cache) Delete(key string) { + c.Do("DEL", cacheKey(key)) +} + +// NewWithClient returns a new Cache with the given redis connection. +func NewWithClient(client redis.Conn) httpcache.Cache { + return cache{client} +} diff --git a/vendor/github.com/gregjones/httpcache/redis/redis_test.go b/vendor/github.com/gregjones/httpcache/redis/redis_test.go new file mode 100644 index 000000000..72f6f619a --- /dev/null +++ b/vendor/github.com/gregjones/httpcache/redis/redis_test.go @@ -0,0 +1,43 @@ +package redis + +import ( + "bytes" + "testing" + + "github.com/garyburd/redigo/redis" +) + +func TestRedisCache(t *testing.T) { + conn, err := redis.Dial("tcp", "localhost:6379") + if err != nil { + // TODO: rather than skip the test, fall back to a faked redis server + t.Skipf("skipping test; no server running at localhost:6379") + } + conn.Do("FLUSHALL") + + cache := NewWithClient(conn) + + key := "testKey" + _, ok := cache.Get(key) + if ok { + t.Fatal("retrieved key before adding it") + } + + val := []byte("some bytes") + cache.Set(key, val) + + retVal, ok := cache.Get(key) + if !ok { + t.Fatal("could not retrieve an element we just added") + } + if !bytes.Equal(retVal, val) { + t.Fatal("retrieved a different value than what we put in") + } + + cache.Delete(key) + + _, ok = cache.Get(key) + if ok { + t.Fatal("deleted key still present") + } +} diff --git a/vendor/github.com/howeyc/gopass/.travis.yml b/vendor/github.com/howeyc/gopass/.travis.yml deleted file mode 100644 index cc5d509fd..000000000 --- a/vendor/github.com/howeyc/gopass/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -language: go - -os: - - linux - - osx - -go: - - 1.3 - - 1.4 - - 1.5 - - tip diff --git a/vendor/github.com/howeyc/gopass/LICENSE.txt b/vendor/github.com/howeyc/gopass/LICENSE.txt deleted file mode 100644 index 14f74708a..000000000 --- a/vendor/github.com/howeyc/gopass/LICENSE.txt +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2012 Chris Howey - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/howeyc/gopass/OPENSOLARIS.LICENSE b/vendor/github.com/howeyc/gopass/OPENSOLARIS.LICENSE deleted file mode 100644 index da23621dc..000000000 --- a/vendor/github.com/howeyc/gopass/OPENSOLARIS.LICENSE +++ /dev/null @@ -1,384 +0,0 @@ -Unless otherwise noted, all files in this distribution are released -under the Common Development and Distribution License (CDDL). -Exceptions are noted within the associated source files. - --------------------------------------------------------------------- - - -COMMON DEVELOPMENT AND DISTRIBUTION LICENSE Version 1.0 - -1. Definitions. - - 1.1. "Contributor" means each individual or entity that creates - or contributes to the creation of Modifications. - - 1.2. "Contributor Version" means the combination of the Original - Software, prior Modifications used by a Contributor (if any), - and the Modifications made by that particular Contributor. - - 1.3. "Covered Software" means (a) the Original Software, or (b) - Modifications, or (c) the combination of files containing - Original Software with files containing Modifications, in - each case including portions thereof. - - 1.4. "Executable" means the Covered Software in any form other - than Source Code. - - 1.5. "Initial Developer" means the individual or entity that first - makes Original Software available under this License. - - 1.6. "Larger Work" means a work which combines Covered Software or - portions thereof with code not governed by the terms of this - License. - - 1.7. "License" means this document. - - 1.8. "Licensable" means having the right to grant, to the maximum - extent possible, whether at the time of the initial grant or - subsequently acquired, any and all of the rights conveyed - herein. - - 1.9. "Modifications" means the Source Code and Executable form of - any of the following: - - A. Any file that results from an addition to, deletion from or - modification of the contents of a file containing Original - Software or previous Modifications; - - B. Any new file that contains any part of the Original - Software or previous Modifications; or - - C. Any new file that is contributed or otherwise made - available under the terms of this License. - - 1.10. "Original Software" means the Source Code and Executable - form of computer software code that is originally released - under this License. - - 1.11. "Patent Claims" means any patent claim(s), now owned or - hereafter acquired, including without limitation, method, - process, and apparatus claims, in any patent Licensable by - grantor. - - 1.12. "Source Code" means (a) the common form of computer software - code in which modifications are made and (b) associated - documentation included in or with such code. - - 1.13. "You" (or "Your") means an individual or a legal entity - exercising rights under, and complying with all of the terms - of, this License. For legal entities, "You" includes any - entity which controls, is controlled by, or is under common - control with You. For purposes of this definition, - "control" means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by - contract or otherwise, or (b) ownership of more than fifty - percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants. - - 2.1. The Initial Developer Grant. - - Conditioned upon Your compliance with Section 3.1 below and - subject to third party intellectual property claims, the Initial - Developer hereby grants You a world-wide, royalty-free, - non-exclusive license: - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Initial Developer, to use, - reproduce, modify, display, perform, sublicense and - distribute the Original Software (or portions thereof), - with or without Modifications, and/or as part of a Larger - Work; and - - (b) under Patent Claims infringed by the making, using or - selling of Original Software, to make, have made, use, - practice, sell, and offer for sale, and/or otherwise - dispose of the Original Software (or portions thereof). - - (c) The licenses granted in Sections 2.1(a) and (b) are - effective on the date Initial Developer first distributes - or otherwise makes the Original Software available to a - third party under the terms of this License. - - (d) Notwithstanding Section 2.1(b) above, no patent license is - granted: (1) for code that You delete from the Original - Software, or (2) for infringements caused by: (i) the - modification of the Original Software, or (ii) the - combination of the Original Software with other software - or devices. - - 2.2. Contributor Grant. - - Conditioned upon Your compliance with Section 3.1 below and - subject to third party intellectual property claims, each - Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Contributor to use, reproduce, - modify, display, perform, sublicense and distribute the - Modifications created by such Contributor (or portions - thereof), either on an unmodified basis, with other - Modifications, as Covered Software and/or as part of a - Larger Work; and - - (b) under Patent Claims infringed by the making, using, or - selling of Modifications made by that Contributor either - alone and/or in combination with its Contributor Version - (or portions of such combination), to make, use, sell, - offer for sale, have made, and/or otherwise dispose of: - (1) Modifications made by that Contributor (or portions - thereof); and (2) the combination of Modifications made by - that Contributor with its Contributor Version (or portions - of such combination). - - (c) The licenses granted in Sections 2.2(a) and 2.2(b) are - effective on the date Contributor first distributes or - otherwise makes the Modifications available to a third - party. - - (d) Notwithstanding Section 2.2(b) above, no patent license is - granted: (1) for any code that Contributor has deleted - from the Contributor Version; (2) for infringements caused - by: (i) third party modifications of Contributor Version, - or (ii) the combination of Modifications made by that - Contributor with other software (except as part of the - Contributor Version) or other devices; or (3) under Patent - Claims infringed by Covered Software in the absence of - Modifications made by that Contributor. - -3. Distribution Obligations. - - 3.1. Availability of Source Code. - - Any Covered Software that You distribute or otherwise make - available in Executable form must also be made available in Source - Code form and that Source Code form must be distributed only under - the terms of this License. You must include a copy of this - License with every copy of the Source Code form of the Covered - Software You distribute or otherwise make available. You must - inform recipients of any such Covered Software in Executable form - as to how they can obtain such Covered Software in Source Code - form in a reasonable manner on or through a medium customarily - used for software exchange. - - 3.2. Modifications. - - The Modifications that You create or to which You contribute are - governed by the terms of this License. You represent that You - believe Your Modifications are Your original creation(s) and/or - You have sufficient rights to grant the rights conveyed by this - License. - - 3.3. Required Notices. - - You must include a notice in each of Your Modifications that - identifies You as the Contributor of the Modification. You may - not remove or alter any copyright, patent or trademark notices - contained within the Covered Software, or any notices of licensing - or any descriptive text giving attribution to any Contributor or - the Initial Developer. - - 3.4. Application of Additional Terms. - - You may not offer or impose any terms on any Covered Software in - Source Code form that alters or restricts the applicable version - of this License or the recipients' rights hereunder. You may - choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of - Covered Software. However, you may do so only on Your own behalf, - and not on behalf of the Initial Developer or any Contributor. - You must make it absolutely clear that any such warranty, support, - indemnity or liability obligation is offered by You alone, and You - hereby agree to indemnify the Initial Developer and every - Contributor for any liability incurred by the Initial Developer or - such Contributor as a result of warranty, support, indemnity or - liability terms You offer. - - 3.5. Distribution of Executable Versions. - - You may distribute the Executable form of the Covered Software - under the terms of this License or under the terms of a license of - Your choice, which may contain terms different from this License, - provided that You are in compliance with the terms of this License - and that the license for the Executable form does not attempt to - limit or alter the recipient's rights in the Source Code form from - the rights set forth in this License. If You distribute the - Covered Software in Executable form under a different license, You - must make it absolutely clear that any terms which differ from - this License are offered by You alone, not by the Initial - Developer or Contributor. You hereby agree to indemnify the - Initial Developer and every Contributor for any liability incurred - by the Initial Developer or such Contributor as a result of any - such terms You offer. - - 3.6. Larger Works. - - You may create a Larger Work by combining Covered Software with - other code not governed by the terms of this License and - distribute the Larger Work as a single product. In such a case, - You must make sure the requirements of this License are fulfilled - for the Covered Software. - -4. Versions of the License. - - 4.1. New Versions. - - Sun Microsystems, Inc. is the initial license steward and may - publish revised and/or new versions of this License from time to - time. Each version will be given a distinguishing version number. - Except as provided in Section 4.3, no one other than the license - steward has the right to modify this License. - - 4.2. Effect of New Versions. - - You may always continue to use, distribute or otherwise make the - Covered Software available under the terms of the version of the - License under which You originally received the Covered Software. - If the Initial Developer includes a notice in the Original - Software prohibiting it from being distributed or otherwise made - available under any subsequent version of the License, You must - distribute and make the Covered Software available under the terms - of the version of the License under which You originally received - the Covered Software. Otherwise, You may also choose to use, - distribute or otherwise make the Covered Software available under - the terms of any subsequent version of the License published by - the license steward. - - 4.3. Modified Versions. - - When You are an Initial Developer and You want to create a new - license for Your Original Software, You may create and use a - modified version of this License if You: (a) rename the license - and remove any references to the name of the license steward - (except to note that the license differs from this License); and - (b) otherwise make it clear that the license contains terms which - differ from this License. - -5. DISCLAIMER OF WARRANTY. - - COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" - BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, - INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED - SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR - PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND - PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY - COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE - INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY - NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF - WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF - ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS - DISCLAIMER. - -6. TERMINATION. - - 6.1. This License and the rights granted hereunder will terminate - automatically if You fail to comply with terms herein and fail to - cure such breach within 30 days of becoming aware of the breach. - Provisions which, by their nature, must remain in effect beyond - the termination of this License shall survive. - - 6.2. If You assert a patent infringement claim (excluding - declaratory judgment actions) against Initial Developer or a - Contributor (the Initial Developer or Contributor against whom You - assert such claim is referred to as "Participant") alleging that - the Participant Software (meaning the Contributor Version where - the Participant is a Contributor or the Original Software where - the Participant is the Initial Developer) directly or indirectly - infringes any patent, then any and all rights granted directly or - indirectly to You by such Participant, the Initial Developer (if - the Initial Developer is not the Participant) and all Contributors - under Sections 2.1 and/or 2.2 of this License shall, upon 60 days - notice from Participant terminate prospectively and automatically - at the expiration of such 60 day notice period, unless if within - such 60 day period You withdraw Your claim with respect to the - Participant Software against such Participant either unilaterally - or pursuant to a written agreement with Participant. - - 6.3. In the event of termination under Sections 6.1 or 6.2 above, - all end user licenses that have been validly granted by You or any - distributor hereunder prior to termination (excluding licenses - granted to You by any distributor) shall survive termination. - -7. LIMITATION OF LIABILITY. - - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT - (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE - INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF - COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE - LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR - CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT - LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK - STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER - COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN - INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF - LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL - INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT - APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO - NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR - CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT - APPLY TO YOU. - -8. U.S. GOVERNMENT END USERS. - - The Covered Software is a "commercial item," as that term is - defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial - computer software" (as that term is defined at 48 - C.F.R. 252.227-7014(a)(1)) and "commercial computer software - documentation" as such terms are used in 48 C.F.R. 12.212 - (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 - C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all - U.S. Government End Users acquire Covered Software with only those - rights set forth herein. This U.S. Government Rights clause is in - lieu of, and supersedes, any other FAR, DFAR, or other clause or - provision that addresses Government rights in computer software - under this License. - -9. MISCELLANEOUS. - - This License represents the complete agreement concerning subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. This License shall be governed - by the law of the jurisdiction specified in a notice contained - within the Original Software (except to the extent applicable law, - if any, provides otherwise), excluding such jurisdiction's - conflict-of-law provisions. Any litigation relating to this - License shall be subject to the jurisdiction of the courts located - in the jurisdiction and venue specified in a notice contained - within the Original Software, with the losing party responsible - for costs, including, without limitation, court costs and - reasonable attorneys' fees and expenses. The application of the - United Nations Convention on Contracts for the International Sale - of Goods is expressly excluded. Any law or regulation which - provides that the language of a contract shall be construed - against the drafter shall not apply to this License. You agree - that You alone are responsible for compliance with the United - States export administration regulations (and the export control - laws and regulation of any other countries) when You use, - distribute or otherwise make available any Covered Software. - -10. RESPONSIBILITY FOR CLAIMS. - - As between Initial Developer and the Contributors, each party is - responsible for claims and damages arising, directly or - indirectly, out of its utilization of rights under this License - and You agree to work with Initial Developer and Contributors to - distribute such responsibility on an equitable basis. Nothing - herein is intended or shall be deemed to constitute any admission - of liability. - --------------------------------------------------------------------- - -NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND -DISTRIBUTION LICENSE (CDDL) - -For Covered Software in this distribution, this License shall -be governed by the laws of the State of California (excluding -conflict-of-law provisions). - -Any litigation relating to this License shall be subject to the -jurisdiction of the Federal Courts of the Northern District of -California and the state courts of the State of California, with -venue lying in Santa Clara County, California. diff --git a/vendor/github.com/howeyc/gopass/README.md b/vendor/github.com/howeyc/gopass/README.md deleted file mode 100644 index 2d6a4e72c..000000000 --- a/vendor/github.com/howeyc/gopass/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# getpasswd in Go [![GoDoc](https://godoc.org/github.com/howeyc/gopass?status.svg)](https://godoc.org/github.com/howeyc/gopass) [![Build Status](https://secure.travis-ci.org/howeyc/gopass.png?branch=master)](http://travis-ci.org/howeyc/gopass) - -Retrieve password from user terminal or piped input without echo. - -Verified on BSD, Linux, and Windows. - -Example: -```go -package main - -import "fmt" -import "github.com/howeyc/gopass" - -func main() { - fmt.Printf("Password: ") - - // Silent. For printing *'s use gopass.GetPasswdMasked() - pass, err := gopass.GetPasswd() - if err != nil { - // Handle gopass.ErrInterrupted or getch() read error - } - - // Do something with pass -} -``` - -Caution: Multi-byte characters not supported! diff --git a/vendor/github.com/howeyc/gopass/pass.go b/vendor/github.com/howeyc/gopass/pass.go deleted file mode 100644 index f5bd5a51a..000000000 --- a/vendor/github.com/howeyc/gopass/pass.go +++ /dev/null @@ -1,110 +0,0 @@ -package gopass - -import ( - "errors" - "fmt" - "io" - "os" -) - -type FdReader interface { - io.Reader - Fd() uintptr -} - -var defaultGetCh = func(r io.Reader) (byte, error) { - buf := make([]byte, 1) - if n, err := r.Read(buf); n == 0 || err != nil { - if err != nil { - return 0, err - } - return 0, io.EOF - } - return buf[0], nil -} - -var ( - maxLength = 512 - ErrInterrupted = errors.New("interrupted") - ErrMaxLengthExceeded = fmt.Errorf("maximum byte limit (%v) exceeded", maxLength) - - // Provide variable so that tests can provide a mock implementation. - getch = defaultGetCh -) - -// getPasswd returns the input read from terminal. -// If prompt is not empty, it will be output as a prompt to the user -// If masked is true, typing will be matched by asterisks on the screen. -// Otherwise, typing will echo nothing. -func getPasswd(prompt string, masked bool, r FdReader, w io.Writer) ([]byte, error) { - var err error - var pass, bs, mask []byte - if masked { - bs = []byte("\b \b") - mask = []byte("*") - } - - if isTerminal(r.Fd()) { - if oldState, err := makeRaw(r.Fd()); err != nil { - return pass, err - } else { - defer func() { - restore(r.Fd(), oldState) - fmt.Fprintln(w) - }() - } - } - - if prompt != "" { - fmt.Fprint(w, prompt) - } - - // Track total bytes read, not just bytes in the password. This ensures any - // errors that might flood the console with nil or -1 bytes infinitely are - // capped. - var counter int - for counter = 0; counter <= maxLength; counter++ { - if v, e := getch(r); e != nil { - err = e - break - } else if v == 127 || v == 8 { - if l := len(pass); l > 0 { - pass = pass[:l-1] - fmt.Fprint(w, string(bs)) - } - } else if v == 13 || v == 10 { - break - } else if v == 3 { - err = ErrInterrupted - break - } else if v != 0 { - pass = append(pass, v) - fmt.Fprint(w, string(mask)) - } - } - - if counter > maxLength { - err = ErrMaxLengthExceeded - } - - return pass, err -} - -// GetPasswd returns the password read from the terminal without echoing input. -// The returned byte array does not include end-of-line characters. -func GetPasswd() ([]byte, error) { - return getPasswd("", false, os.Stdin, os.Stdout) -} - -// GetPasswdMasked returns the password read from the terminal, echoing asterisks. -// The returned byte array does not include end-of-line characters. -func GetPasswdMasked() ([]byte, error) { - return getPasswd("", true, os.Stdin, os.Stdout) -} - -// GetPasswdPrompt prompts the user and returns the password read from the terminal. -// If mask is true, then asterisks are echoed. -// The returned byte array does not include end-of-line characters. -func GetPasswdPrompt(prompt string, mask bool, r FdReader, w io.Writer) ([]byte, error) { - return getPasswd(prompt, mask, r, w) -} diff --git a/vendor/github.com/howeyc/gopass/pass_test.go b/vendor/github.com/howeyc/gopass/pass_test.go deleted file mode 100644 index 7ac315135..000000000 --- a/vendor/github.com/howeyc/gopass/pass_test.go +++ /dev/null @@ -1,225 +0,0 @@ -package gopass - -import ( - "bufio" - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "testing" - "time" -) - -// TestGetPasswd tests the password creation and output based on a byte buffer -// as input to mock the underlying getch() methods. -func TestGetPasswd(t *testing.T) { - type testData struct { - input []byte - - // Due to how backspaces are written, it is easier to manually write - // each expected output for the masked cases. - masked string - password string - byesLeft int - reason string - } - - ds := []testData{ - testData{[]byte("abc\n"), "***", "abc", 0, "Password parsing should stop at \\n"}, - testData{[]byte("abc\r"), "***", "abc", 0, "Password parsing should stop at \\r"}, - testData{[]byte("a\nbc\n"), "*", "a", 3, "Password parsing should stop at \\n"}, - testData{[]byte("*!]|\n"), "****", "*!]|", 0, "Special characters shouldn't affect the password."}, - - testData{[]byte("abc\r\n"), "***", "abc", 1, - "Password parsing should stop at \\r; Windows LINE_MODE should be unset so \\r is not converted to \\r\\n."}, - - testData{[]byte{'a', 'b', 'c', 8, '\n'}, "***\b \b", "ab", 0, "Backspace byte should remove the last read byte."}, - testData{[]byte{'a', 'b', 127, 'c', '\n'}, "**\b \b*", "ac", 0, "Delete byte should remove the last read byte."}, - testData{[]byte{'a', 'b', 127, 'c', 8, 127, '\n'}, "**\b \b*\b \b\b \b", "", 0, "Successive deletes continue to delete."}, - testData{[]byte{8, 8, 8, '\n'}, "", "", 0, "Deletes before characters are noops."}, - testData{[]byte{8, 8, 8, 'a', 'b', 'c', '\n'}, "***", "abc", 0, "Deletes before characters are noops."}, - - testData{[]byte{'a', 'b', 0, 'c', '\n'}, "***", "abc", 0, - "Nil byte should be ignored due; may get unintended nil bytes from syscalls on Windows."}, - } - - // Redirecting output for tests as they print to os.Stdout but we want to - // capture and test the output. - for _, masked := range []bool{true, false} { - for _, d := range ds { - pipeBytesToStdin(d.input) - - r, w, err := os.Pipe() - if err != nil { - t.Fatal(err.Error()) - } - - result, err := getPasswd("", masked, os.Stdin, w) - if err != nil { - t.Errorf("Error getting password: %s", err.Error()) - } - leftOnBuffer := flushStdin() - - // Test output (masked and unmasked). Delete/backspace actually - // deletes, overwrites and deletes again. As a result, we need to - // remove those from the pipe afterwards to mimic the console's - // interpretation of those bytes. - w.Close() - output, err := ioutil.ReadAll(r) - if err != nil { - t.Fatal(err.Error()) - } - var expectedOutput []byte - if masked { - expectedOutput = []byte(d.masked) - } else { - expectedOutput = []byte("") - } - if bytes.Compare(expectedOutput, output) != 0 { - t.Errorf("Expected output to equal %v (%q) but got %v (%q) instead when masked=%v. %s", expectedOutput, string(expectedOutput), output, string(output), masked, d.reason) - } - - if string(result) != d.password { - t.Errorf("Expected %q but got %q instead when masked=%v. %s", d.password, result, masked, d.reason) - } - - if leftOnBuffer != d.byesLeft { - t.Errorf("Expected %v bytes left on buffer but instead got %v when masked=%v. %s", d.byesLeft, leftOnBuffer, masked, d.reason) - } - } - } -} - -// TestPipe ensures we get our expected pipe behavior. -func TestPipe(t *testing.T) { - type testData struct { - input string - password string - expError error - } - ds := []testData{ - testData{"abc", "abc", io.EOF}, - testData{"abc\n", "abc", nil}, - testData{"abc\r", "abc", nil}, - testData{"abc\r\n", "abc", nil}, - } - - for _, d := range ds { - _, err := pipeToStdin(d.input) - if err != nil { - t.Log("Error writing input to stdin:", err) - t.FailNow() - } - pass, err := GetPasswd() - if string(pass) != d.password { - t.Errorf("Expected %q but got %q instead.", d.password, string(pass)) - } - if err != d.expError { - t.Errorf("Expected %v but got %q instead.", d.expError, err) - } - } -} - -// flushStdin reads from stdin for .5 seconds to ensure no bytes are left on -// the buffer. Returns the number of bytes read. -func flushStdin() int { - ch := make(chan byte) - go func(ch chan byte) { - reader := bufio.NewReader(os.Stdin) - for { - b, err := reader.ReadByte() - if err != nil { // Maybe log non io.EOF errors, if you want - close(ch) - return - } - ch <- b - } - close(ch) - }(ch) - - numBytes := 0 - for { - select { - case _, ok := <-ch: - if !ok { - return numBytes - } - numBytes++ - case <-time.After(500 * time.Millisecond): - return numBytes - } - } - return numBytes -} - -// pipeToStdin pipes the given string onto os.Stdin by replacing it with an -// os.Pipe. The write end of the pipe is closed so that EOF is read after the -// final byte. -func pipeToStdin(s string) (int, error) { - pipeReader, pipeWriter, err := os.Pipe() - if err != nil { - fmt.Println("Error getting os pipes:", err) - os.Exit(1) - } - os.Stdin = pipeReader - w, err := pipeWriter.WriteString(s) - pipeWriter.Close() - return w, err -} - -func pipeBytesToStdin(b []byte) (int, error) { - return pipeToStdin(string(b)) -} - -// TestGetPasswd_Err tests errors are properly handled from getch() -func TestGetPasswd_Err(t *testing.T) { - var inBuffer *bytes.Buffer - getch = func(io.Reader) (byte, error) { - b, err := inBuffer.ReadByte() - if err != nil { - return 13, err - } - if b == 'z' { - return 'z', fmt.Errorf("Forced error; byte returned should not be considered accurate.") - } - return b, nil - } - defer func() { getch = defaultGetCh }() - - for input, expectedPassword := range map[string]string{"abc": "abc", "abzc": "ab"} { - inBuffer = bytes.NewBufferString(input) - p, err := GetPasswdMasked() - if string(p) != expectedPassword { - t.Errorf("Expected %q but got %q instead.", expectedPassword, p) - } - if err == nil { - t.Errorf("Expected error to be returned.") - } - } -} - -func TestMaxPasswordLength(t *testing.T) { - type testData struct { - input []byte - expectedErr error - - // Helper field to output in case of failure; rather than hundreds of - // bytes. - inputDesc string - } - - ds := []testData{ - testData{append(bytes.Repeat([]byte{'a'}, maxLength), '\n'), nil, fmt.Sprintf("%v 'a' bytes followed by a newline", maxLength)}, - testData{append(bytes.Repeat([]byte{'a'}, maxLength+1), '\n'), ErrMaxLengthExceeded, fmt.Sprintf("%v 'a' bytes followed by a newline", maxLength+1)}, - testData{append(bytes.Repeat([]byte{0x00}, maxLength+1), '\n'), ErrMaxLengthExceeded, fmt.Sprintf("%v 0x00 bytes followed by a newline", maxLength+1)}, - } - - for _, d := range ds { - pipeBytesToStdin(d.input) - _, err := GetPasswd() - if err != d.expectedErr { - t.Errorf("Expected error to be %v; isntead got %v from %v", d.expectedErr, err, d.inputDesc) - } - } -} diff --git a/vendor/github.com/howeyc/gopass/terminal.go b/vendor/github.com/howeyc/gopass/terminal.go deleted file mode 100644 index 083564146..000000000 --- a/vendor/github.com/howeyc/gopass/terminal.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build !solaris - -package gopass - -import "golang.org/x/crypto/ssh/terminal" - -type terminalState struct { - state *terminal.State -} - -func isTerminal(fd uintptr) bool { - return terminal.IsTerminal(int(fd)) -} - -func makeRaw(fd uintptr) (*terminalState, error) { - state, err := terminal.MakeRaw(int(fd)) - - return &terminalState{ - state: state, - }, err -} - -func restore(fd uintptr, oldState *terminalState) error { - return terminal.Restore(int(fd), oldState.state) -} diff --git a/vendor/github.com/howeyc/gopass/terminal_solaris.go b/vendor/github.com/howeyc/gopass/terminal_solaris.go deleted file mode 100644 index 257e1b4e8..000000000 --- a/vendor/github.com/howeyc/gopass/terminal_solaris.go +++ /dev/null @@ -1,69 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -// Below is derived from Solaris source, so CDDL license is included. - -package gopass - -import ( - "syscall" - - "golang.org/x/sys/unix" -) - -type terminalState struct { - state *unix.Termios -} - -// isTerminal returns true if there is a terminal attached to the given -// file descriptor. -// Source: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c -func isTerminal(fd uintptr) bool { - var termio unix.Termio - err := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio) - return err == nil -} - -// makeRaw puts the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -// Source: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c -func makeRaw(fd uintptr) (*terminalState, error) { - oldTermiosPtr, err := unix.IoctlGetTermios(int(fd), unix.TCGETS) - if err != nil { - return nil, err - } - oldTermios := *oldTermiosPtr - - newTermios := oldTermios - newTermios.Lflag &^= syscall.ECHO | syscall.ECHOE | syscall.ECHOK | syscall.ECHONL - if err := unix.IoctlSetTermios(int(fd), unix.TCSETS, &newTermios); err != nil { - return nil, err - } - - return &terminalState{ - state: oldTermiosPtr, - }, nil -} - -func restore(fd uintptr, oldState *terminalState) error { - return unix.IoctlSetTermios(int(fd), unix.TCSETS, oldState.state) -} diff --git a/vendor/github.com/json-iterator/go/Gopkg.lock b/vendor/github.com/json-iterator/go/Gopkg.lock index 338f1c68a..3719afe8e 100644 --- a/vendor/github.com/json-iterator/go/Gopkg.lock +++ b/vendor/github.com/json-iterator/go/Gopkg.lock @@ -1,6 +1,12 @@ # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. +[[projects]] + name = "github.com/json-iterator/go" + packages = ["."] + revision = "ca39e5af3ece67bbcda3d0f4f56a8e24d9f2dad4" + version = "1.1.3" + [[projects]] name = "github.com/modern-go/concurrent" packages = ["."] @@ -16,6 +22,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "ac7003b5a981716353a43055ab7d4c5357403cb30a60de2dbdeb446c1544beaa" + inputs-digest = "56a0b9e9e61d2bc8af5e1b68537401b7f4d60805eda3d107058f3171aa5cf793" solver-name = "gps-cdcl" solver-version = 1 diff --git a/vendor/github.com/json-iterator/go/README.md b/vendor/github.com/json-iterator/go/README.md index 9f404aaa3..54d5afe95 100644 --- a/vendor/github.com/json-iterator/go/README.md +++ b/vendor/github.com/json-iterator/go/README.md @@ -31,6 +31,9 @@ Raw Result (easyjson requires static code generation) | easyjson encode | 883 ns/op | 576 B/op | 3 allocs/op | | jsoniter encode | 837 ns/op | 384 B/op | 4 allocs/op | +Always benchmark with your own workload. +The result depends heavily on the data input. + # Usage 100% compatibility with standard lib diff --git a/vendor/github.com/json-iterator/go/adapter.go b/vendor/github.com/json-iterator/go/adapter.go index 3a494eeb4..f371bfed7 100644 --- a/vendor/github.com/json-iterator/go/adapter.go +++ b/vendor/github.com/json-iterator/go/adapter.go @@ -77,7 +77,14 @@ func (adapter *Decoder) Decode(obj interface{}) error { // More is there more? func (adapter *Decoder) More() bool { - return adapter.iter.head != adapter.iter.tail + iter := adapter.iter + if iter.Error != nil { + return false + } + if iter.head != iter.tail { + return true + } + return iter.loadMore() } // Buffered remaining buffer diff --git a/vendor/github.com/json-iterator/go/api_tests/config_test.go b/vendor/github.com/json-iterator/go/api_tests/config_test.go index d3e93e5c6..7aa349bee 100644 --- a/vendor/github.com/json-iterator/go/api_tests/config_test.go +++ b/vendor/github.com/json-iterator/go/api_tests/config_test.go @@ -2,9 +2,10 @@ package test import ( "encoding/json" + "testing" + "github.com/json-iterator/go" "github.com/stretchr/testify/require" - "testing" ) func Test_use_number_for_unmarshal(t *testing.T) { @@ -45,3 +46,129 @@ func Test_read_large_number_as_interface(t *testing.T) { should.Nil(err) should.Equal(`123456789123456789123456789`, output) } + +type caseSensitiveStruct struct { + A string `json:"a"` + B string `json:"b,omitempty"` + C *C `json:"C,omitempty"` +} + +type C struct { + D int64 `json:"D,omitempty"` + E *E `json:"e,omitempty"` +} + +type E struct { + F string `json:"F,omitempty"` +} + +func Test_CaseSensitive(t *testing.T) { + should := require.New(t) + + testCases := []struct { + input string + expectedOutput string + caseSensitive bool + }{ + { + input: `{"A":"foo","B":"bar"}`, + expectedOutput: `{"a":"foo","b":"bar"}`, + caseSensitive: false, + }, + { + input: `{"a":"foo","b":"bar"}`, + expectedOutput: `{"a":"foo","b":"bar"}`, + caseSensitive: true, + }, + { + input: `{"a":"foo","b":"bar","C":{"D":10}}`, + expectedOutput: `{"a":"foo","b":"bar","C":{"D":10}}`, + caseSensitive: true, + }, + { + input: `{"a":"foo","B":"bar","c":{"d":10}}`, + expectedOutput: `{"a":"foo"}`, + caseSensitive: true, + }, + { + input: `{"a":"foo","C":{"d":10}}`, + expectedOutput: `{"a":"foo","C":{}}`, + caseSensitive: true, + }, + { + input: `{"a":"foo","C":{"D":10,"e":{"f":"baz"}}}`, + expectedOutput: `{"a":"foo","C":{"D":10,"e":{}}}`, + caseSensitive: true, + }, + { + input: `{"a":"foo","C":{"D":10,"e":{"F":"baz"}}}`, + expectedOutput: `{"a":"foo","C":{"D":10,"e":{"F":"baz"}}}`, + caseSensitive: true, + }, + { + input: `{"A":"foo","c":{"d":10,"E":{"f":"baz"}}}`, + expectedOutput: `{"a":"foo","C":{"D":10,"e":{"F":"baz"}}}`, + caseSensitive: false, + }, + } + + for _, tc := range testCases { + val := caseSensitiveStruct{} + err := jsoniter.Config{CaseSensitive: tc.caseSensitive}.Froze().UnmarshalFromString(tc.input, &val) + should.Nil(err) + + output, err := jsoniter.MarshalToString(val) + should.Nil(err) + should.Equal(tc.expectedOutput, output) + } +} + +type structWithElevenFields struct { + A string `json:"A,omitempty"` + B string `json:"B,omitempty"` + C string `json:"C,omitempty"` + D string `json:"d,omitempty"` + E string `json:"e,omitempty"` + F string `json:"f,omitempty"` + G string `json:"g,omitempty"` + H string `json:"h,omitempty"` + I string `json:"i,omitempty"` + J string `json:"j,omitempty"` + K string `json:"k,omitempty"` +} + +func Test_CaseSensitive_MoreThanTenFields(t *testing.T) { + should := require.New(t) + + testCases := []struct { + input string + expectedOutput string + caseSensitive bool + }{ + { + input: `{"A":"1","B":"2","C":"3","d":"4","e":"5","f":"6","g":"7","h":"8","i":"9","j":"10","k":"11"}`, + expectedOutput: `{"A":"1","B":"2","C":"3","d":"4","e":"5","f":"6","g":"7","h":"8","i":"9","j":"10","k":"11"}`, + caseSensitive: true, + }, + { + input: `{"a":"1","b":"2","c":"3","D":"4","E":"5","F":"6"}`, + expectedOutput: `{"A":"1","B":"2","C":"3","d":"4","e":"5","f":"6"}`, + caseSensitive: false, + }, + { + input: `{"A":"1","b":"2","d":"4","E":"5"}`, + expectedOutput: `{"A":"1","d":"4"}`, + caseSensitive: true, + }, + } + + for _, tc := range testCases { + val := structWithElevenFields{} + err := jsoniter.Config{CaseSensitive: tc.caseSensitive}.Froze().UnmarshalFromString(tc.input, &val) + should.Nil(err) + + output, err := jsoniter.MarshalToString(val) + should.Nil(err) + should.Equal(tc.expectedOutput, output) + } +} diff --git a/vendor/github.com/json-iterator/go/api_tests/decoder_test.go b/vendor/github.com/json-iterator/go/api_tests/decoder_test.go index eecfddbc8..8e1c16078 100644 --- a/vendor/github.com/json-iterator/go/api_tests/decoder_test.go +++ b/vendor/github.com/json-iterator/go/api_tests/decoder_test.go @@ -56,3 +56,9 @@ func Test_use_number(t *testing.T) { should.Nil(decoder2.Decode(&obj2)) should.Equal(json.Number("123"), obj2) } + +func Test_decoder_more(t *testing.T) { + should := require.New(t) + decoder := jsoniter.NewDecoder(bytes.NewBufferString("abcde")) + should.True(decoder.More()) +} \ No newline at end of file diff --git a/vendor/github.com/json-iterator/go/config.go b/vendor/github.com/json-iterator/go/config.go index bd66947d7..835819129 100644 --- a/vendor/github.com/json-iterator/go/config.go +++ b/vendor/github.com/json-iterator/go/config.go @@ -2,12 +2,13 @@ package jsoniter import ( "encoding/json" - "github.com/modern-go/concurrent" - "github.com/modern-go/reflect2" "io" "reflect" "sync" "unsafe" + + "github.com/modern-go/concurrent" + "github.com/modern-go/reflect2" ) // Config customize how the API should behave. @@ -23,6 +24,7 @@ type Config struct { OnlyTaggedField bool ValidateJsonRawMessage bool ObjectFieldMustBeSimpleString bool + CaseSensitive bool } // API the public interface of this package. @@ -75,6 +77,7 @@ type frozenConfig struct { extensions []Extension streamPool *sync.Pool iteratorPool *sync.Pool + caseSensitive bool } func (cfg *frozenConfig) initCache() { @@ -128,6 +131,7 @@ func (cfg Config) Froze() API { objectFieldMustBeSimpleString: cfg.ObjectFieldMustBeSimpleString, onlyTaggedField: cfg.OnlyTaggedField, disallowUnknownFields: cfg.DisallowUnknownFields, + caseSensitive: cfg.CaseSensitive, } api.streamPool = &sync.Pool{ New: func() interface{} { diff --git a/vendor/github.com/json-iterator/go/extra/fuzzy_decoder.go b/vendor/github.com/json-iterator/go/extra/fuzzy_decoder.go index 8ff1cc3db..52546b11d 100644 --- a/vendor/github.com/json-iterator/go/extra/fuzzy_decoder.go +++ b/vendor/github.com/json-iterator/go/extra/fuzzy_decoder.go @@ -217,6 +217,9 @@ func (decoder *fuzzyIntegerDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.It default: iter.ReportError("fuzzyIntegerDecoder", "not number or string") } + if len(str) == 0 { + str = "0" + } newIter := iter.Pool().BorrowIterator([]byte(str)) defer iter.Pool().ReturnIterator(newIter) isFloat := strings.IndexByte(str, '.') != -1 diff --git a/vendor/github.com/json-iterator/go/extra/fuzzy_decoder_test.go b/vendor/github.com/json-iterator/go/extra/fuzzy_decoder_test.go index 3490e3a23..69315adfb 100644 --- a/vendor/github.com/json-iterator/go/extra/fuzzy_decoder_test.go +++ b/vendor/github.com/json-iterator/go/extra/fuzzy_decoder_test.go @@ -37,6 +37,8 @@ func Test_any_to_int64(t *testing.T) { should.Equal(int64(10), val) should.Nil(jsoniter.UnmarshalFromString(`10`, &val)) should.Equal(int64(10), val) + should.Nil(jsoniter.UnmarshalFromString(`""`, &val)) + should.Equal(int64(0), val) // bool part should.Nil(jsoniter.UnmarshalFromString(`false`, &val)) diff --git a/vendor/github.com/json-iterator/go/extra/privat_fields.go b/vendor/github.com/json-iterator/go/extra/privat_fields.go index ac7096ff4..0cfd549e0 100644 --- a/vendor/github.com/json-iterator/go/extra/privat_fields.go +++ b/vendor/github.com/json-iterator/go/extra/privat_fields.go @@ -3,6 +3,7 @@ package extra import ( "github.com/json-iterator/go" "unicode" + "strings" ) // SupportPrivateFields include private fields when encoding/decoding @@ -18,8 +19,37 @@ func (extension *privateFieldsExtension) UpdateStructDescriptor(structDescriptor for _, binding := range structDescriptor.Fields { isPrivate := unicode.IsLower(rune(binding.Field.Name()[0])) if isPrivate { - binding.FromNames = []string{binding.Field.Name()} - binding.ToNames = []string{binding.Field.Name()} + tag, hastag := binding.Field.Tag().Lookup("json") + if !hastag { + binding.FromNames = []string{binding.Field.Name()} + binding.ToNames = []string{binding.Field.Name()} + continue + } + tagParts := strings.Split(tag, ",") + names := calcFieldNames(binding.Field.Name(), tagParts[0], tag) + binding.FromNames = names + binding.ToNames = names } } } + +func calcFieldNames(originalFieldName string, tagProvidedFieldName string, wholeTag string) []string { + // ignore? + if wholeTag == "-" { + return []string{} + } + // rename? + var fieldNames []string + if tagProvidedFieldName == "" { + fieldNames = []string{originalFieldName} + } else { + fieldNames = []string{tagProvidedFieldName} + } + // private? + isNotExported := unicode.IsLower(rune(originalFieldName[0])) + if isNotExported { + fieldNames = []string{} + } + return fieldNames +} + diff --git a/vendor/github.com/json-iterator/go/iter_object.go b/vendor/github.com/json-iterator/go/iter_object.go index ebd3da895..6e7c370ab 100644 --- a/vendor/github.com/json-iterator/go/iter_object.go +++ b/vendor/github.com/json-iterator/go/iter_object.go @@ -60,7 +60,7 @@ func (iter *Iterator) readFieldHash() int64 { if b == '\\' { iter.head = i for _, b := range iter.readStringSlowPath() { - if 'A' <= b && b <= 'Z' { + if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive { b += 'a' - 'A' } hash ^= int64(b) @@ -82,7 +82,7 @@ func (iter *Iterator) readFieldHash() int64 { } return hash } - if 'A' <= b && b <= 'Z' { + if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive { b += 'a' - 'A' } hash ^= int64(b) @@ -95,10 +95,14 @@ func (iter *Iterator) readFieldHash() int64 { } } -func calcHash(str string) int64 { +func calcHash(str string, caseSensitive bool) int64 { hash := int64(0x811c9dc5) for _, b := range str { - hash ^= int64(unicode.ToLower(b)) + if caseSensitive { + hash ^= int64(b) + } else { + hash ^= int64(unicode.ToLower(b)) + } hash *= 0x1000193 } return int64(hash) diff --git a/vendor/github.com/json-iterator/go/misc_tests/jsoniter_array_test.go b/vendor/github.com/json-iterator/go/misc_tests/jsoniter_array_test.go index ef467d184..56e3e12c0 100644 --- a/vendor/github.com/json-iterator/go/misc_tests/jsoniter_array_test.go +++ b/vendor/github.com/json-iterator/go/misc_tests/jsoniter_array_test.go @@ -3,9 +3,10 @@ package misc_tests import ( "bytes" "encoding/json" + "testing" + "github.com/json-iterator/go" "github.com/stretchr/testify/require" - "testing" ) func Test_empty_array(t *testing.T) { @@ -168,6 +169,17 @@ func Test_decode_byte_array_from_base64(t *testing.T) { should.Equal([]byte{1, 2, 3}, data) } +func Test_decode_byte_array_from_base64_with_newlines(t *testing.T) { + should := require.New(t) + data := []byte{} + err := json.Unmarshal([]byte(`"A\rQ\nID"`), &data) + should.Nil(err) + should.Equal([]byte{1, 2, 3}, data) + err = jsoniter.Unmarshal([]byte(`"A\rQ\nID"`), &data) + should.Nil(err) + should.Equal([]byte{1, 2, 3}, data) +} + func Test_decode_byte_array_from_array(t *testing.T) { should := require.New(t) data := []byte{} diff --git a/vendor/github.com/json-iterator/go/pool.go b/vendor/github.com/json-iterator/go/pool.go index 735062684..e2389b56c 100644 --- a/vendor/github.com/json-iterator/go/pool.go +++ b/vendor/github.com/json-iterator/go/pool.go @@ -23,6 +23,7 @@ func (cfg *frozenConfig) BorrowStream(writer io.Writer) *Stream { } func (cfg *frozenConfig) ReturnStream(stream *Stream) { + stream.out = nil stream.Error = nil stream.Attachment = nil cfg.streamPool.Put(stream) diff --git a/vendor/github.com/json-iterator/go/reflect.go b/vendor/github.com/json-iterator/go/reflect.go index 5c7d3a8a0..be7a0e218 100644 --- a/vendor/github.com/json-iterator/go/reflect.go +++ b/vendor/github.com/json-iterator/go/reflect.go @@ -2,9 +2,10 @@ package jsoniter import ( "fmt" - "github.com/modern-go/reflect2" "reflect" "unsafe" + + "github.com/modern-go/reflect2" ) // ValDecoder is an internal type registered to cache as needed. @@ -40,6 +41,14 @@ type ctx struct { decoders map[reflect2.Type]ValDecoder } +func (b *ctx) caseSensitive() bool { + if b.frozenConfig == nil { + // default is case-insensitive + return false + } + return b.frozenConfig.caseSensitive +} + func (b *ctx) append(prefix string) *ctx { return &ctx{ frozenConfig: b.frozenConfig, diff --git a/vendor/github.com/json-iterator/go/reflect_native.go b/vendor/github.com/json-iterator/go/reflect_native.go index 7f1e2464d..9042eb0cb 100644 --- a/vendor/github.com/json-iterator/go/reflect_native.go +++ b/vendor/github.com/json-iterator/go/reflect_native.go @@ -2,10 +2,11 @@ package jsoniter import ( "encoding/base64" - "github.com/modern-go/reflect2" "reflect" "strconv" "unsafe" + + "github.com/modern-go/reflect2" ) const ptrSize = 32 << uintptr(^uintptr(0)>>63) @@ -416,16 +417,11 @@ func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { } switch iter.WhatIsNext() { case StringValue: - encoding := base64.StdEncoding - src := iter.SkipAndReturnBytes() - src = src[1 : len(src)-1] - decodedLen := encoding.DecodedLen(len(src)) - dst := make([]byte, decodedLen) - len, err := encoding.Decode(dst, src) + src := iter.ReadString() + dst, err := base64.StdEncoding.DecodeString(src) if err != nil { iter.ReportError("decode base64", err.Error()) } else { - dst = dst[:len] codec.sliceType.UnsafeSet(ptr, unsafe.Pointer(&dst)) } case ArrayValue: diff --git a/vendor/github.com/json-iterator/go/reflect_struct_decoder.go b/vendor/github.com/json-iterator/go/reflect_struct_decoder.go index e718722af..355d2d116 100644 --- a/vendor/github.com/json-iterator/go/reflect_struct_decoder.go +++ b/vendor/github.com/json-iterator/go/reflect_struct_decoder.go @@ -2,10 +2,11 @@ package jsoniter import ( "fmt" - "github.com/modern-go/reflect2" "io" "strings" "unsafe" + + "github.com/modern-go/reflect2" ) func decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder { @@ -31,6 +32,15 @@ func decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder { for k, binding := range bindings { fields[k] = binding.Decoder.(*structFieldDecoder) } + + if !ctx.caseSensitive() { + for k, binding := range bindings { + if _, found := fields[strings.ToLower(k)]; !found { + fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder) + } + } + } + return createStructDecoder(ctx, typ, fields) } @@ -41,12 +51,13 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF knownHash := map[int64]struct{}{ 0: {}, } + switch len(fields) { case 0: return &skipObjectDecoder{typ} case 1: for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName) + fieldHash := calcHash(fieldName, ctx.caseSensitive()) _, known := knownHash[fieldHash] if known { return &generalStructDecoder{typ, fields, false} @@ -60,7 +71,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName) + fieldHash := calcHash(fieldName, ctx.caseSensitive()) _, known := knownHash[fieldHash] if known { return &generalStructDecoder{typ, fields, false} @@ -83,7 +94,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName) + fieldHash := calcHash(fieldName, ctx.caseSensitive()) _, known := knownHash[fieldHash] if known { return &generalStructDecoder{typ, fields, false} @@ -114,7 +125,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder3 *structFieldDecoder var fieldDecoder4 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName) + fieldHash := calcHash(fieldName, ctx.caseSensitive()) _, known := knownHash[fieldHash] if known { return &generalStructDecoder{typ, fields, false} @@ -151,7 +162,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder4 *structFieldDecoder var fieldDecoder5 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName) + fieldHash := calcHash(fieldName, ctx.caseSensitive()) _, known := knownHash[fieldHash] if known { return &generalStructDecoder{typ, fields, false} @@ -194,7 +205,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder5 *structFieldDecoder var fieldDecoder6 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName) + fieldHash := calcHash(fieldName, ctx.caseSensitive()) _, known := knownHash[fieldHash] if known { return &generalStructDecoder{typ, fields, false} @@ -243,7 +254,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder6 *structFieldDecoder var fieldDecoder7 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName) + fieldHash := calcHash(fieldName, ctx.caseSensitive()) _, known := knownHash[fieldHash] if known { return &generalStructDecoder{typ, fields, false} @@ -298,7 +309,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder7 *structFieldDecoder var fieldDecoder8 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName) + fieldHash := calcHash(fieldName, ctx.caseSensitive()) _, known := knownHash[fieldHash] if known { return &generalStructDecoder{typ, fields, false} @@ -359,7 +370,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder8 *structFieldDecoder var fieldDecoder9 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName) + fieldHash := calcHash(fieldName, ctx.caseSensitive()) _, known := knownHash[fieldHash] if known { return &generalStructDecoder{typ, fields, false} @@ -426,7 +437,7 @@ func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structF var fieldDecoder9 *structFieldDecoder var fieldDecoder10 *structFieldDecoder for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName) + fieldHash := calcHash(fieldName, ctx.caseSensitive()) _, known := knownHash[fieldHash] if known { return &generalStructDecoder{typ, fields, false} @@ -489,13 +500,16 @@ func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) if !iter.readObjectStart() { return } - decoder.decodeOneField(ptr, iter) - for iter.nextToken() == ',' { + var c byte + for c = ','; c == ','; c = iter.nextToken() { decoder.decodeOneField(ptr, iter) } if iter.Error != nil && iter.Error != io.EOF { iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } + if c != '}' { + iter.ReportError("struct Decode", `expect }, but found `+string([]byte{c})) + } } func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *Iterator) { @@ -505,13 +519,13 @@ func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *It fieldBytes := iter.ReadStringAsSlice() field = *(*string)(unsafe.Pointer(&fieldBytes)) fieldDecoder = decoder.fields[field] - if fieldDecoder == nil { + if fieldDecoder == nil && !iter.cfg.caseSensitive { fieldDecoder = decoder.fields[strings.ToLower(field)] } } else { field = iter.ReadString() fieldDecoder = decoder.fields[field] - if fieldDecoder == nil { + if fieldDecoder == nil && !iter.cfg.caseSensitive { fieldDecoder = decoder.fields[strings.ToLower(field)] } } diff --git a/vendor/github.com/json-iterator/go/value_tests/error_test.go b/vendor/github.com/json-iterator/go/value_tests/error_test.go new file mode 100644 index 000000000..175a24e53 --- /dev/null +++ b/vendor/github.com/json-iterator/go/value_tests/error_test.go @@ -0,0 +1,36 @@ +package test + +import ( + "github.com/json-iterator/go" + "github.com/stretchr/testify/require" + "reflect" + "testing" +) + +func Test_errorInput(t *testing.T) { + for _, testCase := range unmarshalCases { + if testCase.obj != nil { + continue + } + valType := reflect.TypeOf(testCase.ptr).Elem() + t.Run(valType.String(), func(t *testing.T) { + for _, data := range []string{ + `x`, + `n`, + `nul`, + `{x}`, + `{"x"}`, + `{"x": "y"x}`, + `{"x": "y"`, + `{"x": "y", "a"}`, + `[`, + `[{"x": "y"}`, + } { + ptrVal := reflect.New(valType) + ptr := ptrVal.Interface() + err := jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal([]byte(data), ptr) + require.Error(t, err, "on input %q", data) + } + }) + } +} diff --git a/vendor/github.com/json-iterator/go/value_tests/slice_test.go b/vendor/github.com/json-iterator/go/value_tests/slice_test.go index f504e851e..3731cbe15 100644 --- a/vendor/github.com/json-iterator/go/value_tests/slice_test.go +++ b/vendor/github.com/json-iterator/go/value_tests/slice_test.go @@ -20,5 +20,8 @@ func init() { }, unmarshalCase{ ptr: (*[]byte)(nil), input: `"aGVsbG8="`, + }, unmarshalCase{ + ptr: (*[]byte)(nil), + input: `"c3ViamVjdHM\/X2Q9MQ=="`, }) } diff --git a/vendor/github.com/json-iterator/go/value_tests/struct_test.go b/vendor/github.com/json-iterator/go/value_tests/struct_test.go index 2335d0786..067ad22f8 100644 --- a/vendor/github.com/json-iterator/go/value_tests/struct_test.go +++ b/vendor/github.com/json-iterator/go/value_tests/struct_test.go @@ -63,6 +63,36 @@ func init() { d *time.Timer })(nil), input: `{"a": 444, "b":"bad", "C":256, "d":{"not":"a timer"}}`, + }, unmarshalCase{ + ptr: (*struct { + A string + B string + C string + D string + E string + F string + G string + H string + I string + J string + K string + })(nil), + input: `{"a":"1","b":"2","c":"3","d":"4","e":"5","f":"6","g":"7","h":"8","i":"9","j":"10","k":"11"}`, + }, unmarshalCase{ + ptr: (*struct { + T float64 `json:"T"` + })(nil), + input: `{"t":10.0}`, + }, unmarshalCase{ + ptr: (*struct { + T float64 `json:"T"` + })(nil), + input: `{"T":10.0}`, + }, unmarshalCase{ + ptr: (*struct { + T float64 `json:"t"` + })(nil), + input: `{"T":10.0}`, }) marshalCases = append(marshalCases, struct { diff --git a/vendor/github.com/petar/GoLLRB/.gitignore b/vendor/github.com/petar/GoLLRB/.gitignore new file mode 100644 index 000000000..e333b2dbf --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/.gitignore @@ -0,0 +1,23 @@ +syntax:glob +*.[568ao] +*.ao +*.so +*.pyc +*.swp +*.swo +._* +.nfs.* +[568a].out +*~ +*.orig +*.pb.go +core +_obj +_test +src/pkg/Make.deps +_testmain.go + +syntax:regexp +^pkg/ +^src/cmd/(.*)/6?\1$ +^.*/core.[0-9]*$ diff --git a/vendor/github.com/petar/GoLLRB/AUTHORS b/vendor/github.com/petar/GoLLRB/AUTHORS new file mode 100644 index 000000000..78d1de495 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/AUTHORS @@ -0,0 +1,4 @@ +Petar Maymounkov +Vadim Vygonets +Ian Smith +Martin Bruse diff --git a/vendor/github.com/petar/GoLLRB/LICENSE b/vendor/github.com/petar/GoLLRB/LICENSE new file mode 100644 index 000000000..b75312c78 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2010, Petar Maymounkov +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +(*) Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. + +(*) Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +(*) Neither the name of Petar Maymounkov nor the names of its contributors may be +used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/petar/GoLLRB/README.md b/vendor/github.com/petar/GoLLRB/README.md new file mode 100644 index 000000000..742ca0bd5 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/README.md @@ -0,0 +1,66 @@ +# GoLLRB + +GoLLRB is a Left-Leaning Red-Black (LLRB) implementation of 2-3 balanced binary +search trees in Go Language. + +## Overview + +As of this writing and to the best of the author's knowledge, +Go still does not have a balanced binary search tree (BBST) data structure. +These data structures are quite useful in a variety of cases. A BBST maintains +elements in sorted order under dynamic updates (inserts and deletes) and can +support various order-specific queries. Furthermore, in practice one often +implements other common data structures like Priority Queues, using BBST's. + +2-3 trees (a type of BBST's), as well as the runtime-similar 2-3-4 trees, are +the de facto standard BBST algoritms found in implementations of Python, Java, +and other libraries. The LLRB method of implementing 2-3 trees is a recent +improvement over the traditional implementation. The LLRB approach was +discovered relatively recently (in 2008) by Robert Sedgewick of Princeton +University. + +GoLLRB is a Go implementation of LLRB 2-3 trees. + +## Maturity + +GoLLRB has been used in some pretty heavy-weight machine learning tasks over many gigabytes of data. +I consider it to be in stable, perhaps even production, shape. There are no known bugs. + +## Installation + +With a healthy Go Language installed, simply run `go get github.com/petar/GoLLRB/llrb` + +## Example + + package main + + import ( + "fmt" + "github.com/petar/GoLLRB/llrb" + ) + + func lessInt(a, b interface{}) bool { return a.(int) < b.(int) } + + func main() { + tree := llrb.New(lessInt) + tree.ReplaceOrInsert(1) + tree.ReplaceOrInsert(2) + tree.ReplaceOrInsert(3) + tree.ReplaceOrInsert(4) + tree.DeleteMin() + tree.Delete(4) + c := tree.IterAscend() + for { + u := <-c + if u == nil { + break + } + fmt.Printf("%d\n", int(u.(int))) + } + } + +## About + +GoLLRB was written by [Petar Maymounkov](http://pdos.csail.mit.edu/~petar/). + +Follow me on [Twitter @maymounkov](http://www.twitter.com/maymounkov)! diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf new file mode 100644 index 000000000..a399b06ae --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf @@ -0,0 +1,4401 @@ +%PDF-1.4 %âãÏÓ +1 0 obj <>/Outlines 348 0 R/Metadata 406 0 R/Pages 2 0 R/Type/Catalog>> endobj 348 0 obj <> endobj 406 0 obj <>stream + + + + + uuid:a1e65d06-96f2-9a40-84d3-4ac4f901a7ea + adobe:docid:indd:e8dd818f-4504-11dd-9d3e-8aa37d5afcf2 + proof:pdf + + + + ReferenceStream + 72.00 + 72.00 + Inches + + uuid:1f382f0a-0ae0-7240-90c9-052bfa9b93bb + uuid:D604B9AA2016DD118D05AA6D720C964E + + + + ReferenceStream + 72.00 + 72.00 + Inches + + uuid:f2359209-ca4b-f145-bc24-11a32d3118e1 + uuid:92F9E1E974FFDC11AC15B6426E08541E + + + + ReferenceStream + 72.00 + 72.00 + Inches + + uuid:725ae99a-7e76-5e45-a638-be54a8b3e099 + uuid:96F9E1E974FFDC11AC15B6426E08541E + + + + ReferenceStream + 72.00 + 72.00 + Inches + + uuid:46ba4750-b6d0-a148-b72a-6aac87b46fcf + uuid:39AC52ADCAFFDC11AC15B6426E08541E + + + + ReferenceStream + 72.00 + 72.00 + Inches + + uuid:d81eb84f-0775-844f-8950-327b309a2838 + uuid:BD14D8DC7C16DD11BCFFD65EC7B1D34C + + + + ReferenceStream + 72.00 + 72.00 + Inches + + uuid:852ed07c-1a0d-af4f-b9f3-759b446c18bc + uuid:B4D572641149DD119EEFF96D7801BC77 + + + + ReferenceStream + 72.00 + 72.00 + Inches + + uuid:b46d8aee-c25e-b541-956c-22fa803ac69c + uuid:B7D572641149DD119EEFF96D7801BC77 + + + + ReferenceStream + 72.00 + 72.00 + Inches + + uuid:c81f585c-6684-f14a-ae05-056a473a74d0 + uuid:1C547E781A4ADD119EEFF96D7801BC77 + + + + ReferenceStream + 72.00 + 72.00 + Inches + + uuid:d1fde563-235e-8e47-a158-ac3cc76aa98f + uuid:23547E781A4ADD119EEFF96D7801BC77 + + + + ReferenceStream + 72.00 + 72.00 + Inches + + uuid:dbaaada4-048d-4642-b37f-5659c12203ae + uuid:DAD009446E4ADD119EEFF96D7801BC77 + + + + ReferenceStream + 72.00 + 72.00 + Inches + + uuid:a7a9523b-0c40-7d47-980c-c2d7a5d1ae87 + uuid:20547E781A4ADD119EEFF96D7801BC77 + + + + + + + 2008-09-14T13:43:34-04:00 + 2008-09-14T13:43:43-04:00 + 2008-09-14T13:43:43-04:00 + Adobe InDesign CS3 (5.0) + + + + JPEG + 256 + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4AE0Fkb2JlAGQAAAAAAQUAAuMM/9sAhAAMCAgICAgMCAgMEAsLCxAUDg0NDhQY EhMTExIYFBIUFBQUEhQUGx4eHhsUJCcnJyckMjU1NTI7Ozs7Ozs7Ozs7AQ0LCxAOECIYGCIyKCEo MjsyMjIyOzs7Ozs7Ozs7Ozs7Ozs7OztAQEBAQDtAQEBAQEBAQEBAQEBAQEBAQEBAQED/wAARCAEA AMYDAREAAhEBAxEB/8QBQgAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAA AAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGx QiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSV xNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgI7AQACEQMh MRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0 ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH1+f3/9oADAMB AAIRAxEAPwDrfqx9WPq3kfVvpN9/ScG223Bxn2WPxqnOc51TC5znFkkkpKdL/mn9Vf8Aym6f/wCw tP8A6TSUr/mn9Vf/ACm6f/7C0/8ApNJSv+af1V/8pun/APsLT/6TSUr/AJp/VX/ym6f/AOwtP/pN JSv+af1V/wDKbp//ALC0/wDpNJSv+af1V/8AKbp//sLT/wCk0lK/5p/VX/ym6f8A+wtP/pNJSv8A mn9Vf/Kbp/8A7C0/+k0lK/5p/VX/AMpun/8AsLT/AOk0lK/5p/VX/wApun/+wtP/AKTSUr/mn9Vf /Kbp/wD7C0/+k0lK/wCaf1V/8pun/wDsLT/6TSUr/mn9Vf8Aym6f/wCwtP8A6TSUr/mn9Vf/ACm6 f/7C0/8ApNJSv+af1V/8pun/APsLT/6TSUr/AJp/VX/ym6f/AOwtP/pNJSv+af1V/wDKbp//ALC0 /wDpNJSv+af1V/8AKbp//sLT/wCk0lK/5p/VX/ym6f8A+wtP/pNJSv8Amn9Vf/Kbp/8A7C0/+k0l K/5p/VX/AMpun/8AsLT/AOk0lK/5p/VX/wApun/+wtP/AKTSUr/mn9Vf/Kbp/wD7C0/+k0lOb1b6 sfVuvP6KyvpOCxt2c9ljW41QD2jDzX7XAM1G5gPxCSnS+qf/AIlejf8Apvxf/PNaSnWSUpJSklKS UpJSklKSUpJSklKSUpJSklKSUpJSklKSUpJSklKSUpJSklKSUpJTk9Z/5R6F/wCnCz/2xz0lK+qf /iV6N/6b8X/zzWkp1klKSUpJSklKSUpJSklLFwaJcQAO50SUx9an/SN+8JKV61P+kb94SUr1qf8A SN+8JKV61P8ApG/eElK9an/SN+8JKV61P+kb94SUr1qf32/eElM0lKSUpJSklKSUpJSklKSU5PWf +Uehf+nCz/2xz0lK+qf/AIlejf8Apvxf/PNaSnWSUpJSklKSUpJSklKSU1epdPp6rhWYGQ5za7du 41kB3tcHiJDhy1JThf8Ajf8ARv8ATZX+cz/0kkpDk/U36s4ZaMvOtoL52i26pkxzG6sJKQ/82fqb /wCWv/sxR/5BJSv+bP1N/wDLX/2Yo/8AIJKV/wA2fqb/AOWv/sxR/wCQSU2afqN0DIrF2PlX21un a+uytzTBgwRURyElJWfUHo7HteLsmWkES5nb/rSSnpUlKSUpJSklKSUpJSklKSU5PWf+Uehf+nCz /wBsc9JSvqn/AOJXo3/pvxf/ADzWkp1klKSUpJSklKSUpJSklKSU5/VczqeJ6X7Nwvtu/d6nvDNk bdvPMyUlOF1FvVOrFjuofV/1jUCGfrO2N0T9BzfBJTT/AGM//wCdn/2bf/5NJSv2M/8A+dn/ANm3 /wDk0lK/Yz//AJ2f/Zt//k0lOnh5nXun4zMTE6F6dNc7W/aA6NxLjq6TyUlO/hW5F+LXbl0/Z7nA 76p3bTJ7hJSdJSklKSUpJSklKSUpJSklOT1n/lHoX/pws/8AbHPSUr6p/wDiV6N/6b8X/wA81pKd ZJSklKSUpJSklKSUpJSklKSU431oxq8nBqFmHbnbbQRVQ7a4e13uMA6JKeZ/ZWN/5QZ3/bp/9JpK V+ysb/ygzv8At0/+k0lK/ZWN/wCUGd/26f8A0mkp7bptbaen41bK3UhtTAKnmXM9o9rj4hJTZSUp JSklKSUpJSklKSUpJSklOT1n/lHoX/pws/8AbHPSUr6p/wDiV6N/6b8X/wA81pKdZJSO976qLLK2 eo9jHOawfnECQ35pKed/5yfWL/yjt+93/pNJSv8AnJ9Yv/KO373f+k0lOp0bqPUOoNtdn4TsEsLQ wOJO6ZnlreElOkkpSSlJKUkpSSlJKUkpSSlJKUkpSSlJKUkpSSlJKUkpSSlJKcnrP/KPQv8A04Wf +2OekpX1T/8AEr0b/wBN+L/55rSU6ySkOW4sxbnNf6RbW4iwidsA+6PJJTxn7UzP/nkq/wC2T/6T SUr9qZn/AM8lX/bJ/wDSaSlftTM/+eSr/tk/+k0lK/amZ/8APJV/2yf/AEmkpX7UzP8A55Kv+2T/ AOk0lK/amZ/88lX/AGyf/SaSlftTM/8Ankq/7ZP/AKTSUr9qZn/zyVf9sn/0mkpX7UzP/nkq/wC2 T/6TSUr9qZn/AM8lX/bJ/wDSaSlftTM/+eSr/tk/+k0lK/amZ/8APJV/2yf/AEmkpX7UzP8A55Kv +2T/AOk0lK/amZ/88lX/AGyf/SaSlftTM/8Ankq/7ZP/AKTSUr9qZn/zyVf9sn/0mkpX7UzP/nkq /wC2T/6TSUr9qZn/AM8lX/bJ/wDSaSmz03qOVZn49b+vV5DXWNBpFRBfr9GfTHKSnsElKSU5PWf+ Uehf+nCz/wBsc9JSvqn/AOJXo3/pvxf/ADzWkp1klIsoOONaGNa9xY7ax/0XGDAd5Hukp5H7N1v/ AMp+j/5jP/SqSlfZut/+U/R/8xn/AKVSUr7N1v8A8p+j/wCYz/0qkpX2brf/AJT9H/zGf+lUlK+z db/8p+j/AOYz/wBKpKV9m63/AOU/R/8AMZ/6VSUr7N1v/wAp+j/5jP8A0qkpX2brf/lP0f8AzGf+ lUlK+zdb/wDKfo/+Yz/0qkpX2brf/lP0f/MZ/wClUlK+zdb/APKfo/8AmM/9KpKV9m63/wCU/R/8 xn/pVJSvs3W//Kfo/wDmM/8ASqSlfZut/wDlP0f/ADGf+lUlK+zdb/8AKfo/+Yz/ANKpKV9m63/5 T9H/AMxn/pVJSvs3W/8Ayn6P/mM/9KpKV9m63/5T9H/zGf8ApVJTY6fj9WbnUOu6V0umsPbuspYw WNE8siw6pKerSUpJTk9Z/wCUehf+nCz/ANsc9JSvqn/4lejf+m/F/wDPNaSnWSUhzQHYd7XMdYDU 8FjfpO9p9o51KSngvsGH/wDO/wBR/wA5/wD6SSUr7Bh//O/1H/Of/wCkklK+wYf/AM7/AFH/ADn/ APpJJSvsGH/87/Uf85//AKSSUr7Bh/8Azv8AUf8AOf8A+kklK+wYf/zv9R/zn/8ApJJSvsGH/wDO /wBR/wA5/wD6SSUr7Bh//O/1H/Of/wCkklK+wYf/AM7/AFH/ADn/APpJJSvsGH/87/Uf85//AKSS Ur7Bh/8Azv8AUf8AOf8A+kklK+wYf/zv9R/zn/8ApJJSvsGH/wDO/wBR/wA5/wD6SSUr7Bh//O/1 H/Of/wCkklK+wYf/AM7/AFH/ADn/APpJJSvsGH/87/Uf85//AKSSUr7Bh/8Azv8AUf8AOf8A+kkl K+wYf/zv9R/zn/8ApJJTb6Vh4rOpYz2dEzqHC1pFthfsZr9J01jRJT3CSlJKcnrP/KPQv/ThZ/7Y 56SlfVP/AMSvRv8A034v/nmtJTrJKQ5pDcO9znurAqeS9v0m+0+4cahJTwX2/D/+eDqP+a//ANKp KV9vw/8A54Oo/wCa/wD9KpKV9vw//ng6j/mv/wDSqSlfb8P/AOeDqP8Amv8A/SqSlfb8P/54Oo/5 r/8A0qkpX2/D/wDng6j/AJr/AP0qkpX2/D/+eDqP+a//ANKpKV9vw/8A54Oo/wCa/wD9KpKV9vw/ /ng6j/mv/wDSqSlfb8P/AOeDqP8Amv8A/SqSlfb8P/54Oo/5r/8A0qkpX2/D/wDng6j/AJr/AP0q kpX2/D/+eDqP+a//ANKpKV9vw/8A54Oo/wCa/wD9KpKV9vw//ng6j/mv/wDSqSlfb8P/AOeDqP8A mv8A/SqSlfb8P/54Oo/5r/8A0qkpX2/D/wDng6j/AJr/AP0qkpt9KzMV/UsZjOt517ja0CqwP2P1 +i6bDokp7hJSklOT1n/lHoX/AKcLP/bHPSUr6p/+JXo3/pvxf/PNaSnWSUiyt32W7Y5rHem6HWfQ Bg6umdPFJTx2/qv/AJa9F/zq/wD0kkpW/qv/AJa9F/zq/wD0kkpW/qv/AJa9F/zq/wD0kkpW/qv/ AJa9F/zq/wD0kkpW/qv/AJa9F/zq/wD0kkpW/qv/AJa9F/zq/wD0kkpW/qv/AJa9F/zq/wD0kkpW /qv/AJa9F/zq/wD0kkpW/qv/AJa9F/zq/wD0kkpW/qv/AJa9F/zq/wD0kkpW/qv/AJa9F/zq/wD0 kkpW/qv/AJa9F/zq/wD0kkpW/qv/AJa9F/zq/wD0kkpW/qv/AJa9F/zq/wD0kkpW/qv/AJa9F/zq /wD0kkpW/qv/AJa9F/zq/wD0kkplWOs3PbVV1Loz3vMNY01kknsAKUlNv9j/AFu/03Tv+2x/7zpK TYXS/rNVl02ZVuCaWvBsFdYDy0c7T6Ldfmkp6NJSklOT1n/lHoX/AKcLP/bHPSUr6p/+JXo3/pvx f/PNaSnWSUxsrZbW6qwbmPaWuHiCIISU42T9V+iV49tmPgMstaxzq69zhucAS1s7+5SU4P7LzP8A 526v+3j/AOlElK/ZeZ/87dX/AG8f/SiSlfsvM/8Anbq/7eP/AKUSUr9l5n/zt1f9vH/0okpX7LzP /nbq/wC3j/6USUr9l5n/AM7dX/bx/wDSiSlfsvM/+dur/t4/+lElK/ZeZ/8AO3V/28f/AEokpX7L zP8A526v+3j/AOlElK/ZeZ/87dX/AG8f/SiSlfsvM/8Anbq/7eP/AKUSUr9l5n/zt1f9vH/0okpX 7LzP/nbq/wC3j/6USUr9l5n/AM7dX/bx/wDSiSlfsvM/+dur/t4/+lElJKMLqONczIo+rtbLK3Bz HC46Ed9bElOl+1/rb/5Tt/7cH/kklJsTqf1mtyaq8rpbaaXOAssFgO1p5MbklO6kpSSnJ6z/AMo9 C/8AThZ/7Y56SlfVP/xK9G/9N+L/AOea0lOskpBm7Psd/q7tnpP3en9KNpnbPfwSU8B/2Nf+bj/w JJSv+xr/AM3H/gSSlf8AY1/5uP8AwJJTp9I6D0TrLbXY9vUqhUQD6zq2zuniGu8ElOh/zG6b/wBy sz/txn/pJJSv+Y3Tf+5WZ/24z/0kkpX/ADG6b/3KzP8Atxn/AKSSUr/mN03/ALlZn/bjP/SSSlf8 xum/9ysz/txn/pJJSv8AmN03/uVmf9uM/wDSSSlf8xum/wDcrM/7cZ/6SSUr/mN03/uVmf8AbjP/ AEkkpX/Mbpv/AHKzP+3Gf+kklK/5jdN/7lZn/bjP/SSSlf8AMbpv/crM/wC3Gf8ApJJSv+Y3Tf8A uVmf9uM/9JJKV/zG6b/3KzP+3Gf+kklK/wCY3Tf+5WZ/24z/ANJJKS4n1PwMPJqyq8nKc6lwe1r3 tLSR4gVhJTvJKUkpyes/8o9C/wDThZ/7Y56SlfVP/wASvRv/AE34v/nmtJTrJKUkpwvrPe6n7Nt6 p+zN3qfmF/qRs/d/d/ikpw/ttn/zz/8AgL0lK+22f/PP/wCAvSUr7bZ/88//AIC9JSvttn/zz/8A gL0lK+22f/PP/wCAvSUr7bZ/88//AIC9JT13S8irK6fRZVf9qAYGOvAI3uYNrnQfEhJTbSUpJSkl KSUpJSklKSUpJSklKSUpJSklKSU5PWf+Uehf+nCz/wBsc9JSvqn/AOJXo3/pvxf/ADzWkp1klLEh oLnGANSSkpwvrCbMr0PsDMDK2b9/2vY/bOyNm4941SU4/wBl6p/3D6L/AJlf96SlfZeqf9w+i/5l f96SlfZeqf8AcPov+ZX/AHpKV9l6p/3D6L/mV/3pKV9l6p/3D6L/AJlf96SlfZeqf9w+i/5lf96S mzRk/WbGrFOMOl01iYZW5rWideGvCSkn7Q+tv7/Tv88f+TSUr9ofW39/p3+eP/JpKV+0Prb+/wBO /wA8f+TSUr9ofW39/p3+eP8AyaSlftD62/v9O/zx/wCTSU2um5/XTltHVLMJuNB3Gp43THt/PPdJ Ts/bcP8A09X+e3+9JSvtuH/p6v8APb/ekpX23D/09X+e3+9JSvtuH/p6v89v96Sl25eK9way6tzj oAHAk/ikpKkpSSnJ6z/yj0L/ANOFn/tjnpKV9U//ABK9G/8ATfi/+ea0lOskpDmAHEvDmG0Gt4Nb eXDafaI7lJTwv2TA/wDnbzv863/yCSlfZMD/AOdvO/zrf/IJKV9kwP8A5287/Ot/8gkpX2TA/wDn bzv863/yCSlfZMD/AOdvO/zrf/IJKV9kwP8A5287/Ot/8gkpX2TA/wDnbzv863/yCSlfZMD/AOdv O/zrf/IJKV9kwP8A5287/Ot/8gkpX2TA/wDnbzv863/yCSlfZMD/AOdvO/zrf/IJKV9kwP8A5287 /Ot/8gkpX2TA/wDnbzv863/yCSlfZMD/AOdvO/zrf/IJKV9kwP8A5287/Ot/8gkpX2TA/wDnbzv8 63/yCSlfZMD/AOdvO/zrf/IJKV9kwP8A5287/Ot/8gkp3eh9A6TYyrqX2C7Cvrsltdz37gWnQw6P yJKejSUpJTk9Z/5R6F/6cLP/AGxz0lK+qf8A4lejf+m/F/8APNaSnWSUwutZRS++z6FbS90a6NEl JTz2T9cug5GPbji66s2scwPawhzdwI3DzCSnB+1dH/8ALnqP3O/8kkpX2ro//lz1H7nf+SSUr7V0 f/y56j9zv/JJKV9q6P8A+XPUfud/5JJSvtXR/wDy56j9zv8AySSlfauj/wDlz1H7nf8AkklK+1dH /wDLnqP3O/8AJJKV9q6P/wCXPUfud/5JJSvtXR//AC56j9zv/JJKUMno5IA6z1GT5O/8kkpX2ro/ /lz1H7nf+SSUr7V0f/y56j9zv/JJKW+1dH/8ueo/c7/ySSl/tXR//LnqP3O/8kkpX2ro/wD5c9R+ 53/kklK+1dH/APLnqP3O/wDJJKV9q6P/AOXPUfud/wCSSU2ulZHS3dSxm1dVzrnm1obXYDscZ4d7 uElPcJKUkpyes/8AKPQv/ThZ/wC2OekpX1T/APEr0b/034v/AJ5rSU6ySkOWXDFuLHtrcK3Fr3/R aYMOdodAkp4z7X1v/wAvOmf+B/8AvMkpX2vrf/l50z/wP/3mSUr7X1v/AMvOmf8Agf8A7zJKV9r6 3/5edM/8D/8AeZJSvtfW/wDy86Z/4H/7zJKV9r63/wCXnTP/AAP/AN5klK+19b/8vOmf+B/+8ySl fa+t/wDl50z/AMD/APeZJSvtfW//AC86Z/4H/wC8ySlfa+t/+XnTP/A//eZJSvtXW/8Ay86Z/wCB /wDvMkpX2vrf/l50z/wP/wB5klK+19b/APLzpn/gf/vMkpX2rrf/AJedM/8AA/8A3mSUr7X1v/y8 6Z/4H/7zJKV9r63/AOXnTP8AwP8A95klK+19b/8ALzpn/gf/ALzJKV9r63/5edM/8D/95klNnpuT 1d3UMdt3WOn31mxodVVs3uE/RbFDdfmkp7BJSklOT1n/AJR6F/6cLP8A2xz0lK+qf/iV6N/6b8X/ AM81pKdZJSLKBdi3NawWk1uArPDzB9vzSU8d9hz/AP52qP8APH/k0lK+wZ//AM7VH/bg/wDJpKV9 hz//AJ2qP88f+TSUr7Dn/wDztUf54/8AJpKV9hz/AP52qP8APH/k0lK+w5//AM7VH+eP/JpKV9hz /wD52qP88f8Ak0lK+w5//wA7VH+eP/JpKV9hz/8A52qP88f+TSUr7Dn/APztUf54/wDJpKV9hz// AJ2qP88f+TSUr7Dn/wDztUf54/8AJpKV9hz/AP52qP8APH/k0lK+w5//AM7VH+eP/JpKV9hz/wD5 2qP88f8Ak0lK+w5//wA7VH+eP/JpKV9hz/8A52qP88f+TSUr7Dn/APztUf54/wDJpKbPTsPNZn0P f0CnGaLGk3NeCWCfpD3dklPWpKUkpyes/wDKPQv/AE4Wf+2OekpX1T/8SvRv/Tfi/wDnmtJTrJKQ ZoYcO8WBzmGp+5rPpEbTIb5pKeA+zfV3/uB1P/o/3JKV9m+rv/cDqf8A0f7klK+zfV3/ALgdT/6P 9ySlfZvq7/3A6n/0f7klK+zfV3/uB1P/AKP9ySlfZvq7/wBwOp/9H+5JSvs31d/7gdT/AOj/AHJK V9m+rv8A3A6n/wBH+5JSvs31d/7gdT/6P9ySlfZvq7/3A6n/ANH+5JSvs31d/wC4HU/+j/ckpX2b 6u/9wOp/9H+5JSvs31d/7gdT/wCj/ckpX2b6u/8AcDqf/R/uSUr7N9Xf+4HU/wDo/wBySlfZvq7/ ANwOp/8AR/uSUr7N9Xf+4HU/+j/ckpX2b6u/9wOp/wDR/uSU2+k0dDb1PFdRhdQZYLW7H27dgM6F 2nCSnu0lKSU5PWf+Uehf+nCz/wBsc9JSvqn/AOJXo3/pvxf/ADzWkp1klIct23Eud6npRW8+pE7I B90DwSU8T+0z/wDPM7/2Gt/8ikpX7TP/AM8zv/Ya3/yKSm506vqXVi9vT/rC641AF/6FzY3TH09v gkpu/sH6yf8Al27/ALb/APMklK/YP1k/8u3f9t/+ZJKV+wfrJ/5du/7b/wDMklK/YP1k/wDLt3/b f/mSSlfsH6yf+Xbv+2//ADJJSv2D9ZP/AC7d/wBt/wDmSSlfsH6yf+Xbv+2//MklK/YP1k/8u3f9 t/8AmSSlfsH6yf8Al27/ALb/APMklK/YP1k/8u3f9t/+ZJKV+wfrJ/5du/7b/wDMklK/YP1k/wDL t3/bf/mSSlfsH6yf+Xbv+2//ADJJSv2D9ZP/AC7d/wBt/wDmSSlfsH6yf+Xbv+2//MklJcXo3Xqc iq2/qzrq2PDn1lkb2g6t+kkp3klKSU5PWf8AlHoX/pws/wDbHPSUr6p/+JXo3/pvxf8AzzWkp1kl LOa1zS1wDmuEEHUEFJTgdexzieh+zcfpzN+/1PtTWMmNu3ZO3xMpKcn1Oq/6Pov31/8AkklJac3r uMScc9IqLvpem9jZjxh4SUl/a/1n/wBP0z/t1v8A6USUr9r/AFn/ANP0z/t1v/pRJSv2v9Z/9P0z /t1v/pRJSv2v9Z/9P0z/ALdb/wClElK/a/1n/wBP0z/t1v8A6USUu3q31ocdou6aSdGgWt1P/biS mxu+vLSYbhuB1Ezp5chJSvU+vP8Ao8P7z/5JJTp9Id1tzbf2y2lrpHpej4a7p1KSnQSUpJSklKSU pJSklKSUpJSklOT1n/lHoX/pws/9sc9JSvqn/wCJXo3/AKb8X/zzWkp1klKSU8/9a8dl/wBl3dMt 6lt9SPSsdX6c7OdrXTu/gkp5/wDZ9X/zs5P/AG/Z/wCk0lK/Z9X/AM7OT/2/Z/6TSUr9n1f/ADs5 P/b9n/pNJSv2fV/87OT/ANv2f+k0lK/Z9X/zs5P/AG/Z/wCk0lK/Z9X/AM7OT/2/Z/6TSUuMCsGR 9WsmR/w9n/pNJTJmG2t7LG/VrJ3VkOb+ns0IM/6NJTtf85euf+UN/wDnn/0ikpX/ADl65/5Q3/55 /wDSKSlf85euf+UN/wDnn/0ikpX/ADl65/5Q3/55/wDSKSndxLrMjGqvuqNFljQ51TjJYSPonQcJ KTJKUkpSSlJKUkpSSlJKcnrP/KPQv/ThZ/7Y56SlfVP/AMSvRv8A034v/nmtJTrJKQZpa3Dvc9zm NFTyXM+kBtOrfNJTwH27pP8A5a9T/wBf+uJKV9u6T/5a9T/1/wCuJKV9u6T/AOWvU/8AX/riSlfb uk/+WvU/9f8AriSlfbuk/wDlr1P/AF/64kpX27pP/lr1P/X/AK4kpX27pP8A5a9T/wBf+uJKV9u6 T/5a9T/1/wCuJKV9u6T/AOWvU/8AX/riSlfbuk/+WvU/9f8AriSlfbuk/wDlr1P/AF/64kp6Cj6r WZFNd9fVs3ba1r2y8zDhI/OSUz/5o3f+W2Z/nn/ySSlf80bv/LbM/wA8/wDkklK/5o3f+W2Z/nn/ AMkkpX/NG7/y2zP88/8AkklK/wCaN3/ltmf55/8AJJKV/wA0bv8Ay2zP88/+SSUmxPqxbi5NWQep 5VoqcHGt7iWujsdUlO6kpSSnJ6z/AMo9C/8AThZ/7Y56SlfVP/xK9G/9N+L/AOea0lOskpi97K2O seQ1rAXOceABqSkpzcnr3Sn41rMbqOPXc5jhU8vaQ15B2uI14KSnA+39a/8Anjwfur/9JJKV9v61 /wDPHg/dX/6SSUr7f1r/AOePB+6v/wBJJKbWNT9bMyv1sTrONdXO3cxjHCR20pSUm/Z/12/8tKP+ 2m/+kUlK/Z/12/8ALSj/ALab/wCkUlK/Z/12/wDLSj/tpv8A6RSUr9n/AF2/8tKP+2m/+kUlK/Z/ 12/8tKP+2m/+kUlK/Z/12/8ALSj/ALab/wCkUlK/Z/12/wDLSj/tpv8A6RSUr9n/AF2/8tKP+2m/ +kUlK/Z/12/8tKP+2m/+kUlK/Z/12/8ALSj/ALab/wCkUlK/Z/12/wDLSj/tpv8A6RSUr9n/AF2/ 8tKP+2m/+kUlK/Z/12/8tKP+2m/+kUlJcTB+trMmp+X1Gm2hrgbWNraC5vcAioJKd5JSklOT1n/l HoX/AKcLP/bHPSUr6p/+JXo3/pvxf/PNaSnWSUxsYy1jq7BuY8Frge4OhCSnnOsdCZR6X7H6RjZW 7d6vqEN2xt2xNjOdUlOd+yusf/O7h/8Abjf/AEukpX7K6x/87uH/ANuN/wDS6SlfsrrH/wA7uH/2 43/0ukpuYln1rwKvQw+jY1Ncl21tjYk9/wCe8klJ/wBofXb/AMq6P+3W/wDpZJSv2h9dv/Kuj/t1 v/pZJSv2h9dv/Kuj/t1v/pZJSv2h9dv/ACro/wC3W/8ApZJSv2h9dv8Ayro/7db/AOlklK/aH12/ 8q6P+3W/+lklK/aH12/8q6P+3W/+lklK/aH12/8AKuj/ALdb/wClklK/aH12/wDKuj/t1v8A6WSU r9ofXb/yro/7db/6WSUr9ofXb/yro/7db/6WSUr9ofXb/wAq6P8At1v/AKWSU6HSMnrl7rR1jErx WtA9M1uDtxM7ph70lOmkpSSlJKcnrP8Ayj0L/wBOFn/tjnpKV9U//Er0b/034v8A55rSU6ySlJKe c+uFGJd9k+1YuVlbfV2/ZfzZ9Od/tdz2SU859h6T/wCVXU/9f+tpKV9h6T/5VdT/ANf+tpKV9h6T /wCVXU/9f+tpKV9h6T/5VdT/ANf+tpKV9h6T/wCVXU/9f+tpKV9h6T/5VdT/ANf+tpKV9h6T/wCV XU/9f+tpKV9h6T/5VdT/ANf+tpKV9h6T/wCVXU/9f+tpKV9h6T/5VdT/ANf+tpKV9h6T/wCVXU/9 f+tpKV9h6T/5VdT/ANf+tpKX+wdJmP2X1PmJnT/z2kpb7D0n/wAqup/6/wDW0lK+w9J/8qup/wCv /W0lK+w9J/8AKrqf+v8A1tJTrdE+rfSM6cn7Pl4rqXtLW3OAJI1/cHgkp7BJSklKSU5PWf8AlHoX /pws/wDbHPSUr6p/+JXo3/pvxf8AzzWkp1klIcshuJcTYaQK3k2gElmh90DwSU8R9sx//nqv/wDY e7/ySSlfbMf/AOeq/wD9h7v/ACSSlfbMf/56r/8A2Hu/8kkpX2zH/wDnqv8A/Ye7/wAkkpX2zH/+ eq//ANh7v/JJKV9sx/8A56r/AP2Hu/8AJJKV9sx//nqv/wDYe7/ySSlfbMf/AOeq/wD9h7v/ACSS lfbMf/56r/8A2Hu/8kkpX2zH/wDnqv8A/Ye7/wAkkpX2zH/+eq//ANh7v/JJKV9sx/8A56r/AP2H u/8AJJKV9sx//nqv/wDYe7/ySSlfbMf/AOeq/wD9h7v/ACSSk2Ift2QzExfrPfZdYSGN9C0TAnlz wOySnU/5tdc/8vr/APMP/pZJSv8Am11z/wAvr/8AMP8A6WSUr/m11z/y+v8A8w/+lklJcToHV8fJ qvu6zdfXW4OdU5hAeB+af0pSU7ySlJKcnrP/ACj0L/04Wf8AtjnpKV9U/wDxK9G/9N+L/wCea0lO skpZzWuaWuAc1wgg6ggpKa37M6b/ANxKP+22f+RSUr9mdN/7iUf9ts/8ikpX7M6b/wBxKP8Attn/ AJFJSv2Z03/uJR/22z/yKSlfszpv/cSj/ttn/kUlK/ZnTf8AuJR/22z/AMikpX7M6b/3Eo/7bZ/5 FJSv2Z03/uJR/wBts/8AIpKV+zOm/wDcSj/ttn/kUlK/ZnTf+4lH/bbP/IpKV+zOm/8AcSj/ALbZ /wCRSUr9mdN/7iUf9ts/8ikpX7M6b/3Eo/7bZ/5FJSv2Z03/ALiUf9ts/wDIpKZV4GDS8WVY1THt 4c1jQR8CAkpsJKUkpSSlJKUkpSSnJ6z/AMo9C/8AThZ/7Y56SlfVP/xK9G/9N+L/AOea0lOskpSS lJKUkpSSlJKUkpSSlJKUkpSSlJKUkpSSlJKUkpSSlJKUkpSSlJKUkpSSnJ6z/wAo9C/9OFn/ALY5 6SnN+rH1n+reP9W+k0X9WwarasHGZZW/Jqa5rm1MDmuaXyCCkp0v+dn1V/8ALnp//sVT/wClElK/ 52fVX/y56f8A+xVP/pRJSv8AnZ9Vf/Lnp/8A7FU/+lElK/52fVX/AMuen/8AsVT/AOlElK/52fVX /wAuen/+xVP/AKUSUr/nZ9Vf/Lnp/wD7FU/+lElK/wCdn1V/8uen/wDsVT/6USUr/nZ9Vf8Ay56f /wCxVP8A6USUr/nZ9Vf/AC56f/7FU/8ApRJSv+dn1V/8uen/APsVT/6USUr/AJ2fVX/y56f/AOxV P/pRJSv+dn1V/wDLnp//ALFU/wDpRJSv+dn1V/8ALnp//sVT/wClElK/52fVX/y56f8A+xVP/pRJ Sv8AnZ9Vf/Lnp/8A7FU/+lElK/52fVX/AMuen/8AsVT/AOlElK/52fVX/wAuen/+xVP/AKUSUr/n Z9Vf/Lnp/wD7FU/+lElK/wCdn1V/8uen/wDsVT/6USUr/nZ9Vf8Ay56f/wCxVP8A6USUr/nZ9Vf/ AC56f/7FU/8ApRJSv+dn1V/8uen/APsVT/6USUr/AJ2fVX/y56f/AOxVP/pRJTm9W+s/1bsz+ivr 6tgvbTnPfY5uTUQxpw81m5xD9BueB8Skp//Z + + + + + + application/pdf + + + Adobe PDF Library 8.0 + False + + + + endstream endobj 2 0 obj <> endobj 7 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 71 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/ExtGState<>>>/Type/Page>> endobj 97 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>/MC1<>/MC2<>>>/ExtGState<>>>/Type/Page>> endobj 151 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/ExtGState<>>>/Type/Page>> endobj 180 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 216 0 obj <>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>>/Type/Page>> endobj 224 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/ExtGState<>>>/Type/Page>> endobj 241 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/ExtGState<>>>/Type/Page>> endobj 284 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>/MC1<>/MC2<>>>/ExtGState<>>>/Type/Page>> endobj 322 0 obj <>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/ExtGState<>>>/Type/Page>> endobj 347 0 obj <>stream +H‰´WkoÛÊýî_ÁË"d¸»|A€¬ÄÒh[ƹÍP³Å™ŠÂÙÏ"™b“-ÀdÍw¸dDºä§à`úœ¡ÇðpäwÔÑ?×f¨ÉèC{Ö¨f®nê/¯å¡ß.[\íx?ž…çÕ½ ÐFZ5n¶»wjÕɃ†¿Ãªå$HoúðIا-M{¨†¼ä ¦Ï1&ibß@0Åî–‡>ò‡›¬ÝNzŒVmƒï&-Ø;³?sB¨jÄ-âh°íÄ'äÞ¦½’-õt«È5+*¶K>Ž(2æ÷)DU>5|³ap$øqù0ú½&S{›rÌ2Ó’õéAL™'jÏmôýoéå£qÇjùe:\Sl3 «Rí.ÉA˜«Û:>pÁ3Éà™ 2rõ[˜ªx• çQ˜©Mwàû†=Æ ¡×¾b¬¢jBV¸<¼š=į³{ÀUB‚üQ· \7>½øOC¨‡ðKŽ³r®2û,‹Scw›‚¢ N#_\oüXŠ|¯† ß{13Â1ì>øóÀ+o0ËøÜÊ¿Uâ;3‚§6íV½ÌMmûøE¥tçy1¡T™(µæð–ð3ÖÉ…QW‡F£L"\.)XÖVŒS~mÑ\^†+ŽYÛ±­öH)X†ŽÑ:þ\57!r¹,^Ë€ÂÚí©û½Õ/|÷>jå!ÀóàslÆ‚ÏR;)ØG»ŽÖ˜ÄÅ…Ò‚Wpø4yÅ‘¬RHäy©÷Þ¾Š·CìЕ [??%C¼iŽh×ÜHh"Ñ,|ð,r©Xp$ ß__„<Ô²[-xÌ —ùüöþåøy¡êÎ8©å¹F~7»­l–ÛÂqÔš!BÇ÷è û/ÆxYËEãho"Äd™º›‚.Þ'óÒÙ LÐÑ'Éwð+†‚Ëa^P9FaTNõ]ò/BGGx!<þMÅìÚ…¾(‹ â8ÎýÕ‚L˜¿Ä¹Ò›‚Jëë†*“> »ry)A¿Zxª 6Ý(-ÈL_˜åJb +Å>}ÝƼƒ>#èæ-6Ú5Zš”››4×±­ªŠ;\p¦ê¦uЪ”f4;ó‘U§69ijãÊËñå£ÍTM.¸"·>Çv×ÈO6óµ°¥ŒÛÞÐè¯Ü¸ ¾ e©úVÂçw-_T:ܽ®ÛÐ;ÀÇÔ‘ vŽþ¡¢Í‹¦›ïºŽ "VŒp~ ‚QwÓ´ìZBÍ&,rjÍŽT£úB åÞà » È@‹á.Œã2Ò×PÊ&Ï€ 9ÏYè'Ã~ú¬KBú½ÝøÝ–Äm  ›YÜ?.ã^bãÂâc‰r 2_¡Üó0¾ŽÀÍÀ­ +l™yX+£yŸžßÖí³gO_Ìû]½š-¿õÏÞüòæM’$Õóçσ—¯_gIœW¥ø$ÀC¿|€Ù1¦5 éb"å³z+Q ôƒ óCÊ×ã@˜Y,úG¨7®º›¦¡S„'øýåð"¾‡å¦{¶¾ÿ-&IŒ ”+YzÿcÄñI,øÃÀ·)¦Ôbu…xÞRkUÉšf/6[†°† ~¼Âÿê–€h³ák6àÀKš¡Ï¦å¨þ\{ñž2. A:gôžs´ì¡#ôÀu5ÛƒzèP~dÁ‘¹…ÞkJ67œàð–»cŠ&É‹Ä+º§œ€_YšžÕ…ÒUn\JÒ&«þ5ªû„Tqš±Ë…1¹6¹¬{ƒ#Ë|è)óÓ‚c$æ*ûÂØ +5J²P›pTœŽ¨ÄMu"´_äêö6ѨDÑaþXB-¨1Ž¯y¾§|¿E¾výκ^,å0!ÅíòصqỉØý;âs¿ÀTrGF½&åOåZXÊC ¶ø'HÉ(`å™d¸¢už± +Â?u[1—t%&‰ÓL; `¬×u_ç=Þ»E{ºªÕNêåq^Y‡sS%?smâ²ÁÜ&ùq”›<Öv\"ö“>‘ð‘%¼DŸk,¿×Ñ¿Ày BéÜÅ•>ßoÐÈÂÖ-R÷2¨ÛzN¼Ã|ÞAí@H• ²!¤£¦kz—‘§kD“'‚dÕ«Á«Kôõ-•yT4@urŽ ÆšÅh×4Aùr[º¡>qÌiŠædHež:“bNÇ©IÊĺå!h%Õ@ éO#Б/pi¦cXår‹#mÀé®´qfOØ9Ò#¶@…Z¯¥Fd~$ÌÍY§/ìÚzK8»E£YXz&ý3O.0hÔ %Ä)^"0*µä=ÜLVXºc m)­csÙ´_³<"ÖLëì¨[&°¦ NÞðëòÖ·È€k)Žçõ¬ŠX.àô~ùÙ*.‹tÄÆ…ùƒ4›Æyž=‚fM™ŒH0û 4;•ðÁѬϑڵŒ( ÒØœL°ç›õÚ§T}áz½(O¹R5”²]¥¯‰l0)Q$˜8IïWêˆG`ÇùüÞ*úW ß÷Ô[a=<´¤æ>â­îçÝ¢rËŠ¢ÝI9¦ÝìÖŲvàÃüg m"aV‰b)á—ÌØÜK®Yi×¥qcûBéÔyÛn†½Bäïùç#îC_rìú Oî;gÿÀŽG@Ûè¸JÓôv¤bsÁzÜ•nŠzܺ B“ÅTÓØ£‚ëVX n‚ïz…ðàJQjF¸0€G'TåWeâ_çsÛ‰AĆy+TM¥¶´)âö…ëŸVDØÂü“p‹¦¹! ñZû(W%iœ9®*W¤|þûe×ÜÆm…á{þ +\ÒèßXô®‘ãÌ$ñÔ)=Íô’¥e[E;Yg2í¯ï°»Ü]Š"éZ2y.¤Å‚ àÁ‹¸z®=âšü˜Ò©lû¼aŠ&¯ÓDÓæÉÇ@qY˜~=o³ï`³êé»|nüžf~w—·*ŠÙ8Ô¸é?ñ¼ ÓËcÊ9P¶§NX_"“ð%ˆÎóš,íýºÏ½ïBxÂÜ{`ÚµÙ“çÞ¼¹)çx²Ð/ŠF­—ÍÅu´W¦æ̪ªºŒvk©û£ôî +÷ÒΣ§ùw߶c¿é)ʼn\ø!™£Ù(j:ÿ¦7Ü«´´ófõÚ–*ÉhÿúLuŸ½H^IѲ¤VŸæ˺ßËóroÌüMò‚û¾ÍYTº5æœà›ñD7­Ów]þ®Ü2×Òô Õ; ^ÿ…<Ü` +îIëÍ^VàuvI”ÜÛ_˜FTöõ†éüµÃYyÏbL0mØy±œÿúaYn#e<Úlf<ÿWŽû©àVó%þôü«oê~˜ûš‰p€àÌþ–ñ­Ã1ø‡Ž4ŒÕ½Hâ~ù«Õpˆ¡YP¿õqz@Üoî·ëfÖû1­w“Và¿:IôWY,rªtw—œ±ºY´©ð‡$×âØïoõð>X,…±æýu}Sj›:”M®·„ì¯Ö¶–±w±Sæ1x0ÄËfŒ2ÍvN›£>à&e Üsì­r>EÀpèsÒÞ¸¸DqZì6(ª,æëµQMÂÛ„§»®‰öÛliw0ß»<µMèL”/‡¡¾{=¹|µœ/®ß¼zþB\¾¼’¥‹Ÿ'¿Mt´`ªJ8÷*ïñž‹Z“;üýzò‹XM¾}=‘eÑÅíäòû™ïê< ÛXBä­!‘£<Új#%îg'\PéðwYž…[L— nYÆwñ®Å*cwÿn;ü s—˜r—”dã‡jzý¦{¿çòüÓ{q30ÄO?ýãÛì=-Í®×é+è1Ï 5B{ÌÆ\TiÓÎ$ñ…§ñ{Òg‹¨T‹­ÀxüîùdjS… ­˜I .èdîåÿ¹SðG4þü§°â¥èÔüM4Û +Õ +˜iáq]¬7^,îrÛ»‰ƒ(ÓîX6¥‹Ê@’s‰¿¯Ë³´ª]oÎÐÚZá%bU¸Æ]wR”n–8A­¡Â¡6*dÛáž6¹¼šI§™¢^¬²Ð¾õH!’¢Ô1XT{1XÈvèo\Qßü3Óë¼X¹ÍEnnd•Â[E–Ü07É©zÝz½ %AÛ€†íI« ¨`½ÀaÁÜò=1мکü6=¬k®}[¤àŸL°þ5ÊØk™Þdù,ÛúÔfÐa¯¿4Zy•M™ûx;XÇÓ@w¸Ç¤ÙîF!º;ÝõÑÝÝ:† s.èìu6 £=:oS6 £3:£Ÿ:á¸N°aÑýèÑ98²aνΆatFgtFgtFgtF?ytNzYuR[ñ§PR¼Dþ_…?ˆÁ„4›µpj<¡¨*±LE>ØR‹-p¬åd†ý_^Íp¨{õb5RªrÞd¥œJ2:ö:OÛ¥Ù+P&Œ83ÁÛ®Zƒ¦kYÞ²RMësãÔ&5ñmËò’•J£•WÙ4X+%sõ³AÜ&bAI”Ø[ ÆýŠßKŽ¹à7Ðõg£ë-è‡n³]à,9K¾·ätÉÙ,l–3 g›³Yö&Ç‚SŠÒÝàÐÉnQç xò&çÀšŸƒætC ]r6 KÎ’­ä Îà Îà Îà|æŸINÎäœ!ò=br²f! Ž§Ô³ ùíÜn–}È·™Å€·ÎtSÙºS^¦¢…*ÆR‹-‚ÅÚöty5ÃNkìIÔ‹ÕH“Pi…+ðUÔ#M¼®ÒÃ¥y*9Œ8ÁÛ®-Lײ¼eMš"ÖçÆ©Í §®¿2Zy•Mƒµ&2—Q)Äí`"¤ö'â ·¹¸GëÊkìHÔ‹ÕH C•M(­¬F‚xÒÃ¥I*P&Œ8ÁÛ®Zƒ¦kYÞ² M±Ô—6ƒžºþÊhåU6 Ö’È\Fl·£‰D§\¨2z<‘#½ÝYÑ:FZtø´tBAî!gh…ß]áGi¿?ºæìôp:å˜N×é˜shOÑ.NƒÆ?]ô¡QŸê¥énQªÓ.„íB®Ó)£>I {Ñýt¾}Ãppd¯Ÿ‹×“Þ3AçÃ^çDàø Ãè_Ý>í JΚ³æ¬9]p’i—> +ï h£ô§¥*±LEm0?P¥ZØïr2þ.¯fØm}‰z±tíÁL)Ò2Ñ™‘*u‡K3U ðÃüíÎBAð¶ûUƒ¦kYÞ²*M±Ô—6½žBó’UI£•WÙ4X«"sµ²AÜŽ&R?‡ã®å=Ä—{-ï>IÒ¶åmÑ ~äÕfj: 7r3"7ò-à_,»kÁ1§ÆÙmÆßÏÞQON-ˆ€ËÉjî<„€ñ•Ðõ«E÷UñúHéÌ;§S ‹”5¯@šèGét²v!›·ö9atº Õ JÙ,t“.ª3:£Ÿ º‹`¤ÞÌ^ VÑ9õ:$õ¢›PF§jÊ[”îqD°a ~äÕ¦êr3 7#r3 ªèBXsgÓGáaÍ é¬9ûü5gtF?tŽél—½Ð­ÖAx@ÚèèÊ€“A,Sí$u,õV‚ÓëgØÙåÕ û­±3Q/Vƒ¾8­ðø½46Ždñ8,>\šªeÂèÓP¼íª5è`º–å-ËÒK}i3è©ë¯ŒV^eÓ`-‹ÌeËq;šH%Â3[C¨üx"G¼§Zp+ॡdÌNsQ¿ýÑ·¡qÕ)£Su:]p6 ›åÌBÝÑ=EÉ:ÁŸÜ¢àdgp>?÷ßž£?=ºW bØ ×Ÿ}òë-ä}pÛ·CpÛ€Ÿìepgð#§{|ÒÕœ,8a³Fw ½4;ÐÉX¶¡«CÑÕ «Nv“R÷ŒÑÕ˜eàó}RsöùñÙ…Á|Opˆ‚s\a—ŸƒYHýÆV.Çã¼ G\%–©h"øÊ”j!xƒõ3ìëòj†ÝÖØ—¨«A×`Ï4€S‰k Š×yŠ.ÍT2aôÀY(ÇvÕt0]Ëò–UiŠXŸ§6©‰o[–—¬J­¼Ê¦ÁZ™Ë¨• âv4‘ «*O$:½¹¥ŽøÓ¡;¨*ïH¢V.º7IrÊV÷U ŒÎè¼K®_ÑÏ%ƒáÃègƒNw›zܦ¹1=tŽ0ìõ³1 «ÎªŸ :áàÈ^gÃ0:£3úi¡Žë¬:Ÿ¦ç¢úÿد¢ìäy¸•¬@µ$[vž»–ÐÇöô…ýŸså$¤$ù¸@†ßO± VÆ“ÑH†,`èÀæؠߺä(%¦ÒûžcèFK÷U‡b”ú4.sO}4_ßy¬·÷‡Ý{¬nÿñ½ÝSdvRŠoÕµw™”úHõ L¬yõðC0e‹ó²8PwŽ³”ièëÃæºgiŽ7¾mœ†iÃ)a;U1wŸ«sXòóZ ¤¦H÷€\ë§He}|y€¸BÈO—kËàòFùÅ”7äMæÿ™ãRΤçó×æxóÄFyëYšXå?”kݲ.¿æ\N@?F®ÇÈu‰\'ä/«•(þ§lw¦<#Käñå)‡EŽk,òFyËϧKÞÒóå;–¦•få ù#o Ú(ÿP^(ZŸÎ@¿†ó‹ _R@ÏZ “r€dW/ˆÈeÐJ)q-ó⛿êP)ŠŒ«BÉÌWwæí}ç÷¦Û|GU§A-|pÖuÿi’ë#ÕC2±æÕÃÀ”-ÎËÞÅfwŽ³iè륛ö,"ÍñÆ·Ó0mø!$ c§)æîsuTœI‹êoÊ ôeôÇBŠAÏA¦ÊÑ ?:S’~ƒ\~-u9üZà/Ly³—Æú…õ½A¿ +z¢Ò÷ µ”6gl9zôHœ:°Ö…ú/DèÀ‚NS`­Co‚y먽WsÆ&ôÿŠ3¢æhzzkë­”¾ôÖ{=:j(ÔÓ5glBQ¡³¤2ØbN!¯€÷Zº¯:TÿUÆU¡Âê«;ôö¾ó {Ôí?¾™Äü­õ[–Ë*°I®TOÉÄšW?S¶4/‹w(:ïg#ÓÐ×K7íYDšão§aÚðÃIÆNTÌÝçê )˜øAÌ?qZ34~ˆ_iòć•k@N|Ú8^Å;‚Þ›’ýâË%QÎÿ(yOka3p%Õ~+–Û¿½Î3i_sX±Àvs`ÎaË°\€Y/¾¥ß Ö ¶NRXÎaë(,p`gNPX¹À‡Ö9,tØBì- zsô+”}¡ƒ•‹Q*iËú¯I?\®.ç€÷„·ŽŽÀ9°Òaåk‹°ŒÃns 0ëírÑÚÜ+8‡Õ9"ô؆–KÅút&MÝW%Ïß<.F +±øêν½ï<æÞuûïE\!.Eš”u‘ó¥úHõ˜L¬yõð#0eKó²dwŽ³’ièëÃæºgiŽ7¾mœ†iÃ%a;Q1wŸ«ƒDõO›<¶˜âë ·[o¯ý=¬÷f’ÄG^Èþq{yZç=ÀöTµTà$žü?ÌP·E|‰##ç©¥; 7Š¢çšÑ[è¼eèÌy_ÿ»õÄ¿õr=®Kàz™—Ãj8?‘‘ãº9.r\µ4ä÷FŽZ‡¢>s¥Ðj]¡ÖêV„^ôoTܸoÿîœßß`9‡Ö9.rTµ€–}\ÂQ "³t¦#¿ÆÉO þƒŽ¼™JÓxÓøsj—qÔÜlÈÛ5èòüDur£(jw`üfÎÂÔç±dŽKèL‘K÷U‡n˜YÆÕèÑ¢¯î<ÒÛû΃î=R·ÿø^Vbv*jþ”\Ö*4)õ‘B©¯aÍãÃ3?S¶8ÿ*$Yçãlàdúú£îYœão§aÚðÃIÆÎTÌÝçê šrDÉ"[Q>±ÌЋIîqêÝxòA‰ ç¢8÷¼²»8Áͼ÷tÞ 7w¹Ü]œó¢g9oIzs¥Ã²ž=œl•þôå¨ÉåAI + U0À­6tIº¾æý…5Þºß £l¡ÿšôÀo;jry„\pYGvu”˜ðZ¯$dù.rù iIzkD-GÀí.¬»4ÎÂ9löTα¡Ãº pï‚š¤°Àc¡ÈÜoÞòo¾Ò¡¦(²ŸãÞE“ºxH•áf5é:S,¥ûªÃD½ÇV#E˾ºóHoï;º÷HÝþã{8RÐ>ÙS^sbÎ’?R='»R—?S¶8/ IÖyç88™†ãú¸§nɇãdाmœ†iÃ'a;S1wŸ«ƒHQ?‡ÕSßVWuiÇqé·MÝ"àÂÇô¢²w@.ÄYNz. Ç•*Ó/T™ºE¤…*õ"U³³ð¯ÿÿÊq9ã§*ÇwpH[ÜZ)‘Ó©’÷ ä§JÞµRyaÆQ³U+ÈŒ7äwF.É£x®î?#rØü Ä–O^»ž·QI¼Uʯ…rõÍ»•è¹™·:i¸ÿ7j^j½AmqôX¨JiŒ7Æ/e9;rÝÖû§×JÃ}_ܨ}aóÂV}.í 9‹!Þ5qµ‚ê†Ñoµ‚«r\ä¨*W9o}åék~ ¢iË7€¢2Ž›› yC~9rÜÞÓWUãhZQ*RúÎ,ÖÁ1ðH¡çî«ÙHÍÆe’}}ç±ÞÞwvﱺýÇ÷Š’Þù¿f4YqbRê#Õs2±wxÃÃ3?SökÂá×úVwŽ³“ièëCŒºç(’M“”ú¶q¦ ?¬„aìTÅÜ}.’œÌRsµ¢3põ³†‚äGœw1$+xÖ…4•uÊ6Öÿ\ëÍ_îÍ90tX¹õ=N‹4ÃÎÿ¡”ì%뺂­-;¯“¸dÊš²Áf'®\p9îr[EX¹ø-WLC‹6Eq¹0Êù.ÐoŸ¦‰W0p-:æÍYå°5¸GÛÖÐÛ«¼ÕÐ×€Þš®Vþ¯ìÒ«(²1âvè©e6<¹ 7]ÀJ/´?§ôçd8Ia/t°Àa¯À*Çê["åsg–‰û´,DÙ·çî«¥§â1†eñVÞz_ßy¬·÷‡Ý{¬nÿñ½b¤T°•)º¢Ä¤ÔGªÇdbÍãÃ3?S¶8ÿêA²Î;ÇÙ@É4ôõ!FÝsɦÉÀI}Û8 Ó†RÂ0v¦œÏÅ9¼Îi´±àñúO]ïfäÙcomà‰ËÝŒ¼øGK@Ý 8×]ÃúEÐ/±ƒ³¬…â"dX0*°Ð±µn‰·]ëâ±1¡»Ös1 Niθrám«ôÔ™#OÇ v‚¢#`è°JW%Mþ/8à©P/õšõçbi¥èt Ø[¯ø€M”¸õŠ÷외Ïx„#‹·ö'£P¤@²Žš¡.ÌùÚÜåî‚ ¶YÄu—@&åKKÑ…§«‚6¸¬c—#LÁí3 ÷ R,«so`Yï)ö¼Uúú5•ô"è—hýt×I0í,'*—îÂB1Çî«ŽcOÅ?Ê°îç¾¾ó`oï;»÷`Ýþã{EKŽž­–Û€I®TÊĚLJf~ ¦ü?ö«%¹qîß)t„@€\ç>B–qeãûW=H²•ØrÆŸñ(î”V"en¶@Ãtú4tá2w-ûåø~\0ÀU¸4§)°oŒ¹´Zƒ„Ž,!aŸ³þô½²4áÜ™™çcè™{;ÖmûuÉT²Žï¥’EïÚþ·‰`/¯›ˆ»‹`Ýîíã(v|ͪ„w.õ„ãᎥ¿j¦,>>ì°‹käèï:}ÊÄ.ÓÉq7в_Æû!FæK$ÛoZú_·ià“–4¬ƒ,õîýä"-GÛèMžySa€K¡Z ª|.`%x’K3jðãÌ­È1çÀ)ŠÊy4HèJµÈÐ/#M’Y·hÒ™ç>éù“ÔbÑ|í£Ë&)°Ò…ØxÞŽ ‡O>#uóëuq…Ž\^pƒëv-#p’âBGíFÈ€‰%1 ç°Àe“Š¸…—¨-î—?+é¨z‰ââZæ9úx½<Þt᲎ì\”jæKV÷9YÇ­¬YbÀxxš®eý'Êúš¥?‘¥À‚AH™·ù@z·X–*‹«V–× +Kb@àp„kñÚ™Gë/ÅŽ€g¡lݶ_&“6¾–F.aûß&b½¼n"ì.bu»·£ÐJÓÜ™:©Øiƒ3®ý£ô÷ ÎÄNq‰Ln:½E¸L'ÇÝÀÉ~9¾ÏEšâ¿6nÓþÀ'+iXUêÝûÉEª¸GhÁ¸Î°§ýs'àÙ¤—f˜§*`èaI[–KCï³B×sµzƹByÒ º‘Ï=pd¹ r <üQãrÉ’>bòz˜›þ Í(SŸ—Å»I_ŠsàÚJWÉ@Sã<¦Æ–0« ®éBv.¸…ºElm€åEIdŠFÕ(éx”¯µeµº·å(ªw‘JžmÎ9ß-¾F.úºC×k•Ž:Ò!§¨‘T…”‹ _ž÷ÑçOÑUçëpqCŠ’f ]HssDèÈIŠªtäúÒ"Ü™fôø>zký½Õ%¬.3£&)ªÒסîG#k™W ¹ÀrŽiÂtµ,bÑDÖd^Ÿ¸‹JëÌK|×9ÏB)ºÓ¶_¦<¾#ÉK¼ÝD¨—×MDÝE¨n÷öñ5r0Qr«AI#M§¦±÷Òß2SvØÅ2¹éô)»L'ÇÝÀÈ~9¾Ïœâ¿6nÓþÀ''iXQêÝûÉ=ܤ ª,¦sŸñø¿6ßúß~£Ê zøŒ¦@ª\9ÿAÎ5“ä„4~}å\­-áì/—¨’ùŒAzV—¯sdà¨*7¥$ÖUŽšž±ƒ,æ¸Èõ¤– 1AqI‡ÍÐ~vlI!ûf.ÔªÎ?>?/§ÖΨ!AaåRâ»~‰ó§,縜£Esª\æÀŸžqX©àGu,fT½úŒ?~…MOT±à¶ZÀ#…Z+V –sÔ _Þ$ÏHPc²|ÆÞ@G¶[  +]1k ®ÊQÇBL+b,ªØ|BÈO`ëT˜‹uIM‡!Ô•»Δ-wÛ~­J¦6¾!­ï7ìåuqw¬Û½}ÅΤ?lZ¢â¶S1{ÿ(©Æ/QvØÅ5rðªÓ§Lì<w-ûe¼BõgŽNñÆ_·ià“–4¬ƒ,õîýä"V›IFÊðßÿ¿kèñG'KPµì7@gáKµì© +Â֘Û gä4…eZë% 1 x a¹äùH€ àê Úxµ6ƒ~7ék3úÕîX鸬›ÍFT€F +¬–ð–‚'¼º˜©z]B,k]ü-Ð1m:.pè]+úÂyÅ• pE· ˜u`è!Ø4ÌHYlµü‹ º9yµé0ÍKèÕë"§(n/R&®Ðç:`Ö•ÜF³€ÀYâ7ÌzÏUŽÒFâÞmû¥8•dãk®”¹ÅûMÄzyÝDØ]ÄêvoG¡C~`M•šòé¬k¡Ìx”þž™²øø°Ã..‘ÉM§O™Øy:9îNöËñýxæK$ÛoRú_·ià“•4¬ƒ*õîýä"–ƒš>¡4ÉéE®L(»#¡ì¯j‚ž©ðÜ#]%K»]–׿€»ïךçéª)æ,ð«(ÿ›)æ åÍÊVãgÕâQ´ÞÙ9~\訬ÇØëYçП>IcQ¥-Á9ßš¤ß™ê_ k”‚zH¹À¶Q¥R}.—»‘/¦sÔÚ %™Ï_ÏÏ8¨ãB®ˆFÕë\+ç|íý¿¡÷÷¡B©ÿâX´ +ægÆ¢µ-Ly"ëÏXÊqUŽ‰[)žkA\ ╶}›`Á EžH\+¤=Ç­‹©å²R¾ åÀEQ©TŸC¿ùbÀ{(p#‚fµ¸¬”¯SèïÄ-`[ào' +¯d‰»m¿%Íã[.T“ÇëMDzyÝDÐ]DêvoG…¸™!…´žºOc勵d¦,vòˆdrÓé5;O'ÇÝ@È~ïk·?ÓñÃÉq30ÒÿÚ¸MûŸ”¤a<©wï'÷(šêХㆪ_ — È~AÞÚ™tB = i­ +Êú*õ•ôëIrI+ë‹K:lY;“åÔÏ hµ6`èÀR_YÿÖ%5,븵Z/°Y +,õGS0™Œ‹C²ÎTkUDÖͨz³ÎwCç•õ_]'S`Ö™Ô¼@²Žë¾€I®¸zQjÛª—¥³º‘¹ah;Þª¢˜30ëk]_}À-Èç à,E”zªæ•Lœë±Òlݶ_f!3_爧5Þo"ÖËë&Âî"V·{û8 +­ÄÌeÈ"©3‹aìý£ô7Í”ÅLJvq‹L¿yø”‰#'ÇÝÀÊ~ïk·?spŠ7þÚ¸MûŸ¬¤aÝßÍ»÷“‹¨™ÅEœ¤ÕyRñ¹¿·\ó÷ò7ïa–? ó›?w)%Í~.¥þˆü;]NУ›§Ô¹b0åÁŸŠÁ7ÀùLB•?%_n”kºT nA~Kû[ί7ÖO½Ï•~¶_¥ô[*ðsz!±:·xk’þÃ$…V:&çmX.Qþœ¦ZKìÿÀU8C¡°`0ëb Mäʹ÷¯äò/Ú((ç«Î—çÜ©&)kY\zºp/ó>úüÞ8¬[DaÅlsau \¤ÍÛF‚ÂÖX¹×`èF¹¦¹?G€ÛESt˜žˆ`Å›žÀÕXçÀ–kÌOƨÔâÍ­‹¦Ì¦êõ˜pék|·í—¹PN<¾Î™$Tµýo¡^^7u¡ºÝÛÇQä8¢UÆäg?M~c勵g¦,>>ì°‹Kdò`òð);O'ÇÝÿìWMRó<¼ŠO0hô3#­9BŽÀŠMî_õ-ãÄTòð£æóÊ’ÀJ«ÝÓÓšH™‡¶ž‡ùÕ†Ë~õ×êÔÍ/\HqÓبŠ:¼Þ$k=…pšÞÜîì Š'µc…|Í|¸Av­§¸’ŒåóóœoÝÂç{лêøræØ]€=9ÊGø ++`g pyŠ–sà¤kŠÀ™ÖÚâýÈ-ÿÔŠ|þ8‚-¶"X±å÷`ü'z(¬·ÀÆÜLQ>Žà-Ðr-R`¥;ýärÑ+‚í¡À*‡ ly +1Â8B#†|µ€MèÀœgÊ)´ŽŽ¹€Yöt´0f-Í“Ò½wëË“sqx‡‘K] 6ô¶z²žžO¶éÙvÎ/ï«ÅE¥Ä³—JÄçñ‘Æc2qÐú™I%.õäÕ/oÖÙDÉ<´õiñ«džL”Œ¿V§n~áB‰›ÆFTÔáõ泯ßÖy¨Û×]í#$Ë¿= H}ÅyÕô®Š4úpë6?Ñô6ëГí-åž¿tÕ¯ÿB‘kSŸ¤¤þ‹º™/FPè°J·@#P¨þœ£¶£Ã_~ :lô::éoÄ]XO‡-Q`Ov`èy0 1âi²bnqû"Ý>3+¸“B³`/v‡§ÿÆÃŽ™wæ<\#käáaÎu.¥µ–þežH$µZAðDØún¡À + ½ÓTÝ8ç7QXc<ÂâÑŒîCO”%ÈT¢ZܺD™œ”ámFò¹.òlk'Ûçéùd[žmŸáüò~ÃH)%OŒHâ[Šmf4ž’‰í÷×;“J\–=yõË›u612ëz}gµÓ²_ýµ:uó FÜ46žìFûº:ˆÚZœª©ð—ÑnVýúû†›Vö‹ïú@´‹E»wr²—¯9ÿ—LúRä…ñ”\Ûîü +ù>þñ¯ÜJ.‡ööÂßƽ#ã7ë2ÙéºU +pmk_¶¹CâÛK\)³´÷­o+e¿ÒÄŠÕ¦Æòå¥[O1sŒ{*±ì@8ÿ+ã÷<%Qɱm??LùÈq]µácšŠÚ¿º=jów¸ÆÖ¸Ãc¸Au›RŽ+ÛþyµÝ31ï~÷Ù¦i‚Š™rÌœ‚ꇠ¸-_9–ˆ¨pÐŽÌ8j6ÄõBH…ã&,Ü bµé3$å°ÀqU~ ?dþð ÈQÈ~÷+Ð6f“í½o\ ×ÀÃxx,® J¸:A“–§ÆÒâî6‘ i.#p¦”ì¿®3†·q˜Ès¬«Á¾Œ-žl£§ç“íy¶†óËû Å'©2Þš•ø<>F/°aËwÓC>fv&µ+ÙÇ_=yõË›u6ñ1ëz}çj'™'!ã¯Õ©›_¸0⦱Ñux]Ã*Hì{ŽçPÑ{¥´…ën&Éè¦É}›¡¿|/àæ»9ø¶˜~¸Ó=RM_Ù>ç™\ÒÉ9“8ó&ï=t~xË787èìïBï*Õý.j¬Gýäп»;º£\²‡T:ª\€97èœïBïUé }4Sd.À[pvÁ´Å¨â']t{à?Á9¬\p‹¹ +•î±Þ'ô#ìßIqý™söw9ï²Dq#0ç°)7v%&q…ñtkŠÆx‘ ˆ8èÛ"pZÄÌ‘÷¶F`à°% +taÓ"p%eû£$OÃ8S”2¼ÃDYK]ݸz²žžO¶éÙvÎ/ï7Œäız­‹·ùYÌ ì‘Æc2qÐú™­½Ä寞¼úåÍ:›8™‡u½¾³ÚpÙ¯þZºù… 'nSQ‡×ÕA +¹b4Ž> %´iºÛO»÷¦ÉÔv»Žo0 t&òÐ72°+à!û{®"é•ÎmÒ^x Û@ìÆ‹Ôª¯ŠÔik.È9—Z©÷_£ilÚ@‰ôºÅ‚¢¾5—þÅÌ9°+¢z‹ Ë—ÆíÝ6sá—(ƶBû§üH-‡Êÿ/â9ª)"7"TSDÅͲo-ÀYÌ¥„¶}[ä»iÕW`Eˆ]ÜÃ"²€Š6kyŠœö¨ÎŸË#&ª—X¢ÇEîˆ[Ç-dµ`öPUÊ%·¹¥™=ô7*4¯;”èæJ™Šú–õî•œ[`9t—LmOI…²‹kÎ#¹†·qÈBžë*{⤶|²­žžO¶ëÙ¶Î/ï7¤¨ªŸ’…”[Š¹=ÒxN&Zò1³3Xx•¸üÕ“W¿¼Yg'óÐÖó0¿³ÚpÙ¯þZºù… 'nSQ‡×ësŒ‰Îs˜Î‘\hM¬×fý€GÊQîu¼ž,ìpÆ2I@)ãÝ[2…iàÞtÎ-çÀ““{—Æ> 4çSçL9hËzÿÞ’ˆ-d@ÊÖÏ-­©Ç,QXÎ-dJ¹wÝíÓ[€Û?°Ò¡ãjÝn¨±ä Éz0Á$ÄÄ›]`C‡.PÎqMñ¸Þò8ðH‰¹KÿÀ ÔYBçzÿ­?ZfQD±À2Î<´Àûgø‘Ëâ|qoÀ¥e#—Ögr5ÜÂ&–d)1µ7ÐþK4Ú]HZà% +ì.Þz¨? Ð·F¨ì %Œ‘à8S(<¼C³M uu¼:y[=ÙNOÏ'Ûôl; ç—÷FÔÕo¼ãBÄçñ‘ÆSZ3±þ==äcfG`R³»¿zòê—7ël¢dÚú´ÇøÎÕN2O&JÆ_«S7¿p¡ÄMc#*êðzsŽ•!;Ç ÒxL&ró°30©ÄeÙxU¿¼Yg'ó°®×wV;-ûÕ_«S7¿páÄMcc*êðzs¬¾LŸ6¤Üö¼ŽMl(¸Ø¦énUù87÷Ýã°‘÷âK¸ªÞK[hü'ÊÓE¿GÂ8Ês†ÇîÛ^u1 Ñ’‘@ê¸De_Ú,Ý¿-*AÚ$ tØVjŠ°·‹®äÖWúg:—ÃBâ(-t„¸H¼kK”¿ ý!Ö)Ò»Ðñ'®ˆ€<ŽÿÔÆóþ}Z- ½˜sÐØ™Ãjø + +{§8€ï¯r}Ûöb"ð…ØYJy!müÀ÷8`gƒÎ-ôþåœÌa“"0çÀíØ¡»(¬`ñ'  ë*œƒ!Wrr#u¦¤<¼C!ŸS]¤lõd;==ŸlÓ³í4œ_ÞW{J)¦*Dßth±ïk4ž“‰ƒÖ‡|Ìì L*qù«'¯~y³Î&Næ¡­ça~gµá²_ýµ:uó NÜ46¦¢¯7Ñ’u2(Þ-À£}<9€ï|ŒmÛèØ®DÎ>·ÞÛqž¾"=ñN-æZîÉ¥«V½@W +I÷€¾½\€•(H‚´—d¯è½kLŸRŠ`ú/@Çí¤ÀR?r×/¨4¼k”q\‘]à´+ôh;;n€›òÝÎ[À:$Ê(\CWrɵ7Ñí­e{èBbn ÆynÍ¥àJ!éÝû +µAr{¸âÿد–äÖax]` r#øY&•ï_5ÐÇŠmzÊ™”£§Ny%Š6©V«Ùh<ÞÐ9Ì¥õmèþåò¬þÛ‹¥ÄïÅ‚¸·èR ±†§\`±”¦}VDˆ¹Àå8¡Ã*ÝÉ,cVQÜVTI Ì]4râ$—ðÅ˼ȤbÃÇ8,¤ñäi6"Nå˜=ÄN/¯‡Øô; Ç·Ï‹•rM:§¹z M|¼”ñ5™Xýê¯Àä–×i!qYWÎw%Ë0æë°¬¹ØiÝo~Ú|›–_”¤iDeÞ¯ÞÃ%ç©Z;ob¿«Ö+ôÛ¥>!ýù†À9é½&fWçi…ž)qÛ¢ÿz<ëaX9ãìŒ2÷œÿrÌxrÔ#*ró{1cŸG4Rª÷rÆ>…îQk¯ôÝËÙÑ:xÖÑý¶1µ>Nï_å°À#¬s1HK„=ž°Àa}%ScÃL¸JY¸? ˜uà¤Ì:¬1WÑhç’ðíÜ㳋Qfn (h^4bî»9„jT¨rî-}ÿæR©¤æ²à¸ZÉdl½³ìþxZü©5ÌB„Ê9rjyÿpØà üÙÆ=“Ö·}4Û"GDØóéd©öjA€Žgçbm æ™R¾ +æ™XÛð1Ù¨„ñLÓ,”Ùcþ{½¼bÛcì5ß>/¶Î”“ñtøÝùúsšøx)ã‹r<Èæ‹Ÿîâ-˜Üòú«¸¬+绉•eóÓVãš³|¹™XŸ6ߦeÁ+iWÙ‡÷«±’°n¬À=¾²"º‘l às‚¿À9¨Ê%æ)–õ#mýé, p#«©¾ãŒqÆy)ùôÿ‡óoAÿNʸ =B©r}·ñè/"#­“s‘Þ‚pDc7q—dzëè°ÞRǧ/þ»nJæj€RAe9â¥æ˜©8+â +Ʊß8¤¬—¦ˆþ¹€»"`f¶ ³Û^TÊR1Ë‘Qót`kUz¡šl àçùJ+~™™jÌ|ŒC§Âyž-dj1{ˆ^^±é1vŽoŸ;qÕ< «½âÄÄÇKß“‰Õ¯.ñLTž¦…Äe]9ßMœ,Ãy~^s±Óºßü´ù6- ¾8IÓ8˜Ê>¼_½H·ÁT©´ÖÜÇ«òa÷=¾&é«ÝŽ[€z˜Ø­8 +=ŽT•t/×íºf²Ê÷Œl—Ð#M»öÝîn‹Þ™ÐÝRèÈöâÔrë3ÒŽ+öëÅûv¹%âJßm¼;3ô’[ß P¹§9 +6ªYïYË#(XûõΧFÄ¿Ññ"@O¤5÷zù1ò­Ôbш…Áà™'íqh9jEvsèxŽZˆ˜² ›‡ZD¤ZT©lG„j/ÀŽ®I …þ¤üIù7)7!ñÞû7,U,1àèå6VËwHÿ»yK(¥àå-§–AC nca™œµ— ëfT½:¢¥[¡2þ ïVÊ­Ç –DQ‰ž}è¦æ›¹ÂsÖ{Bé×K£¤‚xD€Qó°óQéù’u‹'ÔácJ”ªPÓ4-Ñ@‰Æü!özy=ĶÇØk8¾}^l]‰S“éü×Òy®I/e|SŽíW—x ŽP’×é ®+绉•eóÓâqÍÅNë~óÓæÛ´,øb%Mãà*ûð~õ"ZTãL1©T¨Ï{‚g*¾.$ôð`–Ð!LÝ[9¯ÔFÁÁôŽ+ãqP´`ŠEÃÏ8#BG>¢¸ÆîÒX1ÝÅjQ<àÁ¸•´E2}X;°rîcøð tþ¬kµ¾ ûÝb¤çÈõ¹~³{K¡R¬/Fû?¢ñ'ç¾Û=ð¨¡Ù+ )º9,pä›)·Ög„ + +Û1%˽%"”~¦Züô§\,—Òtë¸õàZˆƒvH±4ò,Žƒ,lˆ¬» °Ö£cI=ôK}«b¤J5çÞ)p'Ö(œ1ý¥P)–ñ” FM 0à/”nÔÿýãÆí-bÀ7*èî)×L¦Þ» +€—öá+âÜË|÷NÛ…§ÚbðTùSå÷UÞÈóò –€ž½ö:ß-çã¹ ¼æJåŠr§œdø‡ÒÈBIÓ´HlÞbþ[½¼b×cl5ß>/vn”âÔŒ–å"×õÍÄÇËèeÿabµù⧻x&°}ú5꺮œï&N–aÌ×aYs¶“/7'ãÓæÛ´,øâ$Mã`*ûð~õâ§O«µnQ¨öqOÐ-Gç’{軵°8ÿíSÝŽ»ÅzSSï¾ûçE˜ÊJ$B-¸ÑhKº?š»5¹‚±nCîÍäZQÆÔ±0$aZ /@ö¶~IbcG£@±çã? õòz±¨W Õ]ß>WI)Ôê^@sY·7ŽÒ?rÿ¡FSâñ!·}„±€ÓüW|„æ›ãnHÊ´´ó!Tç!’L›!)ýÛÆm˜.Ü“†µ¥*I÷þø!<$3 :@™È‘;ºCGû™e¯m´ ”°çI[ª©Gè¹ä=ŸÑdÖ‰âÕÛLzE­Ýt«]ïøßhÑz`9%ª¥¥ùœûCž%×=´ù”Û"ppé[ÌDjÐúÏ朑Ó9=s ž›æ_À>j„yÔĬùŒ¡ñ×n=@gÀö:Q“Ðm4tK˜JrÆhqx™úm£6ŠzE!H©‹´}M'%œÁóŸ˜æ¼zN€az›Yw<] õ(êCѽB7¦s°ÿò'Œn{‘ F¢K¯ëw¦C¿ óF…:`ºéb–\\ö"§ââ›-N“î¹çñ«ѵY4k–€Ÿsüô_š?m¹¼¦<€¢ÖfÑCÊݺ\R+K»C‘ÍB’Šv, +ƒ. #Úuý:%H…Çs²j´ó‹{y½XÜ«ë®oŸ«´¨r¶+ƒJÔUZ8JÿÈý§Ú‹ˆÇ‡ÜvöÂiþk„(4ßwCZ¦¥k7Ýyˆ$ÓfHKÿ¶q¦ ÷´„amÉJÒ½/>¤¿âðûb9£çTR3î>ZtÔñfà¨ðÞ ÐRAÝ¡'‹÷d¬Ièæ3$yÎ LƒÀ9-Ó +9-ÿtã˜3.)ù$‹€iûžEjºÍ0%æÚ•6ì4fèb­9­[êŠé‚ü4à +¶qdKÝ÷þ,¥–sÀQs-,í'@‰ujxh| 9¬ýVû9WÐœ='0ÛR늲8æ¹cènõÜ/ÓÍãÙhE [Ö RmØsËzÒfä!ë;‡îÜñDäWÒ‰¡¨Ô3‘èF˜DXw£ö™žAK¨;ÐEÇL·E2¾¸¤ ¦â³ùõ]œ€OéF?<—®‹˜B­. ä´@N+äôWJÔì¢DÝ3émæÜ­,:nE ¤©—ømºÄ_èÏX]ñiºkqñP¡ Ë^÷o3å~‹ÑÜÜbñÝ&:Ô\3ýxqùSäÿt À’¹c €¹,é‚r”î£_'ûMìuÃ9!dµã‹Åzy½XØ«Åê®oŸ«¬(Fê8»*ëÁ…£öÜiŸ?Y=ì+„Ó|! +Í7ÇÝ•iiçÃåþN…o7ÇÍ•þmã6LîY ÃÚr•¤{_|H„ЧÈ>(ç²çîšúuoÈ£ee×—¶ˆÜ5Ǹ7Åü°¶wC®[¬oXÄn\!(Â;6£¥áë†[ÀÖõÓ>ÇMW‚äºS7ì¥ïÕ©\ »;ÉS¡3R~pqf3Vº}ªXÆC(5W¾]gÉŠB—ªâ•âfç49Äí·4óö¸Õ|i2¨¨ÇŒ;vµæ²ÔÂyãŠg§â³oz#¼âFÐüñ„0Hô×î¨$MÓ¯&()¹tâ^G¯ÍÞ¨ÍÑ:´W¦âAòÃÏá$ ¬µ¶Ïr·ãO„¨é ®Ü9#äÈõÐq b`rÙöÝö  )Ê?Ü!2hQŽÜ˜‚fÉ=V'õÿ#«Ó1r¯Ý3Aâà1㤠„ê9ÀPê¾ß\îï,"ÍñÆ·Û0]¸g% kË•}óûêCŠ" ´ eÃÒM?/-õü˜~ÞüpüìÏ›»E¤E=Ñ“z‚®ö›mto#ÿçŠÊ¼LK^Ò“5§(_›£¥Ì¶DþG%õ<ôÝœ'$_ö¦¡[¹güJ€Û¦KÂ\ç¼yà6vÅêÖ±¾ÄO+àÒò~ ”cW}i¾ýŸíÑór¾¯,Ø¡šÛ‚q¸²X΋¦š,Ç7ÿã³îØ·$3w)º„N@Qj®·¯.6Z‘‡"%ȼA—ãs~<]2B—}” –=´Y¤ 2b ½ý"uÜŽÒ®¼4É(ecºðP£~—ã #ÀÈâ²ùu^6×Y¸½2mº¹€7Äq|ù´BN 䧉º€ÆìÑí"$"ò¨.&Œœé p|‰:†®Ø§Û5è‘b­éßF~–º8Vtƒ^ÒÓÛFýõ.çÒůˆ@Ø!Ï 2oÅÏ3B—“‘-0íÚ®6K´€ O`˜kèÍ©ùE”â•éŒ\OF »mFYµnFM—hŽ;VJ+¦£‰eHÝG¿N6~ ŽçÄ@†ãã? öòz±¸W Ö]ß>± ¬Ë•Ž³l‰.Gí¹ÿT$rÛÙg §ù¯ÑÜÍ7ÇÝ–i9žw"É´ÒÒ¿m܆éÂ=-aX[²’tï«)ApƒŒTËÁ7tL:¦÷ßWÔ±p`éCÿû L+ª‚}XEÍÀ:ê1楋Šª VQ3ôZŽ±§CW$‡Ì½§C÷KS—6ºGóEjÀ£î¥üOTñ©”ÿ§á^Iò®¸´™s×âBicŽiŸ.~+ÔqÍ ¨5[Ž‡~¼í2ëNxÈ szÖ ”k¾4_¢Æ–¤âÒ¸$ûç„ÑåXJÞ«Ð6uÑ1t‚6,zótñmº +g—‚îv,2·˜%¹d‹_ä **'hËOð¼ˆKçâUÏÍ·°D—¢(h]*yîy¢K }p%š¡äà’.cr˜sÓsI%êçuo¸8úáYOý• àÁ»d‘¢GèŽ;©•iÔÚ¼8Hºy]ÔFú³¾‹‘Ó9=ç»Ì¤X|Î~kÔí|ṑ&%ï5ÒVé’Ö’Þ<]l,Î@¯¬±¬RŽJ)ÝG¿ÎhkÏIm­v~±X/¯ {µXÝõís:AÖ"g +aÍDŽÃ'ö£Ádõ°¯@Îóq„(4ßwCV¦¥—û;‹Hs¼ñmã6LîY ÃÚr•¤{_}ˆ’½sèz¥þu¶é=£_ü¶¸S¤3,Òaõ]eÃS7<=ÎÐØ#[úe‹)M¿pÔ®oÐ{Qušu±p ÷LRS]o&Lö Ý«¼8f‹@æP1 gȘ빷yºðÂeoŒiRÒ.,OnƘ‡ NynÐòÜoÿ÷l§…Gu!ŸýŸ +°WUô)-nû®N¯r.~»¿8f:fDLOÑé[úì•Æ,GHÔÞWÌQE1•¾!]¢EgGL—îgX 9‡nÿM ЙڣYº9µfn¼j£\ÛX¤ó/1—$ Áñ’å™j²gèþœC+:ê,ê‰Ô3¤Õ YLÍÇ\Ÿ¾Haõ<'ª.c²ÌœI9a:t¡ªí¾eE‡ÍsÔ©8Ïû¢´†»D1{hL¢âΈé‚Ë9S³òŒ<ßÝæô"£¸LO¹Õ˜,Ú8MßBxNcr–+5•QY ƒ(*î¨Ïº@A\ž.Ä"£(Î/æF9óØ…~Ôü[%QÈäA>]‹Æ¿šµï8 åƇ÷¾Î-’ÉÖ÷ꔽÄûc{ùuŒ¸§v8½~ÜÄvŠø+‘‡õž“傥ߓ‰Õׇ}îâLnùò©ÄÐ#—“ën!弌÷KŒ~æ*’7 )ýÛÖm:ø"%-ë *ûáíîÆI–ß6%ëiÚ¾q\„¡¼Ñ'tŸ+¦FDèÁz5 —qÁ­”¼Ž¾r%iŠ™-[‹¦ °*ÂG–(NÌGíŸ=?’•ßFþÀwó£çVóäqÀ€^¢ !M»CÂ8¥&[¬O ØŸ»’r”FPM/a\lœ,¦7Ú¢£ ÏO8SqÆ(·;t‹\I¶%çsv"¥äõ¬‡]Ä-`g¹Lú€ðù•–p!+‰!u…É›ly­9¡K".ëÀsE,Š° +#p¦‡ËÞ²\³B‡ô-ÎÄ‘ë”ãÎÈ Þ‚>kÂèæ@7'rà|nG°¬W©PÖ¢€Æ+b?>±àb¼x€Èo€3“4?¼÷u.ĵ®ïU©6Ž÷ÇöòëqOìpzý¸‰]ã8× ¥Rn­Þ‘b²Ü°ô‹†Q_ö¹‹[ÄÐZýùiC—ËÉu·r^Æû%F?sÉΛ…•þmë6|Ñ’–up•ýðvw‘'zV¦l†¤ŸÈC€[ÛÞ´iù…Û5ã…‚ý ŒkzÀøÄí?W UŻƗû~4?îà»ek7džô§ ™ƒ×pkTeL”Ù…¶KäwÚê˜3æIŒ¶jFÛÙö(ȳ¤»2§¦iT•ùs%ž­ÊØfgÕ§Dmš{Áã[¨Öº•á3jŠU¯þ„LÙ]Ç eÖqö™Ÿs`W‹«‡3t%Û=œ¿sÂ2ž‰Ë?À8lÂå<ºg.6ö Ù³Ü™Rõqð‡¸zˆéÈakÓ…Š¥±ͯ‡Ö¨Ê˜*³‹JÀÎ 0ÃQ+·ß£2Š»?MF%œwðíšÆi"Ãñ§Ê-Úf¡¬w݇…Xï}™+eoëk5ŠË¾ÿç¡^~#ê)BN¯7‘ ‡×´ÂÄMî­„ÉrÃÒ/ÿoq &·|y-$.—“ën!å¼\߯gúÿ<¹nRú·­Ût>ðEJZÖAUöÃÛÝE²±Ç¯[ˆkÞrSy¢ ôLî<&æ´Rpn”8A9ÿ+èU‘†­«d)a3Tì]CˆŸ1µìf¢ÿä…´=~ùÓ€gjî¨z®ÅÇŸs‰p¹‚jKËe,ÑéõÜ…Rî0ÏQ9_&È4‰”rX +æ¸F1 œ+1{ƒóL\øwwè!Š rî‰jÊ£;Ÿ^])o¥ù”Œ«"²Ý‚Ž*ç^¨Y+ˆÐJôù™ L{ ¶õg‰hÒnáÎrJEŸáÍ&¢+è´B]Hr+tþ47ªê†Ç8p}«9,éÎ$l£9Ÿ¾@­"«¹¶4ªùüœ;r…º‚!O)y!/ê7ÐY(åvxïë…Ð|}¯Fœ=Þ#Ø˯cÄ=E°Ãéõã:v~ΚV˜¬Ü¿ÉrÅÒoÊÄjw¸“[¾¼Žïr9¹îVÎËõýz¦ñÏ“ëfa¥ÛºMç_¬¤e\ÅÕÞîî¡ÕË⦛ÉØ­çýy¯¡{i8üWpîd‰ÆÜ]€‡(püáï)‹7*µŒÀ§/ÏX4uÀ]ÑÈ cw ˃ò€Ê¢¬˜¬+µMS:'òBÅGÎç/ÑB13"¹éëdQm£kÙŸóïPP§X¨ùƒV„P¡ÐéRJL\ˆé©Š®¡Šu´Ši,-°×çºô% +Àº3yö1aæÏtØAT¨™Ú2½žOs°Éœ7“Ño( °ž[#çí:ªYü¡üOPÎü@ϧŽ<É©ÕöÆ÷—Äá2ê`:ÌÁWŠÎ?Ú­ù•Ec*c–Ï6Up nHb—+¨I –=!ɹðEKZÖAVöÃÛÝE”UW˻غvSPíëçm{ÔwøÑ죑þ ñm7y9ßM|¯ ·\v)© 軩ÁU¶ì¥ÿ†õÿg +¸@Wj…ÇLÿþ­Ð8gÝ¡ïµë¾÷”L/¹m™»99/Áy•'húîÐca½þ°þLÖzÉ¶Ë óÓKÿÂxn»Ì2O·^?œ?›sØ>Z‚ñ²¥è³j ª,Z£juË1N ={d:o vsZ‹„ÿßEz{½C®¤H­’¹@š]6+xˆmu5ûV‰N©.®ñO>fúôé‚ÜGsÈbƒT` \¤‘0-æe~“Š;zh´ÐQ[æE Q”-›;§² N¢.TKcH]Á•Ä`]ŒG›;}ºD‰rÎ +¨-ÉÉx Æ«<øþ¢ˆš,^(yF²|ç-Ë–žÏÙC¡ÝyËå¬Ç$ +«/Ð ƒÆzêFQB™šÉ-ë#GˆÎ{_g¡\××ÊT­¿>F¬—_Ç{ŠX‡ÓëÇ+­OZV©È½£3©ýQR<˜X}}Øç.nÁä–/Ÿ†¹rù/ûU“Ü:¯¢ | ¹Î|„,“ÊÆ÷¯èÇŠezÆùÞ(zì”W"™jÂFc}sÞMYY–~>ÅßÙ\ãÍ_›·ayá++aZ{®’ øÄÍô4:Jn;_·ncîBhvÄnÄ^XH û7@÷ÖÁr„þî\ .Ã)´Î!å> ÄåL¯ˆJmF÷ââ5– +Hsdiæy¡¤Ñ¡[& Ü +c÷%Šk\*©(`Æ]³Õßâ—àòw2žÈUõNÆ»®ðFÔ?Y +inSÞ}çW—ˆzÜ÷Qý­W§Åòhú7,ÿVοýÂÚ÷a+•šäI|ηef-ôî²(F -pQÄå9®Q4âr8BΕœè ’é™2 Ê"°å‚¦ ¨é2*v8‚ºÔÕJ‰3$ôT(i4H¦Û.`MÇͺeJµ¶ªþ³îE®‘˹|Ó½(éܧ<’¹”˜CÝ +£ke©ÃǸ£ê~:æQˆÆó“‡zy=yÔ³‡ÎoŸ79©lÐ(Ë- •§ æP†¢Ï“6?ô²ó;82/¼Ë_=ÃÆë›ónÊɲôó)ÆøÎU$]6SNƯÍÛ°¼ð•“0­=SɆ÷Í=„¢¦:2­¥î¶_¯À³ Á# 는äNȪž.ÐþšÌÝËC +GKïÿ18® $鎵Ûøî\ñœ£¹ÒºkHž»›®ˆÒâz^J¤ ¬ºD7v‹Áà9fÆ‘•XÍ“rëZÈ¢SÞ¥˜»O,©¶îÁ¶d×Dn5 ëÈÝ_)˜bB7baÆ“t/Ò`3çÀtu°ÝÈ%=ÕŠéA ¬?GsdY)ÉZ«ˆ1X B·è.WZ—Û?]ŒJ -Ï÷oCÏúˆŽ«‹…bÍ*t‹_n€ËSÐÿ%Y +… h[`Yž½qËrQ„-ÐL¥¤G¨Ï…+`É‚ª,Z¨„„Ù†”‚iEE&‹^—ªFšxK—BZÒð1.%‘‰ÌÇì·Ì~|òP/¯'zöPÃùíó&)%i4ûçMo+H¹Œìßþ'RôÞ==ô²óKD2Më_Ù£ðúæ¼›’²,çóù«Hºl¦¤Œ_›·ayá+)aZ;ÖdÃûæ"‰B 6i˜¥ÚjXÇÄ\¡»Šq9ÂíFÌ«¬g}87öšu­@¦ô*åU*C²Åm©æ¶F»íz+pÕ”Z² ÷¾¡ô¼ý¡ïÖBG(ÐX"”Eú tQÒˆÙˆ€ùÚC-R­ñÑ(ÐgÊWõ¡7·Dïž.À²èL‡u.%øçyn$0GQà¬×1B›õŸU¹F.[äòMu5º…"—#Úÿþ“(pE6ºÀºštc²T!“nBâ“ 0ûE\ºxÖYRK€¬{'-E[ÛÕ?Ó¡%½ÖX¡g­õ‘K߃é?a¼€ Rjíî'ý0uF`ºU©üœŽŽÍz!­GŒ¤{7Ò:þoKôŸ.×Àe \¾í`i^)Xn@ÿdÎ9ž  ©¸7WÍÄiÜe²ãJ‰¯§SöÊüøäq^^Oòìq†óÛçMFÌX&3Z±U.ã#{ªþ‰Åæ‡^v~ƒH¦iý+¯oλ)#ËÒϧã;›€k¼ùkó6,/|e$LkÏ“; ÷ÍE2…èAGéå{£cǬ¼@÷ß •|„CÚº‹˜¨>cº2w+tŸÀÒ¬ÿ1òÀ/Yiõ.æþ(Ñ:vêy¿ç…’äÖN#ð¼ºÑøßÀ·øå¸üàJÙÍ/]Ö§w"®E‘üÑo¨PwrAÚ±¡BQ=—ûêšµ…ÞÎÍ-r|T¢]ª °q1&Í‚iÑŠi«.šŽ*Œ–HøŽ0"ä¼r|½O¦W²„،ǢXâ9ß8p+2»C mAõ‹À„AžŒ +•P’ëÀ>¶ÓåÙIÿÏÅ“þ¤ËtÉþ?µ<’Å^s:^t¸ŠîL±EÞ}…&%Ë5Çu\IRmÅ€æÀYwè9ˆ5Ðÿù¾ÿX[¢x£h¢¬,ƒªºÏM[Ÿëü©:|ŒK $%ÍÇÌd¥øùÉc½¼ž<ìÙc ç·Ï›¬huû9vŠb|ÛŸÕOü‘Ç›F¯1›zÙù-"™gõòW&6^ßœwSV–¥ŸO1Æw®"é²™²2~mކ兯¬„ií¹J6¼ß\¤&æ© j­GKj†žÇß—±ÿO—¬ŸÌ#-Ð+…z§ïu¬À¿!çŒæ¨×¤ç ÚÞ +ünÛëx¥¤zDÆw4wk/R‘z×¾_\žL?žéÐtUt`ºCW"â|áY÷£…Þ?ÓaK´‰0¤ö.F%j›õ?F~Xk ¬é.Q`è•Šp„œu%‹wlWÿÂhTk=‚.?´ç¼Ìay¨5AòüitÎy¡s«-à[ür\þðX³@õº%’Ê-aúg:n'‚E+i8jÊ.Ý–þ3붔²H[œ]»­TJt²8tÛV§i>ÆeÌt>‘¸ŽÇ'ôòzò g4œß>7•”=Ó™Â- •m|äñž‘¢ØüÐËÎïýóiý+¯oλ)'ËÒÏË°¼³ ¸Æ›¿6oÃòÂWN´öL%Þo.R´L÷ŠSM_¸ÇV¾:îu r×/oÒPÕtAî,+ù/êIÀÜ®Ñò£i±G®ø“³µÕÙ±‰¾Ôgq_T[–÷Î`=ÌzgféŸã¸È]É“›#<® ÖfqVPý;§#/)¶èg™"×Àe \~¿ªTÈÚŒ±Ö¦ù e€¸Qµק¸Z:µåH9i«„G­M£*õ ßÛ©x×,œ =hu:dzò£9¢Çêt] !á°~€+˜ UQqãzÚÊ‚7ûd&Vkµ°cž¤(uPu)¼µX™Dòð1.9úºÌÇQ]5ÅÏOëåõäaÏk8¿}nB{;KU§Žì»É‰ry¼h¤è¿õöá·ˆdšÖcϬñúæ¼›²²,çóùM¤5Þüµy–¾²¦µç*Ùð~s«2ÿ¸KÄùqWàþãZ~䉺êÐè.‘ýw„î¼Ï‰oy@—@!†¶itl¡¯è¢‡ºÚÔ‰¢ÎD®-VjK—dñœ‡Ú}Bÿá-òPÑ»„î㜫zkö‡¾™BÕxÖE€‹:gi»Ñþmô)/W†1SHŠ8_x4>D\ö÷º•$ÜÀt/R µµéÝÓ[ÐaÛh¡ckÔ»oFØt‰¥0$]*iFìEÐó(pEu]Èm¬BEª ªB&ÛU +¢ÃǸäD1Ù| ÅèÇ'ôòzò g4œß>7½±™|ú%5ß’P–þÈã-#EŸj¦‡^v~— Më_™Øx}sÞMY–~>Åß¹Š¤ËfJÉøµy–¾r¦µ'ʯù~s‹U§‹H¼CɻմþÂ{USþ“jZ¡û?i•o¹Œo!ÿûU“œH¯÷,ÕJZûÁK;¼ñý#^u7nb¦ñ| £t°jµ@"•¤²²¾á`ö'ö nä¿ÕʶTZiW–»áT®jWÖŒÿÄù߀î-œ:¬Ò‘½…/%Òá‡ÊKnWvƒyKäÕ¾‚\PJÅQsKjÖ+}xo®•J»Gº½™K+ ³ +GcÊM¶ñ;ЯrÄkXÿÉÐq«?²»`v—àÜÕ*$ç\ZŸqJhÚB½žî1ðžq/.C]Õúâ`ŠÈ¬g’ܶ"×У›uÅóØÀ™SoŒÃ×PØR›Z‚qóÔûÊðÀójÏ8FÂLŠØõX.¨¬»áfEÜÀ,är„'.j»R25–r݈ã0oÓÃ9K]¦³QõóûØëéyÛ~Ä^»—÷“­iʼ°Â>=l:il.~öˆSdò¢ë4;¯+—·™•Ã0æëî°æd§u¿å×–×tXðÅJšÇÁ•úîõì A‘,%;ÙùA.Ù+ðLI*Psœsr@àB­h/•a-l·I¥/ã37Ÿ PóuÄxr¨šq„\³ÝÃVn="Fî¡#°ž¨–ÞYg2S½ô‡-©%»â…[a.¥$¨Öë'$E©¼e‹ß~ç×xËOÖù£ˆþƒZ[cPè Ý4ç mѣݿ¡r®uún||•ÃöÐ*-CÀ½S“¬ ú¸ Ûb‰¾¢”ÔsŽ·`û +dÒ™’gDäî‘έOçÐMIRÄþwÈö‚Ú!½ ÀŒƒOdœ©±È-MÀYʧjÑ#½MÃlá—ËlÎäj1½­žž÷±ëGlµûxy?Þ¹&öù¯,žÏ3h‰âaÓ13eñ³Gœ!~¦è:}óºry›99 c¾îkNvZ÷[~myM‡_œ¤yL©ï^ÏÎažsDHrêƨšü»Ãiv7ÙŒ£#õŒÇÐÙ¼ï¼ÄË9ì kŒ“/Ž·i;D±D¦óøçQÁ’õ cܦë¢LÍx«[Rçîä"½\Æmtå’*d eªé‚-Ž¯óø2—-?U,ÀÐam¶A'—’{µ ýá‹"ú"ª%÷MçBê 5sÁ*Ö]2©jߊ"pŽ\‹ŠäÞ ã’.TÔõ‚ ][ ¼z:lO{‹ hcÔŒ{±@kª[Ї¼¢Á:»õéeüXé°MtÔõÚ«ÁЭb[$Tsíµ2>pXGdÊÌõÀo;•„/Å9ÏÉ‹5ªOm%tïu÷6 ³‘eY¦s´}b1¿­žž÷±ëGlµûxy?Ù9OàëòoJ9¿ø%>Š‡MÇÌñ?{ÄÂ芮Óbæuåò6SrÆü¼xZs²ÓºßòkËk:,ø"%Íã`J}÷zvm¥Í÷©Ê…j7¬¬À•ª–¾ ¸Ú­ÐCŸÅç>­À9ÔV šÝ#[’žs§œúˆÀ9SJv$}{è¬Ë–» Õ¿à;zÔf•-¥ɹ6*ÅúpÙÓ‰@z:°12—{Èåö¬GÆ÷|Ö¿Kú6ç"m‹óQÝVéBÙ­/Gr©šGûZjïç¥øŠJ€»Ý%tFÕzvÆLŒÀÐ%ÒKÙº¦è7 ¬Ã³.$—Ì òSîå ¹œ ÿð¿ÑØÁvG°q7G~‘¾’þ1å±lC׸ bí2åÒ¶òâ˜)=Sïu>þ…uXàL"mËGUyñ|¤x{g›a‡urà6Î(eQ,KLšëœ½è)ôˆ1ÕvoÓ0>[f…,}ûß>vzzÞǦ±ÓîãåýdcŽ%VÏe¢>㤰O›Î?õïôgÈ uš‰×•ËÛÌÉaóuwXs²ÓºßòkËk:,øâ$Íã`J}÷zvåøÍ9GÎwhn¦Ëz$iß,ÕcBkyëJ ɳ9ðçVXll….T‹7H¹X$U<ŽX7©'$—8‚\$¶ã{(ýöþ,`Î9U‡„\Ž€ÓË”…³’³nT5:-¼Ì}'Dà°Å¸©SJÒúø”'2ÇLèÀ½¨séµ2>pX_Ž[|þ/ O{÷®8¾Ð™¤ZY +¨P-ŽÎYvF%)œAYO¥nA“õG=ú7ÐÅ¥O^Z‡öuÐC(©öJ?¿({oŒãÏÄ (`ÃZb&iµËßU¹#—Säru{Q½õbÁà6r¡]ÑL­x àFìgn>ɺ{›†JµÉ2+T<&÷±ÑÓó>öüˆv/ï'û +夲ÈÛùÕ/ÁUp¸jY*äõÌy+ÛŽI¹Rò{ X"~ W(_¨ú*gj& º‡µÜƒôÛëÙZPí8àâRÚÅÁ‡- ¸"Çõr¥êÚ÷·Ë£ôÿ€lÛ*IÓžñS±|GæWyË5Ð7ež©µ á|à*Tsû¼¡|Z‰2i­»·ihÑuè2«¤¥Äì>vzzÞǦ±ÓîãåýŒ“fÖæ¿3‹žßýÂ>=l:gŽ/”åáŸoq†L^tý”ƒb^W.o3'‡aÌ×ÝaÍÑN~x™9™~myM‡_œ¤yL©ï^Ob´ˆÒÙ¶Dù‹ëTþ à•ÿüÏ.¸#ù +²|?_\ú· •¬Ô?LEÿµ„¤Ro¸WùÖEÔWIä¿øÖ'ÛšZ¯‘áqG“x%QÕ h$L„=8f#±¨hõe]"dÇ»ŽB’´oÿö/PówÍïW9ùuÖ *y°ý—Ø4?#ËÖS=8jHª%¼ËnãumTü.¸oì"LU2`ÔF¬¨úæË8xµ)—käàˆ‰²Ü ÚŸ’³AÚ¦m+ij½º‡× f“À¦°HeD‘(Y©ͺÄþÏ~$·®ãÀ«øA¹Î|„,“ÊÆ÷¯HrKôûÊdd=ö¯D1!Õ„›Ý ‹ ÞYJP›IÔÜŠið¨õFÍ®˜±—%fÖ:N÷¸!{œDœïe÷ä.nðÒâþ5ì'Eþ!“¨¢#»·eþ†F‘LÊmqÎuw¦è3Ã0Suî³~ RòÙ³ïôòzöM/¾Óéòö¹*H)þ5IÜ\vexÈpN&ö–p|Ø×›ŸÉ4Ï-Î+§·±&×á4?­Yl8ï7}mz ×ß5 ãØ+•íô¾8ˆG)ãAJíÛq[òo€ŽÖTÍÀ=ÁÕ#‚Ðþ%W$‘,îZ·ô·«žð¦è®V-ÏøâÞbK˜n½_[2å8@nî4,ýãNT¥´q´àF©læÿ>Q¨–ˆH–HE P§ˆ_ñDšµÞ¿»>lÍC"pÒ‚²mùgŸ´FÈÌ’É’2Y¬R.åà‚§[ài <ýØ>smëÀqàÄÂV0þý%¶‚M,À&pa¯¨°´Ð®(ª¥·îhŸ]…RÎm6ߟ,°ж"SŽÃb¸ +lE°¹¸æFÁã¹P’M#êSÍ3E­ º%m«Þ¿œÃv™¤„)-hÞ/¤ì¤©X^ÖÜùcvú†ì—Àÿmœf¦ØçϾ×ËëÙ·½ø^§ËÛçª&%x“5æþÈkj,ÃC†ƒòÐŽ­~ +&Ó¢-Ú›èJK+Š±Å†%­¸ xh"5àY‘RNŠš[8ŶæêœÅÑ­®¨×¢ b' +LôJ!+&tñAF¤‹R©Ú^Ñþ½h„#2ד,7Àc°êD°ÝE&© ³;wh«Þ¿ºÀÇã¹:½UFE¯Q–Ͻý’Mýíº‘Ë%Xº»B¯¸U×Á=ÚKŠ}Iº¸ i<ýy1âÂmÿÕqFºa‹˜T¤ÖqæŠÿoK–ÇO·ÀÓxú!p¡ ¾‘,À6êƒT[UÜŸ.OA_T=—|„>"ë‚ê pêJ”jÚ’Æ>¡3]HXÚôÒP²¨-]~]òÃ*®”cRH²$*ÙZ²ô_s¡t‡+ÏÔõ`A—œ[èl©Z²æÀ a¡¨9Ç°•¹úT`/R•¶êê4`šl[+‹ÀÚÍs þãi‹RmïÏóý]4ûÞr¾ÄŸVÀÓß*ù&ÉŸ±e÷Ø-¶4G¨:¬´Àæ-Ø Š\bL¼PŠyœ)znü†®ó5O³‰,«Ïž}£—׳ïyñN—·Ïž…Ô³ÛÀÀuâ4–á!Ã)™Ø›™ña_o~&Ó<ÿ5Ú1¯œÞÆŠ\‡Óü´f±á¼ßôµé5\|W$Œc¯S¶Óûê5¤8$²ü±ëʇþ´ùG?í Ý;-ò§€±Äüà ½D¾ÜÉÃùɨkàUcK–_så÷º›¤»7À“¶LÙŸäû#¯Ä!ýQzÁ•ÿ!-¡oÞÏB%ä|Í÷—`¢ƒW*Ê ©‰° + X•ŒƒAš°º0·lAp"# ¥ÍŠwTIôNÕ +ãóŽ~G3UÖ#ýòRñ¢ý‘ +¢mw±x„ª‹RÔ¸Uõ^¡ç.ai«Þs„«éB…s›»ú/9,p`…­¹j*€a6å>¥üp)îC¡±Ô +Ht`Mž)kHªÀºh`ITôŽª "0Y"K üYóÖÑøs.ìÐ EÞ"gò} £LIê4™(šOž}›—׳ïxñmN—·ÏÅ®•¤ä2ÅÏÐDc2’‰“­~&ÓgÅu¿úìÙwzy=û¦ßétyû\lÌ”“'Ïá +ùæk&j´á!Ã9ýËÉV?ƒÝ×MGŠ–æ•ÓÛX“ëÐçËéºf±Ó¼ßôµé5\|×$Œc¯†ÿŽï«ƒøo*×î¥àHÁŒ» ‡jw,3t£PïôºÝÞMÍýJfèJ¡¸"àñ–,¨Â[pw3‰[áhÛù1/1AêJ¡ªÚƺþi.TBlcøgÕ`7Ö„ +k„$‹7/÷|¨ã¾ëF[8¤Vû§K!µº•û¤ 0ÓÍ;"5QP¢+Åt§æ—ÿï&ø†VJµlAï5¡Çl­"T¸/•t%‰ÜR½{IW&ýûUݶ÷=…O€ ëÁGÈ2yÙøþï}HrËt«´•ô9}é¢"“ÁÙÁº¸}ÍqÙ€µ4ªÞÒ’Åx0ÀŠg*!¶G0ÿB%¶Âò­‰»j"¦õûýT‹ +IØšWbÿ·€U±ú@1eÑHJ¬:ì%U +¥¶Âø |G+*¬-UºfyŒ^­A[jˆKE÷¿q:½ ÃD%Û´*¤I|õì'==ŸýЋŸtº¼¼/Ž$êç 5I–îexäá=™XìîáïÀdšæåHÑdÞ9ÍÆš\‡¾>nö [ôcç4k2|Û4 × Ÿ5 ãØ+•ìôz÷"\t‡dgeí·íJ|gäÞÁÄÚöŒÓr†®d5¶ÍW·RpÃÉÈ5>€ëxÅŽhw÷๭x5Ò‘>ˆÓÛkËöЫo±)‹nylˆÚ’)snõ|û+ú»%_¯¸¤FÔÅ‹G!i)Ë¡Í_ó!²¸GÕsLU7£.Š@˜B©®šQ¯ÐQ» TQWïëWtk5Ò”’+Ð> +›Ñ•bL€7ÔkÌZ+êÿŠÂV׆€WõØÂ߉ë`踄Ñ@ $tä}Ma«®~MkÌ•T"pó  -Ïÿ˜+?ý^þ‰–NÉjl½¨¶ÀÒÚ‡j<ćöɹU—þé‚ëýÊÄõˆ˜»±ƒz>¯üà†öÏ¥PâZ;×%Wr&±Uè©"gŽ#ÍCÒå eJ¬§·a˜Iýãj¸ðöãì==ŸýÌ‹tº¼¼/Îòæ°þìæ{ç8<òðš~¿üïãÃ>fþ +L¦iþk¤h2ïœfcI®Ãi}Ú³8p>oú¶i®>KƱ*ÙéõîE²D­º†À8B0w«NrðÍîÓMÍ-?è»:¾OÐù-ÚVº†É9n€ç"@^=÷þÅl,]EÒz¡¤¡­9Ï=MÇŠÞ?Ï‚ç.ŠYô/G»A%DHEÖ#‘ÕðÞ@Oö@]úg:jBwYŒ%µÚ‚Ð+o¹i®Ãq©üšæ²@.wÈåÿtÐ’#_PN©•D#öÐB¥0ª‡b&t¯yÚª"BÍ•‚åÖE˜®$ÙÚ¾h_ºÈ-rY"—/ c-Ú*:FÍÍl úLß>@C¯l˜v„ªéÊÕ#¥TÓG+…[3B€Ž«.À-†Ç¥–ë ä²@.wÈeü03*d‰ÛĈ Œ°)ÝÈCzFä96tÌìÛ¹‹²>Ж?¾¡‡‰b%‹’ µ¥—=x^"ºÄ;AgJþ«¿ ÃLêWEòo?Î~ÐÓóÙϼøA§ËËûâ\ÿ‹%I%Üß6<òðšL×&Ó4/Çñ[?vN³±$ס¯—ÓuÏâ¤ù¼éÛ¦i¸nø,IÇ^¨d§×»IÙÊHËš€®Ó nµ= pŸ´–±ÞSª›»×I9"íÝ¿{ zW ãz±ÐBßÞ¨7ÓÞº§éð ×uŽfàê; ª ¸©yI¡•EèÞîŠBu3òè™T ±è./¹ +dÕº°¶- t`Q÷øŒ(êF&“.™¬2¤¾àŠ:°“:ôX´m꺿£Ê”,%<àß ÆÿâE•˜­å9ÂÅÍ].é9Èšõ I92$aŠǘ\¯þ!…tR`®#ëz¡¬©êûƹE.KäòÅmHAÊZ‚Ùzü]¦ÇXqs£Kc(v„ªoO˜J…ƒ4ÐÿùQÀ5«®ÙQ¯L‡Õ%IÚv¥U–F¥TR›Õ»¿¤À­rfŽ^…8•£ãîW×¼¿šã!Ù…]óRÙ%¾žÞ†a¦šë´ê¯ªÃêÙOzz>û¡?étyy_œ‰ý¿±"Ê÷9Tý+ý‘‡—dÿ Nû˜ù0™›úÇ_#E“yç4 rNëÓž›“ì:+2|Û4 × Ÿ% ãØë”ìôz÷RÁp›RÉ­áu|›> {/ á„´™[ÏU÷˜a±…Þm̘»4´GaKJ”ìn€iÛÆŽƒ|Éå1KÛñîkwr‹\–Èå×vw£ææ~‡ãÓ3p£jµ Â’­¶íKÿ,G%‹‡:Žåèë¹ËqÖKbŽÖBï¿æF%qËòî¯'¬{:ðZ1I^IR9¢£øŽ·75×È­}ÔÖ@xäÐ(YJÕ6&~W|71dÆGTü[o"KÖr„ƒîáýAdùï°åKbþä«lAm*¼äôˆÐ²=[€knl­ó„ôÖâV—7Ô=4XËs9çÜVÀAs!UÁ$KñÉÑÒ"·Èe‰\¾,-%§6p!H‹Ÿ]ˆ-{=Gk¡woDÈÀ«ØZRì5µd)˜ªX©T=¢›Ûš.•RÉÚâªÈZ['B ‹QIÜÆÜ?.úQWÔé9´5ï8`3—¨Æ’ÇÆBøΊؗêémfŠÞÇU¡šÕWÏ~ÒÓóÙ½øI§ËËûâ`¥ žš†S­Þ×D£ <¼§·‘õ–&óR~,G óÎi6Öä:ôõrºîYœ4Ÿ7}Û4 × Ÿ5 ãØ+•ìôz÷"ÿpü›v£3ôòØ8º½PÀ•!˜g§?6s¼™,ÕÏŽî½þ"eÜ\Їô^›ÓÅ¡?É=j¾9]Üór L÷KÊ¢]ÿD/chƒ]Ç™ô¦ä"&[ü¸ ÇIÏYt\äÀL÷¢—$kúÒ¥‘ª(3â%6RØȨCÃW!55¼À¶tNòjõˆöbûi¡A–=RskEûÒ\n˸|‘æLIµÞ?Íjª’æ…R]óþ.‘;[ŠEL +$%»ŸCÕs¿£¡dÄÜHs[úÇÍ$˜4ÇÕsTQte‘[àlѨ€Êâ5Ï&ˆ4÷’Ç0ÙR©$Yƒ¾EÕ·¿£…LôDUw3âŠyEƒDÐ+*9·Ðûw"Tà©Ä°[º¼žNó$¬¨ÿšâŠ¸¯®È-pY—_ëJ¦’“Œ\±|×U0%N§·a˜Ç–c\MSôÕ³Ÿôô|öC/~Òéòò~Wê‰yø!k´û‚h´á‘‡—t!»{ø°[Kš—#E“yç4 rúz9]÷,NšÏ›¾mš†ë†Ï’„qìuJvz]¼‡QÿT…JØĦùö.ñü»ò¶²;ãfŠ*iø:î¿Q€w  a-Œö‡Û ïŽQñxIÃj½;ÄÍ”¥õ¸ß\¾ÕÛÝa{¨(ÙÚPÑ=îJSÙ÷ïÂ^G‡wۙܛ¥‰rûd‹¸ì¥tv»*œxé­¦Ýy²½‚š¥ã.ÚÂÞQLþ"*ß\Ê*Ü&ª?åÈaRé“FRt-v3{fÍÚj±;”?ÐÇmRâš»w 3»âRwÇý»°×È)) Âf@¡bë”}Û»K·W¼âI7nrM %¨wÒ‹¥eIßÕÆäˆû ×Ý…dj[\Í€ + “[N# j§€j“Ž›cjYÒwtÍæ,áÖnúFí²Í5µ€#܆€BQk‹û›Ý»°Û(ÇU–tˆS¹+IhÜvÔVc¸»W’@¹æ6Mõ]m¬öFÉJàQµÙlYk¦TãémfªjÓj¢äŸ{ûqö“žžÏ~èÅO:]^ÞïÊQYËÏ„Uc9ÔákXìîáïÀdšæåHÑdÞ9ÍÆ’\‡Óú´gØ¢;§ÉX“áÛ¦i¸nø¬IÇ^©ôûU“Ü8¯÷s +_à!ä:GÈf™T6¹Õƒ$G±LM)ó=ÛûU²ÑODªÕn4~zÝ|H%.<QªŒ2œAÇ•Šf˜©õ ¶5A)üOЙ¤îÌ~w-— e Z¾Z¨9+L|ø,ÆJmªf,„;eí¹Þ`– f¹Â,w°=õÚ'ž±m/š‚ NàVuŒ©É˽AßÚA¢%מëÁ/ØÎÎ}C»™˜ª§‘I3¢<4õfhªCÜz¯sÈC´ Æ&ÍÜ{õà}Q!A¼Þ}ðº¹@f†ˆPÒ‚—A±48Á”v]S20aÒ’ð™Fյ¥T¼.9(q¹·Üvˆ:UFu¢RüÈ@†ã´3‚ækÐat mkêQÝg‚jõÚ[öÐÞ*ëÈ!­=´<@c*fzb’\áT jÖÑÑÍôÇ­àÖ˜Ù)†/;_×1Ë0 Û»X º…œe«&Ózz›N q¼y¾«4ý,o¿^b§§ç—Øô#v:}ü~¿â£j.Ë Ä~m«%×é`©M¯añ«C|ÇïoëíEÖ•ËÕLÉùt¹¿¬™–”Ï•ËÅÌÉô¶å2|q’æó`Jýôºùi:->÷–Ô×јÅÚ«¢Äžu¦¤v”{Æ)þ·RJzäµâÎÒîÍvxm#V$ª¶!52E6‘>²Ú/p×¼ãÛë³&c;”Y]Ùá#¥ÁLYçˆCJ°Õj+@£ß…‘XÑŒW‘–¥G=:Ûˆ­&¸.ZZ4?Dij^¹Î‘²[Åc»îE¨ágƒxˆ‹¡µu#áÔk{pÔ¨îY‘æÔšõ¨×®”Ôú =¶FµèNg¾"ó¨ûÅ(–4¡ùH fç†::Ížù .ìT\„Òš3\9%¯.Œ4j¶F†oë¦]z• ®mÌ¡†‰%¡Y¶ÕØ:VÈÍG*áÅGJµ-Û<ýïô6²H†ó]¥Ú$î¾ÄNOÏ/±éGìtúøý~Eˆ—ªsÑh–ë¢)Ù§ƒ….ÿ3U•_â86°õv¦ì²®\®fJΧq¿žÎk6;­û-o[.ÓyÁ'i>¦ÔO¯¢)QâPÏ<ø¥vGùe/p ¥¤½k ;ÁȨ# s9rÛQRÛî(νm£‘âMñP'QŒ)j£T*?µ\¢–-jù&êx¦EË€«GÔn£d¦}E®mT•dÒz6ǃ!ÙØ1¢=~e³µÇ|ÑzÜý@3+¬°Í’¡¡ÎäjG­æ6¿{àkM­·©HH¶£"ÝKÏöè-2j²IÍp¸ƒïl­÷’Ñ´*™ª2œsƒj;ØnÎ}7¨wÃò]"½¶£ô: n!ËÜ×åਤÙz5“D£¼7ê{ä’⭯ɟŽóÃö…¸Ù߀0QMMðDÂdU¯½ƒÊ$§(!9šÌÄ­”›Ý]Þ÷ðn³8›!v¨IAZ i¸ÎÚöVËw¸¹Êém:-ľÜT*¹ÆÍ—Øèéù%öüˆN¿ß¯ø(Mó̇s.W|”ìÓÁR›ÞÂR–ƒ^Å'ĺbë3e—uår53r>A×\ìäç‹™’émËe:/ø¢$ÍçA”úéõêC"¯ÉlZ¥$³=ã6R×^£%gÔ™LJß’G-þ3êÈm^ú18꥟ÚÚHñgÅÍvä´ÂŽ‡› IÛU³~nu)áèˆ +)™+^«T6ªD؉d…‡;¶Óv$îq ©ìû±s”U2¯}Io%1{ìUåàVÂT[…k’J­t#Úð¨c$å̈ÊFÔH<´ÓÙÈÎ%îLyG#ÃÃNQ“|T“öv¥*æ÷îí÷wJÖ;÷Ø™$PATwõÒ«dlç¶F­j_“ƒk$“I%Sv4®C!žëQ=èÚ ™$QÉ\qÚ¦‘DI–”[$$Û˜#hcGu?&w>Él’LÆÓGCi;T¢m§·Ž2þê¼c~äQjl$[.a˶|“ì¶Þþ—ˆPÒZ`Pk•<+¤ðt4z•ÓÛtê$.Ë]‹Ð7_bŸ§ç—Øò#ö9}ü~ßl˱[k³£¶Ü®µdŸ“ΙXüêø£[oGѹ¬ —«™óérY³ÙiÝo~Ùr•ÎÏñ‘æó IýôzõµÇg(UûsÝ˦î×Ãù7µ‹Û-µË«Ï_u:ý*};mvÚü®ò­Ò_¡ 5×¾§m¡Ûº]A·¿‡n—Ðm ý¨_°î’{Öó?†žÆz$ ·¾'ßúß"?žãÙú§Áõý°óߊåOybnäÊ=ã:Cj;qsEÔ8SòÔGÏÛ»ùíÖúêŸòLVíÀïÑ@­YŸŒEHK;‚>fl‰ÄV 5qyÎ}â¿Hcri©Ÿ\8Ïaé­Ço¡ÀA±ýã˜;0p`Æ«ø#Êóö*Wʹ`yfɽ¯ X¢¨ôÍ| Uõ¾Ž/ŽíRï,ãΉ'ÑÍaÅ’H8cz9hFT*igx#¯½RƯMX¥$ª\q¥jµ—8@²FMÓ­š?@,·ïúšz#ŒB?SÜ¿¡ôœÊÑ÷7Jÿ–»|ú¡Ò•Ô¤1ë"ùˆõ!¡‡§kný:~Ê\Ž&¹[(ýC¨çŒÈ9S3íu~_àr \¶ÀåÛÀÍ­AÇgoÕز”B–ykæñM±çÛtê¤ñÏù®‘Åóöë%6zz~‰=?b£ÓÇï÷;‘à4Ü*¸›K˜o¦fb)ËÁ?¯â ˜<Ìâó¿Ñ%]Ö…ËÕÌÈùt¹¿¬Ùl¸î7¿l¹Jçç¿IóyФ~z½ú ¯uá'–ô‰tà>½B;Œu£BÏ{Ї­¦ àµæøÀÌ +]ÈRyÄp{è°r±xÈ!—µ»x [,¨¶˜¤X$ºØC¼åÖb‘ýòx +7×GŒ.7WyŒ‹¹p}|ÎaÅë+L²§òñŸb=$pd¾Óö|Wåñ”ó´_ ãsž‚óvÔ?o1RÜÃA½zŒó½ÖP¢¬×G(ýö¬3Lè9Œqg"Bð—¼sÇ÷ôFœ‹#l…• +ì(ÇñÌNn¸„—3fó·xh'Ÿ#p¸4†¹ÎÇwàÌkŠ™ê^غ=ð{x KBäx +U9lëgr@5’ùNy"Œq¶ßAÇ—‹EjÑŸÔò˜Ô"¢5€j9ù8S+rz›Njl1ß5š¾ôí×Kìôôü›~ÄN§ßï›…ÔÙæÖÜš¶+FJ®Óaú¦6âW‡ø„°Œbëí3]Ö…ËÕLÉùt¹¿¬™–”Ï•ËÅLI¼l¹Jçç¿Ióyð¤~z½ú ç¸9i²¶¤šü›bú–&¿óÓþI“+t&ɉ!¡gRážõaËi®±wF圫 NÛøà<Ú†”k“DйP´GjÕ:—T{#ÈeÞ¡Ê%rDÙÑùøÞ3c+ÈÒ·×yìÝå/­0i4ÿà4ó¤õ`xÙâ—+àò1b‰÷=hxàâ$æxÌq^vÿé@?Ik?˜¤•;¥ÄG¹|LÊ…”*to©Ïåã› ìüidÜ(®T ËÓ4÷ЇK¤-Ž?@±âÿ²_Éë:pÿNá äzŽ#d™T6¹Õ‡$G±L½¯Ì”íÇNÍJ-Q­v£Ñïƒ9ÿ1åßËBKË‹w‡~q¨¦ÜCGˆŠÀñœ=÷ñCéÉø(ž +½”‚é/Jl©\СYÏU{ÖÇ÷¦bÞGÎ+e…\¤°F¡4}\JG¶ÅL*ÜCŸs¡¤µ]à[ür\ <[²Sd\ÒæÛò,¤5ŸÞ¦ÓÌÔdYe#O}ûç9¶zúõ»~ÄV§—÷ÍÎJÒ"9Ï2”ë4g1öÆaRO#ÙÕ!>#x—u9SvY\®fJΧËúòÌf§u¿ùeËU:ßÿÅHšÏƒ§ø°×«¯0 šÍ‚nk@ƒÀ +¼DËp?pßþ-øŽ&ÿÍ~t ï5 [gò¬=ðñu®TSœ 2.Å3¤Ê…jFÔJÄ‹šzÊï \.˸|x³Ú‹üöÀoéVè1Z0e!Cv&€ƒôô:7œ+ÆÔ¥å¨÷É9SµÚ mÖ]8½V@Î ¹#j%GÎý ‹`çÀÐaC®QõÚÛ9‚µüˆ-X3ÏÄ,Æ"q³õ”ß>nÝ^-ÀÃ(p%n;À²9pÄE6—ÔÒQàS/B5ö~1jš’òBEq$*Äæ}ÆE¨Pب¨”¬é|LΙZìP'í¡_¡F<‡@Î…Š7Ä™8dëœhi'(ŽïåN)¥£þ9fu²ÒÜñ)ÏTç‡á€+•b}u œkà5gR×-ðø-Þð6²‘æe•3 OËϱÕÓ¯çØõ#¶:}¼¼ov.$Yxö«lrM‰eŸ“ä™Xl9øçU|“[YÍ”]Ö—«™“ói¬×Óù™‹ü|1s/[®Òùþ/JÒ|D©Ÿ^¯>£„—D×èŸ]yñ£)w¨(ºB—ø»&ôC—ôñº’HÃd=\LjFjÕ?A0BâùQú¬—lPÓîë)5 Œô8‡ Læ ¸RSÅK ¼ê¨ÍÈ­ +$t'KÒC_é…s{@ý]Ê°Îc;Î}Ô_,NbÓq‡:qr•¾D G‘êéã› ¬£nT½:ä0'ÔÜ´²•Œ\!—ÿD+žˆ5Å­1}EI-õrA€œ[2ÕZÇ9!m;t|[TÊ\ËÄr{ÎZksX•÷P¦RÚQ+Ó¤)bTT*• Ø rD±{K¦’!½E¦›0cn¢*‚ ](¥ÖûËøEZȬa©qOùø½È( Ø0Çœùdž)yÝÎDÑXƒÆ·é”RÜ6/s&7‹õçØëé×slû{>^Þ7[e§?³X½v\Ë>¦/aâ°†í!>‚ã5e]Δ]Ö—«™”ói¬×Óù™ÍNë~óË–«t¾ÿ‹“4ŸSê§×«ÏÐ6ýµVQM7Òä'îJ¹vvÞOäJ†Çx˜€¦>IHÏÈ=¶Öòˆltkä¡Ï;Iz`çýB^ç¯FS92ãYíõysä…$+žT +Õ”%>źü‰ßÜ™jQ¨ ú‰<Âb†L+ÇÒ»ÊÀÓ<å…Tå(® ‰\‰³õÃÄ—ç£|´eªÌY%“5î|x¡dÊ¡p<ÜJÍ´Ç `)LÍ°6ÿâ~,î8¦Ô7M€œâ”ÅÚý.^IEŽúÏ®‚:ºej€ÕéTZéùþÛ7ï¨p«;™ÀUŒª×~ˆpr%­:¸y.“„RJY¡B¹¶ŠÈy¡bùj¹µŸ;SôPHÎ+yËpÅwþL•ÔYªîd–ᇭN`GÄíüF…¤ZœœËQçR-BµV¨).‰·ÞȲm›P¦lvz›N¥¨yÕ¢[M«Ï±ÓÓ¯çØô#v:}¼¼o6vbñjò¬Ôχý.ÿL,¶üó*¾€É­¬¿—õÁåj&ä|ëít~æb'?_ÌŒÄË–«t¾ÿ‹‘4ŸMê§×«ÏPö:ÿ±ª¥·?Vä½Kiù_ýÈy‡ò¯ºSÍ¥áÓ +<ú´ï_,…DÔÈõ ]ZNëz4êêõÀÍÚÝ…`*KFêÔøEªÑ½vä22Å1˺dÌ-RICèœÇ¼ÁGÈÇìþÀ-4Æ´£—á…-” d̬Èæ€Í?€›fùÛüÙü1Û®ÆQ“yÏ®˜=È©©ôå9>ç°À•ZÕøíÅr{èBª;^>>çÀÓRëÛÐøœg’šú”ˆÐ?a£'y4ð[0ÞÈygB(OXÎaËÖ åœz•o€oñËpù¯œ\[­å)Tl'™ß^å÷€žÚN"°^¨²`ÎCÀé"”ÞÌ VèñÔ<ýÇö{o÷]—ØÎŽBÒPFpÁyJÔÀ%%ê!KTï¡X† +HЫp}|ΣkÈ#(¿‡Z@)‡5‹„‘ûh„`æeÌêä¹l‘ËÿOu?¡±¨ùe…Þ¦›ÿv¢»KÉΠñ¼VCL\°Q7¶Àv"ØTÉ­!ϤyÇVºQõú•ßº÷¬#@/Tj3ÈÄU(%9š-ÆttÖw×}ý;z96Æ&hŒ…Ô³B궋jʽX8/TAÕ’©¶Ò«!ë¶Fag ¡*;-t|ÆJv† ‹Ð9¸ÿ[ɽ`ÆWºRm€Àšì¸ùðñÜUcL©¸5Äþ©$)õ–8>p!g5@àF­•¾ñ[œN5ùµç-pŽØém:µ˜8ʲZˆ#Ù¼ýó;=ýzŽM?b§ÓÇËûfãFi?õ¶’Òu†³xUÊô•LÔmñ ñvÓu9Sö¼>¹\ÍŒœO—õå™ÍNë~ËÛ–Ët~à‹“4ŸQê§×«ÉÖt.¦ÔJ_L7éºP®Ò÷ºÇ®OèÒ¦?ªX/Q51^hÝ|GëÃÚØ +ÜHY¯­Þå +·<´q\è<×>!hXæÀÐc|);™ÀÒƒuñÔ×(ë9õ +¼FúaÌ6š#{&Lkt*®È+UmGÐoa/·—z‰›J?;ŽŸ]<î݉ºãbsLs1â*}½/çr‰\¶È始¸ûéÑø” ¹zOùíß#+jõ£æ?dÌÕD©å>+@¡§È]€1WI²7ÀÅç¤QÒÚç­áÅÀ¥Aªw¬€M-ṄCèõ£TµˆrßA‡/Ðp6=ʸcªv ¹B¹JŸZä‚›ÏÃÿÇ~Õ$7ÎëÀýw +á€ëÁGÈ2©l|ÿª×’Å•‘Çc{ˆW³¥ éfO£ÑÀ¢Uz÷îâv uÎ Ålm í_)…4Ú3FÐG´Ðd{¾ÒgjRI{«OKdœÝ¦sÈå²1Ëu ÝÈ"ÂX ±•^0™f>ÆeCp?'£#¾pÖËëÇqÖp|û\±Rñ³#)!¨¬H‘¤ã£Œ06Y=p‰óò9QÒ´ìœß&RNK|ŸŽ÷Œ[ôkçü2‘2þÚüN¾I ÓT±ïç÷ˆâ|&– »ªsÈïwùÃαç@YÚˆq•‹mâÞQ¥ü©‹S^“:¤ö”o Órƒ\|—s!Žµõßþ9WXX¼- mRþë”q½ÊHç*— »ÇtT$´ÆÒ½RtÜ!æqH<»1`üe[©Ä¡-Îîµâ¶ëC+ˆoëÜå£íe m}ÞŸóû˼ eÞ:½üå +UعîM»½B¯1¶q«ÿ"-TeC.ýÏd•ö~϶˜È$îhŸÐ %{Á¥WèšÃ32×ýãb!›6»dÝ­`˜BØHŒú(SL¹ ^> K>¡+þ8yL/Žåâ7§ë¸EZÖoFþ´vÄT“¶ÆèAç,ŽÞ?p!ak»hÿRqÜþ…‚rëæœEŒ,Õ=?ï“õJØa…:ºR æâAèJZE\²^(›xìE™ +×=Îû”‹ÇÚ†Åþ9÷š¸‹œ[à>ÄbjÏË#†"·ÍÈÝ<*)ãœÂW½~SÓð1.S!8Ïô5"ã¨âó'½¼pè' Ç·Ï'¦˜Çê/’òŠI6>Êxψ*Óù!_o¸C$^þ5AiÙ9¿Mœœ–ø>1î¹8p9oþµù5œ6|s¦5˜bÞ/.‚ Ç‹(þ›ýç~CGI™´ÓÀÍÈ~· lŽˆä8S,1º˘¨Kë¿ýsî¯çý?@¯džìQéL!{tTklw‘Ü·"EÈÓüŒÉñþƈXG0^°³Í^mÑ1t£bNÝ°ðÉ:üŧ1:š(;…ŽÄ(^ŒBœBÏ$õörïFZHœú"„þu£¿| +])ü˜¿.ÊTÙ!áì5¶h¤±ç×¾ò;Œ_å+×@¿¢Zq)r¥"n9N¡CéÑ¥—3%÷þþ¼˜X¥—Y«rlûƒúôœYBöØû<«Ó`ž©x‡—(“FŸÆ¨Á3ëNý¥PÔ,OË#¬Ñmvᣧ $"†eÄ.»t&Î6|ŒË¨¤`qú3¦VÆ÷Îzy=àØ#ÎŽoŸ+V,$+B¡ÆµqIÒñQÆ›‚?(õò[DRáås¢¤iÙ9¿M¬œ–ønÃiϸE¿vÎ/+ã¯Í¯á´á›•0­Áëð~q‘DEç¾²£)f>þç–gxÁÝt¹@GIŲ—5ºjgÐcm¦î_.JVCë¿Ýö¼3[ÉÙ£XæTÂÓÓÝ= #ÝEŽ­\<¸ 2µG q2W£ÀôPƒÏVÄHÔÚ²Þ¿\Þ’}Ê¥PIæ*QŸ)]·¦˜þåR‰A¼ÃÜ‚¹±ŸYQ°%U‡bqrR²½¬xgyç9¤Fty¼BžÿV#xŸÊT¥¸Ì--DrËzÿ%*´Õ@‹;ŸãΗ¸óÕÖBÖ'¿¿V" ‡º™#·Q±ÿêUæLVò^íÕÍŽrL%nˆÅAjµ¤$­\ºoCŠ¿Õ¤Ø¿X +™¸Œ,°ÄPƒKèš(i;Èy0E¡ÂÁk:×Öÿèã +4“±ÏÅj58TK®TÍgy +ºkŠ]¦©$5&¬k¤¬¶7Ëu ]Œ´î¶¢>£”·@÷öâÖá.u+Ÿw¬óH¥&Ä8·Kwô£ ã23òAœ?'¡Èã÷Îzy=àØ#ÎŽoŸ+V4Œ±C3¨Y±"IÇGo)fY=p‹H*¼|ÓlZvÎo+§%¾ÛpÚ3nѯóËÄÊøkók8møf%LkpÅ:¼¯.R"m¬”t×uÔ˜¡£¤bˆ®”¹@/Ø"­wì'à¨T€¯Öq‚nd–×%ëEé9íÕhŸBªm·N7OO£Üˆ³í%Ó>ÕR(G‹Í¥Bæµ5—ûËåw)ßWyN­V‹;ŸãΗ¸ó•¸DÂ3&Çû‹œ‰“î¹y¯ž˜BÝ›{e½dÛkÿ}²ÎpEyF‘>ºÛÐU½øÔºRÁŒçRë^)G +Ùgr)%µÝ¨ÂÛ¨Ïî×D1:$†(eCâ ±P5õ +]…Ù%tÇiQÉ,´´{sÁ\¤º1ÐyàÜÐúÅçH'ª¹,R´QÖ§øËýµî—uÌE@þŒ†ô‡)\÷†‹^Yw; +X綗öŸÝ7âl>;)'mGŒx3çWA¿FçW¯Â²ç.}B&g‡JwÜGœ—–srñ¼TÔ¡Ò9’ÔêsÄ(àü)ryt)ùa÷ŽÐK„#ŠásºdÝ(¨ã2'ÊøéésbJ¸äÇœõòzÀ±Gœ5ß>/ŽÎ ÉlÒImÍŠ žâQÆ›FŠYVÜ"ŽBX>'œ’–óÛÄÊi9Ÿ÷\œ´œ7ÿÚüN¾Y Ó\!ý¯.bÕòìÁ©¶Ê¼ù÷Ñ6¶¯kÙÓeWÍc.ƒ¸ +§ t£SÛ<ú—Ë8ɨ«Á÷¬D«¥V.Ý6ì3à9…¶Dûnh~¾ÒÝ™-r,æÑ‘©ëØÌüyK!ŒŽê‘sÈE²—ЕLC«ôry`‰FÄÍ èÝ;º2e {í¿KÎQ¢Vt/-ö Ýqèò›ÑTÍ¥Ö9Q(Á«OdtŸ½È¬ìõÿ.eÊSt]‹”=B‡¹Hª^-Ým7rÓ—©_Á(‚zŒ-ëý7$¿¹ EšCiËèpõhæ“u¿E* +è¡MéfkL?@ÿ]ä{1î²ú.†©ú?[o¹?ðû«Ü+ç˜ÔÛòôà,L™7Úÿc9ÏçÈó%ò|u +s;õ¼PΖè!æ*I ÑaVd,R+œ{5E$ÅTm/nõɹ©=#µ<")ª<ÝÏÿH.Ìœ±?_sJ¬:|ŒËTñÃ2N‰`üÿpÔËë§qÔp|û¼8™©h­sw®yíZ’t|”ñšˆL0äé!_o¸C•¼ük¢¤iÙ9¿M”œ–ønÃiÏÅËyó¯Í¯á´á›”0­Áë𾺈%ž¦F‰î{*¨µï^a¿2ø*Už#“j嶞n~{ßà #ø©o|1®”cùqØí˜q8sÜCþ$ó½ä|yµ'Ý€ßî_|}Ã.%´¾Û?á +7}Ér”g +âP+èÑ%ý8ôl+öËLwGäw·rφ(¥º¬O#›öz«O#­­8 \©êFº¹:ŸWœN›§_©`(RÙ£¼ÇÄ&Xýu}à5z9Æ·¢²×zÔ +ŒÅÔÚ¤u­Üy%‰!zä\)Dz—´ºD^¨@ì‘{õDÍ”»t–J¹FöˆÜ(hmµr3ðpß=$V<µÕJ÷¸;ÄamFbQ >n•³;¥ÀÅ«qÈ8'ŒAÙcçôªÅßï1Þã4áwòÄ4!¥î¥•.97²i¯³Üÿc¿Z’[ÇaàU|AHÈõ;‚eRÙäþUÓ’%6õFIFñSo¥-¸Õn4šúÑ‚ð’½·•ÈãŠÜ(%ñˆV^šì∌#°˜Ô~ +`+¹6§”À½wè7²œ‚E[1¨Ä*“¡?¯ #@eÏÓ©”y¸Î·Ù¨Çý3j=ü:£ì+j^_®J* ß3Sj¥Ýz­qezÓLYì怷Èä¦ëm&v^Ÿ\®fV.§Ëý噫Jk½å×–Ëtyà•4Ÿƒ+õÓÓÍ‹¸¶:o.©EJFoÀ᪥×å°öqWÙ3±#êpèp1ofÅRÉs¨rŸüj/Gå¾+ô¶^çÃ7(òhÚÚ]ÆK%iR,0E“|4>çFÕk¿tü'Ô‡Jvk‹"µlthäJÅv }¨&þEÐ÷¬åyþ{PK;ÿ§%Vzƈœ£Mk¼°•ö€k(Üœ«Œçˆ-ê³=Sæ˜c(nTŒ«óJÙ=àü„X’r¿ˆ¸C,Ât~ß Ê‰{àäbŠH,¢\”£æljìÉå·wQm÷€þË\L¹x&ÉÖ;úøS´Â[jÄñ_©I‰™ÏUK@#pµTÿ·\á–ÜòßàŽ*q…©ˆ÷sxà˜@‚«YËÈ,ÇŒ‰F™74t;hï‰Ã+Þ"Mú)!k•"{M:tnÅOV™²Û5ôJúót*L†Ÿžo³¢®ãþµ~QöµN¯/W¥1”ŽeV¨bZÜ°b\§C™Þ4Ó´‹]ð™Üt½ÍÄÎë“ËÕÌÊåt¹¿¹\Íœ\N—ûË3W×z˯-—éòÀ;'i>Sꧧ›÷°”u%—P+Ø +½RqïSõñ|˜.ß #(•VöFö¨¬«çPÉz…Þ(§ÖO¾aGö‡&ÍÙ„P‹*©µPÙt%óÏJÈ:z4î…~…\®Ë r¹BþàüUà¼ß¡)å^é€é—o«ün¸»yÜäâB­IŸ\@ë’¸7ôJ»Ç :9¢Ö=±üiуu>­†º3BGÔ¹+Ù>µülÆ•Àå¸|2ã62i1'QÔ¸¥L¥Ô>¶/–Ã9W!M÷ùñÈ{ÅF‡ï, <Õfw¶–ÏP¾\RŽ¹„V*îýð sº²÷¬G€nij?‚^OѨ‰+,pÏÿig—1·8 s@Æ…Z“½]nÈ…[hBv¹ƒ³ü„\TËžŸÿaý`[tÊÍ#’Ž!ÚJí¡t“(¢/"æzmýN!¶4*"ñ(‡³°{oŠâ¹3yn!÷9Œ¢jm/ 1׬ìõ蘆^©6Û›¢cBw*¹ì-tƒAÏêr²ªÄ&×ЉäÓót*NS†Ÿo³#3îŸQëá×e_QëôúørUºWT¶2±skºÆ>Êô¢™²ØÍ/‘ÉM×Û äõÉåj&årŠûõtyfzÄßž\.fR¦_[.ÓåwRÒ|ªÔOO7ïQ¦_˜öÊýðØ ÞÏéncéÿÚÞøª¥V½d²N÷1'’’¢J=¬^æ/‡ÊÕXo’ößб†y½‡Ô[ +VÒ 9§^êßF~7àRu‹Ž^RDàÈÔèQ¿ÃþøÕöÜ÷Äb“è +·\á–ÜòŸ0[iMúÝñxÆwD!I-æô¯äÎ{»ãб˜´#Ó¿r¹‡ÖvOµö~þ‡óuô$ÚÐÃ.tfT½Þcþ/tCà0hæŠ:‹À¹»ìASé•ZÝ`}x¹À\6—¢á ]•ÄrŽÇ8ÖÐÊ}à7V‹Zë^R³;£¦p.Ö¡áqCã¹Ißœ´‚ ¸éä2‹ƒuÝc}ÌÑï¤) )b|6n=ðá;T… •{ÈüxkáVïX~"ßF]‡ —Ô"êœgÝØã†îŒ4õÀ#ŒP¥RÚô!禿”]Ö‡„7ä +k½ç?±ËmÅ–)OŽXnµP*õZæyz®ž§sÍ”¤,÷¿ìŽûg{øuFÝW;½>¾\ÕÆ\Nµ‚t¿¦Û¿Ó¸N‡2½h¦,¾ìí +o‘ÉM×O™&†ßž\®fR.§¸?טž¹*¸Ö[~m¹L—ÞiIó9ÞYýôtó"Zdî'Ï*h¼!o”¬ö{À°²¼àžæFƒì¢á†Rç{(å#nùˆ[®qËçpãX7öÅoûîOÛnp}[%/%žN”Q8õ|Eß%“¹ôŒ®pD"½¿£ü{…ÏQ®õ¸ŽÏï®[qà¶T9 ãÐJJSR‹×›’}Ï GdËmJógtÆÃÎM!ÞÚ ÆŸ›ª˜›»ÈGÔ8´’¦/Åã<.rg²Ì!1h>ŒºqÆ͇@ÓJotçðÉ6èÔGÊÊyc“_ã`¼¨Ýƒñ@^K‹ØHZ¹äˆjq£Z­Üùì¼åå£;bèTêÆÜqä,K•v'4®2“Cå’="rG–Ö;âè*GbQÞØ‚FÇîôÌó +4ÞTâM ¸®‚ dmƒñ³3n¶-TÒÆ>B-Þ<$òȉ%M_ +¤óJ­Õv²ZÞ¢WÐs¦Êõô<«Óôñ|_ +i-¸F±‡_gÔ}E±ÓëãËÇÚœ(‹habïh1žß±L¯šñM_öv…×Èä¦ë§S^Ÿ\®fZ.§¸?טžùPÉ.3-Ó¯-—éòÀ;-i>Yꧧ›¯¾ì¦{Ê,7‡£þßòÿw…î™LÒ'ƒÆ§ %h”o4Õÿ‚õ©v½é_å|_-.úÉp7ph¥ºdCO§;à[3oõûšy¿Í_•8ï·”{àÇwçñÐZåÞXÆKE{ö"`ˆJUxúWtþ•l÷ïÆÂ].O-0ó”S‰È¹JX¡²ÒZ<µL{£ç€¦™WÙXx‡‘WÍ}Ü +€—=c²=Á9sîÍ<€'¢A›û^à:Z”³õ‚ù6òß?<)b“–z¹ bIºaŠÄx±;üa‹&ÕуFEU‚Ø="tìDÊÐÐa.ž4¤\¯s³_5ÉmóJpŸSèÆ`þ€µà#xi—7¾Õ×%E”ÐqQ æUVil¶zzz] +ïÑ6 ŠTMú±(€`H‰‚ +&¬ÖsÒækÆ‚ œàë¹jßK›¼ø9/‘ó×’:iÔJ—Æ}Ú ‡ÒÛÞjÙ §‡Í]˜ŒŠèZî2¸`ÀÈ}^,^Àyë9^,È\Ee¸¸¹'z r!±^ç ä¼@Î7ÈùïxK,3§–Zaà®ÞNx›·Ãû´FkTæç\RcÁóöôü‚s?qØáóõcÁ r³…™&jiY©ÓE§¥D˜ÈŽ?ßá+(¹Éå¯p/—óÝ‘”Ór~>ï¹:ÉO7GV¦·Í·ù´á'-ù¸W⇷›áŒ(: 1¹ÔPCÌ:~?aáˆÐ§¥Qí†mWr!Îkþ;T&=CwK¹Q lwѹ¤j¾6Œ©ó–ªøÚô5¤\D“Ô²G,Ýœu4ì\(P¢¾^ŠõŽþXà| œ—Àù‹À‘ \û}°X6±EŒ_vÇ#èÿlÔ'ÓÆ(ëÒ1ÇäÖBB·šŒêZ'zCØõÞ¿-õ_ß<½ø4qñš\†,RÇç9¤¿^LÖ²GCúSÒ×WÏ5"ç2)]÷æ|‹à5ý­Í£C–¨Oc]DC' Føº€”Ãs©!¡Žé`8¯Õè¾yÂàäB{Œ¤[·QI$^Br.ɬ¬%€!¡ taé;iÖEʽ^†¯Q”b6RJZ=f7¢–=Âîæ¡€YûFAéEyà°t¦ÒûâðœÃîBºKNYË1}{g©!mÑ<•ê!SWàùŽî"kqL螬õ¤ø^M4`êÊ©J“ƒUOMóR-DɼÞ§µXrÒù9kÊè¸ï?^pØÓó ÎýÄa‡Ï×ZZµ‚ŸS’6¾õÜiÃezéÿ(\^ð”Üäò¸¤âå²s¾;ÒrZâùqó´gqÒå¼ùmóm>møIK>®A–øámñ!xg>êRª‡ú}ÏÐí£Ò¼YUý?@§¹¼Â8Ù8œLÕŸæâ±D]HBŤ‹\4U¿3=€Že¹3€Žù±´Õ‘`Hc„¿°JÈ2ÅHPŠqDÖ=—;æ8¼«;èG+œëÍe‰\¿Ä9ý)ôU¹pÊVûÌX¾ ½üúŸ +}],Æ%&çqKT‰ÑûàõX¹ð5r^"ç/Ê…aŠ éèŒ9Wû°@Î ä|ƒœÿŠ-"1:µÙ%ì€oáâ-¢-‚s°ÖÃs·B}+¸7ü“í‘з.<ÕVú:<çK-¹\ÃER\‰†tˆÅÅlþqG «©æ;=tû¬¸=ë¡»¨ëÐ5¼¿¸&j}÷P£ ¼YÌQ5j™×FÑ!¡c,çÞ^&ð0ŠP]CB‡©C/}ò +З)#žû~´=ëJúº\*ßQúðÀ1a0ñZP³D)™xTè,¥×yè¸jHè`]%l;2Ž•)¹ÃÅ]à鲌^D‰J9¼Okb©6?gNlŠç/8ìéùç~â°ÃçëÇ -¨AŒ:ñskV|ºèô©xÛ|ñó>à0lžÿ +–½\vÎwGZNK<¯‡Óž«“üts¤ezÛ|›O~Ò’k%~x[|²Ÿjí{ö·•ù‹_w³Aì a£Tkq߸;*ª®M[TÔöœ£g·*à]É¥Öj»†pvïÀÃW(¬‹ßãæn¾ÁÍ·ŸLþñRÙº$Ôg¨n}å-Þd-# ‰ZLäˆ1E× }LWdT©Çd““­M2cB'l){¤®Í60¸Ô7ú¿hí+txàhEµÅtÅÀÐa-š¹—Ë·‘ÿøö¡‹S&îG‹Çꜯ‘ó9±@%©òZR,æ©U¡xbAJ»Ó@p.–²•Þ[†÷óØS·;œ€x*"'}âÞ\¼$Ê^âGT,ê}…+‹ßSÎ à|œÿN#ª©ÖÖ§–¦X­YËÐÑCÝ´g}ø +u ¡Â}à +`ç¨PÕÚ÷Ðá9ð¬¶Ç`ñ›ißB#dE-Ô·Ð:G÷Ïy—&º1ç˜C«jÏùƒu¾‰·HºgçÔ䬫“ÅM“…¶Õè2&ëžÈ|èòo¸¸Jº¥Z‹ç‹È¹ÒJ|à-8ÈkMù&,RÁ!~xŸÖ‚ÙƒçÇŒ zÿñ‚“žž_pè'N:|¾~ÜpRucÆÉè¶ÇY©ÓE§Ï¤DlóÅÏwøBî–Ë_ÅËeç|w¤ä´œŸÏ{®NòÓÍ‘’émóm>møII>®A”øámñ’r¥†j¢TàÁ‘~Û ôIŸ}´Ö.¸óýL:>pˆ_m-“Ž©O.¼‡÷n}*ÞcúºFÎ×Èy‰œß6ÎÀ1{e‘>c ¯sÌ»õ¸9N8ºˆ¥¤¦u-× I/Ð5©æ5Ö‡„ŽdWzG`Œ”Ô8¤§crti=ëÃæé+!©=çš‘&VâˆE6vAç"-ÔøuÅy¶J!åÂè¤wä€u¦JÛ;1n`ŒhFd’sk©Y ™^Üî·£ƨÒ,¢\0‰poŒãsxÔ´ˆ*.!ÏJk–8dy¢‰qHg +tPñܾ@¼8í1Îm ^^„ûÁ"‚T¢†­°m(ð*ššèÚºôÍ•7/EwPúöí_ïÛ+}ûªÓ?yD‰mMzƒÞQ£jÖ }ø6v–ãd²>é¼ïÿÃs; I9g©ý07¾± 1ÔÊÉŠÕƒÕš2f¢tâÄÚïÓZ9 ×ù¹ä”½âù {z~Á¹Ÿ8ìðùúqÊ+:%Îõ6Y©ÓE§O¥Dì7|á½<.ÚÊeç|w¤å´ÄóãæiÏâ¤ËyóÛæÛ|Úð“–|\ƒ,ÍÛâC Ç솟—R)¶G¶Û¬¤® ãÇÞCš›ùØ:š^.RÆ·&f[3à¡Üà +ºséR¡ÃÑZOúðjqI\«ì=|mAù”Jƒz lQ ï1òno.Ê‘f¯3pŒ»U¸w œ¯ó8‘q Ûü#Û9Gn½-þk¢Œ§LÞk}xwŸS¹“¹¾­–½QÔ¸>‘s–=bËöÐsÊ’ë?¹ìÈ9‚‹³CHè"MQS+»¨åƒ…•;:>çžjö +¹D5ø"†¢Þ\†— t^©QHÎ9Q怜ÃÎU¬.Ûwÿí9/I‰tçàÂ×Èy‰œ¿\¬&Ó¾…F¹&ö;#ÑðYvî\Ê +çüKœ¥B¿ óLÞ[Ëðœ‡õDˆ%lõ’÷pÄíU¸÷K*µFŒç¡3®1÷J’î[Ñð~ŽØâª}TÜžóG(=jûO÷Bîðæ‚ +-Ü›bÆ¡óª¨@%.€W›Nn àTk;¼OkiS®™Ÿ³§éc߼ధçœû‰ÃŸ¯7¤Xm RJ¢Æ·ýÙJ.:}(¡™øÍ_Hbzy\RñrÙ9ßI9-ñü¸yÚ3m±óÎùæÈÊô¶ù6Ÿ6ü¤%×àJüðvó!Yf]æÚ0Ô ¸!fì1lØñfäb°°,Û…‡Ž¹‘-X¸;!ç$B½_¢PKm²F­¥FÚ÷ëa›Þ…óiˆÉk©t° q‘‹µµˆ4f…þÇ~Õ$ÇÍëÀý;…N€Ä/×9‚e\ÙøþUšËÒPóäÏ%OˆW_6’‹jö4 +¬µ'}xµäŽ æÉÞEæR0câbÀj=ðœ‡\šÕ£î?ª+rI‰<1éá‹Åž’sϯRdïÓb‚ÐRßE‡ïF¼à¡ÒÇtF‚Ê;A7A‘FÔ•JÏPúÉr w-ý\”s…˜.rz:WL9™IÆȘY.ñÇ%å€B§f4¾-¦ef­€^Ê%­¹„Z¨Jo.ä´ANwÈéïP.A9bFÎCætr‡D® 4 =e&mD™eW+ÇÜèýÍv¢ 4ò¹¶žò¡ÕÂæ4©;Tçm +FÓë|+ñéøI.Ëä€m^‰½~ü|‰mßb¯éíןÍÖÁÆwU+x­w¤hµù"óAôz±÷§8‚©,ÿ[¡Z]Þ¼>]H¹ÝÆúe«ùÕNv{¸2íúXn/|R.÷AÛôûî.­^~\3º?Èwüº§¹Ø]@{Ö ÞC åÎQ†Æ¡Llᙎ’ݘÐÃjJíu>lÌX€‡9iK•¦WÐÉø¨é )—°E¬5QDZµ"·§d»Óåœï–hè1ò6,Gž>j‘ò^¦_黺ˡ+ä"u'/~/ç´FN[äôiwÁ† CW¨¼‰¥š¿Vy±(÷œùÓTÎ R"m€Ópú+ÀƒqeO¨ò(ÏÀ}4‡Ž¸È9a>à¥Q<çaŠªÒ›âøœ'ný\±ç†÷#0ÛiC9:(‰¦„nFÜËeø͸ÄZ}üM;Vxk9 ”ç?~¶XNàÜ*´¶S ã«\¡¶¦ÅÎR=©)8ãQÌ2r%†í_É8£`C25Ûé£ TpGëã»z´£Rú ‹_þ)¹|†ó#¹h*z¤ôQ¡K)–´H[$Þ”Ð%¶ÛÉŒ9ü…‘Ž ©õÈîµÏç[㉂áÂ8©Gn,¾-S$ ž^ç[‰[ñë2(Øbý%öúñó%¶}‹½¦·_6[ŸTÂ莭>_d>'’Ý]â ¦²,W¨V—7¯ONn·×õë;ó+úþæõáÂÉüµëc¹½ðÁI¹ÜSlÓï»c˜óµ{°<ì´©¨årûmeµÜŠodé¿­¯+J¦MmndIŸª¨ò°14z8ÍÐFŽ|§JÙ¨ò9þSäTùÎyüžÞZÁ‰œoó9o‘ÕÓ;ò¨yÜ°Gæ<ê„s:WyØ­n ÔJ/–úe±ÔÈÿ)ð ¸2>¤ÈÜJ/ò/KåIVnÑ­†é‘5S#KFäa+&;œ^1xE}F‡Åo9K3¦–|&«y­O0ñÓçxKÈxWy2nZã¦-nú\»W =#Ftð¬ù*J“w`î„¡§'åtäqŧWæ)­ž¼æÃÕ £0Í[ŸQX!‚»ö#ÛèJ OÑÃIsDÂxÕÖ›áè&nñ·Œ},wÎé!:OáÜ ê2g& à&hé·0Â"}]ŽŽ;®h-¡R"\¹ø>Ýᦿá(»iÉ'ð +×ÃVÿOpJ(Ÿaü([ˆžQâì1?x?i&àAšõÈÏWùéI¼Bµ€5>çÑ:YN›Y3V8yè<ßÆPõ(J\=ŸRBám§åOxLmŽµYC›!ÕÖ&uëâ!V¯Óë|/%þίë§eõ—ØëÇÏ—Øö-öšÞ~ýÙlíá¯1T©VÐvŸ'´^N(¥Å‡£¾¶—8‚©,ËsŸ©Ë›×§ )·ÛX¿¼<¿³ÙiÙïúµëc¹½ðAJ¹ÜUlÓï»sXi~iEËA„þ'²|ðÛž¡à1´8Ér¨‚ZA/(}0žóHt»¹hàD÷ —H£Œšªu¬Ü…xg¸w,¬GB¢Ã`TÖ½rªawå0¡:Oº[qÞ°õE:¾§çu—ÄÐC.J,ùtÓ€J?} /óèÿTjOx‚NZÊ4ñ®8wã„b‰ÞÏ5ðYåÍŸÐÏoŸV[δ•ušKÎ3ë<-ç¼3T|/å´N[àôé.T‹ö](åYe)‘ÕŽÒÖ¨vÎN VkÆ´•ÙózK”¨h¥„rq ¡øðš×YZ“Ч ‚–°8MÁ±<»8OH‰† rØ„FM,ÿžý|¹  ÉQNµ¢c/˜ñMQ ©hR¥'õsgêu><ð`\ÜsŠE¡èN+ÊÀy¾¡¢F÷œÔ£‹6ÜêkHˆ§×ù^ +P”Áe ,¸xýÏKlöãçKìû›Mo¿þlön@­ò–\é^ŠZm¾Hiñ%@²»KÁT–å +ÕêòæõéBËí6Ö}º½³ÙiÙïúµëc¹½ðAK¹ÜYlÓﻃ(…ïªUÐÞ7TI-ÈãèÁQš–÷Ž;FF-˜È +àQ#ÜRYÁ +zqµ”2y·ZªTº@WÒ–Oé67½Òß[¸é3¦¯ïйðSÂÝùr¡hÂÖC^.Ñü9ÙôµR:YÉÙŒ¼Ô”ŽЭØëC +&â"yÍX¤óèÈϺÿr¾ +MrêÈb›~ßDyR)PÔó¤¸ ö~öU– pvày¿ÿ |‹Ÿî€Óß®ÐÔ{àãö5çèí¨oœý|Öcj¬;r¾@ƒóÒ$¥\¬‚»÷ãnoɪsS Í3y­µB5Q®ûî@$ö„,ý2WñžóqÇ€uli~45iŠÜ@š˜âˆ¹%&/jØO –hþóÞßï-çë¼cëÝex[Ì›·,†¿§øùwÈ<+ôðóJŠùrKbk!VMY¡I­EÁs¦Gî'¢á9•“´ÞX†.ˆÛQÜS, +M½/ÐУ :el¡1Í•&)YÏ\* íŒs  Ï‚)xÄú˜‚I =qppÞÑúð½4€‹JŸ^2©AÑzÔÆ”‹J?_|™ó¸ÏéHÛ‘ùø?ݧ¿Ü¨aÖ^dRs&žQçVK‡·ó˜é¼ZË艦@Ú»ùðZ Ê‹éåCÖgȜɓ5,F“:A5à t¬à±Áë|/G¼¬Óœq0Ö_þË~$7®ëÀý;…O€ ëÁGÈ2©l|ÿª×’lÅ6ýK3¯4úDÕdc‰1©V»Ñhà°·÷3νà°Óåãûál&É`¥8OüÄŠÉüŠ%5ðLne]”uçr7³r½Äú¼yÚ3m±ÛÎåffezÚr›®~XIó5¸Ê~ú|z\AͤLsï]lØ’º‡.«[¨æºr}O è( Õ:V¡cИœOÈk?òî4vsà;¹´¦½^4 ¬jÁ, ­ç<€\N[¨@φ‹Ôga#õιlQ¾GFÚ_èF)ÙÐÿ„¹d-¦•óF%¿à|x™{ÁäØ¥ÞÖ:.†…ndV¶Úè˜Æ˜©U9¢ínŒ€.j}™> 4uÕZs9æ(§Ò¶ 鉑+´‘š}ÿ­$ù…`d®Â”²nÝ!ãJIl+u ÝÑKÈ2tnúw¾82`¤K‰û">„ /hFUåˆô²2UO¡ 'Õ“ÕB¢é9+ ·Ó×t]„ªçe]¤ñõÏg½½Ÿqìg.ßG ±¡3[Aí7y.!à +>Jjx±Úòá·;¼“[Yÿ+$.ëÎånfåz‰õù¨iÏÝI~½™Y™ž¶Ü¦ë†VÒ| ®²Ÿ>Ÿ^$3¾:)3eïMlàŸ÷}j¼™ð†ÊÕ+ë•Ì½7²a[Ç\¼åÜÉŒCBGÃõPÑôN險†dEÊܳ>|‘b’Á Ös>@é¿«–m±äô"+FйSÓ&Ýs‘O‡‡+Q輤Ö{K€…»“€A­¨”ASQò¾@÷÷–ý¡Ãa.ñüãœÎPâ(8/µl CB‡Ÿ[;B-ûw"]^„Å?+t½G®Èõ….ÔÜz;¾BáŠfÜ‹%€ÌQ¡,ÚÇ–a1l÷‡¡—vƘ-¦Î©ä-èc²®8;õóÜð¶è™ØoD{øyب˜§ïön>~ëªqøŠ%Ø„Y´æ¨SEÒ^+ãS^IØbúa{e+Ã2ÎÀ[ëɪ‘û£³’•¾¦ë¢”ñèy='JÅ°~ÆYoïg{ÁY§ËÇ÷ÃÑJ©áùfø¾wÂd~Ã’žD¬¶|øíoÁäÐÀí¿Bâºî\îfV®—Ëú²çáÀõ¼åiËmºnøa%Í×à*ûéóéET«Ï¡N$ÒÔuܪnXï£8õ ·ªÊðŒÃJI lÞˆËéw±z¶CšÆnƒË\RãPc-ÑL^ZHè`ÝUÐúî‚qômÆE@èˆÓÓÙaÒ]/*M¶„>$倎”w„Zög½P-­a"ØK#©}v €ÜžÎ[zú4€qÙ°—!£®sÚúöΫt^ èRr‹×g—¸¾ˆèbª1#£F-dzJ/ºQ„ôÑ JÒ»äÍä2¤Ì¡ËœCB˺g*^z_^é_ŠY¢q“ †Qëu.ÿÙÐå@ÿ]ä[ÀR–¨]Øá"®£c­ùEÒ_éBM,dDÜE •ª#:äÂMûˆ>>ðBI_Øâð +•»¨òܨ@æñ8GVôÜú¬8=tLŒ*ó"aYGT ëŠQ9¯)hTD8¯^ðóýu.¤*5¢\ÐD£BÛGá.’¹/ÑGÎGé¿Äù¯@ÿ¹4k%¤\ZTc”°rÉ=]ÃF€’"³ž {bj=hØEmG¨eÜ1 (šÈ•*§Œé¢ey„ÎpJñÓ×taµ$[Öµ‘zÃú‡½½Ÿqî‡.ßO´´l ÛÂ÷k{. “ùËôªL¬¾|Øí¯Áä–×ÿ¢[º¬;—»™–ëå²¾ì¹;É®73-ÓÓ–ÛtÝðCKš¯AVöÓçËâ>'ÿM¬½ üûÞ #kx|ØŠZagrÉOVRo¾§Œ•óFœsïbÃö¸RãX#ï*—FM&“ŠÆy`zS”ëî€KzìpîFl¾}̪ä*¯¡õ—`©4xj ë,¸ ä!g®FÆUá…œ­PœûsÞà+ÓW·!'ÕÖ'Åᕹh•€7®)†*U :ÈEmýn¥ì ‘ÛP&Ó|Dóß:X—”"Ê%l‚ñÆ[™eHS„ÎKÎ=ôœöµ^æÔ‚ +Õ–V¨ qj}PŒ Ãq5æ@Õ\¼éå²?ðý ½R–³\w) ¹Øô!•Žn”]Ž0ÆýcT¤O‹ãרSòtDî Zñü‚ñ +茿x£…Jµщö¯O¡Ä­º gW‰#—L®&'«ÞO¢¬ˆ|úš®‹PN²¬k#×Ï8ìíýŒs/8ìtùø~"¥:·“ã!陟>Êô¦L¬¾|Øí¯}˜nÿP+ëÎån¦åz‰õù¨iÏÃëyËÓ–ÛtÝðCKš¯AòÛçË<Àðã*ή[ØP6vE^¥rȶ›0—¤½ [PWÜÙ©J¤^ýÃ7gë làD9S®5`q"Y;"Hÿ?,MK@­€òäòÅRRëíp|Â!•VR/òч©hz¢„¦”Ó–ªäÃ#—}›~®¤å…«ŒŽÛfXûÚ_ã`¼¶J¹ÒòwVJ¡lµoøÃã$¬oŒ¨LRs<ÀÁÝekˆ±.ÃöžFš“dȽ¾˜ÛFgÜ3iË[½gÄ|…®)æGh|÷®)ÔL¶T¾ç{Ïè÷©å¾sŽ_ŸpÄÒt ù:oTÝ="çL ¼¯Ðÿ ü •ÃYœóõ¹û̉¤%)`²5|Uâ%ĸµY…ŠZÏøøç…[¼X¼¹õ…zàüæ‰Þ8P˵WÒRö¾9çS¹×º )t]Þ:^²‡4†`\8$ë†Ðë@Wè9Þ!½‘‡ÇJÔ<õ‰kx¥X!M7Jh€ÓV+…ZÕþp¯•¨„·¸—x„ÃÆSN}ý p8ÃFsˆ¥ªtòâd }±|…γ{Ïy£¦~ïˆ~FçA„õꧤîòÝS|1ô˜þb•JÊ} ƒó°Jwª)[¼:Z™J«S®±Ö>-ÆpôƹOè ›ÚÐÞ‡×yØæ"°)Fî‹*Uó:“ùnèÕ]rk!Y‡ÖE{©o/Vˆ‹†Œè \…û2:|-ðìÞÑœ#窵¾Œ˹Ru³ƒz¦\®8Ï™œíð:‹¡ÌÚò\ÐB9±ÖÓó˾a­ÃÛŸWœKÅç4Dh¹v-ÅʸÔiŸøoÑ« 6‘É´¬™Øx¹ÜÍœœ†x>/5Í™¦ØûÌåf&eú·å6&|°’æ1¨*vx¹ÚHƒõÎöÛ8õMÌкl=¦7 +ÔÀEû`Pºø½†àrr…\.ï¼ +i¯óœãˆÂC꼤PÌ‚»4ªÓ÷ ¼f*z£u PB§æ±ä˜I—ÉüFŠ­b®z¢„SúûJôä{Ùydw+}o#*ª¶˜½…’ ïÑÑ}ôwàž©•ÜÛâðÞ‚xnƒ¢ šP‹Y†B›¢dß»É9r¹D.÷!}bÉ9õŒÐ9RK•ˆÐ!æÒ]¬R͹¹1Ü¥¤¾þŒBèRbÝ7,vxûñóbm¼6ÍQ\®²M—:mŸ\l¹èû¶‘É´¬¿2±ñ:s¹›i9 —çËœ‹×õ–[nÓiÂ-iƒ¬b‡—«x“2›ÁV‰´]|ßöñ}Û¶ß÷:iÓÖpè¨U6éwÿr©¶ôÍ\øL/¬m‹¦—€Üÿƒt÷¹ü—twf/ÅÃ*=¬½dDS¹}HÁ€õ˜‡J—äQiÔ P”¼O§üǤó/øýÚ$÷­ÌðÀ'™7í }xà¨þš½ýÞX.¥.W¸å¯ ¤Â¯Ójº‡­|ç’Û&]ïî]‘Æ•KÜÊÓKäÈ’Šj@Î+Õ˜ýŒ%fd±¤Vûnhxà&¤ÍâáF(÷Tz¥ ïäPJvîG8…ª¥>± Ï9lÅjí|xàK)uÞss± z¶|ÃY†ç*Ï"½•8 h)JŠ)󘱄§ª{˜ùWtVª¬üX­•="Ëö´Æ­ýu¯€û®¨ê½`"°®$¹õõ?ôÀÖ‡©ÂI7'…9Æ3uT£ ­…QNµËðÀ2^Q]ð²]—Ì”µ^§qÁ¨my.JÇáõŸ#{z>bÝ7,vxûñób퉋Šƒß(sW)”}ºÔi£½-}¿Ã.2¬îýW&6^g.w3+§!žÏkLs.\×[þm¹M§ ¬¤y ®‚^®öá¹ñÒ|)ê΀[âvÇ{?c`yï#Ðå½ïÐQ5$§¾‰8!Awn}/0¼\j²^çÃÖ»3Ƶ†Š¤gÈ™%T³ª¥×i:À ‚)^ö€¾ñE˜®Þš‹UJ²G!Úw¡Â”hÀ‘ZJ‘€[øšsßvE`üfÛ àBånÚ‡–œÇTyEè¥ï†Tý©‘s¿Ãù%õr…\þçhãšöÎA,Ù¬¯žœÐS’ÞY†çý§z +Ù …åÀÝRD7O¤µ'<‚VRÐU(¥¶wG!çÀå¸<Yp:[ê{Ïb‰špaçÉz7^æ‘K?^b‰YACÏ$5K@¥ceH= ð°q+° µ–[<±XÅŒÚGÜ΂Äe‰{ÎÈ%ìçM¹‹Ã7#v ©óÊ$©ôÅÿùåä +¹ü-?ÛËÅT9wn½Ê.0CO'-|™3þÏåð: ê+òïü\˜ZÅã#Özz>bÙ7¬uxûñó|é‚0‘’ƒ%T¹ëŽEÙ§K6Š–^<_ôý»ÈdZÖ_™Øx¹Üͬœ†x>¯1͹Xp]où·å6&|°’æ1¸*vx¹Úˆ•Òf@ÎèU¹½…mõy? c· ,EÑå +ܧƋ{ïÕÂ>GÛå7,lÜp´B7¥:͉SªÏhM¹ÏuXŸJ‡îa.Û“ž(›]üWœÑÍ¡»P.­÷Ŭ£b7É{;£œ#—Käò 3â]©{ØËæÕΘû( Œ"PW»ÓÁŒˆÛ*:ë;˜ç³Pb ¹\Œµ?ŸãO”RíKèðYÑ„¼æ{Ž¸Ejù +±pN}àžó*è|{ÊÇÇ.–s@[A rahåà\JëËg„®"S­åôQÃV‘² u¼ìé^[1¤`[”5¢¡3¡öÕ?€Ò½ºÝƒ>¤\à/ž9`XDga¥öåh|vôJ’ë=[ÒÑZÍ-(ô"u:úƘ¿Ïè¾”b–= o.tF³þˆŽ¯¼£w)¶ü·ÓÑ…¬qt#œÑL™KL_,ê5¨ÒC7L¼Œ¸Œ®EÚ$ÇÓ +gÍýù8·äu!Ÿ'ŸÏȽ(M¯Ó¸8Õœ—ç¢$.x~ÄbOÏG¬û†Åo?~^¬ ¯bU|ÍFÕ›^‘¢X—:í•Dôê‚mÀ1´¬™Øx¹ÜÍ´œ†xî‡ÓœiŠ½Ï\nfZ¦[nÓiÂ-iƒb‡—«¨%›ei’îåŒÍÝ÷¿äŒÿtè(Ë9csèV§—¡ÊõÊ:“¦È‚Ï”ÞRîÜ œ)=×½µœ—Kàòûr}F¹–ÒG»ÒtÏÚûâ°é x­mοkÑtŸò‡4t3⬡Zdz2ªÖú,Â!ME¯“o Î Ré/LEn@_.L•KTγsD#@Ï”lµ|E{‘<õ1éq#£)U‰‰Ü©q ƒÚZÄS9©gB=êY§”ÍrPÁdá>5ŽŸ_ðN¶{þ2¤\ tÕv¯±ÒÕÁºgwãrnRÓ︻oÜ ¼ÀyÉÒõ¤êqëh&«uà_á.7[Œ?VËŽG4jÔôêÒ×Ñ ä—+äòW8·B©Ö˜U4‘$Ž©óÒ¼/E18o)÷-]èL®½¡G@X/Ë(gèDƒtU2ö•íð:‹RѶ<—Bd¯ÿ±ØÓóë¾a±Ã¿ìWMvã<ÜÏ)|„ø!@®s!Ëäeãû¿7d+–èo”tËjâ›^‰bLªX) +—·ÏÅÞœIœƒªem]J6<òpTôÜdÓCoo~ §Ó[žÛ_ Èh^9½´\‡Óü´f±á¼ßôµé5]|ђƱ“%vz_$WÍ㥢¤­4»õà¸ÿ'k5ºÍ¥w„#Q¨6æÝ*xºk£FèC2µÜ–½þåWæuØî—¼ŸÿVÉûŽ³|C+˜œ§˜2/ZŽ– ß#ç%rþ¶\d(ÌÒç5o6½}*=n-|Cu½ÿg =ô-5Ô–õþ3BPÊÍ eiíå—Ýå€ïß%ïc}ML_ [ŒBCgÓ#‚×îZ7…ĺå/½B/EZKïß_DCúKà˜u‚’DÆJ'Ë-çR–J[ŠŠGtÖV,Ýsî…(‹êÁ*ç{ä¼DÎÿv•örß›óVsÑk [ü +–€Þâ~N•Z?ï¿‚†nç[ =€»X­‘íèZPâ]QÏ-‰uËϻ̊&Îyj9 —â=¦€ŽnX¤íBp>TѤ­»t\þQH\,þãT–W=µû‰?†±ø=HešgöÕçϾÙËëÙ÷½øf§ËÛçbo²BNJLyþ•Æ#æá¤þ!¶é¡·7?‚©Ìujæ•ÓÛHËuèóãÚ»ôú2Ò2|mzM×_´¤qìd‰ÞWÉD<æÒR7#uW¼A÷;•Ki[ÇÐõœK¨Ff†ž ”NÖ­Üqž2‡²àYéٙܖ½Ð].UkHÖ]0b²•“º¼¤V Y T}_0µ¾¸À½Ô ¯póŸ1¯Ã²Y‹v×Êÿ»Ì3””bÖ¢juc¸"ƒ*µí@èƆ¡K«i‹õ./i(‚í%Ý¿=#¼êááe§˜Žd1##ùÞm)}nxá{à¼Îß /I¥5õþSW`™{`¬¹ Œdž"7uAsAÖÒ&€îòûæë?£neÝ^¡G Œƒ1bjq|y^!ç?sE¸¦¶0ÇÌèn/Òú3,˜ŽH]»ëÅ4®Ô£ÒÈö‚sÙʺ}úKØjDP(j«o/Šüm/uÅju+£÷©óÀõß|o=ù=p¾ÎKà|¾[ +â–µô©–Àå?A–ÒÊåɆþ{ГrÁd`KËΨ‚yaý†\Üïqš¦ +¨>}ö­^^ϾëÅ·:]Þ>;Ë€¡:)*7ÿO¥2<òpPd]=ü¦2O»‡Í+§·‘”ëpšŸÖ Kì¶rzI¾6½¦ë‚/RÒ8vªÄN遲ˆøÙ5  Y šw>˜Á!öûSQnàòQþwÑ«ƒd‡gŒß ¤3åÌõpëݺ˼XLè•d zW1c–zöʧ­ÖÈ{êwï䢆GgÒ=윇ܺb SÎ-çÝúÐîºÌ#^Ђ +•ˆÐ¥Wn•ÞÿõT¬¥M\8{ER•-[ì“sôòÿ Eptô=è-ö¿¢Ï`½ðƒ¼Ø½ÒKòŒžB:ºU@õÍBwcLé1ÆPzJ³…¶Æ  GŽ<ÅÔ9åÅèÉ:ßéŠFeÝ d«õê-acWè:jY¶.i¯JÇ°¤çr¼3îtKszpKY.ÿ|÷#³§.Ëñ€·F…±múgþsö½^^ϾíÅ÷:]Þ>[+¤ìß׬«ä+Jexäá¤Ⱥzø)Lež&¿Š4¯œÞFV®Ãi~Z3,±ÛÊéedeøÚôš® ¾XIãع;½¯BµêïŠù 2oн‘‘Ô"ÿeàÏ6à™r`IãN,¢e­úŽ{¸÷_YˆH;Õ¼Yãæ¿á-±ì~=w‹@ɪæÍЪ‰Ô9AÎéˆ º?ç UéŸݳR¨`z'eÚ*ÿ}#öAjYï¿þ{¢&8që/”nÀ”[é_.=AEø¹ìÏ:cŽ™^B{zQ‹ŠÕ-Ö{…U0Þ1綖FpuCi9ÿ üiÀèµtÛ°ðVíòvŽ‹Îzl¡w/—Øq1+…Tº×¡”ôoõ?Ø_JE É:ƒ‰XŽ* ”¶1Úß_~JùöEØ:gPJ%(ô$ÒôîåâÞ¢"[ÅhoÙ? i ½{o kŠ‘CWØ~ÎÅ’¨K„ ê}QÉ!û¢œÔbzKØíŠf(ÃÔ2 Ñ’ó +ÉÏô1 YýØ4Mæ‡EŸ?û^/¯gßöâ{.oŸ+NjAvN|@uý•lxäá È6=ôöæ§ðÚ¨2ÿ•€Œæ•ÓÛÈÊu8ÍOkÎûM_›^ÓuÁ+i;WÞñó’³;– §ïpÏÓ‘ Lä ÞóÛ¸Ò»P<×Öµ (€©0PYa<ò¸v(h+¯tJyP?$ —yD­„¥<¬±¸™3iÈ ÁLZgé¾íˆ­dòîÛ¾_yÅVzçÛ +¤’¶f ^’ÛáVëìxàDž™[3ì¾4 ÐJß [#ÒVÞäofñ. %ƒáJJé^)ÙCJÀ\èc[uè1‘K•œ£ÿ/Ö}….Ó8ÝÚ6%ä vns­¬¦ñî1hÄ +I%¢xÀ­B¡ÜzK÷ÀÝ™¤e¡g`E (—¨ƒœ¨IŽqç–°Y‘ ¶cEà1÷Ö_êÊ Aå’%`Ü +›ö!— +‰´*ÿ²È?€ŸmB¸-mK„ò$ÀœÚÖß¿XÈÒzy„̶"påÖY"èÜÛP¥V.ý{ C•²GÞŸsI+cEÿ:¨9oé¼WoQNmj¹‰Þ]é>…J¦-è½²4ry‰–TB:zà ³¶r鿤áõéœoqÆ—À X͇—aIþ±òôÈÈŸý¬‡Ç£{ò³§§×ÅÑ4'œJÈÒ5'Še¸Èðž2ÙÕÅ_"ƒùw¾=öÂpÞ9Ýœœ—þ|Ü<ìYœ4Ÿ7}Ût›ÎÞYIãÚ©b;<_½H¦éÇ]óßnU9' Ä1WRŠä¾Ð3[;ÃD€Î*o5Ž>¡»¤(g\ÈqSé]5뺸—¶çE §jŽ™¡+oÓ>¡óðOíØÛ};*žRÝCéw‡î³£qþ3ÆQ²´±+çIwqôû'F†R(fvñ+h/(XÛ^Ô½¡;p&iÍ¥àäÝ¥…F¹úBcFf{¨7Õ•æß¿Ì‹ÔÍ6Ô§™¶–¸ÐÍ “¶‚Y _ʆ®ÓO)] 5"çq»?—­¤Ø'åŽ<Å ¹^¡¦ekí•uY›çº.³¢g.b〜G6—”¥¥<€¹xrÑ[ì¿û;nLm@@9CIS- †+Á%Bd¶˜Ž^€m%|ùnEZ çMKïUéÙ¨.úï¢Ð,f䢲Ë<÷£(ÚJÌíÚ[¨Vto "[@/ E/Ã’ØÃ$NQÀDýùÑÏzx<ú±'?ëpzz] ^8cñ+^wèá‰_dxÑ Ùÿq¼ØÛ¿Döq‡çOÑ©Åyçt7’r^Nϧ='Ùùf$eø¶é67¼“’ƵSÅvx¾z+)OÂ4µ~ÝåÏúÝ.Æ7¹Ø }æGéŽ÷l|SA͸ Š~Ü8:§¼¦ÖÅú§Ü^âóÑÿƒ‡ñMvA¹¬_øeµ|½å-‘os^J‰ÜC†Ø‡½ºëú l-•·úÐNéÿÆÏ‹COÚÖhèC÷Oi‹õ>8sˆ¬t£”Á(ÇÌa[iܼÈÙbV(CU•€Zq‘§J!ë“Àj*;pþrÉÿ }_èVÃB÷EÅÒúKèH{$Æû# )1õâ“8&tÄ›3i—) ø?“Æl¦ +™±…!À„M^iø]"Æô°áE@²Déˆj;Óýÿ.à!% +Ù†\åaÛPèq9oÝ>ÃÀUJPèb{ô¢û·Qñ-iÁè/,ª”ÍbŒBá­wßJ­®Öè—ß±Bkj£KǸɿD@Tq»ø¬Q/Ã’²·©ñ1ú 2<>úIG?ôä'NO¯‹ƒ½f4›b É®QßO†×Ì=3-/þLy~Œ€†óÎénää¼ôçãæaÏ°EßvN7#'÷M·é¼á“4®)¶ÃóÕ‹X’:–Y +Õðfèï[Û±±c›¡{¯N¸©û„® ‰1$tÔÛŽwÿ¶ñ-Ðó&ë}–ihÖ0QrÆ…5*k+—nöohG¡u^}P牛£)`]‰ý—(í3|Ý¿DTëç´@NWÈég8¬sŒ3êhÖº³-Ò%rZ"§mñ/·ü—ýªInÇWñ!â‡ëw!ˤ²ñý«²Å2]¥©od=b&+Q,jÂFãxQLëÏÓæ\@õ,Ï , …6é2*t/›Y“é +ÈOœK†¬Wßœ‹Æ„΀֎Èú+¦Ñ¤]âõÎåø«€›ƒçlFZ¬ºÅðç­bÊœ‡²`íºáyž×-†CoÄ°üŠØ#_çp~Î%å±U3 +Kâi®‚JïËó…å)Ðœz¶ŒOó´ZžÖ—'ã¤QNƒËP[N›˜¯BI‚ߪ +¹®€ ”Øùœ–TcXºn£ŠýsÄzûsŽ°—ˆuº¼­BW`7™å¶sÎJ>=dº'Fl{xÄ%Lë²M@FËÉùíš”ÛrÞŸÏLGôûäürMÊôµùµÜü$¥\בªj§‡{(£Í£®÷ o`± ùuK¥b ô¨,Ö^ †-¨øÔ9¬‡5w4¯l9ynQÜ^æ<F¢DSÀ]ÆŸ» d©ÁsêÉ’A+4ã”Ð=ú¯µ-ècF@µõ\Ï .V±|¦‡•Ò1ã cÜæÓ×þÐÔ¸w.+ä¼BÎÈùïä<±Í`-©FÞ;¦S)G¨Ëþ²˜µ‹]¤aFYL=\J/‹袡.[½hȤ‡]4zÒÿ3´ÑÄT×ë•q|IðÍ‘nÌ”çE^Á±ýZ—Cyžx¢cÇÞ¤ÿc¶¦çXâWKT‚.šs0ªPªö®küM<ŒÖ(Q˘ó´ÀÓÎs±PΨæ±·†¹=Äü)¯¼iÇf¾59ÍÅH„­‡>>ÑóZE3ðmÇ5&]j0si^eT(¢}ÒnÿhámUš+®€Owi§ÏiI1¦ò¼‹G8¶ÏêíÏ9¢^"ÔéòþµŠ,ÀÈ|M‰[yìÏJ>=dº&²=<â™üÞ& £åäüvMÉmû×ÃÓ™U¤%ÞüµùµÜü$¥\ב©j§‡‹ˆX½¶oÞkÁ°ú»çÐ_O5Üåœ1ÓÄ»@Þ7ÍH—©qØiº8”êGtŽýé"qIJ)y=ÂßíÔôî˜.ø¤[gÈù4 kÌ0ñ颪f¸‚…úÞ& £åäüvÍÊmû×ÃÓ™U¤%ÞüµùµÜüd¥\ב«j§‡‹TgºJ˜p*!XO}ƒ%%t††œhÞ]€WÖú1``k·@wp+sn€¥&ðÐ×Vû†·?ðÝ Ô *[?ÂŒŸóèoÕ·Ìô˜jà…ŽÐóÝŒÆÓù™¶$Ⱥ#°z?ñ&€Y7ÁD†ú®H±W— Î% múÅ1é¢ÀÂ}Öǧ‹Ä‘Öóü—.¿êòœ.ElË£I¤š²ÆBŠôÆk|ºTp²ÞŒ\@PzžgðèTÊ–åÚ½@wEimK[Æ,ИFÑûñ"Á4ÐkÝêÿC&Ý ¨SÎ^”6é™»hZÓ•XÓÅ ö¦+ƒ¦'Îzjÿ’ÔìÓ›¥¤‹9h˘rr9œæÿïâ"àMéhIß©)§Ìz5釣ý¹¾™&îFèÜf|iL¬/ +âØC?ç5b÷ÆÀ¸ ùÔþT}=Ò”§ÏiIç]ÂضØ>G¨·?çˆz‰P§Ëû×*²jmW½UåÇ¿Rɦ‡L÷D@¶‡G\Á´.Ûd´œœß®I¹-çýùÌ*ÒoþÚüZn~’R®ëHUµÓÇÃEji³ø:¦š¿‘ XÅ-í¹£ã6ãøâí6pWŠôöhXøa +²ö#A¾›×ž'£oä!“iU¥r;|øo¯äMÛ6úÈ9×èr®ñD˘òpv­¥2Ñ7äÎЈ5£(V0±ùðmH@Z9"ã{³Üã7®½EüÇÀbÊ4â–ŒÕ9M¸&}Ƈçxd¼õBž¶ +áÐr®Ö{ÛÑEÅ1'î´î0ˆRjíE%AÂ¥'J14z”áó­@FýÈ™Bij"7À"=ò_®¼+¿ëà„çì÷y3îPZ„KˆðqC|îQ%‘ø£JTgo1Æ^£¿a¯+¨Rj®Iñ¾<›¡å{“Å€›n\Cé;èT)ÐWôOËÙ=SÂV°V{]¿8HŸxò Å)@xȘ»qV`?Ä—ïO—¤<ŒcÉhn»rQï]yeI:{VÖ–°<´<)Ï Zn „½GÌ=:¨ûô1K4µº4=¤ù¿‚0‰¡§,"áGL {+ºBmÔ·¢ ²&½gùþÐM׊é¬}…fàKV»è®Ë(¡¸T¨<_Æ3«¢ÕC:Ñ+ñÉX”C5a‰zD–rÓ_á¹ÒºÜÄú’•é!ŒRU3©‹[³“ªAu]ÛE;}NK* A¦ë6 +TÃØ?G¬·?ç{‰X§Ëû×*tƒ‚a㦬 ácV”lzLÂð/d{xÄ-,ÎoÑrr~»f嶌}?Ýά"-ñæ¯Í¯åvà'+庎\U;}<\„4R=]$þëÞk ¬ tíÿÞ¡mÒpDNšrsI%ÀwDçâ}ÖÇg‹A)­ï×ãwPI47æ/Oka2(%ô`¹:}'tœ¸ö]h`´@ ”-k7¦š ¨²'㜠4¼ï“Ùküo©˜;miN‰†Æ»Ö/割Œ<±®¸{ï¶2°\cA[ÐGÕD4ËèÍ +[Ïó 9‹ýEšT]»óâõ²ìÏs‡Ê%§,¦.Ѽþ¼:b}E7ª®=ôñuQ )õ>w|à¨nò|L»(PƒèKÔ (×Þ.fÈzb“žx42pÆŒ†1rŽµ/Òñ cZà D¨×–ñ+ 1Zì/,?öÞæf€Iw볞Á¡+0[ï¹2½°õbž¡…4§Œªh ÅSšÅ°è^±ôa{¿ƒ—ø‘ª—ºö[¬µÓç¿Ù¯–äÆqºŸSøA|¹Î|„,;•ï_5ä8–©i¥»l7Ñ5+Q´ ?ÂÓ`Óe(Öïÿ#ÖËë1ž"Öáôöq““ÆA¿éï ¤·%¤Õ§‡LE@²›GÜÁ”/ÛªÕËÉåmÎÊyûóáéÌ*Ò%ÞòkËk9øÊJ™×‘+¶Ãë‹h Ù ÓE7x9êŸû|1îÇq{ÞuΙû¾1®|!0êǨê{qãÚ“%CÊcòj˜iÞ½f iNžGk½œÿ +Ï¿…ü;²ø×V¨‚ËÆô•¡¥Îe¯:Çä¸F¸§¨ùý“óKàO©‰Ò¸þ‡þPèDÖf|A¨ -eγöPEëg¹ñ[peÃ)ŽßCCXjé›’;ÖúødÑPDìË3ƒqq¨Jý\‘!çU6ºP†œ‡Y4äf‘9§WdÐÖ÷þpZ§àôgô<í0× VßkDchâ柵<·P…V¥åÆg‹€jʩ EÚSò\¢BñÙ]#§5rúûý–Ͻïý9èRÑzmÉ=µ¢sÉIu‡Bm/écòÅÁ6ìâý…ñEÚ´ôú2~°”ý_@¼õ:>ð°Šm£<»:ÿö#‹TQ ŸFHóZ¦ +¾ŽPÂȼOKŠÂw)ÆջLjôòzŒ §ˆt8½}ÜdÄÕçÒ­Þþ“;ñé–Hvóˆ+ X$ôs»Bµz9¹¼Í)9/c><™ŽèçÉåeNÉôkËk9øJI™×‘(¶ÃÕ=âVœÄ[”¶–.À <þÚL ã}Ò]ÅLã*ë:];‰\ã/©ŒÑzH Ó3ˆ~ÿ +e¢ÞÒe ¹Zëy>~Î5€=e¹Íï_¡N’ÈE_¥\›ä̹@ÅÖKKUtÞÐó laãŒÊ~ËôÙõI×Ài œ¾ ÜÐûúümŽ?±:U±%c.nP%¬Ë[ÌC)¡KX\×”ÐubUV¤5¹ÌXŸ è UÉ)X¤Ïyº$ö¹R¬—ÆñM—©>£=bž£Vs +£Aõ uÉÐŽÐ0#Óœ©E3çRödqLž‡¢×â?BN7ÈéOuѤÀ œS²ç îÔ@½¦’E)®aÍ㻦kYD`öÃû´”˜9dÙe ÖØ=F¤—×c=E¤Ãéíc˜@'70eD¬Ýz +­óõdº%FêÖ¸BÌ +*—í +Õèrry›3r^Æþ|x:3ÑÏ“ËËœ’é×–×r>ð•“2¯#Ql‡7q»ÏêëúŒÆq·‚ú; ›ä2ÓèD¦™dì]¼öÐWÈGþºLNc£aÛ:®Õ{qŸ+a5 àáÔ1©°HÝ…>f}8•[#“:ZÛ›Æ$Œ€ dTÅ.–hp¼"K!~†,>¢…K_¢ÈR‹fî€z=¸M|²”’èPØ{sž!çX6$1Aη¼âðj®®jïÎs¨9aÙ,FÌyfQduI˜ñÄž%/ôÐä]=r"J Ý1Ž´=ç2$ôàºpémîøú" [í|EWÐèÿ)É’Øææ좙½¢Eì Ë•ç1YãŒSQ@§¦}žé™é’V(—œ´¶0…¤¨ +p•5Ï)þ;¼OKd@÷eK((Æþ1b½¼#ì)bNo«Ð bˆsVˆðöïÔjÓC¦›" ÙÍ#n`*—í +Õèrry›³r^.ûË™U¤K¼å×–×r>ð••2¯#Wqç7qZþ^¥TSÌz”TM48^á&ç=ùª¢® WNåí.Èg¥9aíGÇa;Ç'ð˜yÙ¬ž#çeúVÆ Wjò swwÂdÎzÖ"Íœó^[o©ïýY×R²JcR¦;ªSî Õ3f\ywt2åS-”1ç Ý£ù˜zžzbÓ•–éj3ÒE±Æñs¾Åª¦Tô_âœÐ‚í)Ùâî}…Öß®ÐúD¶ o¨âý¡ÿ*ò¿VΓEAíuÿ!;Qd½2fE/›õDO=’΢½ gà‹CSí©>¾¼x©9kTÁ¨gËø­(µ¢“™%—¬Ý+`•œY÷裖SÒƒëEŸQ¦÷×—¦¥§KàZJNë’X³¶ÑT¥e²\¤¥†Co€Üê +¸Þ§e- M–mŠ±ŒX/¯Ç{ŠX‡ÓÛÇ*´7m³ÜzÁ[7§Õ§‡LE@ÒåaŸoq  ÷úùi…ÄçÉåí_ö«&¹uîç>Bð×ï>B–IeãûW $ÙŠd*Ÿ^2²?vjVe“nµÆÈÊõvz>íY8Ÿ7ýÚ´ × Ÿ¬„ñ> ­áôv÷"šO©}‘¹žÒêßÍwÿnYý»¶ª'ûü{mYOå´:i%ËôWõtƒîX0û2hô Ý­€Ë—Í:ÝÕÒÚ +–ñ=äe‰¼¬‘ï5ëy¥œý[Ûfðο¿ ü+3˜›»oˆ€ÀÝ~ÿapìY,½Bk[¡ýs.TsnUŽ`-º­s¹8ëÅäËl×5ë°îbxcøBàÜ£‹Æ¶‹öϹ_ÅÚ@À¹¸£Ã–¨öQL1mûhü1ôøôï’¾ØÓb«–îq»ÌsN;)w-öt‡;ý;ÖÏuxÿR©^› S¨RÚj Ž ÝS.—½ÄÕ%tŸç¼ !ú9pâ†nÛEÚ5Š˜Óœz³‹n æÇÈŸf‹Àœ×íìÒ?çB¶ÕCJ´—Z±BW4ñnÄjX«…=äÓûpë/¨:=Í”Rò§g?èåÏÙϼøA§ËëÇê\¡£ŽßS"q|¿êð3œdºèmå¯À¤RæO#EMóÎi5Rr½žO{VÎçM¿6-ÃuÃ'%a¼w¢²žÞî^Dü%¦„”"”ÌÐ=PW…ª¨tOIþÿ¶c t÷±X¥5àn“é ¼zí2 p71ŽE!KÔÇÙÕyŸÐjL­\Ž‡~XÔ˜¡*¶+˜>ÝE)¨>#jí.BZcËùÕò4±À2n¤†i-B5•YŸ°2÷ÀÎO±óGt¢TJ«tÎQú=úÐ(Ÿ-2—–õþ ]=qÕ½Q´W¹ ö"%É»½¨Kè>…’aõÂ3¡YI­`ú·ó ÛÖhÿ¸+YÖVæÇD+Š!"θœ»¡ç÷\±OC÷/›ð u+Uk…@º#Ï•÷ ÷ÚŠ¢ågØË#ªTyw¾è’u¯ÒR6¼AëÐS]µÜzc÷­Ô +(pKkÿX+ÏêE°R.Ïa ³v¸@@.TSiç9€NäMt«u_ ÀbQŠÃáxÖ‚*%λZé¬:#³zRJYÖœgâOïÃ- e;ÆÇ)ñðüìg½ü9û±?ëtyýX=œheœY85B¢—ªŸ8|aºèmåoÁ¤¾íöi¤¨iÞ9­FV®·þÜN×=‹“ôºY~mZ†ë†OVÂxï\e=½Ý½H©,c«N–ێ׭.oÀý(I[#èØÃ~t#Ž¢8ö».•[;øñœ+UN­\ú/QïÕZŸ óG˜K•ÐÊ‚ò`-ðŽ»õ ÝÇ°Ùk!—Óë}Bws1ÿ t.ºa‹Ž[¥F%WÔ S¨:²7zb¬ÏŒ‡KÝý…CLˆ¤Sç6íŒCiy—¤»«[Nm‘þùÀBj5¨Ã&¯J¾@õtÞƒÞ«½ˆè3úÑwIÿµîb”’¶± 8GA”ŠQÕ”!¥R•ÐrÞ¿X€Ý\©r2@ΕrePÊc°½ØÒeÅU‹‘»ùÞ8×'ç•x#nõ߈PµbÙ¿Q'"ÑÚ6ÿîÅâÉœ5µ9±{àn,–¸U9†XR•ˆW E(‡#WέÊ1ºPÈi/´ô™·Œ²ÖVçЕRÞðóŽ•ÎÉ!im1‘å|zn¹PÒ8=f¦¡Û¾ÿçìg½ü9û±?ëtyýXí NsœòP.÷QNâø†%T?ÑAÈtÑÛÊß‚I¥ÌŸF?.Í;§ÕÈÊõvz>íYœ¤×ÅÈÊðkÓ2\7|²Æ{ç*ëéíîE +ku©™ÛœñƒžWW=¯~þ½õÈž·nÆ{6öW²¬«‚j€VP3tqñlô¼ã9?ºy»GxA]zAü0/˜W*¶Ñ:ú×y\j/Û}ø_éüi×Kè!¶S#t¥¼îÖjOwÀÓ¿"saÇ}H@zº)z¶‹ñ€ôtèæïF+êß[|rÄ ól7nC5¥û܈œe#'v\ü˱´M¡8-k«q„îiRÝË,½zy-:Ç€ŽiŠ^¢œskŠJN-ÀÐQ•Ûþ½D-otÑî;ãn-ü„öÿˆÅËà,•Å¢$lÏhþ˜ˆ`#W¥bIº‘FÍ-Iãž\º„î­¨HÌ-¸³¨ÛFàBàœÉªµrAJ7<ºøqÒBï>x‰V“6/£{: ·éóh¹Ž s£˜7J´{Î}È.!¶]£Da§Q¥à10»s^)Tn•Þ±»Ii ]ùÎЙb¬§÷á6Så8=M$VüéÙzùsö3/~Ðéòú±:·R-«Ö¦¿IÔáR†Wdâ$ÓEo+ÇϤRæO#EMóÎi5òq½õçãQÞÅIz]Œ| ¿6-ÃuÃ'a¼w–²žÞîÞÂ…§ŒQâ3úÝA¥´.:pŠã¼ èY2$tw^ 5ðÎÐ+U•¶iý0 [@ +¦—¸CUHµ¸Ðµµ»¸‘F† +ÓË + ˜jñ6Tè!À²nIÛ>Ú}v)B’"p{Öür0p¬T¨Áë7x‹QLP.Îy)¶—»Lèã¸ËmBGàVçÿï¡ÿ†£­†X¢ƒÒ­Eþc±|û£… ·v@¹$’À­¡÷Ï9°+*™åÉ9êjT8fHè®.mn€.‘ªæ=Ö»ôEà ;„. ˜Ý(PȺÜ_üp Cf)†ÚN-Ý«´:e¸¶t÷_œ³¶œ÷\’ï({m¿GäÎyȶW¡=zâÐöï¹y—œUÝàWÒÌÏpÅÃû† ÜŒ£ö!\­Ému>wZâNkÜéïpÃŽžÂÄQ´Aþãâüwü.îøk]¹RM½@+¨“ªV2öpJ©$Ê­RºÇm$)>CáG#ÿN”V)ýwNwC‘ˆ8wÊpÝÞº¤6{̲‘sØh Û<•LCË8„ʵ„v˜è߇ÆRÛ†«•¿þK ²ÆC1H¥hÞ;{Å-•*ç‰pa^·N¦è½·™jµéiò74zö“^þœýЋŸtº¼~¬þ@/™æxß“‡Hç—2¼%'™.z[ù+¸Ëy|º})jšwN«‘‘ëíô|Ú³8I¯‹‘’áצe¸nøä$Œ÷NTÖÓÛÝ‹Äê/ì)”RÂJ¢3t¦œhP¼wñ„ZÚÝ=pg¼Z«•îq{š3«Qä°ZqÎk±6ÏõÚ3–Œ³ì-]ŠE¼_§²—¡»š·rÉ*­™@‡íCCC.€Ò½Hs˜ÐÍ3)j/J!¶½ F‡™±ü—ý*Hnd×aûw +Ÿ@‘H‰”Ö9BŽeRÙäþUêvÛò<ÿ7ÕîR³·:#‚A4J½ÀÔ“Üh¤ÓÛK.â×3…\:ç2À]$âðÇÇ®‡D]R½§@W­F©ubÁ´ÐDXYW£9N߈MBoe ^ÓSà^3e7â]èE7Ês{Êÿ+ã?w.ª¡äÌ(t¡–ö(Ï­µÒB#2úJ—yÕ1*2p.šÇ´Åœ´{òNèžÑ"%t°^%Ž:Ÿ_.ÄÁ¼V ”C,­ÜH‰Ó›"8Ï®¬qËK9' X÷\)gP@W-”¬3÷ÑÔê˜Ð'†3ÏÑè¦~é0)DÌIïý1‡„BXÞjHÈ•ïÿ¼à¤§çú‰“Ÿ¯Wœ4·¼†ÿ¬×J4©ý£ âk’ÚÕîBßÿõZ‚¸œv®«…“ããú~ÝsqÒé¼õÛÖe d%yÏ,±ˆÀ§¿Î4n’¨3è¥è½64+ô*>¦ééå‚m2o™­6ªe~kAÆMvoÞ“sŒ$RGè 2/)1Š¥W;?G4o–m±<ÂÎ1Ðä’ cöÚlÔùôÀ™£9§%¸FË;ôÏG´~/mä|z•ÃWšº2r¹Ô’ïuÐYã–EgmþÑÇ¥0Ï•xŠé^…Ϊ•\ çJ̺‡¬é^:Xo"c<' é­qnú€VäYcåÕê=ès +=…–Gä Í(*§+b)g(Pó2ŽÛsþˆ©(Æ2Úùô2G ­9œOb©IÆe-ŽÀ§/OhÜZ"jüè÷fŒãv¥ñþôÞs0TîòVCn‚·/8ééù‡~â¤ÃçëÇ#-"uFšM¤öëò5êë‡}­p…Ž,Ÿþ +x.§ëjaäøˆ÷Ë}ÏÙIv\,”ôo[—ñ¸á›“¸<ƒ¨ì‡·‹‹hHÙt͹AzÚŸö 8Š©xç® Ü—f W¸uW8Çq¥‹Å¾Î€çz#þOŒÎT^Üö6›¹Ît®vúöº9t°n95êçÒo7–èü¦o‡QŽmµŒ~ÎQ¢î7 ”( ‹ÆÑÓ§/QÈ%YK”@.ÄJôœ™Ÿ]ZpÍ{¸ËÖœ—Ф”8DÐÔþ–èžrÎKóq%(QÚ‘bјY97Ôòà̵ rÄÅh•”ô”eœè¦7·äÒÐ[¨Ö8¡×àIî£[@ß>Ä ùFx™ßÒ[P)£\Jô~BŸR+ aw4ô÷¢-*”Væh¢5ë|z™ÓÖ'·™³vë[Ú8Z@'è]ŠZŸ¾HûT˽"“ó@9e‘Òz:ºh²4Ÿ¾ýC,–ó8ˆÎÓ\Lcn!P9¼¥”ȹX]>—` Sœ™„j—õ™‚V=¼÷ÇŠ¦õmÆM+޾ࠧçœù‰ƒŸ¯W„T©kJßðQú%áhêë‡}­pƒÜòé¯Äå´s]-Œñ~9£ï9;ÉŽ‹…‘þmë27|3—gð”ýðvq¢KZ ¬ƒýa/_½úau×ö xw¾‡ÈÀÎ8/¥î}sÖaa±µ{6+ôâœzÁ e¬QèÝ'³QÍgUšŠÜqÆ™ZÞpFëÿYˆ˜ŸQ¢.2Zúü:O!ZâÔ92¨¦Ji‹ ÇUß¡DÁºXÞ#¼l<Ô*ce0F2ŽJïÆØ"k‘–X8c±`R(šÇôÂÝ¢pöÒì†ÔçwFÖù¢W¨ßðÅé'N]}¦«Ni耮5†Î ó✖Ht[hÞ„zlmÖ7—z¯Ñäc/b`½ÛcݺÅÒh‹Å­ç¸õ·þŸ¹¥…¬7|q~?¯A$RNç¹?”\ZÓqžÛ¾D1•¾‡ÑÐ[°Ç6:¿¿°G\Ìf„ *—Ü8º¢%ÖM按+…ÔqÇQ L2×`©.Œ·"×´5;¼÷G ­ÚúVð/_pÎÓó ŽüÄ9‡Ï×+F¼¨¯S¢ÅëŸÒd¹^é·ÄOÿ¸|Ø× +7HÁ-Ÿþ*A\N;×ÕÂÈñï—3úž³“ì¸Xé߶.ãqÃ7#qyî&凷«‹4Œ¹ëO[}üi'Öä ¸5!›É9/\óÈùüÀ[¨µÜ›f ­ÎyTîEŒ©ÚÆI05xNãäõÛ¤ÿø†‰ôÈyo•,ÖŠÔËÐSY GwN¹Ä!qºbEi-íV$}çy®"ŒÐÑF3a}¢µ|#qqx"«Î!©µ2º ÝT)“.±»tè)ßÌ”¬#¤§˜GÖ #¼´]¦ºí}݃ÁÜ)’ù ΧOŒÐ9éî²5pœl7Æ" +©Dgž£ýíþ{wÿèÎÑ[HÙ8…8åzŒ£X C.%×Ñ]¦×9äb²KÆ}ô,:rÎ0YÔPÝÆîÿWé•KLMù€‹Ž®Æ8V¤ÐúqtÀ¡•†ˆ1*b”Óh™sâØÒ»J¹ å*{ôGt¾"-YëR¤&ñ2.¦Ðä{ì7\_jð,xù‚ƒžž_pæ':|¾~\œ[‚y+‹“ =Îd¹_é×L!©¯öµÂP{ðŒ¯¿J—ÓÎuµPr|Äû匾çì$;.Jú·­ËxÜðMI\žATöÃÛÕEšÁÒñš²œø·=ƒž-72à/à°‚&7bçzÓ±wLÏ9ÄRïR>UÏûj1 9Þh׿üÀ7aNÀqœT¢ÙëLæIÚè‰bÎSoÌŒÖRšƒÀöœo.foáU:BiÄ?„JG¾´D59žA/­ŒJŸŸsL0æדpÞ¨ˆYP0µ€qSËôŒóJ'K[ÿöÀÑ„’ÊØ? ÓÎr¼QBdÂÖRKãd<[Þ£>·öDâ`ƒŠö!¨<µ4N –˜Ày«|ÚC‹ÜmC³ê\,²B§M\ “œ*À1VŒœs¸ gnÎ~lEœsc‘:¦E襗»E:'ô¼‰3j¸“‚uˆæžÃÌ +5î:ÆÑQ0È/¹×+äúG±\Lîºú¬rÉ¥’Yc¶f ë)ëeôJ!y=¼÷Ǽ¼ÕPиÞÿyÁIOÏ/8ô'>_?.¶§ÕÅs½Úµ ¥ß_£võ;¤à–O¯%ˆËiçºZ89>â}=÷ô-þµs],œôo[—ñ¸á›“¸<ƒ©ì‡·«‹ÔŒ¦_¤j‚‰Kê z·±˜îér è›Ùë¹UJÖ=™íÁú#ã1Žíã·‘ï&LÍÇ\-¿íÀò èÿ•ò{Œc ˆyÔùôÀ»¿[¦šd~€· @Õî滩’ÆY‰¢õR…¤t Šy€ÐcˆWáŽw +ÒÌø\‘¹Vñ¿Æ²3ttáìþÒÚX -Ћ'Bèp—dRé€.jc %€NÛýÁy‰iAtûv”C®¤rIŒRa„Á uДîæŒA—Õ[\¤¶1¹tÑ[SA"»è±ˆƒtÚþŸº”4¤«r&Ý4Z&ä\0ÑåQ,Ó:ólQCñQæÓk…7z”Ìé+-˜f„‹&¤6f–ùµRFÐ{akÎ4…Øœ°Aä¤SrŽÿÜ*åXèÆ9AèÒnŒÓ ¸¶¢Ku\áx +Eòá½?ZHë»ü?ö«%»q^Å'@ð#H®s!Ëäeãû¿7 d+¶©i¥Ó¶š˜élD)&T„ +…‚„öìèq^^òäq§·Ï›°’MÌ’î‡,ãÒ.©ÑG±»‹€ »Ù¾A˜)(óm¨Óç£-“ÏO¸¶§Gôòzô 't8½}Þ® Åã5ÍJÆ÷õcÞ§ý’Ú)ɇ<_ìrçGðiÒG²Ë]?2/;ç»)#ç¥?Ÿb´=W‘ì|3¥¤½m¾Å󆯜à´öDi>¼ßÄØÊäD¹ìm åúËÊí—•_Ù7"ö”¸˜.Ð}¾-kþb`»Êz¦Èb,À½ß©ôÚ;¬‚-ÀÙ‹_4dÆ™1"U¼A¤Ü\”ÅZÀÞFÈyPàìSn Ù†ÜIµ~ì>ç>”Š½$FèŸþ#²ˆ¢(€íxsX[Èÿvð,ÏhDl‘çþcâ˜ÍßgF¥ˆW!óŠÅs‚ÄÒ÷вغ(kO—Y\¤%k}ü" «. Þý{u ÑŠr‘ˆÚâÐsŸññ©B€ˆ1‡9v5¯uÁ²Dtç +–¶zÐÕ™ +ä˜Í3lÀv¼€dqè’¨ïBã×'9ËWüíød «ˆÞ>½FwÈø3æ8a‹9 1ÿ…Ì:BR‰é·\]¨¤xEêÍ?••œÜÉÂd3îšM" Ç!×óʽk‰a¸´pßE‡†N™ó4¥{@ vøh«Ei~¨ …üéѽ¼=æÉNoŸ×q ‚`ÑékšvƸ´KjÇ$ ×´éb—;?‚‹´éò_Ÿ2/;ç»)%ç¥?Ÿb´=7—xóÛæ[«JLÇXZ<¶Õ­qnÌ^Ä€˜{®_¤ag¢¸>×É"Â[Їä¹7#,©§Ëøoâú'åYmÕîòa>ðú%µCäùb—;?A6]þËÀ™—óÝ”‘ór~>﹊dç›)#ímó-ž7|e§µçÉ+ýýîš‹ÌåÄt¡%lN-BÏÉÐÕëJ÷d2®r^”R¸žŠì1<:"‡a® “p¯.ãóœWÍtiñ—•ù%ÑJ–­¬JôL+D ‹5S߉"ä¼™SŒØ‹Ä­&÷oU,„=ðñ3¶<ÛS#ÅÂ¥†Ô—DŒi·Ì1Ås#Û⢎‹pE#dÝåE´Ïzy±Ä½Ë¸z‰jDA'HT·X>fŠÇîÇŠñ›¿kbÙôæc¦œ!kÚc”{FÖµl!5édºGÒŸá¹R‘=L×3¦9´Ú·¢YG(YbÆ¡ãf;z•Â!¡“s½ìm»ä¹Ü"—o»ª½¼Dp]$l3°`OòñGeJ`Ç…î[VÚÐø9'(J)àd¡ †1=KX{ž*d¢=<îã“.Nté‰A\Ä;è.Пa-–º +;îÔ \áöñŽåðÑ–XÓüT!exô8/¯Gyò8‡ÓÛçMØ6ÕÎÃ-æ{Ca\Ú%µ#6«”ç‹]î?A6]þë¶$ó²s¾›òq^úó)FÛsp‰7¿m¾Åó†¯|à´ö,i>¼ßCQiÒ^«©×Þï|VûýÏjüYà~ræÎ-«È7*Éþ¸’èÌ¥ŸÇϹ/´þÌÙï;£ïg| ·€EŽ€¹'JŽ 0•Ÿµ‹¿Íñlu+ç¿Ã•oåüO,Ý•®¬N.ãçÜ[´jDA Ü„ØíŽõš:A•ÔÓe|9ÈÕ,¤¶0cï#@ÜD 5¦¼xÖÚ÷¢çÖ¨\#—[äòÍ kÎÚ\‚¤uKGeyÖ•œ?ú3èRc’¥ iÐ>TqoE|DʈsZŸF[d9!†t-©BN´_/Š Õ¸oEãרËbÞE\/‹Ê1çkF1B'rq1éÙòãÝ­>J)½ ?™æÿßQع¢ý¶ô}h|à(i©â,ç5Q_Y’¬”gŒœ‡‰ mB3ë )[Ì" =¬sñØ™÷p.oFA3îÀ·üù˜,WHȽsº»Û4¯\oYN 9>Ú2ù±t~ª@\üéÑã¼¼=äÉãNoŸ7a°¤2Ies›óù%µSú×–<_ìrç' ÈÞ_þÃ~µd7®ëÀù[…W€‚ä8Kð2LN&Þÿ9úD±Dö•;WV}n&".Â…Báë¿”h99íÆŒÌËéýtfp‰7}Û´ óqmy’tyß\„©”Q2 +ùàhŸmŒsrN k%èxj\  „Õ“·[ ÛBw]FŸÐqç¨ç-ÀÃCÆ ý¹„N`½º†Þ­³û +Ôúu®›¨^$¡ÔIïŸ-hCc©5ÑC%H”ëþß¿œð²;ôY¡¹4J´ÿœÛ$£äÓq¹íD¦-kãâ,)á^#ê“,[œBg’ëíŸçÖüïô>}‹ô4dñ¿œŸéY9?úñ '­KÿŠNÐêDT‘ d©»¿è8„«g‹þÙ"À9û¤KÍÑãP$mÏÕ?pû—ˆj’÷ßúm¡º—ñ>«SÛ×t·S¨@æX{–ã_ ±éZú—D„\²O-ç@>­y„TÈ¡54„Ú±øh JTÜþ5‘,çXç܃&"`9CÍN¹}¶4|b÷õiý™jÏÒ?po£AN1R®×Àb¡ËÇ°T³¿ez;ÌLÉÞ^-ÒËëÕ‚Þ,Òåöö¹ +,ãXö‚i[Ç:„ÄZ{eš‹Ô„ùqÒO,R)ÉgC2º§6@†^ê-P¹fKÿÀ$P--ýGð“0®-S’.ï«‹˜12>NÎŽ©æåñZp/èÖ9¸¦e·*¶à&ˆ9ÖÉCʺa ýÇ"öl—±ª^kƒä,Ì´gJ»êwÒ"©¸jy_ÐcÅìÈ”Þi¢S²˜˜—ª¡vm2îJ”´Ô¨Q4Ãé ;}<ôAN~<Ó 6z¨èŽ‹Ô ~{CLŸY'0Ïåjþºƒ®’k àAÝjz ˆ.yŽSôhºT³OE·f”bM—þsnÑ¢ø4 8œu—r†”¥®O}È>$eo0êºc§‹ Nù‚ö¡âÕè&¦Úr//ÏhF\Ô'tŽìÓ££… u™þX_~üV7æXÛ.ta(ˆ­.ƒé¢OatËsÇ9w<*h.>›BD¬ ³B¾¾oóŸaº[à Ò<tÚŒú,PG‰Äa ÒÚ+ö߈OEdGtç}B÷V 6€’Š`à×ÐÑ&¼|ù–Ñ\LoÐhõñ¿«Ezy½ZЛEºÜÞ>7ÉÊ8þ˜Yuëä”ÒðˆÃ=Óæaw0hÀ¾^%-'§Ý˜“y9½ŸÎ¬"-ñ¦o›¶a>ð“0®-S’.ï«‹(`H<T ®X¹@·Û†°7ðvÅË:j©çFY˜\ùé;èsí§=@ÀR9»œÓ9?Ìk,ÐMì»ê{ tÄÆÐûcä§åÜ-p‚T’º$‹Agqšs¯À…Â^ûï•,^{h,6„zv\!_wRÞ ç?E¯97=ŠuÎ÷-O顉kEï_]"”RjßâÁ+JnèyÿÀ72î¡@ÍŸ©[Qÿ,`Õ²“óß!ËC9únÎ +f¯í?Hƒ.ý—h€‘]Ò… k¨eÑ]´‘ôþÅE!Ü«Ð>ÙbáHëœ÷_¡!ÒŽ=ï’,ÖB™Î°çÇCGˆ²Ëó^¥…J©í¹è…RÍtêB ¡ìõ¢>¡£&ì™ô>¡3Ä<ã9Ÿ’ñ'p…)üÒZôË‚¸»WqnwMùŽ¡Œû_L,ëŒ?P›-†;@nvSÎîø|›×¸ùáÒlQÅAiúl›h~F×<\QŠÄ3:ÏzfvÙ{ø—r¸ hi0Å‚K›)jÓ«Ÿˆš]rÅ«3DH1ÇŒÿŽ>”ñc¦¶fÆè¸Ïþã·ã“9ñÝtÇŸsm™Zzè·:›ãO÷:nî‚C¯‚éŒÒ<\Tbr <šúL9C º§†"÷©*ž{>·f =?µ:§ƒžÏ€å¶Îr¯.‹ 9ºTD‚ܪOʬñ“G²øƒ‚æùŸ'åÞH®Fî<šÄ1®#û >†¥Ø°ÁÓ[²·W ôòzµ˜7 t¹½}n2’PÒ”’bXÖ)QÊÃ#×D@N›‡]!©,¯mºL´œœvcJ楽g†#úurÚŒ)¾mÚ†ùÀwJ¸¶Dæ÷ÍEJÌy\$o/Ò¹ôÎÐRâZÂ:.§¸éáp^ç pþ3À­¬ZÖ±,Ðm¨êµóv·ÐccÐíŸæ‘÷Ì•˜CWǣ˜¹œ œïó8ÿíÀÕ>Ó Š–«”½Ù¥OÏ"fìB­‰ ›ÉÔ˜]6„‚ÜcÖ 4ž>zT¥„âS` ùžÀô AÖnÑÕ]O¢%ºÌºic¢Úíþù/€?Ã¥S>£“>c0Ê’÷Œ>ÙAY÷ˆÞ«2ª=€‡Ñ(sLNSžK®ûhÿ97m¡PÓ¼QŒ´܃´ðxo‡PçÎ`E‚˘"k1~F%zDÒBzdècBŽ¨ï/ÆWºWÑ'xâ#8O[D =k;ê­ôíèøE”²cCî9Ï ôˆ‹ÖŽzº1Y`±¬—T…úJ:~9Jn8úøŒ'¾ ´Ï.÷‡~ÖÐJVÖÍ[¯ôñ‰öUtü+ÊÀZºÑQÅ"{gKMZûÇÊ­è;ä¼CÎWÈùÏÜP”–ó†&N\ÂÂ)¡'¶tÆ„e¡ öqñþµèÆØŒ{cÌ!¦ÒË›õAÿ‰`~½xN{™¶£T±K¨i7Zö¾ˆ Ä§ihP.³j5fϱÓËë96ýŠN_oŸ»[ü™Ñl¸ÂzýcÍÇÓé”È~õˆ# x„©_ÓÑB8­+—·™‘Ë0æçÅÓši‰ýZ¹¼Ì”L_[^ËeÁ7'eQâ§÷«ƒT .'+P‘¾^ûÓ®À Ô½×ä÷HánœÛaÌÊÁVèqwšö%oØZ½ç°Þ\UcsA›ËQÿ5&t)9‘sü÷®8¾Ð¨Õ£d7&çiㆹ œ6BG­)Õ"„½Zna67Û¶1t”J å¢P9©+¦­¡¹ zÒÇWKô[X +ј”GÎ-‡ÐǬ¡æÞC¿ðÚúêŸóPzNà ÕjK(‚&}Í`-Ü„SBò”SèLšSèä؇ÜûsþˆúßL²vE.7:Ñ —4±`Ò6tE©Ï\ã±`éëèø¶¨ õ°³ DHÏÉ9ULi, ظ‡ž£1Zï‰ã«…À$ù€;XΔˠ†G½Å˜Ð:gTºAñ–6åæ . ÕjÆFT ²yÆpn þŒØrGcaUž‘GjÙ ‚²>¦¡E·ÄËlDʸ ÿœc§—×slú;¾Þ>··øx£‹Ë5%FuzètLd¿zÄ0ŒNÖé©Ñ¤uåò6Sr.óËši‰ýZ¹¼Ì”L_[^ËeÁ7%eQâ§÷«s8Í. µ<;ñö§åýOËÿz™¶ÀUJ&çý†½®¶£B—¦=ënîãNq÷Ý*Õ{àä]£Ò3ºÆû”ê­Î[•g”¼ûËe*yíH.cBc,Þw0ãË…c·ÒGÒ ÞB¬™¢ÝV,ìÔ—¢ œ#rJ;Ê‘rBj$I…îGÀÇä\ –¢ ohDE¤¾åàº$öD‚¢ôŒzkIˆ*'ÔyÆœKqæ¼RÙ_Q„bõô1 eJËl„„¢1{Ž^^ϱéWìtúzûÜmŒ èué+_ÿ˜Mo ï-dÚ·D98·ª=ç §mD3jµ‡~Êÿ +}'tñCèc +FÀ¸û¯¹¤ +I+t +^jªr½Bùp4MÕÛÈÅYS™Ø +Ý q£<&¶å¼i_órp^¸§<r©ÔCÏpC…¹wÅñeù¨bM<:^ñœ*ŸòŒöÀøœ TÊYúŠiNµL!™ûÔ2¾Z¢áEÌü6ò§WP©–Ò_¢9õÖøØrÄ[ä¼GÎ?Nº•¼¯£ã‹…ƒqëóâ8ï€ópþ3ÀJó^*ã3.ÑÝHèãG®´W ѾôÜ£#*¥" VŽ˘%H€¹¥­ž9›9[Æ’r‹*D}HÌÍ£€²e´sÞòñU΀\r:‹@yFw™'N-Åâ¯2rÎÀN}àºÿ}tlxÄú˜—4|ÑåÈ_FŒ³æôTÎ ¡”ÖWÒñ­1¢KsÉ™lK­²g¥ž>¦¡7\fã„Â1{Ž^^ϱéWìtúzûÜmÌ@Ödfk»¶-#Ÿ:‚-ÿõg@p“õ)r8­+—·™“Ë0æëé²f³“_^fN¦¯-¯å²à›“2ƒ)ñÓûÕAY—ª—é—]q´Vû’7° ¬Ð¤–¾ä ¨Wà ©KÎÃzo ”s+÷“w¸ù +7ÿ™û©‘ën$Œ#éæ~jk=Q€•9S–ÞÈEX³Bg—¾e :¥ê_6œ›k¢$½­ýØüÙ¶xÇÀ3¦ ʹ¿ŸãO\B£OrÌ(–©×ò¾o, Ön0>>𬠨‚ªæl†¬´ÞXÆçÜ¡JÉ™Xˆ)çý”¦Ë'ség‹‚7ëu>>ç¡òF}¼½?çÐyUë/h¹4½ÑŽ/‹˜è}!Âßþ#ÎïÒ %®¡i;Ð š&䜠yégèäTZÖÈ…N9¡[dÏJK›ÐY™S£Ô±‹Q³Æ.q–¤ÐÓj JëY?LìC@ÎIjß`üUúCY7°–Œô¢U棖«¼‹ ÜNÓÐc«yVÀâJ|üsŽ^^ϱéWìtúzûÜmI®ÅW§_Ó©³\£:=t:'²-ÿõg@p“õCÎNëÊåmæä2\æ—5» ×ý–¯-¯å²à›“2ƒ)ñÓûÕA„Ïe¯ýýjInW‚û9…NPêuÁGèe;¼ñý#¦H©iRÐÝõžWaJ¦ª2³¼¦²½tךhò]€34å½l:”¬8g¦žó Ð)®ó>›?Ê_éÿŒ-϶7°*©¦°U¥“c}|uÑøçvÆ v<çÒ¤O¦ãsÎ1 <>~ƒNI©¤šVœ3¦,–´Ê"PÃýV9‚ÒÆÇ. Š{CãZ~|±P<¥„Î10iªwÅ:—–1)* ÷sÅsqÓ7mqÓ— T¼--ÿçÀ÷ñv›6°é6}Ûþw­}oŽœAKüWFài ˆAXrNŸŽÖ{g†Ä¢ÐB\R²žvŒ#¨ÚvŒèø·ƒæV‚œUYÒÚ)Ö×ù–ó?‰æ_âü+Ðw9Ç0¢Ê çOÃiRHXçèí;-ž =„Ñ)§‹6¬½ºߢÏ(—¢ÖO¢ÊEAj;C_žaGM9§¥MŒR0•04 ¨jÓ‘­U@ÂËÛ´Œb¢ë&Á4…¼ýõ½üx;?â¢ËÇÏ÷ͽëìÐ÷ÁBѧ™^²B 9Þ~Ä T0åe —“ק™Û2öçÃÓ™éˆþ>y}˜ ™¾íúXn> )ó:hb»üº{ Òàn.x††V” ôoÝúp7pQ.а>‚5lNÁz9ïÿ”ô=àáÖ^ÏÈ¥ÇW:E.Õœåz)”*#­¤½HÚõªÐQ‹¤¤|4+ôÒhú˜=Ê f=ôñ%=±a‰«3 •²˜ÁFªRŸÆWtñrFt9^ œÈâøœ'Ž‹aED{ê2f¹x±œ3‚aJMa,ÒC?ÞGŸ»²Ö:¡œá¤ÏLZÖ°KÖú̘u!>£Ö·$lÚ³>~ Hܤ ÍxÏK¿›ôpC2¶½Ü8*ëjÖ«úñ1àOIßnÔe|àÞJߢãOv J­«£XpÏŠÆä\âŸKŸ\Æç<±%ê,Ô¥žýørIê ±xdDÿºÌÿöñù\+î5訢XˆÎçŽoÐÄSQZûh¨=ð9ô¦æ|WçØ.oÓJÀ­]7¸ÆækÜòòã5.üˆ[.?ß7—*V›µÖK7Þ*úô1…ø’Jv÷ø+XÐø{ —“ק™Û2öçÃÓ™ÍMË}×o»>–ÛO>ʼ–â…ݽ¶âWí¥ÝŒ1”„-ÐLZ_“ÃÚÆÜ@Ù%ŒxÒý!à8žsŠÖˆ&ËX,H!MùŠ%m•‡×QíãhI$ ´D£îJË çuWåb2™qÂrq=;ŽÒ9m‘Ó—Ë¥‘å4"© Ïùñ• ׌ê Þζ¢#ê~¹8”‚95=qæðJ9›”¡¡ôNz|D†Uµ¾ÖÇoREÏ<hg´è3c«­ç<Ã(ªÞzmy.pZ§-pú"ðVÔÎP–ã/¤:Š#t%Cà2@â~*¿X˜´gŽÔbB9ËE@LµhD’k>æ-ç¸ñåmZÆÄfÞe`ÇØ}›^~¼Æ¥qÓåãçû#Íþ̈tKÄŒéC¦×¬PãÇÞ~Ä;T0•ecÚÄåäõiæ䶌ýùðtfsÓrßõÛ®åvà““2¯ƒ©àà×æEBªê,bÊ¥½†U‚8G}0V‚tÁÝùe(%X•KkÔ+Áøå¢Àѵ K4(öCÀøÀS7¨WOVÅ‚TΞ^ŽiχÀ‡M+Æ9®ËˆÛb^LéAÕʲþ•*ß…®P"&ìϼe.ÈgÌ‹Ç×JP®œ‘sëpgZ¤ pºNÿU±Á>#ŽÏ8E^ÑŒî©àæ½”¯‡Ç·'ƒ¶¶g c* ÅHQrºPZçO«æ +ÄÞKÎ$渔h,3rËjʹ‚ SÊJÇ`½îÅÜQY¯µì̘¬ÇpátFzY#§5rÚ"§/6)…QoF8§Çš>¾02˜x?\äà¦ù·¸ŽÏPóïábë¡ø`¸È .i=q“* ·3*ýM=šÑŒ”¼/—aÍHÁ´Jw(\¶ÅRcÚh—·i)àÑó.‰Ý׸éåÇk\ú7]>~¾ß1µGsÕBtLj¢M2½f…3Íüa¿Ÿâj “å¯h´œ¼>͜ܖ±ï—Û™ÕMv{˜9™¾íúXn>9)ó:˜b»üÚ¼ˆCeäx õ¥^}‡­É¸I½ÿ†–°ô"žºEŸhÂjqÓÞ©vUµÔº }Ìj‰Á±Ëã+αa<ç‰u1LØ´‡>~¹p8lí[t|à +ÊÜ3>ðÄ»@@J5ð®;¦š½Vȋ➶ŒJzµ¶Çú˜Ðc £’3¢#q?ïf¨ôÄ.êÐÐ%eÔ%ðVú&ßGZk{n4f¹phºöê2>ç®-çH'¡.Òsž¡\Q¿Y?»Iݵ×ôñ›”AeN`•û:¸ÄHç9«ÜÀ{?èFn¡Ú¿X QsÇgœ«YBÆ%€SΤ!—kNea@®}V¿\ÒÖyZãO >ðH£H}¿A'—®‰âÅŠqaÝ)Ú§;àôßp·3lú’è­óÓиÖ>Õ Žþ´Ejëm(ƒƒ k_.ãsž¸Î°‰¥TŠ!,e¥3˜÷þ?~¡gÅMqsÆ„ŠˆÞ‹ùñ„?¥; ûI.tÉX.Z¼žÁùñýiÞzà\HA0cf‰œhvðgô'‡ó'ä<ñÚ@mb1aØR ¡ÞDÇ—óÈæt¶šÓ8mÓ—SbRÿL<€Š[ÏøøÀJ¥=ESVºõÓç“ýó(äyIw|Ç/tÛäÄñ5Q º÷už!³(°•œ™E@¥ïÐ ÕÂ^ÎPÅ£û“ Ï–ÃËܦò½2³CŠ×Œr.€¬=ð œ XÅ>+ýxu!hÊ{Їt­TºƒÜÙ ©l—·i)Ðb^šwX-v_㢗¯qçG\tùøù~G‰Ååó¯)Òyœ¢M2½f…Jv÷¯PÁT–m4ZN^ŸfJnËØ÷ËíÌæ¦å¾ë·]ËíÀ'%e^Ql—_w/ÒÍJàÜzÇ»)Ý•ãö§•ÍOë%ðÏŸÖ×?­¬Š· E_l¨+rŸ¯~>ð?Ž[#׌ûoö«&¹q^Å'@â\Ï|„,“ÊÆ÷¯ú ÉQ,Óó”É“9ÄWoeŠ ©f«ÙhÐ-nÚâ¦ïá6¨[ØÀ滟-lÞÀþ ê| [naËö¾y} +\MÚ*@'¦ù·ÍâÇ^sj¹8äÍ|À÷ðúöD$ÒÞËáÙ6Ðú c  ooYÊG €\€0·µg|‹Ÿî€Ó_ѸAIÚ#¤®qN w”ò'¸¿¥”ï0¾§±½â3$p¿œÙj<©ˆw%¶'•!M¥@F´ˆÈ w¯çÈÙ·I93õpÄ'䬘µSÀ°ôH+‡#'0¶}Ä: ,Ôjå¹EˆnÓ8}·Š‰›!ÕÝD>d\‰šlØrÈ€H ¥¶}çí°—*+mÍà†V”5ã FÔ*%DÊ*\{¸ÊÑÈ-‰íq>¤¯D­Ir[;Ÿ¬•#g l5^íH%µ¹6€¯ó^ß9d÷f€j-òák ìå¬!»7­)dõTHª"ƒ$ì‘öè•S@Sw܇ԟ¨.îŒkj+~O1Û³ñÁb­P©Ž¼@ݦ—Ïû4(—IFŸ<û>/¿Î¾åÅ÷9]^?n¶•”@Mt1Y´ûË£y>žø7ö— ÙÝŸÁTÖé Ùh]¹<ÍŒ\‡>?/žÖLKôsåò032½myL×_Œ¤yì<ùßîR±”ùË©çÓÞ@g<EƒØ päÒVèÀÉJë=^,,K[í†õÞÿÖr 16”ŠFÜ¥uËÜ&ŒßÎßÀ>(ÒÝ×)!íeº1/gyÌyèÎ:iT7ωË?+}{ºCNGé^†ò^P“ò)¬S+ôñ]Q=ù‡NßqÅ#Är¼Ì JP™ x;×»¢[ä´ENß.þšºô Ç«¥xPlóV µ„Š¹)Ï9c÷z çÈAÅb!ÐLÒÿ±¯t3D†j!9ƒü@áœÜSânG1(å¾CDàÕŠÜŠ<‚Xx?™‘µðOYÿ†Î…z{ùñV!sXÊ1—åxè.tÒV.î¨%”ÐjTKï¤ô?¥|?pi «óµÅv©’õ¨ À IPCgo‹zS~„-*(?èç†nþ?™ÛÞb`à¬lKSd[Ü轟ާ¡ç«Ë,—iöì½ü:ûžßètyýØì‹  yþ’©ð}eÖ<ŸNR^ƒ¤Ë}>ù Leýk†l´®\žfB®Ãe~Y³ÙpÝoyÛò˜® ¾(IóØyr¨ow)Ì:_%Nµ-wÃf£¸€kCÝÀöu½j +ën€»VZ¸J¯Ð+ˆI¨X·B'(¤­\b(]QC"7¿£¥MGãûb²Ôúâñæò γnjr9žõÀÐÕãÆ,¤J’¬=0ë”Ë^)º·RÛÎ1t)c¼‚ä½#WŠ™¼Ìû)ŽYK˜) \ÜÙ´Ç=:?ÊŒã÷uÂ5fNÜ’ + ´¤C³§.jeþŸZžªò2Š=R×3|1W±‚) Ò#íèVuÏÑǺWQ¿¤}±xÍ{2“s…b¥…!è:ômQoÈ^S/ÞŒjê¡—£}QÇ ³ K=€?Ã\Hÿs—þîb”rȨ+ é1FŒU¦€¹KM[àä–sƒœó^“s”¶3Ÿòˆ†NÕ·Q­`¹leŽ OïÓPÁ4/³ɲϞ}§—_gßôâ;.¯›3Höÿ›ë3Û½ 5Ï”T§× ÙÝŸý•²NgÈFëÊåiæä:ôùyñ´fZ¢Ÿ+—‡™“émËcº.øâ$ÍcgŠíôvw3'sñ°r„Ô[UÖ¯O[Uå +ÜÀÊ! ©nTÙ@?¬à­Ð¸<ˆ?È¥õfeèòûýèßbýßxÁ ôzL3°CúŸr¾ÛH{ýø;ªîª¥½£BÚúñ¬¾£æìÁ%=´`xJY,µÚ^Ó)À}=c`~,õŽɃrÛÊDDj!+©B%i;ŒWÔ=ݱÿ³Î·ÜÓrú;:]ŒÂÆ]v¥[«ôî¢÷ªè˜îRüŠb{E#¸‹BÉ=„~8éæÿÄÖêe|¡«û¢ÄlHÃFèf;Etа˜¹¶*8»T¬í,"¨Ü@’jHè9ç=ÖǬD ÅjLÖ¢ºbM=†-šR«ó ò!›¢Ð… +†ÌŠÎ:¦’CBW¨Û´!„•‹sN“a¬¢æJ·Véã×"ñ„^[G?ø3Ü…*·rŸsv[DàÒ´$¢·d÷siºá9·ÊœehÎ 5;ç’ðÖ[Øðô> J‘e–‘}öì;½ü:û¦ßétyýØlLs~œêb¾/qšËô#Ó1tù±Ï'?zz•õ¯²Ñºryš)¹—ùeÍfÃu¿åmËcº.ø¢$Íc'Šíôvw­F§ªA”[Qüm?¡úGÞµ‚¡jõ ë¢A¡ H¤”qƒ»ˆ´À¬óßÀ>,MÇXäª[f8‘{¥FÔ¶eŒ@y)1 Ñj@µ¸³äò@-ã;‹§: + \§(×£Õ=Z*¸bLc \?3V 鈡À"1S‹€qÐKª@4¸$.ÚAëÏh-*>ÌøÖ( ¹ôˆ\Ï°ÆšCZcà¼H¹Mã§.ª)b\@£žh)nu;× ©Ë5h% ÙÑ1Ê%¨X²iÌZ!QÈZ ÅÔ¹·ˆµ?n3g„¾& ôÈ%TsÌÌå®(\bB7P|`è´î]‘ë`ÏкiÈj¤€µåÇW#ÍAµ"þÏ3è20I°Bš9{HmzA0ÿêïÓБKq×ðg2¶Ü*ƈ1¬ +\ë4%©6Ý+t‘èvãsEÀù#Á|:[¬ïJËP6}…>eé³ÅœnÓ8}“- F=£$*ˆm£ Ê’VÍ]ZŠÅ…1p÷ýÈò š˜UX¦F£–/,iãmÞñTðñŒ”x¼ï§¶¡†Iƒ¢€Z‰ª8>ÓTNQÅG$\lRS)ûÉîŽÉt…μ×õ1¡»‘¶”CÚÀ¸Ç|žé´Ø^Ð:C«IC€AÁ¾B¾þºCN¿‡éJŨ.㨱”±+ëB—8ºôZsF*9¡Kƒ®='a:P7L¨‹ $xÆ:úˆž'‹Ö"ÍOèpQétÆ„þW²ü±¹…A¶Ü?p£‹ñ©’X°[ ¹ ”¡Xá”]ïаïæ=_AÿÎþ;ôbÄž¸üÉÖ²ˆ Ô.¯Óé4²Üísíמ½ÒÓg/úî•.ï/o«Â µ-Ó?]÷„«L‡^tz zíùÀŸWþ þvn×_ë”e¯O.WsO>Nýþ\jzfUðZoyÛrY>øêI™Ï½SnÇ?ï>¤ õ”K̺ÿ—)FÒiyEî; ¶(ÃzÇ pku¯çC©Ø [¤Ôèéò@º(ml0ã7.1Ng๠zM´Üà,9H9W@º‘–Ò8£´Pí{r~Ä„ÏôÄÐD£ýg—œ¢(.Šz¿fdÏîkEÉ*‰Z-+tÜõ¡1……Á¨QÊÀÕ<0fä‹ø—¨.šî+‘”œ|°V£‰f€îªŽ-£vÿ£ž1æ nˆËøWPÛôÇvœn‘Ó9};¹ ¥Tsç +™ÄéÌ ,ž¹”3æ\?QθTm……¤Å{÷Fy~Þ}™ÕYÁ*Ÿâ‘ò +\½E i`ûB÷õ±žü8ݧ5púvËé¡ô-¯ÅölcLè +‚¼·€ ¥¾7ââÊ•*Oߦ˜þ…~2td´TPd°æ?²tƶöþHõò:¢;Uåå6VÿÜî÷Ÿ½ÖÓg/ûîµ.ï/o«Ò +EîärV*Þu…«N‡>}©‹2ÉràÏ+ÿ +ávýµB•z}r¹š»òqê÷çÓ3«‚×zËÛ–ËòñÀWWÊ|î½jrùy÷!ä7R•ûïú¿û…¼2ïí^C"o¾5暨OäM[dË°ÖqÓñ-·>÷áïž32-ŒŸ¸ÝðzÐÇ¡ /¿®dîySÍÜ|ÙmqgL@q²D–'ЕF%åtz ®ÑôlAGp¼»ynXÐð¦ïë¢Y¤Êè¸eú;CSN_&÷†sH÷uN#ŨŠBo%Zçð:îŽODé†ÓÅPkKÉ”Uð :¼ã¥)gdxÒ€euÃ5h¸vÚ[†Mvï’¹¡Æž?VTè8­Ó÷DEýÝëø,wãÔè÷ €«ëaÝÏ!‘ë{üäóÒj¤ùƒ—ÎcÒŠ`‹®?zZ‘ +h–2²'ÛÈÇ.ºÕ½ñ9OÇr¶{Éóº'»¬Ô|²â®_™÷Rù¯fI³­0F]IÀªõlÏ?b8¨n çñT9=B…®֑볋D…Ö­o€cß[»Æ$ºú#Õòq1–=q“æ‰%AkŒÓšÞ@4 +zäâ»À†*Ž?¢šYFàTvõ|L²0p¡8¡í9Ý"§5rúfÏÙ0Œ:¾÷w—Ä –|ZD픥èyK£ù¯,J©9QOŠ]ööŠ!S‹ )1p­¯{OwÈé÷h‹B± ž¯-P(’exànCT9îC9”íŒMî ‘–šQÎeª½?[ JlI1 Z£²dàJ-­üŽ‹Kâ†{ŽßqwOÚÕò!‹÷œû^b’,]1*âødIÛqö]H(!pc‰®ŸÀ<ÅËY;c{D×±•–p@LZž çNãé’!š»ùKÛK¸cz(C3*Ú}Mhq]¬”°ã$|Ë×q§Š°ÝqºENkäôÍŽ+´©\BbTŠ=Ÿ,5nÇ÷üйz4Î×óielxÿ̧®‹LÏ@=#³OóŒkÑCÇ7†*=’e|à>Ÿq ŸåªrÜä2t¼iO ‰žÍ­a„>~Ï°•ŒÙÜYNd?›gÝ?§ñt)Ï8žÞsÓ½˜8*ò¤Y+ï +êb^¸Æ4ô´r.誘“.ÞóÚKÜ*2,¡Íkר.ºn ¦9W‹f4üˆºÿwÚØ+Žçù# 'Ýå ¨YÔóñYnÐYÏP–G$4Î(ç\zçÈ–r¾•[Æç¹@åº×ò!Ù2µ¼kÌ-Ç÷üpè Aˆ£ºŒJ—b Õdé ¨ë˜ÛÉ.¯Ó)²0.·±BÃæ÷Ÿ½ÖÓg/ûîµ.ï/ow=Ñî9hbbktß®:úôè/’åÀŸWþÞËÿ±_Éë:ð*>B$®ç9B–Ie“ûW}PrËÔ{Êä) +ñ+³Qr7ÛÍFÃ=ãýSRZÞœï&N®K>ÕhïÜT’ëÍDJû¶ù6]_ø`%Mk§*ëåyµ#ùIjþ[SŠóãÞOM»aRƼ¢õÉn|Æ<‘žI³°wèÞ« O™år#Ù˜¼¨¥ K?ÀD€nžìöH*“.ÈRâþˆŽï禱’Ýÿ…Z¤ìö¢1¡{t¤jä½nicä]!_o€ïóÏœQ£o.vÖìõæRt¯‰ŽyB}€TÞQË 2Jyè&*†½)F`½‘ñɳß"ç5rþÜláó–¾…F°ó,´×û‡ÔŠ"Ô²qBÇ缂g–Þ¿WäŸq–}॔=c2(ºXŸ‘ZŽ¦\K@àrÌ™"¬•WÉ‘r[¤ÚÏã¡Ïzšk<µ¸!bN½—o, +RcªÜ€ªá‰Ç«\¡¶zádîÀYj>#È%®Ðw›ÿC…ŸÑZ6šè¯-~§ÎµP?ÇE€.€¢GPϸû4 ,tìSîðjiCh’@¦8©›ç‹´fÕ./mYÀ÷8?Í€ÌþôÑ+=üyô¢o^éòöôzLjÚÜ%¸èýñ²v)m“þŬóEÞï|þ¾äåSò©‡–7绉ëÒŸO5Ú;7•äz31Ò¾m¾M×>(IÓÚyÊzy^íƒ ‘ÿÉ8õzØ_ö¸;o®ºgCؽ'ì³ôÀ¶@7@ósu%мÑ7VÈ×Üór>Õ|o”Ž(gL0ÇC/¦9Ôðu]kŠé/­[Ÿ2Â|‡¿˜7Ö¬W¨Ä;i\O ÝÛK iÊ37¬q|¥gÈŒ9d' lŒq©G/•ÚCÿ²^N“‹ž|Bù8¯ó'OhÜÀ¨^ŽŽŽ;;ï5®j‰ÜZ…½ÑbÌ6ÕWª”>œð§QΰÄïPK®º'ô!;¿ÇsK¹Šã›‹+±—ËøáÜ H¦€À=$bî½%‚T4oÏá+B)‡3€¯¸XDRÈ€+R¡¼5bÂm(™Fí ™ûÀ:›Eì qåâ³\!ì{hc¬-fTD@å½ÙbHè~FböQ,iÏÇ„8/JÍg4£ïÈ.&¶»Æ”‹µ +{Î8T;òx®Ù‘ ¯)'ï¬õòÒ–>í¡ÌO[PPúèeþ>ð¨#‘€wþ¨Ë +…´so¡dÒ®ñåâùœ6òÖðÀ[NDZÌÓ–äxÀ ÇŒæRÕ€œKñ…>ƒ¹AÛq–µhø9ÿTç7*¿^þëåŸ@ƒ¦[q÷~x¼•ˆ|ŠµS"Y;"úg——¶r»žfÈJþôÑ =üyôšo^èòöôºªË \d:õ˜å~8²v)m›þŬóEÞï| êÝüýSRZÞœï&J®K>ÕhïÜT’ëÍDIû¶ù6]_ø $Mk'Êg“绘VStÞèuÃjrö5p¾x‡î¢¤º1-ämsèÖXA.Ixú¬;tMÖ·¢òõø9ÿˆÒÝÏs«îˆ:ð¢3pq¶Þâ Õz±D€n+÷r‰`‹deú¬{3ÂTû ;ü!u¹°ÉžÒG• ×Ìñ‚®;z-Ùâ‰ÅUΔCа =lûwg‘„ýñ¸ç4è+"ÔûJ€ã¹å>äŽ\À( n%HÙ$d`©L4âù kæ5EåÜ4íÙùJ?õLEü¨U×Ð}[vyi+,ইˆ ýñ£WzøóèEß¼ÒåíéuU8C̳Ýò=%­çù¥´mzïf/ò~ç[@PÉ˧¤´¼9ßM”\—þ|ªÑÞY\êÍß6ߦë ”¤iíDe½<ßíÃ’³Ø¬ · +aÎÓ;ðÖ¨³õ9z`û] #¤TBuŽE.nÉEÒ¸O/„Æ®Æ+–Þ|#0ÎIû`7pûñ­ /‚XÐÿý:Ë™:7H%¦Î}ô*EÍ^74Ûôx™WOŸ©ïýã˼B5ݳ–1e®P·2îøœ›WÛAç>¡•Ð²l@^.Jà”Gl¡ +–ù Æ÷– +IKÌ#u$òx^Tö8³°šÆãÜÅ¢V÷"ל»-érùÖƒ&ñ´(}Zø¯·ü€·¤Ä1“RßAˆÅM±ZL™ (êÞd1&tϹU&.) yc²ˆÀ¹tŠyFz)¶Çú¨³æ ¥€î €¥'}üä’E»è©](õ½hx±´|ΘCŠEÓÆDÁX,KÏy'N‘uo¢F¥L¥G›ŠØÿ›G‹¼ÆþmvyiKu%•ùi%õ§^èáÏ£×|óB—·§×UÝÙ§_©Þ‹PÈÚ¥´]" ËÝÅ·€ ~ìÞSë6Ë›óÝDÉu9?ŸßYUZêÍß6ߦë ”¤iíD9ÏwQFž6’+~M’ò÷¿¬üç_vn€©|1ÕÉßØÀáÐ]”Ť?MŸ2ßMÒwLþ³ùÞ°^‹ýxÖýpà˜¿Ò þ-ò]Ò}l”æSÉnú¿'»ÏËe¸/R¶ˆœ»Z*óG¯å¼B©u/Ù ÉyËÓÕúd7|/ÒÖ…K@àmÜEê¯ò°À=8¢}qfüÙØ" +EÏ\Ç‹@RÝ#}ÔÔ‚¼!ô¬{B/»R3æ*`.{aqTèÊtFX<º{£îj}TÖ­Rĸh •0"çÍMbRg­é_F~Z0¯3vEŠÚ$jrÆ ýŽÄµÅÎ]µ˜LFz¡‡?^óÍ ]Þž^WuÅçCª³g%¼—¡¶Ki»D@Öù"ïw¾üûU”ܸŽ¯â ,†Hüž#äó™©ùÉý«”lÅ2•'OVÖ#ªö#eI©f»Ñh€z¹}K“–•óÝDÉõr~>¯Ym¸ì7¿m¾Mן”¤éºµ½¼?DŠâ4¸ô³×Àínî™T7BÆ°vÞú4å@úN,¢‰4ð,Ôû×ÀÖ{§òLz燨§£RR}…|¤¡qá\À¨Ô€:¯@˜÷t~D”>œsŸ»ž(ÑQ¡{âèý|Øttg‹›À#Ø¢'±B}‰Ϲ'R·µøÀÓîŸ#I?{hEnŒ(¸Çú˜J÷`)ÔØxtÙ6<}ø"m£aÄuKO5ÑF_ÝL÷ºÑ˜Ðªå^0à Ý+Ô÷”>¤¹x +×rñFj(½¥‡K28)p¢QtPÆ“ä½î?æX”QFtwsÁ^ä<Ñ¥÷Ýøút­”Zúú ÀyܬY-qEŠ…”¹BÍ»cè:1î }|¹TȤ½+_ ¯àÜ2Ÿý`oiv®¹/Ñá»›§¶$fbÙè¡+äëðrþ· +ÔÊFT¸€*…tóÈ©…zàã·!!ÜK-CŠÅ ´„ìüž¶*÷ w`‘·eHšW°Ñƒ]~·KžŸ(Ôž¾ù>?~¾ù–¾Ïåãןն¾‚Mç®ìUÿÀ‡µÒΈ€¬ó‡Üîü*yù–€”–•óÝÄÇõÒŸO{´5« —ýæ·Í·éºà“‘4];MY/ï)æïœr‘IŸ‹¶YVdùŽ"àÕòÞœ[>Ž]þúW&p½ÈF—Þô¯§Hÿÿ*ßñ¯zJæ)xŠô¿°¾‡[!' ɸA–üd¼ŒrUí ôxà‡sîɈŸGâÜ—v¼ˆ¦¨€uúðH R* ´z¦“'côX¦è:ÏX÷ü|H{"ÍL9"ëž[c"¯®—ÒK}üõ ª·—¼ÐÇ„îi±ìÚ˨Ð}Øë•>|õœ‹µÖœWH>‹†„nrŠ(.™‚r.Zúé"BxA¨…ú"¾zH/Ì!ÝÅc•3ë&À “QTC÷ +³¨¾è¿pÈÔ¥m‰õÐÇWº1ŸÁù+@²Ú»K_lSH_¤¯• ß#ç5r~R.þµDcö"ñî”är|…V§1ªZqDèn.˜O~¼`̇º áEÀô”ð +ÁäRCšºCç’c +Æ@´I ^|ñ#«ôómÒÏò^ -$pËl EÒ fZ‡„ÊvùÝ.ÔÃçô´€añ§o¾ÓŸo¾é‡ïtùøõgµ±O‰’Ë”.R¢…¦–vNôÑfýág@P§òö˜€”–•óÝÄÉõÒŸO‹Ûš¶Dn+盉“ö¶ù6]|r’¦kg*ëåýá %™L?.—*kÜ {×Så=ÿÊÄè +Õv¡ÉzªvÆ,s8twƒ"»ZR0ªô¬Û<à ÉJŸï†ÞæÇœöºÞb9žs‘Ò':wO§,{ÐG5F¬Œ!Y÷qûiàxKÿ[Î÷qSÞzs)‚1S—yt¡>º Ϲ·ÐÄ\#rÞfÞD½µDàÜ_³©F%:<ç|3 G®”"¶¡ +•ê^T<ÂY^ш’iD±TP¬½X¸yØ´å”+ìüaE®¾Z/•á‡ æÎøV.w(Ò†F0¬ÜGÛ q“óÐÃfÄjÜ÷ m߇8.©÷–Ði{þ pÝПÈæc©ylÙ(Ò‚AHœk¼väJwܽ\"#eéW±´°¸ÕŒ¸K‹][y1ë^¢›ÓÜñ%z¼`LUC²žÚÅ^fzìvTä”èu|~!÷uî;éÀ ).œ× ÁÈ.¿Û¥û›§§²‘?}ó~ü|óM?|§Ëǯ?«Û èšçŠêc ‰oüŸV\µ½Y>ü nx’—ÇΫҲr¾›8¹^úóiq[³ÚiÙo~Û|›® >9IÓµ3•õòþpÌ9Ï)}ÔØ€äÞ±CEêp·ß¤}Ï[_ãçà|j1Ý.ÅzØ{ʲJ(ï½+P´]¡ÉzβôÍ:€¹´Le/Ýa/¯(S—zHgt­k‰LïË”ÓZÿ[äûrAÓÖè”9‡ÁÖ}z$ ‰

¼·¸TØÍ%pw–$À‡×¸3Ž‚[`Æ…7\%‚“#Ô€¾âNÎYCf–f‰šöÿнDQOQú+ÜEë)ƒÅáEÚò9m  öôBÚP¤îéYJH¹(C)©Dd½Y#Ö½ItTÖ¹æ>`=pôrÁÔ‘ƒŽ8ù—³`*­ #(ÕËïv)PÑæ§ÐÌŸ¾ùN?~¾ù¦¾Óåãן')û’‰“œè!k¥Yæ½Ýùüí’—o HiY9ßMœ\/ççóšÕ†Ë~óÛæÛt]ðÉIš®©¬—÷‡ƒ‰DnvÆo{XNº"÷¬QØB…Óç Õv;öHõ´ Oj Õõ®ÈsöÿÉ¡ì÷¦swšŠ}…L_€¼hé‘›ò“œÅU^)¤Ê£2. +U¬g|ØáëÓÉSB‡o醒io4¯ Ætfì“Öð*÷M}qŽ/r/OÎ)by:å\ÊãX@*IbFr‚̾$ rKÖ[ùðZAȹôZ7IÚk@#*%3¨i߀ÆG®Ù[íùÊ M_«õ=ht•ûDRöüpHÆ+(Sß;ÇGî]ßBwÊ‹–Ú!ÿ¶¯|ûèY¢Å )rGnU÷´2¢•‹BëÛçè†Ø"y¢÷ðgÀtÊ(q¸R*¤TöÆ·#ªóhÎy&<»éó=p^çg5^0d´u•§„úW9ËUˆ”~”wû´½hÄŽØ ƒŽ@™ÝÅóãCº!¢õyüxä/蜄Ôs¾Î+àüœÿË~µ$¹±ãÀýœBšA\÷t„^ºÃ›¾Ä$«Ôe•¨yeÏH2ñâ­ê#‘J¦‰ÄŸðàn¥)kv? ›Æ9©ñ=“Nrò‚=Õ9qÓ½À5)læ£ß²¦ê¼¾¦®)Ãû3öúövƶŸØëôùþ㆒¦ö_;„²õKí¥DØpÁ)(™Êö·•ëÓÂÊåïýtY³ÛiÛoýµõ1_üd%/÷àJìô}wü!Ãõ&-‘ìë zÿZ;‚>U¾¸‚î&c4šÖ +6¹0ôvÇÃ&îÓçÞËý(ŽÎ +½µ;@Œ"U +•ë®œ‘µ•x5*’œÅ£¿Ê¡•Â™rÞUG¨OÆ—õH.s¶OVB"7ì]Ý"Öhw«DmEMòhé CêÂ6ÆéJ¯R_¡ôÇË¥$iAÝ¥6‹9ÑyR×1-þ#—ç¶Q÷±Nï-îB£)N?Z¨¥¦<öÐéGÍÊGå9«Ê£ŽE‹U ¹Kµ1rͯtNÔF;ŸÞZLR®>Vèã?#ãj‘ÑΘ ÔR5GõE+G¶8'ò–Dó8ZLï-ž[‹™Ï[r“Q.ÓûbØk}C)±ñS«1'PNNNñ8Üù½:¿b¬x¼\rRic‰€y¬`iÛPäÌâ©ImqÚJɪv±Xªâº^p–ÓG¿£šL×—Dèµx{ÆFßÞÎØó>ßÜâ­Èò_‚”Ûà¬p1\j?$%*º^ìë '0•íSðk¼­\ŸB.·ëûuÍnÃm¿õ×ÖÇ|Y𓒼܃'±Ó÷ÝAJߦ.½šZ `ÃSá±–¦䆛Û[¤Ž±A/©dÈ9ŠÄŽ:FÙá.7¸Ëù2q®;qø²­m”ùô¾Òc‘Üy„ú¤”…#z9€·ÃÙeNÎñeóqÔà‰1û'"Na Q:fãÏÉÝG±Lo,0s‘€MIë>i`ÉšG;œ8æ¹²©a»|ä+s†Ä¨Í2WÖ1iEàœ’¡ETºqò&£\"°ÎH[³ùSª¹Žkú& +K¯9‡T:üÅ y<Î!'áÀK¥ƒà2#pH¥•Ó£¶ÄsÎ3rnÿQK:¯ÖÜ|Æ¡ŒSµ2?ᡃ"1Gìü9“xÎÑ+Âù32nÓ2†óvž›ÔˆÐ‘¹˜$âHdØ;dó‡Ð‹¨„„v˜ã$^Æa.ç0—Z-¬\¼„òENê,Ë\TëÍ@G˜ñìôÑoko³ë[IRoÏØéÛÛ›~b§ÓçûNœ/áBs¹ tŠœ„Kíç¤ÎÞÍgÀ´Óøz͉·•ëÓÂÉåï—Å}Ín§m¿õ×ÖÇ|Y𓓼܃)±Ó÷ÝA$eþþçÂÅuŽ/àð‚Š¿ R¼Û8oø»òQFš:X7Šï6è5e4@çÿ™u~ôœ¨Ž½cú…Э騖ÇSþ»Œ÷TˆGs™8D®åÎ 3½T¬&s9y§ôD©)ÛJ§§"G…¾bøz¼Z‘¦ÌüõÉ=¯õ¸Ý3‚X0È0w¯T­D4sìm%Ô°û7¸ðóœïŒr Cé¥Ò˜·"(]µôˆ…5ÞA,ørncTœžs#Å:òúˆŒ ¹ˆÞñ–é9WKto z2çjETó¹æç¼¥vg”›7Œ…ê˜Z"àjˆ9åʧ!(œ½ŒŒÇèžFµñ—ìcJŒ )0ÞvàUæny æ{è¿£•_‚þˆ¬Õ+T[L™[Ó1$N\0~f;ÿãuþŒ9ÎøÎ7½µ@åU…ã‰Å–£³ìp—îrƒ»üÆKb³qžˆ0 +ao¦€ã§Qr)GikÎ6ÄhCwÆ¡ù ”R)³õ—ÔÚ¹bZÎKÒì|R§”moæþN§~ËœXÊúš4)V|ü댭¾½±ë'¶:}¾ÿ¸¡ÄDÚ*ZÍ·”({¿ôþM‰ŠÝ\p‚|e{ ÆÛÊõi¡är‹÷Ëâ¾f·Ó¶ßúkëc¾,øIJ^îÁ”ØéûÍAš7ZžÜIG÷ 85 +Õ©WàŽ—þç=ÝÎy¼¸ĺŘó>wU¡GÐysƒÝôbA§*c§ž:‘^ #LƒôH‰ôœ“¸¼b +x¼ÊÍK¬T·‹Jèúïˆå— ?Dæ=ÑP @z퉥Žr™¿>1½èˆ;á˜B‹áT}”x„êäT½¾"l=Ã[•±õ€®Ž/݉¸Ó[K*ÌŽZèœJœñ¥Æ!‹´G®ÂGÁeVèÄù‚y|;b¥úbàåxÙ/¿<§Ò$f@§äÆÅ‚Päñüá¶(’LyÌ‹š‘ ¢¿$1>~ºàTœ4"ëac—ÔTÍŽä2¥1‚s#~…\ž¡ôÖÊ+¬ñÑžžIqú€ÈÕ\é¯ ´ìp—Ü娕¤¹Ž17‚TDêã3Z"€çbcàŠÑ†¨òÈyKÌI¥sS²ŽÈŤ¯˜Š½$DôÑϧ/Røy1‹ôàO,Pn-Œ\n×÷ëš¾D¿V® %ý×ÖÇ|Y𓓼܃±Ó÷›ƒ4’¶ ”ËíA&v‚/à(§âuÔäÄå´qŽlgÚ݆[Ieé+¾Ý_~W)GoÈt¬ñ€ÃU”èh˜ªM_s®e¬Îi{Ýçö±<Þ‘/äãÑC-¢u$=t¸¹;€…^rñq|™Þ!—œ[ÀN6² õ—;C×ô„ 溓YbT'5â´Þ«Îœ &Þª1 Ô7S 'Êel ÓsŽ.dt¨ó9CKNêw8²\b‹%¹ùØŠ¦—KO[ÞN¡0Eª‡Sèœ:/)Óp>=çð–†àPå9•{å ù£©RÈ +¹0q@oé¨Ü@.ê‰Åü¶øŒVÔr=‚»°Ù+ZÑ38g‰ÙD\ŠBŸÞ\P¡zo²`.º»Ž³Åüœ·Tõ%úxkÊÐKDsëôšèòèþO©6•ˆr‰›¹8¡ù}úî?¯x +êçÌÒ[C‡`,ËQDŸL0R›ŸÔ9qó½»hª$§~ËèU`uyMh¹ýõ[}{;c×Oluú|ÿ±ÛY»ÓÖÕ·Œø†eë—ÚJ‰Š®ûzÂ!(œúëSà3ÞV®O )—[¼÷ÓeÍÕNvyXH鿶>æË‚Ÿ¤äå>÷ëôýæ .Ù–ƒxöQ˜Ï5àrýç–ýŸ[þÚ€¿€÷@Mm>­oÀ9‘ÓQ·žªž® »{Hè½í‰ê×çØN-ÔüuU¢µ+L¸»2E«(•^¨¸¼bp|¸ÎÁyɱréU‰þÂÌ;'tNµÈ8óF€NÉÙbB‡`r‹©uDM£€ÖˆK;caô»È9„|9®žk•>½\ sc 8^€qʇÍhJ±À«â€1¡Gut£7YŸ_éž´ÝüÖR“P9êDSj®ÈÆ!+j‘VƸ8½Ìa-a傽õЧ”‹•ÔÚa\œ“õš*õsG3ÆÀÑEâFôØþ¢ZGèó{:¥julFÓ—(€gjÇ¢ÿ°_5ÉÍë8p?§ð!×9‚eRÙøþUÓ”%ê2¯}ÄÔËÆcR­v£Ñ(‘’ˆCàZ¨˜zÌ-L)Ê–ø‘‹ñç¯<r¥®¨ÜCÊ5oeÅ1Û“õsÝvÐH¡¬äsÀEâVÜR,Èç5lP.3à².¦…VÒ¼ÕˆÆt¥ÕUjÕZŒê’óDQÊé«]²RÅ´4-s¤ÂX>㨷÷3N½à¨Óåã{vr¡£\Ç•ÊË<¤±´ÜÞ“‰;¦r¿ÃK0MÿFŠ%>v^ï&Rn—X·ÓmÏËIåv3‘Òžv½ · ORÂt ªR9}.^¤(Õ’(¨õ!cØßö!äöõ´:ÚÍÁœGâ•n7°<’T’?µÀÂòJ"6J?p£ö³¯®ñ¢ØN/sœkÀÃ܇%&óH8Âh0Gùâ¥yJYÉ¢ã3ŽÀcßõ÷·•ý9g² } žs-¤æ±µÁ¥¦-± 5+¾ˆ4—Ð…²ªÃ.„¨%ôÀ‡wsè\jì ÔCÖb’µ|ëzƨ›p—ý[‘PÒÔ‡ó”þ«JÏ9õíßô€>Z«ÇfÁä´ÒG‡W:J4²ô%ê€s(=eq)(Ý2uå¹Ì‘˳K N+¡k|xÝʹcºb¢ Ö÷ÿñ)G}‡s¨ç*¸(GûÊœ«‘˜f—"™{àšPÄÅ&ô1už¨Äè³DI æ¯D[:Ï¡ïCãØa}ï¸jî¥2¼)Âͳ•#†Šß˜‡²®ÜñÅâ5&j¥”Ä£¯´“¹î¡õ»ã2•²¢ò¡9æ]‰¥Ì3K$.|új—Fjùºª”±áë_gœôö~Æ¡œtº||Ï6Ô ¨h´Ô´ìoKûÈí=¹=yñwÀ>pz_F—,ñ±óz7qr»Äºn{f'=λ>íznžœ„éLêçâE´Æx¼Dª§÷ƒ—i}Ûz¦ æ(¾r.ê¨ã=€ +ÆŽrÝ ð"Ò· Š³EÄÓÄøÿÀ:z‡¥-G“õH*m³CÖZ°öЇ÷Œb|ÄÜøþ¢¶â/ãwÑ„]I.ËÅsZdD®^+ÃS®†N¯‰Ëiurý3õMh|CŒèž+Àd–”Û—ŠC±xížpD³°•X† œE×R¢è~K¶¡û,Ñ|H…þÆ8ä6áòš+z¹¬ Ãz³Ë;Ä’ÄãPá»%9D,û›"Î6Ÿ#‘Vd®Øg®ñKT(Xî{¿¥Ã],õc¨¥GÊk¬/&Y‹ŠäÐEcrê.*¼5Ñ ÝP¤aËÓ‡ Xgã^0üljÏNŠÉH­xÌŒÀ™F÷÷t³ä6ìZî#ÀÐ:RÐ+IHswIŠ¾Ú%+ ¼gZæˆ=ëgœõö~Ʊœuº||ώƉEêôƒr²eõkœ^1·7ÅÐÄçx ¦¢é±Œ§–øØy½›X¹]b}ÚÜö´-zßy½™XiO»Þ†Û†'+aºW©œ>/¢l“‡ÈG¸ØnfpCÞb’ºŠ7à)‘ÕN:»ïp¡’ÕUBz"·°¢•SÆSäEåä¯Àå¸ÌËoxwÜøŠ®$ŒýûÝî*Çw¸luê!U©fs57Þ‘ÃCì9wàˆ1—ÞGǦŸ¹:ÊÿO7L*.;b¯øᰃ˓qãèP)G‡~hoT&î>:n·úŽ"øìí(PJ*¡ï™Ã3ž(äìqnãUm+™¯œN`ÜÔªGƲxì‘_‚Zï‡gb>ÂwÉrõH¹YŒCåªÙü¥ÚH‰Ã–ŽØ;Á¸±öZÞ3aŒ(þ”‚<®+|[Hs?þ Û«L2Iæ~ls`ሴ{¥ìo…¿Pšm‹óAMÜ«©ä¬ýø3UnA}Š:Çhá1å‚õ¬÷ÐÁ:‡¶(TÊJ‰zà<"·x¤œI+÷Qq|à,Y‚ãÒfÆz®µg}†\fÈe\þŒ\œÖ§ãæè5ô½ø¼Käšû.4¾VŒteâ¿Mølå'È`+>'P$–`Ü[ùøÀ#©¥Þô È<±ÐÁºYÜš‡F-Q¯£ Kˆ.Z/¼Âú/·ÿ] W|Ù¶ÊtHÖ‘J Gôýsî? éxQ'Õ%ôHYRýo#?LçLµ‡=¾ÊÛwÃRÙŸqtÑÌ},•`è?j8®Ø|¸È-œ¾Úedœh×e΀‘±~ÆYoïg{ÁY§ËÇ÷ìhl‰x›Æ Y¶g¥}´ßùߘ%ñÿé£Üïðh0šÿ‹–þ.çòŠ\æÈ凜Ã{¹¸Jv/œÕèºß…‰l_c–(S..ÕÒ—=oèfýPyEÜÐÃÞ]Ä"Ø…Ò•K\<(˜Ôäz¡RW”>C.3ä²@.¤D[䊱oDÃ{ t®-êû.Brráç–Všÿø!7QõèæÄôÆÿqó'ô”)X=¢DÃ]$³¸Tz‡ÈeÎÅ-àcΉªñÖH4d‰–ˆ³·*tTÒCŠÅe…fY™,ÆŽ‹".;8wÛ‰Ðÿ­öæ2¾\Ðsêåâ!sEõØüýºy 5ñH9SŒ+ZñÀ¹Õäº×Åi·’â”k%­ø–?Î…JÊæ‘s¿S¨PNÖw"½ßo‰¢…èq°ÈTbÜ,ƤæRS?…Îÿ/sÅ_ß}¬€[’|°Xä¹Ì‘Ë[¨¿Q.pÊ'5Œri¸ ÷Õ.¹P½.3’|,X?㬷÷3Ž½à¬Óåã{vt$ΧÒϱ,»³Fk¹½)KY|à-˜ŠæÇr¤Xä±óz7±r»Äú´¹íi[ô¾óz3±Òžv½ · OVÂt ®P2Ÿ‹‘ + hÊd+V0¬‡ÝqC–™«£Vý)Kê»Æ°öΤqÃy9ñV·ÛÃÀvËFâTŒ]GôŒÝ‘û-O…±‡¸µ@èIÔ%txKI¥Ÿ=˜‹Xqi.žå¢¼l™¾|@TV/tº²öíà™ñ%â–’{Î=ô";¤ýï;”лùÀ#ã‹)Z±â²>³®‹ƒ¬è¹É:ëÃË¥M¬ÑŸ·xäSŸñŒÁ¢ïŸ×\}6~ûûU“ܶÒ÷ïºÀC?`Ö9‚e\ÙøþUHʲ¨‘CÛb_%U)‘4 5[F˜qc«àr¾AÎÊÌ YÆÄ’u àZ°ŸAã3^Ir2ε1öŸúQ«¦ ,K?>3@°æ[¬9ˆŒÀ˜z­ç€®,—P¢åˆ­bk$p.½§ghR„Z1§¿aË=v bÞò—!¡ëÍ|«MÇ´F²CXÄ‚áš“ô(§"I¥Îî=ô £T+öëhÎ+0·”¡Q[@·ú—I´¹ 4‰À¥nPå&¨c¬©Ì§çéX +ÄÍËu.ñ¶ן¢Ø·ïOQ÷%Š^~üZÕf(fÁ‰uÃBɧ:½'Æ×ØÍG¼†iÔËeš|ûòär6“r>ŒëóÃÓ3«J—zË·-§åüÀ)e>ªÄN?o^ƒ©à<° ýݘÄ7¿êZ–u%K_ÉÒß~]¿–e=­ +®~]þ,¯ ‡4ßI#CŽ2}?kð +óåc ]>]®¡Ëú–½BŸÆžØ»+ÁȬÇØ«¿YƆŽÑÙïO¡öeÖÏlú2ëôôÏ"ß–‹(õœgÞ*¶ŒbG¼÷ôñ9Gæ#>ë-磻 ô +RÞÕ#Ë%ßêžÓ#«Õr„-îýïý3s”\{W°`va=FZÊmêó{ß@ÿ2òÃ\=Ê5=B逮{>ÄZ'tG,ñ‘-ªkÎèÅaŒHùÜ%³Ò5öQî9Þ]¸˜÷:^,1þ¹Ò ºÿøP­žó(jIÙ qsÙ²–QÕâxÇZ2@G§„“(€WÆ”¸Ý¤oÐáÇPŒþøoùorÄZñ·;¯€7â­µbÌ1„€Þ2æD„"Ø7h†)Tî·èø:¯PêlžA縨äã\*4ä¤Ù¼é–)îÑ €Žñ/©Îµàãg?Ÿ•D:'ðP·z¡º^äõgN Ôq#Ô­_€oóŸa<-ð°mýÖ5¾Æ „=ë ròÞW2@WÀÆ}_.|_çoWÔkR¥§u¾Ÿ¶ö—Ë#Œ‘„rº AuÙjÒ1¡Ç¾U«¦ô…*‡h}wèѦ[nBäÚ>¢—=¤¾¿Á¸iÊQz©ˆ½`èËÐé0ƒ0;ÂÕw×Kø Ö’33¶B=ðýÕrœ¯‘ó9Ÿ‘o¯Pl+0ŽÙ xùøR!@Ñøc¥ò_ÙžC­–-_S+~ׇ§<´¢Ì[©eÌ”K÷G†þtº#– ÀÕQ~|Ÿo€óS_Ù{à Œ%<Ñ‹¤„ž9›c”Ó”khh½yI8ý¥‚iI9Š¦&­ÌåJGm§hÔ¶ºÅùr è¶å-£o¤)[4³\ +qÆE?|¤¼È` ¸T¼E 8šöy:äøs¬©óerÀxÅ瞢ַïOQö%j^~üºá¤‘×±(Öª7œ(Ùô1Uý7 ™uù°×³x‹H$Ñy¯% ãË“ËÙÌÊù0®ûéüÌU%;ŸÌ¬L߶œ–óo¬”ù8¸;ý\½H4´y(¤˜©¡® #QïÀÃ6Ô+ðÈR©ß›íø9¯‘óï³Ý…ñŹOûß_,a +¤ýà6O_g¶[§É<¼ÒÈG»÷§i` ÛNà9º œ¯ó8xÌêLÞ{ª½÷¼»\霵äd¡±o±>&t!ÖLëË+tmà´‘öÐúþžŽ1…KÎ6­±Ã`/˜ñ]=2CëÕ2þe×1ÑÒø +\B)²)ò1]‘ÀMúM`Î1‹´õ1wxµåF-§Zÿi­ªG»ù>riDGä–GD®ÂzDnÙ}ø‹ðf“ =”Žª½1fLoÄ ›AqSéC.á/Ô$ãE0”ŒŽžzŠæ\-$*g”JÜsOã|…¡¶Öos_F~ðéfíW¢£_=j§ìÏð•‚ýà_,•°÷òÇ2Î×Èyœ?¼VT®G$–Gl¡[/–¦Ø\1¡Î£œlšâ˜rQpn[3tH?wñÚz¹d€^„·üeLèÁ:–„ÃH„8kZäšt'"p:d’>‚õ¨2êë¥Fke„n Ø,“`*¨°œÔ#¿°¬­1L'¦ëótH5â,—±¸Çõ§¨õíûS”}‰Z§—¿nX1/8'Œ&t;ë”æW¬¥EEÀ0·ùÃ^Ïâ-Lëå¯d|yr9›Y9.×—gV/õ–o[NËù7VÊ|\‰~®^Ä óü"Üx—xÚV?o{ûyÛ¾VvÉÚ7£ÒÐwSæôIõÿ}f·ë™ýxÜÚ !î’“>£–ÿâcÊ ´öbžòhPeéG}™rzúgûóÿ•p»ñ‘x«w¶Þý•ò+7¼#– S(f¯ò.©ôpK¨,½›g°–ŠØ{âø-JÀ1DS÷R22áÙÛV{Žê,Ζ3߈Jý±ÎÂ×Èyœ?è,wsÛÓÍ ?oý:¼»ˆBÁ”îB@†”Ré +Ö1ÆG]1I¸\h cÄ>¹dK9ʽ§¯¯©çäü§ÜÅZË©óÔ±K*¥TzÆÃ^2BcDöz†]´pŸ†ÇZÑbýüxôgQOÈxH\Ñ{c~öÇmŒ {S ˆ©×øøŒhíÿø¸Óö&Æ=­&d<ï.+E5Ù +ZCB·q’3Þt¯ý6´?ôýµ7‰çdÝ¢vo/S”“žôý-}ÿAÛl>¾©7P7>xŒò5r^#çßQ…ªNê1H×À°ñéy:äÐ’ár™$Ü¿Åõÿ±_-ÉãJpߧРʨPÀºà#ô²Þøþ/IJ´$0‚=ý(*bVüX嬬ÌwìõöóÛ~a¯Ëׯϧš_››_-=º"uºä霌éO‚ÉK^_ ‰ëºryškr½]Þ/k¦%å¶ry˜‹2}myL×ßUIóý$T~ùýtfË9’Éžþþ“ÿí ú» WÒÌ=+G~ ,È…ªôù%p¦ÊÞ+ØÐscE^öÞˆ%·B­¦>3¾xÞQr¥æ¶GóÁœÝMKɽÇxP/\™öFÜ ÑžV¹gyäz–7:ù´õ³‰ ‰(yÞ²,£·g`’ÛôÛ3B×=ðÿ#|3…sk'ãþ“‚ï3E5¢µ…]©šö¦RõzF :\ 8¢YA*Þz{8:îÒp I%×ÑÂ×æä!­ +“Ö¼—;G¬9Ú³q Ésré1@Í™¸iß¡£K"pg÷€6+S +‰ÛHŠô£3ÃkÙ“Ã!E%*UðS·=ª Yqü¦öèø‚Îq%k†|tªX¦æª2úôAäÌ)í9•!Õ0hBÅýŒés¸OˆK¯á£—{²W°CÔÛ‚:ñLìÚ'ÎÓ§Pa™!¢¦6¡ºkƇtXL^ZP‹•Mú‘?<É…Ì’Ä"¹ÍЫSÖG®4.—éV r/¯Å ïß±ÕÛÏwìú…­._¿>v®T”ýRJ#NòLÃ-À%Oebõ§ 1Ñ7¯¯…Äu]¹<ÍE¹Þ.ï—5Ó’r[¹<ÌE™¾¶<¦ë‚ù¥2¿ü~:Hu«óШ©²s7àæ¤ Ÿ $akÍ™JÖ~Ü ÜQ7èà}ÕÚ{ŒÐQu¹VèBmÏKÊô¦íŒÙq¸¾€é–Ëž·³êŠéá½¾ï‘î‘ë=r}D®WäûÀ3ç~ lîîÕÅsÌq„횆F+0xµoÒ×2ýOﻃ2ÆŽQ”KêóWžqÕ=èC#£ÁªGlQ sé5=BÕÃÚ.äÀ´Áôá dQRPÓedÂ}2úkšŸÆòDÉ=æ(Ré³Åø¸öœÏþŠ ª¥îiâ˜bžˆÅzi¿?Ûmhâðb²°o˜–Ü…×'ÜúoU\÷¦Ð˜n‹©šîÔ|P–'õ5G-j}ÍÇD~²;Šålýø~A[\ Ér!‘Ò›ÅñÉ1†š$¿”š©©<òÜ©¡rÓ­"¥B2ç×¢TÑÊ?Þ±×ÛÏwlû…½._¿>¶nè·¹…’t¢U¤N—<TUºàL^òú¤p]W.OsU®·x?/žÖ<ì´î·|myL×ßUIó=je~ùýtšRYon¡BÌ +ã±7’IZ¡ãÇ{7°§¾A7G§´~\;<ÖšWJ­í…ÞQknÞB¹»µêˆEÎЗã nµ×—„™^õ3¤ñ ·q¼ºòÔ+p#«åŒóŠa$Y{W=¾¢ƒåZ{²Œ¦‹9^à#êŠÁæÖ@ñkÞ(!i„ýíÒ´Ào©–˜EgjìÅÜ&{î!í9ˆ^亼Âã&Ö˜UWâÜ#žè`KJ­þã¢Dš6\KU4rç½Y4&Í ‰Y Yuì º‡„.X"}Õ?@Ÿë¿£.àÇ¢Œ%ÖçÐÐ .GL¢ +m‘>‰Pt¤‹šÇ«9€K­=χŽM[^q|Ëe$-G ¢©ˆ†EŒ"-ý Ÿ.™8i_ó ÚJ9;é=r}D®XqÁül1•Åjé‡ÐñÀ_¡,AÉ’ÉK‹)‰<ý(ä ²BÙs¯æœ"ªn;Qn,5WC_–êÔø)5âV/Ó­rØßùµ8etÄÇwìõöóÛ~a¯ËׯÏû­ Ÿ¯0¥4ÊܵP‘:]òtP&FŠœ/åö„S0ZÏÖ¿ +‰Ëºryš«r½ÅûyiÍÆë~Ë×–Çt]ð]•4ߣVæ—ßOqÁ¦Ó¿V½ô 5®þ~CGôÒ —1nC}C7üÛ8fÕ3%Og ìcœÆ7p¡¤Rã=ÏÙsï3"ð\ Lv¶E:‚,™„7t\Ÿ±B7Œ²’bÊbÙN1 WÒ’éBn­—Å5‡K’Ú3}|EGÍ°E¯³EmÚ¡gúk[Tï‘ë#rýí°õ)f‹bŽæQ4·ÞæhQk$%÷-:~Í™Zã”ç¾× CºEðÍ…’Ö~ _p+T“ì‘|ÌÑ_H!Š¡£êžCʹ±{<žO4õ¸hyds·èFÅTCBwª\Θ¡¯p¹bA©®ÄžC#ÌÑZjȪÃ窧Þv€>ɺáWñ,Sj»ŽqLi,”ŠÅ”F&Qëér|Õ_’éd£ê“¨p4i½@ÐÉ\ìz£ŒõÓ­bÔr]^K¥‚Ó~üxÇ^o?ß±íöº|ýú|Øšáæê\-ÏÖ¨ˆO—<“‰Õ—K¹=á LŽ¯Üþ*Îuåò4×äz‹÷õr]ó°áºßòµå1]|×$Í÷¨†ùå÷Ó1J™R®jx¬Ð™²•3òãa-µB¯”Rî¡ÿµ¼ZÆVà™R•=º %c7èVÐøÅâx»š[ÙHãWªÙÏpGJì}ð¿=R¯¡Fõ$jÕPŽúŽ.m«A¶¥wU7¯=Ó‡oÑ:µ¨õj.½¢ýðФæø1ïé˘UÏpÊ~†[¤GGÕ‹¦½x1¦¾ÄMF^à½OFãK£SõÒ[ÆácþK=CÒ§¹QÝrã—<“ˆYÈþT’–Σ¯ K²|F¨{E¼.g0ýГ[/èªßeÞ·é_#?é‰Jë‰>>n%ΩŸEã ºsØ\d­ÆÌE‘nc½–.z\‘ëÒ&×m¯æcÎD ßð\ãkK†&æ¾E€?â×'àz2pnðå¥6„9y sœ 7zù˜îmÚL–÷šHµáý;6{ûùŽ}¿°Ùåë×çÃÞlªõRJCQžsb‘:]òtP€@Ž|¼àL^l}-$.ëÊåi®Êõvy¿¬™–ømåò0WeúÚò˜® ¾«’æ{ÔÊüòûéÙë<ïÜ÷þ·#‘ò†[àH5”#½!WÊVž™3ð¤¾á6ö€¸s°¨{Å wá7øÝJ 4æ¾¥é4¸‚ážx‚¢ÇãIE_æ>"Pp¦,¾Y†ò 7ä°ýžö&|Måž+£ã¶ÊýÌ Àd[Óx¾jhuÃφP•‚²Ÿ€üðîÌ”‘cÖ\šô5~v&JÞ|xØm-íÉáDq˜Ú(FµpD«!WÓxV¸[ª'å¿ùs—8¥ØIâT(TkçÈQñÄ©—•\ ¶Òýá+þ?ê«%É^E˜ø ×>BÁK;¼éûGLR¥.K¢<åñSë«"«ETH$”Šôÿ û½ÞÁÖ¶ Z™q'(M#OèUPš5RʸÄL•å^Ékχ»1é£Þ“ÀcUbM§á0µÐñypû\¦è5p½®ÊðR8¥§M;¸¹ÔòŠœ?½:áTÂZþŠÈ­“òo˜€ç°Y†EBäø-Ä%c…¦5ZÖþDÏWÌyÂÊ¢f«Sç¸M9ã èM?Æ?læÛ{Å!­xÿ†`_¾¾!î;‚Þ¿ý¼‰­øl÷“{#ëv/¸.m<ê¸(#`lÿØáLá¶ÿu¸oÙOn»sR.Ëíývæ*’_6笌¯mÛr9ð+-å¼F®,Nßï.R Œž§0vyœô¼âV}–ßõ+©òQßXJ ® Wîó°~Îj·š©o\ñ¼—TãUÒñãWWè?h;p§Ö|fKšwá¹Ug–´}È(Ôf3ý×ÊòØO®€‹”#M\“,•L}îCä¼caG%º&t8®"÷ž7G‰}[ž_£Wû+|Ëó¡+YÈ+ŒË'z˨ç:ÂÍk* Zð§4¹LÆ:g}yºX@Z8RJ‹ƒ/ËÈzy0e K©9Ý¢5Œ:„‘ ð /™õÑŽª¼B_žŸu!vIÙIQ¦Üy&Ìú®+oÎÃI9Æ Ð•œ_ỞÍ¥Òc.–o£x1ÏÈ•ÑFk?Œn/ wÈõ_É94±7Ÿ/ÏrdÜÊÌ•õI.‘² )I³žÑn+¡vÔ„–„ž8ëCÎMEë—h£*f¢õKT¨ˆäæ„z¬×KÍ9‡¹ñl3d„ár$Œ‹A/Öýä­S~KÆÁæ§cmLl²½×B­Ž÷oöåëâ¾#ØéýÛÏ›ØFÜÀ½ÃÝ—‘KŒG7El¤ïüðnÁnû_C›ì'·Ý9+—%iôræ&àoûÚ¶-—¿²RÎk\Ùâôýî&½âß[ÉðÇ4½ã +w“’Êj|@3Lë©Ä`‡Ð1Ótì§C‡ók ?ÉlìÀ'ú\¢ è‚ÞQY˜¾f‘F™8Ò—5³ŽVÖtž2@¯$ÎGЗ$ Ü©IÍ \ÏÉuÅ8ãó8ó×ÈüéþúÒÂT}IºÀ¿T9–DŽVÊì3ôõ=€¹Ïâ²<ÍæÇ+Èòü Ã(¬ÏÒ²>Yàt{‘ŒrUì‚ñ6£¶U“YЗ/Q´Pæ–SϱðžÓé¦U%³zdפ º¨”#ϵ$]๊kJM‡éêÕf¦ç LWÕ|EŠ>Z‹flFLUmnFËGƽó\ ËS%*±ðQy®©,JZÆáœÐ{{…žF‰†Èœõõ™.¤¡9™ž×¹Àèb¢›ýâ òÛ èrýwZ‘P±6Ï¢ŸËs½F®·Èõºk™gÈxX tùæA%bv-ϧÊgXܦ}&KwŽ™ˆK?P–%é‚œ7¯¯¦Ë“Qžsmäί(Ò'ë9x.Ý_݈þáRp¿ñŽß½-Pf*ÞO?Æ7¨æù½* ãõb}ùú†°ïˆuzÿöó&4†Ɣ厜¸Þ›P—:îÉÄÛÃ?v¸Ì«ÛþWÙOn»sN.Ëíývæ&àoûÚ¶-—¿²RÎk¤Êâôýî"ZA€ÁÊè\ÆÂú»C‡)5›õwa-Ø¡µ#̲ã·UõYÃ2°Å!¿–júºÊ:û_š!ëÁœ‰ž éÁTÙSB_BÈK¾uŽÈã5và•º÷ÙS'   —³X¾9†kªaàJ]ºª&̹R´6÷¢õ7*åA®\H‹%4‹Ð Ës}àèŸÑró`Í:Î1·y¶XŸ.Èyo)âPs“£ynIèÖ¨ÖÈ™uxEѹH×7¹Jæ–S]@—q&#]”J×£Ñbͬ Uõ#}Yº’÷Œƒ(~[fY\wn™M×úÀ[® +ŽóìÐ@·À‚ô|IèhE×2¶"˜.•:ëy†"5–”9Ç4ÊQçö¿|ÎA–¬Ã|Kãz$ŒËBwžûè_#ÿ pùeQŽy*sΗçùè¢fs+Z?ãi©Âd#ÞçSåù,™ýyßbÄ|„|MMdt¢˜»ÿúD¯$Å<À !1PxGlo·Ê8ˆïÇX[¡Öd{¯…ÜÇû7ûòõ qßìôþíçMl§¢ÞÏn•¸—-—:nÊÄêw\,pÛ_ R+ûÉmwNËe‰÷çPãÌ8'·Í9-ãkÛ¶\üJK9¯qg‹Ó÷»‹Hƒìz(ÕxগýïîÀ+E9È#×9?š×nhÖ=•›Þ¡;r~”ô¥ZÞUÒ­÷DãºBKÉ(-Š=–e§€x#îž±<[¡bIÕ<È[$½®Ø"­Í²>Íîˆémâõ·þ+ÇàÕµÏÀž¯ +ÔÍf–'€B¥·TCãUïÇæHÑ—´-©°eýП/ŒFê|?ÜePt&e9hE+ +#Üy/2güù%úе?Æ% +Ÿ[P§)K”©×žÓ/qDMh»”zçyžËQ¤ ÌÜG3¸¥z¤.kò¼Ã$äy%™}Ëú°J¼¢…~SªÙ–%ý(n1ÏsrnTšem VZJÃe# ýsµE¯‘ë-rýCmòâ9‰žØ乶¹­¯‹‰-®{K©ŠÖÈõ|MUTüHgèë³¥P¹<3¤Ü1ÊÙ+F¹ç빓5Ÿõ|}QlĵÌÀקy¥Rí<ÿŒœ—ã]“çFÍ{ª­Ô$NÞ*…·ÛqÂ~Œ¥@î¹m¯9ÈXñþ ¡¾|}CÔw„:½ûy—”îâ›±¨SR\ÚxÔqQ&F+9?üc‡K0 ÙþW! ÙOn»sR.K¼?Çg®"ùesNÊøÚ¶-—¿’RÎk¤ + ùûÍEÉô~îyÆ<ÿw—ƒ¸PWÿ|Z>M vè Eª!æºuRë‰&+ºÔ–ÉÛ](kG˜dCâ`ÏäK¯²^KRº4©õ<¨…¶”<¯dZ5i+jMsªK%éq¤.kBÇBËlÖ/R¡N5Æ\ c”Y_þù«JÔF9åëseŒ¼mVÅåÃãb"J5ð^E%¥šƒå‘TÍCo…´¶œ“hPÍ9\yJEO«.àyˆ9ô5Éâ(Ñ:—è_'ý7ÀŸ?Z(Õ¢‘æmü¶ÌýyàÑñ›_Ÿ*°ŠÌ³²¬œ©•’¸>p#ÉØ*U ΗoÌá:g|yàèùì=¡Šƒál‘ÒÚ¢s²Ö”F Úº q]ëì—Ž 0&£µEÎ-¸òõµÅ‘óž“,fuîŸ È‚œ7öYYÖ'‹P4N<_Í?e„ë‡hIºÀpÁ{ʬçòæÐÂ*íäI«ÜŠ"ã ÑN?ÆÚàjض÷*¤êxÿ†`_¾¾!î;‚Þ¿ý¼KIk­žÜaŸ»Ý»P—Q\ÿaX&¿{à ¡¶ýµ„ì'·Ý9)—%Þ·ÓåÌ8'·Í9+ãkÛ¶\üJK9¯‘+@ý~s‘†âgÃü’ÈíÀ±ø/÷U7ï~…>†H<»rÌVmÍaÚS\>¬ûýmJ3ã‘([Δ¬{I“œfh4|ãsâe[~ãâ”Zè¸ ¸"G:åÐV¼þƒ\œ§¼å¥ûä<:VÙ +—=Jõþ¬DLu07‘˜pû 9 ÁPóu`8Š)Szù¹  œGiÛÆþqÇô^}Æ +»¨Þ¦*f¸{YºuÐkÛèWjÑÝz~XÎËŠçê?Eƒ“Žèww/¡á¼¥.}Vÿä¥6E-„‹Omº?åûg(C©mD?—r¹E.säòAÊÙ‘'ƒšˆA¡Ø2>>Ç/ àò{ÄœF>Âoí/,ârέœw,Iè–ÝêSX`·R1Ù„bàCÜrŠ]BGŽ&DºÁ@4¹îÐèm¤[ôœý)úETVJ‘… µ«‹p¹ãô^s” ·’Þ¿.¢%RÞ—£ ÕÛí8,—ÊŠW´åÁ¥X¢IèvkQŠN|9¤†¢‡,&i‚º5ŠAh“”ïNR> º IW¤±ÿp1 <8enû¹ýƒåWcå àÈ˔㠹¸˜æ„Ç"ÃSŠº"<-sMå‚õ®úúx­/¸jxùñ¼ $SPBŽ|â% +s‡O¬ÏÄÑÅo —4\—ÙqâëÉi6Rrb=ç3õHºœœ&#'õצ©?x%Åc0Òðsöâ|Ì2–¼R¤XªÖWèâB([л’ßÖ£h ½[)¸Ç±¸åKûä¾4É2empNÛ¶ÑçBÉ”CºaÝKhS´Û¢w#‹”t«ÿê’óÚÄØòÓ7‚ +-ûCÏØêÿ ÇÆ@ZF¿’¤ý—Qx÷HmœwQžxÅsõ*„ö+[MO¦ÜÑþ9Gõ¯û9$(ÇÎ-„Kr€o°·p£Í~N$Ÿ-F:,W +²%Œ}Bõ†–õÏF¹E.säòaa,+ºØ}†bÀtH;·¿¸` Òª¢qI—•0·¡â2E›¬›uº àÞ¢]Œ0.þˆú¿¿º8Ý°%Œ}¦hpB‰L¦ht>¤­þ¢Oèv5½še›6=¹”CëugÈçr™!?L_²‹´ÒÝMùQÀ-K@ÅÀ^e¸ôlÑ° …ÚôÜøîÁ‚qL&ãÍhI&KRT³Qu‰.kncÝëê©©XÏN}àA 6{ž›]òðî4<Õqð.B¦ÆuñNJÄú —}}<áÞ\6¼üx^Ð’‚'ÐRï)Ë`TÎõëS tñÁ3È% ×eˆwâëÉi6ÒrNëÓ™z$]NN“‘–úkÓÔŸ¼ÒâÇ1È +iø¹xHÉ•$d‡þPhê¡©;„æÿè,¼¥eo„¦Þšºƒ œYÕ·vÃë€XîìÃ~‰uþUèoûÓ3ôäüš±þåXeý}¯ôñxÙŠôb7\‚eèV¥-¤7Êz$')·†cÿ$Ý_ÕQµ³¶s·2&ŒÑn%Mvà M9ùÎÕan–r»æºH»ì‰KB?f¸šUE ‚¢Ÿ5µ(u]hHF:Õ0n5ÎÝjw½‹Tßm͹Ô5é¸Ô(ᶭ"<Y”@·j\jÀX….ÎÛLÒh·ú§¬m í¸eY FKL‹U¿…p1ÚWˆ ,z€šFŠFÅ‹á’¬†K4›¢°ÉRd·†ÂµíåŒfgpÙ®i1ëpíqÅÓ ÅÃ(ÊÜ(¹~ô2Ã+ðó®elj¯'§ÙÈÊyˆõ<œÏÌ.¼Þ7ýÚ4õ篬|ûþ8TrF +â2èøç†çúJOøÃpzüãjLý;¾7O¦8dºñ _¨ÎÓƒrç*eœãý©ðyÃ8œöœWë¶Ëê ua`'XÍãüKý¬Pž6à;mÁ಩§mõÿDr?!7úχÿ'å÷ endstream endobj 12 0 obj <> endobj 68 0 obj <> endobj 333 0 obj <>stream + + + + + application/pdf + + + RBPassUp + + + + + Adobe Illustrator CS3 + 2008-07-03T00:35:39-04:00 + 2008-07-03T00:42:04-04:00 + 2008-07-03T00:42:04-04:00 + + + + 256 + 132 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAhAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7Z+WOpecr3VPNZ8zWl5Z uL6JrCK5SkCQtboDFbOCUkVHRqumzH4upIxVker6h5otGuJbPTbG4soUMiyTX00MrBU5NWNbSZRv UD4z9GKpjpd8L/TLO+CemLuCOcRk14+ogaldq0riqJxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVbNNFDE0szrHEgq8jkKoHiSdhiq23uLe5hWa3lSaF68Z I2DKaGhoRUdRiqpiqE1f/jk3v/GCX/iBxVDeVP8AlFtH/wCYG2/5MriqaYq7FXYq7FXYqpQXdrO0 iwTJK0LGOYIwYo46q1DsfY4qq4q7FXYq7FXYqgNb13SND06XUdVuVtbOAAySsGagZlQfCoZj8Tgb DFXzlqf/ADk95h1HXbhvL0ccGhLMYrUTxgzuqRn42JqF5seXGm1B74VT+w/5yHutNs7fUvMH7+O8 +rQW9lAsatya/uIp5+zHjbwf6vPiPh5VxVnnkv8ANSx1Kz086tLHatqME93b3EzpFyX9ISWsMIj3 q/ELWhOKvQQQRUdMCrBPCUZw6lU+0wNQNq4q4zxBinMFxQlBu1CaA0G9MVdDIZIwxUo3RlPYjY/P 54qvxV2KuxV2KuxV2Kqd1dW1pbTXV1Mlva26NLPPKwSOONByZ3ZqBVUCpJxV4p5x/PbXdC82a3pE dvaNDpSy+h6iSAyMYlaEMwk3o5PIACowq8G81/mDr/mnz7qd9d3Uy2cyp6OniR/QjjjCBFWMsVHU k/5RJ74q9q/5xuvnvfMnmG4LOUe1tzErmpVGllYKOtKV7YlD37AlCav/AMcm9/4wS/8AEDiqG8qf 8oto/wDzA23/ACZXFU0xVD6hqFnp1jPfXsqwWlshknlbYKqipJxVS0bWtM1nT4dQ024S4tZlVlZC CV5KH4uOqsAwqp3GKowFuZBWigCjV61rX7sVYZ+bvnb/AAh5MnvonMd/duLPTmC8qXEiO4O4ZfhS Nm38PHFXlP5B/mJY2V3rq+Yr0RNdQRajcandPRSUJVzI7dyXFPE7YVfQrXVssckhkUpEaSMDXidt jT54FdbTmeL1AhQH7BJVgR4/CTiqovLiORBam5AoK/LfFW8VY3+YutS6P5M1S9trkWt8lvIbJ6ry MqoZKIG+0wRGangCcVfLv5o+e9U80a3WS6eXSY3ml0yCRY1aKKf024MU6kBVBBY0IwqwLyvpl8un x3T28qQPMTHMyMEcFONVenHqMQpa1KG5udV0+3dndbaWSik1CIJg7AVOwqxNB3OKsj9bUdNtSxlP qclW2dWH7veORGWnf91ih7t5D/Nee88ovLJcpc3Wm29i14tu0fqlri2tvUkZPhCAz3DVp8PJT3BX FXomnWkmp2bGK/Fxb+oyJcQSKV/dOAVIUv8AECoPWoI47YpT6KxiSJI2JcoR8X2ahSeAIFBRcCon FXYq7FXYq7FUvl8w6HGsztfQlbeCS6mKuG4wQsUkkPGuyMpU+4pirCfzn167tPK8UVm9bbUobwTl RVmSOyknTge3xIMIV475t/NDW5dR87WkCm9Gu2I0vSbeevNUu7j0hEioacxHdORv1HcYqkFj5R88 +cI312+4Nc6lCnqXc7LH6jLGU5lUBI3X4vhG/bFCb6V+RKpdxajf6kBKyD65aInJdmX4UkqP2V32 69MaW3q/5OeSrby3rupPaTPLbXNpCgEhBcNFIxPQKONHFMSr1nAlCav/AMcm9/4wS/8AEDiqG8qf 8oto/wDzA23/ACZXFUyaaJZEjZ1WSSvpoSAzcRU8R3pirA/zx1uPS/y51NSEaS+UWkcbNxJ9U0Zl H7RUb0whUh/5x01At5FjtldJJhcSPKrseQUpEF8ewb7sVeuYFfLX/ORfmTUfMH5j6F5Z0q6e402G GRhZLWNDqImubaTlz4BmUQ8EJ2HxcftGqrz/AMx6bqXlqzu7G7jUS6jpSq4rui+oJPv5QUwq+hP+ cfteXzV5OsxcXAlfRU+pyW5pXj8SxPse6DjyO9VPzKr2BVCqFGwAoPowK3irTEhSQORA2Hj7b4q+ YNa85a35o82an5QupJH0621G5u7C6ZfUMcFyl5YEszSVZVbULfgqCgQE/Mqnnlb8utE0ZVnuIkvb 4FyjyfHHGHJ2RTsarSpYH2woZPZaJZmKOxsrCMxRu0sVtHGCquWMhZUAovxMTt0xVJIvyJudb8wO 2pA2Olad6yxVoZZmltLOOJkYArxRoJC58dqGpoFSPzl+TWtLf3EMCv6M2oJb6OSUJuFNjLIoY8lV T60PFmb+auKvKfIVtrnlybzPbXVvJa3ccMME8LDdhFqkUUqKdwwEkTJVe4OISWZwfmkvl/8AKLzN pnrSjUtfu7u30mJg0kUcbmIXe9R6Z9K4YqR+1viVD6Zm88eWlsri8trxL6C1kto5mtCJVBvJViiI cHgwLNvRtsCpza3VrdwJcWsyXFvIKxzRMHRgDTZlJBxVVxVTuLm2tonmuJUhijBZ5HYKqqOpJPTF Uh138wfKOhyGG+1GIXAVHMEZ5yBJK8GKrU0PHr/XFXl3nj86rfWIoNJ0HTjcmO+s7y4luXNvFJBY TLfPGjMpPKT0EjoVP2+m2AkBnDHKXIEsQvvMF/HA0cV4sMVylzZXcUCmR1tLu5eeZeRDKxrctTp9 imROaIcrH2dml0r37KHl7XdX1KVjq99cavGha2t7TmECD0Ui4KPU+FnDjlt+2e3UeKe4sp6KMeeS Hw3/AB+Amy3esSNoEcelIkkUsUVrcT8X9eR4GCJHIQrKzpGR48uIpg4pnoyGLTRFmXFxcu+Pmfx3 p7HresTTfUrGxl1K+tKvqPooTHRV5SIjIXAkUn7LfLuMHinl1ZR0MSOInhjL6f0X5eaH1DW9egiW 01fy9cWjX4CQLJX02RiI35sBVTyNKU7jp1wHMaojm2w7OhfFDICI7n72dflXd3t1LcTahDFaTTQR 3FhCs8ckklpOeSyNGpLKPhX4uhr0ycJk7Fw9Tp4QAlAmQPWtrZtresW2j6ZLqN0GNtAU9YrSqq8i oXNSPhTlyb2GSlKhbRhxHJLhHMpfbeYLPXPLl/d20csPCKSOSGdQsiMYRKvIKzjdJFbr33odsYS4 k58Bxmj9iK8qf8oto/8AzA23/Jlck0sV8z39zJ+aXlvTFCrHFa3FyshrXnKfSKmjDbilR74UJL+f WnJrJ8taGkwiubm6nuRVS1IbeIeo9NhQNKgpXviEsZ/I66vdH86S+Vbm1CxS2KXsTSBllibiB0YD 7Sca/LEoeyeZdcFnomuvYTI2q6ZYS3Qh+2yN6UjQlk8GaM08aYEvD/JqWyG51XXfQ/xHGrR3d5I4 9QQ3L/XWDoxCxsJ7hlNFG4+WPEO9s8DIa9J9XLbmnH5jflHB5hs9DkkuGtdR1O6XTzMqh1S2lhml 5Ov7RBj+H4gByNa9i1vNvy6XV/y187ahp2oSOjaVb39Qob0p2QOttNwqOSNzDDwBxV9I+UfPen+Y PKEetQyxSXMduj3sCMKR3DRBzGSK0JJ6dsCpLqf51+XdHstLm1SCY3Go6bFqRt7Qes6mQLWFVPGr VY/QMUgEmg8284/mfr/mi1AjQ6XpDkFLfkVd0dOVLh60r2KR18K+NfiX9O7mR0gjvlPCO7+I/Dp8 UPoFh5p1I2MelpHcCLTRJbW9tLxEaK0CxLKZDxE00XOSMP2jb4TTaJjLmW4ZdOKhEbE7yl923yLN fK/5XWPmTT31HVb64FqZZraxs7c+iIktJHt1LVMlWVlbj7detAPBvmkdpcAHBEX1J6nr827by1+Y XlgW2t2b3GoX5kezn0q4n9a3aNhwjuiymJYkpGjMCDTuRvSHDMbuSc2ny3jIEY87Ao+7zT/SPzMu INOXU/NKWdto8+1nq1jK80UshkKekISplBUKWZum2Tjl73Hy9ngy4cVmY5xP6+SN0780/LskVqdW J0iS8ia4tzMyvC8XrGFCsyfAWbZiv7I6+OSGYddmrJ2bkBPD6q28+V8kg/MHyF5eutU0NbRBYSaj Pdi5vkc0YcbjUlEjNyHpteuZCPfam1LbcDhJNMU8y/kRpV15v0q+lEFp5c0TTo59VJqLe5vkDodm 5ooLQxGVePxL7nGwoiSaA3SQeVNR8qJp9rfayjWSend6nBYT842NjLJN6TLVfUfm0IAK9W2rTCSA sYEmgLTnyr+ZUPk3yvH5Zs4F1ZLBpXjvuXpRTfWbqW5fhxaRh6aSqvT7Ve1K1nJHvckaHMTXCfuS DzR+c3nHVrx7ddUi0HSrh5AYYwvqPC0VBGZpQHDDiSGjAJJ6dBg8S+QbjoRAXOcR5DcpRqJ8wa5G 9vEb3WllCvJBC1xdFyHIV+Pw/tHqNsfWe5jE6WPPjl8gE/0D8pfzGlhmSXRhZO5cm5ubyMGRm5uG YxepL14qQ1dz7Vx8MnmUHVxif3cIj3+r70bffkhr2lvHquqarbpEbm2tIIbVHnIuL+dLKCRzJ6Jd IZbhZipPxcePvhGKKy7RzkVxbeVBEW/lSLULSZLI3DX9jYXWpWgXjI73On3klukaJEkY4zPbo/Gh o2y9TWwABw5SMuZtNPMflHyj5C0211LStDiGoanZzxXUkzSvLHJb2b3KSQ+ozLFKJokJbjX4R0O+ LFi2oap581C719JriKSTyDarqUQuApT1LG4t7z0n9Lg8vM6eV5F679cUsg0P8wYvKX5deXlkuo21 yb6jq+s7RI11b6p6twxFQzEooVXYL8O1NsACTInn0Z7o/wCaXk7zN5W1K9t7+K2a1iMd/byt+8ga SD1BVQObLxJ+JVIPFqfZOFCv+W9zos+nC0hSFtZ0CCDRtQuowrF/q0YUFJKBjEzKxWv3YK3tlxnh 4b2d+Y3lvQ7vT5NbvJJLW+so0jgvIjMGAM6FVpBWTdiVqAaciaHKcsBVudoNROMuAbg9Nu7z/Gyh 5Ltbu28nawl1dC7laa6f1PXNyeLRKV5SmKAsWX4q8fiB5d8OHl8WPaEgZihXpHSv0lkvlT/lFtH/ AOYG2/5MrlrgvOfzOvrfT/zL8p3wuVtzEyLqDCTiwtXmoOS13UtXoPnjY5MvDlw8Vem6tF/mT5i0 O383aTaXBl+twRNE7pw9JIr2WMyM5Zl4mMWqseRAow96QlkEXJ0+inmBI5D8U680Wz0T8zbDzuk6 NoWpWdppMLLIrs11czJb2yxL1ZCrKxNTsGPTJg24sokGjzYn+ZXmcf4qvV0fUTFFcm3j1GUqGWN9 PaQAKa/Eq+ozOP8AMwlI8hzcnDiiBx5Pp6DrL9nmi/LP5f8AlHXrcxW3mCHUdZuRBqfqOjNOLCXl byoQWTlyeN9ytYzQbVBMJYQR5uTi7TlGRNenpEch3ft72W6dd+U/y81SfSr291AR3kAu11DUZPWg PpEoYoygFHFRtx32HhgBjA0yyRy6qIkBHY1Udiln5lz+SNe0qx1K1vrNpbmVLa6v0McsyWB/ezjg TzBHBa0AcdO5BtGSPe4R0eUS4eE37nmNvr9p5Ya80Ly1rCx6BcXa3BvZAwmcksq24WnxqkaKW4/b 3Gw6x8S9otstEcdHL6R3dT+r8bJjov5R+cfNLLOZhpmkXPOVNSkUSFqkcHhty/xB68gzbU6HHw7+ rdkNcYCsQ4B8z83qvln8lvJ2kQRG+jfW75I0R7m+PNOSoFZo4P7uMGm2xIG1csGzgykZEk8ywO30 G90rW9a85TSBtJTW7mNkhQg2ltpmn6vZoSFAHDldRInHCh5ldfmB5j0i50ldGuWsl0+1jEVD6nJ3 HrSs/MEOJJZ3bi1abeAxQ+hPIn5v6b5m1mHQpLc2movp9rfBpJFpJ9Zsra84IKLVgt01QOyE/IJT qXyLoj64dX1WY3scRYabp9wEFrbB4wriOIAKxPEncfjvlfhC7LmfnZiHDH0956n4sa1jyZ+Xryyv BLKgnnSe5toTyjaMjjJFHyVvSVg1TwI6AClBQHAG2HamUDfeh+D5sPXydPCk+n22o3LabciSts5D W4o6mFTbtzqQFX4uVfh98j4B5W5Eu1gfVwjiFe/z3/HNEDyHaRfuZ797bSSPXOn3FysSO4Vg07iR gz04cthsQflkvAHwaT2rMi6HH/O8u4fd7mG30vlqa8t7ez/0pb+R7RbsmST02uXaK3mCScFYxtGd u60Na7ZLwYtX8pZhyNe4D8b83oP5Y/l/5c82+WbfzPqizqb97iNdJgl9Gyh+rXbQq0aRBHJb6vyb kxWrNtkgAOTiTySl9RJ97P7L8r/y9s3MkWgWcjsyvyuIxcEMn2WHrepQimxGFgydERF4ooVdzQCg qTU4q3iqhe2FnfQrDdxCaJJYZ1Ruglt5Vmib5pJGrD5YqugtLS3HG3hjhUcqCNQo+Ni7dAOrEk++ KpT5u8q2PmXSJbG5pHKUkS2uuPJoWlQxsyrVa1RiMVUb/wAi6HfXWszSoY013TzpmoRQhY+cbmXn JyUV9RhMRyPgMVfPP5j6dqGsfmV5tSSs6w2k/wBUMjbItpbeswXw4qSR88KHk0Y1HSfOOpaf6zRv FWG4WNjwZlAibwr8LsvyJ8cUvpH/AJx5urmPXPM2nyRhI39K6RiCGNZJU29sSh635n0Q65oV1pYu Dam5C0nVQ5Uo6v8AZbYg8aEZCcbFN+nzeHMSq6QGm+Xl0HytfWCtA68J5A1vbpag8k/bRCVLbfaF NqCm2MI8Iplqc/iy4t/ibR/lT/lFtH/5gbb/AJMrknHeSec7f/FHnHzRplkfVutLTT7qE8QABA3C 4i5uycftq56ii++4F35NpMeAAXxXv3eVJf5P8x29957v9R19vV8ved57qw0+2ubb1VaezksxZ1ZO VAyXDRlSBRouVa1pERsb9W7JkOOURE0Y/eefu7vgt86Je6HpEfl2XT71tQ03UV1u01C1RjatcQxs 0Atom9XikX2uAHVONN9qokx2pz8uOGeshmIxA3H8VD7yT96ceRfIt9qP+ItK802lvBrC2CpYyH/S ns11MTqxYhvTeQekrcl6bqrUy+IoOpyz4pXyedeYNP8AN/5T+eNJvbeR7bTp9M1LS7fUOEM3rcJ7 m5hVlIk4MWa3k3A7joGGSa3s0vnbyr520uzu7Ceb6vazR3FxZTW8ZWU8CywTCQOtOXEngTTtvQiE oW34c/h3Q3Ir3MT8y6d5Y0aFfMF7YJZW89wpSO2VVEjqCaJEWFUVviPHatK4PCi2fn8xFGV7V+Pu TX8mrPTvM9pq3mG70eO3eSQ2ej3ckCiaOx4khI5CtNmkbkU6n6MnycUkk2XqejaZFpWj2Olwu0kV hbxW0bvTkywoEBam1SFxQjMVYv8Amh/5L3X/APmDk/ViFed+b/yROrTa1q93eRWdxc3dzLbNIC6h JZITE/wEH7KyAqa9cKHzx5LtL3SoDdSXP1C7LOFjB4zcJYijbAhl2OISXoafm/a6HZJEzS3z3Uh+ pWHPZHkvrj1mkkIPE+iYuxJ22pUhRSIg/OswpCx01bkg8JlmLCrCTlsY3XYwbdPt79NsKpbc/wDO R/mnWKw6JZ22gW6iITmBVklkkf7Z9Rx8Kh6lOIqB3wJYL51tPO/mXT380Xhu9Vs7CSWC7vpGaUW6 804qxNeCFpvhA26++AqH1V5Q/JPTNH0p7W/ujdXMqWnKaJQjRNbTi5ZUZuQZWlUblAePzw2r0iGG KGJYoUWOJBRI0AVQPAAbDAq7FXYq7FXYq0zKqlmNFAqSewGKqVzd29sgeZwimtDua0Bbt7DFVH9J gmVVtp2aIcgvpkcu3wk0GKsPsPKN3HrmrapLpNrPcahcTSR3F1RikM0EcLwlQ24b0zXbvhQkXm/8 mZPMXmXT9enhs/XgCwXKo0iBoRMrgenTgeCl/dtgTiqbeTvKtn5d/MG9tbeRpf8AcLaF3YAFibmd eRA70jGKXoeBUJq//HJvf+MEv/EDiqG8qf8AKLaP/wAwNt/yZXFXkF9o2pXFrq3mvyvfNJF5huL2 yns5UjHpRS8kcySiSXiOcfJOC1oV6ZSd/pdlAiO2cbxiOHp8Nu/vR/5k6JceUfJ3k6extPrkXlnU La5vVjYJ6jruxqQW/eS9+JpXLgNnXzlxSJ71ur65qHmfzNocOi3DrqMer2s1/ZpKqNHYWUyNeK5Y oWT4+IoKSfEB0IwsHs2BLyz/AJyI0f8AS/lDTbZLhYZotVgljRhUycopbfiKe84P4d8IV4T5d/Mq bytp97HZ20c0C2hnsYp0LD61sA0nFlqvBale5A6b4oV/INzr35r+bLW28x6i8k01pciGYJ+7t/To VMcKGNAPhFQKVxS+sPLOhw6D5f0/RoJGli0+BIFlYULcBTlTtXAqZYq7FUHcm6uYpYYYxEd0LzqC p2O6qCa7069sVQ6eX7d5hPfSveyjceoaIPGiDantirxr8zfynNvoNtJp8UcmtX+uXBCxkKJI7y6v J7aMFyioUS5Ct2qPADCr5u8x2lxaavZQ3CcJROWK1B2Z1I3BI6HFQmH+6v8Ant/zLxVn/wCRP5Ke YNe07V77U4m0uwnW2js3uom9SVlliuuaRtwPptFQc+h5bV3wKX0v5J8g6H5R0mfTrBTIt3K813JJ U+oz1FOJJUAL8NBirJMVdirsVdirsVadeQpUruDUexrT6cVaWJVbkCSdxuxPU17nFV2KuxV2KuxV 2KuxVCav/wAcm9/4wS/8QOKobyp/yi2j/wDMDbf8mVxVjPny5tPKvli2TTIRarHdCW0NaxrO83qF SGDV5mRyBUe2EKSi/wA2rya2/L/WWt2C3Jt2MRqKgp8ZIB60C4Arwr/nG+O4k/MNZuLvHHpr+pJQ kAuwpyb/ACqYVfUbEhSQCxAqFFKn23pgVK77y9purojavapNKjI6AM44GN/UjoQRup798VfJf53e RbPybrs1hZyl7S5smubeM1rHGXlRYyxJLEBOuFXuP/OOn5b3XlDyWl1q9u1vr2qVe5t5QoeCFXb0 o9i1Cynm3Q7hSKrgV6xirsVdirsVdiqlcWlrcen9YhSb0XWWH1FDcJF+y61BowrsRirzG7/5x78o 6hrkN7qkktzptlNLPZ6aGKAvNBBEfWkUh2CPb81CkdRWoBBVZhpn5c+SNODeho9vI7KiNLcJ9Yci OEQL8UvPj+7UKQtK4qyJVVFCqAqqKKo2AA7DFW8VdirsVdirsVdirsVdirsVdirsVdirsVdiqE1f /jk3v/GCX/iBxVDeVP8AlFtH/wCYG2/5MrirA/zg0631DzL5Hs7qr2txqDRyRg8ag+nU8hvhCvRt T0ux1Oynsb6P1rW5jaGaEkhWR+oIBHh1wKwP8m/y5l8o2N5c3QC3WoFAICo9SGOFnCoXDNyBBDYS r0bArsVQd/o+l6hJay31rHcSWUnrWrSKGMclCOS/QcVRmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KoLTNa03U5L6OylMr6bctZXqlHQpOiJIU+NV5fBKp5LUGuxxVR1z UNPi06+iluYklEEgMbOobdCRsTXFWvKn/KLaP/zA23/JlcVSvzLob6j5t8rXL2xntNPkuppZN+Mc npL6LGhH7Y2wqyjArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVSLy15buNGvtfuZLtLlNa1A6ikawmIwloIoPTLGST1PhgU1ou9dvBVHXXl/Qbudri6021 uJ3pzmlgjdzQUFWZSTQCmKo5EREVEUKigBVAoABsAAMVY7c6n5nufMF9p2lmyigsYrd2e6SV3Zpw 529N0AA4YVX+n5//AN/6V/yJuf8AqrirvT8//wC/9K/5E3P/AFVxV3p+f/8Af+lf8ibn/qrirvT8 /wD+/wDSv+RNz/1VxV3p+f8A/f8ApX/Im5/6q4q70/P/APv/AEr/AJE3P/VXFXen5/8A9/6V/wAi bn/qrirvT8//AO/9K/5E3P8A1VxV3p+f/wDf+lf8ibn/AKq4q70/P/8Av/Sv+RNz/wBVcVd6fn// AH/pX/Im5/6q4q70/P8A/v8A0r/kTc/9VcVd6fn/AP3/AKV/yJuf+quKu9Pz/wD7/wBK/wCRNz/1 VxVTt5fO1zEJre90eaIllEkcc7qSrFWFRKRswIPvgBBTKJBo7Knp+f8A/f8ApX/Im5/6q4UO9Pz/ AP7/ANK/5E3P/VXFXen5/wD9/wClf8ibn/qrirvT8/8A+/8ASv8AkTc/9VcVd6fn/wD3/pX/ACJu f+quKu9Pz/8A7/0r/kTc/wDVXFXen5//AN/6V/yJuf8AqrirvT8//wC/9K/5E3P/AFVxV3p+f/8A f+lf8ibn/qrirvT8/wD+/wDSv+RNz/1VxV3p+f8A/f8ApX/Im5/6q4q70/P/APv/AEr/AJE3P/VX FUX5Y1K91HSfrF8sS3cdzd2svoBhGTaXUtvyUMSw5CKu5wKmuKuxVbK7JE7qjSsqkrGnEMxArxHI qtT7kDFWD2H5j+THlsdVhhuI38wWtjczzuopBBdTG2sjcj1CqepM7IOHLfdtt8VZ1irsVdirsVdi rsVdirsVdirsVdirEvPGi63qV5psmmpKyWcd5MWiuTb8bn0QlttyHI8malRTxoDlWSJNU5+jywgJ cXXh6Xte7HX8t/mRaC5S1vby5eCCBbOZ7tWWRnRFuiyySDk4Yv6YIQCinnXbK+CblDUaeVWIjc3t 8unuvn7mST6d5ii0jQ7W3+tSzQ3UcuoO9yDIYQxLpLJzRm2eqhS26qrclqcsqVBxBkxmcya5bbdf L8efNicvl/8AMgWVqIUv476GLk7rfx+i0s0rSy8o1liDlVkIXkN2/aVVHKrgnTnDPp7N8NH+jvy2 6H8dCTt0fy/aXNpo9tb3TyvcIp9RriT1pasxajSb1pWnU06VPXMiAIG7qM8hKZIqvLZMMk1OxV2K uxV2KuxV2KuxV2KuxVi3mj8xtA8t6tb6bqXJXmt5LySf1bWNIoIa83KzTRSyUCk8YUdtumKpVbfm f5O0y0kjW2u7QxyXN1qNq6KZLVHaG7uLqf8AeMBEf0jE/wADMfjoF+EhVWfYq7FVsqM8TortEzKQ sicSykinIcgy1HuCMVYZYflL5ZtLXSbYTXU8WlQW1rSV4/8ASYbG4+tWiXIWNAwhm+JeIWv7XIYq zXFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqkHmnyVpfml EtdZlmuNJFDLpP7oW8rrUrI7en69Vr0WULtuMVSiT8ovLE0TLcTXc8s/qJf3DyJ6l1BKlvG9vPRA vpGOyhX4Ap+HrUtVVmruiIzuwVFBZmY0AA3JJOKt4q7FXYq7FXYq7FVlxcQW8Dz3EiQwRAtJLIwV FUdSzGgAxVba3Vrd28dzazJcW0yh4p4mDo6noyspIIPtiqriqnc3Nta28lxcypBbwqXlmkYIiKNy zM1AAPfFXW1zb3VvHc20qT28yiSGaNg6OjCqsrLUEEdCMVU7/UdP062a61C6hs7VKB57iRYoxXpV nIGKojFXYq7FXYqsuLiC3gee4kSGCIFpJZGCoqjqWY0AGKrbW6tbu3jubWZLi2mUPFPEwdHU9GVl JBB9sVXQXEE6F4JElQMyFkYMAyMVZajurAgjxxVfirsVQ9/qOn6dbNdahdQ2dqlA89xIsUYr0qzk DFURirsVUWvbJJTC1xGsyjk0ZdQwAFSSK1pTfFVv6R0/0fX+tRehy4+r6i8OXhyrSuKtyahYRRpJ JcxJHLvG7OoVh/kknfFVcEEVG4PQ4q7FXYq7FXmv5zy61rGg6h5U0WCYyz2Fzc6jc+ncKnoxpSOC OSOKUPLLI6ngOqqymnKuKsYg82/nAujanqFpb3MkOm2NjfW1vNZcHkkksiktkI2T1nMdwwlkYb0S gPx7FUwXU/zWY6bHFql5NA1tqWp3866akbtHAY/qlmjT28XxyEsFLQoxFTxOxxVI4vzH/M2z0nVN X1iS7s4FGkcYZ7GOFgbp/U1AaerxBpZIYmCokpbYM7YqnHk3zD+Z2p+YNIsL3Vmm09YbW/n1O3tE mt75LgSPLEk8VskCJEAicvURuVaB6gKqiNT8x/mh/wArAeCze6Xy2dXS0iRNOEg+q29kZbhy5Utw e4kWNX5bkGjDpirHtO86/nVf6SIli1C11KS0sIoJ59MUI95fagxllP7oBFtrQhTXagLU3DYq658y /nFPpusLfR3t1aT6RrE9varpvptWSdrawVysfIOI0eULyqVp164q3oN/+bdle6f5Ytp7my8vlY10 fVP0byb0LUW8HoiIW7BEekrL9YZG48SZP5lWWQa1+Z1v5Q81eZ3ae+vYpb6Py9oL2SxERQzmOCYo qieQsilgvLdadTvgVI9THnTXE0PR9T1C7a31HzSH0+Z4ILeabS9Pg+tGaaJoQAPXg5Rhk3BHLl8O FU689ax+YunaxrMnlsTLo2gaRBcWunw2SOl1eSSOvorIUdmSKNQ7rEQaUAp1IVhWtX/5ma9CfLmq rqN9pN1fadyuItMeNZbae6Ms5kZra3b04I4AopGjEsS3w0wqy5fOvnGDyR578w6jJcW31ITPoEst uIYwAH9JY4ZoIZgwYpHJ6nqDkKqx3GKpHDr35wafotpZLPezW2pXK21nrd1ZtNeQRxWIaR3ihtpW Ky3lREZYqlBuRUOFWZ+X7vzwdX8w32t6tPDoOiKsNrE9jDB9YZLJJLi5qQWKrKxoEfjUEVpsFWB+ VPN35ur5Zh1YPfana6uLFBPLaLLLb3N9cvJczWsaRo0kENqUVedU9Q7fCCMVQPmPVvzR1PytozXK 6695La61cT20dkE5OT9W0+CdIrcBvgmqagV6rvRgq9H/ACoPmrT9C1rTtZ9YW+hSLp+jobT00+r2 drGhaCio06NKr8TyJPjgV57pOvfnBb6VYLYQ3NgkkVk17BFo8cZ+ualqUktw3AQqD6VolZGC/tAk VPIlWcefte/Miy13WrnQTcNpWi6Xb3MFlHZLKt5fTyunpCQo7ukaBXkERDU2FOpCpBB5m/NprMqs 2oiY65LGHutMjVhpVnaGWV/gjRf30yFV92VQ3iVSbUtZ/M/zPoel+X9dsNS9K5/Q41SRNOKev9Yu DPdvNSIBFt44lj4RgGtWY8cVTS782fnVfetLpyXNnLcyNZtayWAMdpcPqggg9Jmj5OBYo80shLIA R9mq0VTr8vtd/NK+832sWvyXP6Gmg1C64SWC26hPrZhsUlkEYKOYonkA5bqV69cVS/W9YhsPO/nv X30e/u7pdPtdI0RINOuZTO/pyNOwb0+PASOqs1eg2rtiqV39l6v5WeUvJGlaVdPdC60oX8txp9yt sJV/0i5MhKK3FZFVXbwegJ+KiqUT6TdS6B5VsW06+tr763q+tazA+lT3UVpfSRyIltDbonD0pJnP pICRQcj1xVmcul+aLH8vfy68v20Op6VNJdWcWsR2RE8kMEMbzOssjJIFDOiji3wAVVqqKYqhNQ8x fm+kKzrdXUUOsapqFlaEabX6laWxkFrMY47a4mZ52UceYK8e9TzCqhr3m/8ANxb3UY7aW7tzpsq2 FvbJpsjG9HpxH6x6y2tzFC8zeoIyrOoYqCgALFV7TpBuzpVkbzn9bMERufV4ep6nAc+fpBY+XLrx FPDbAqLxV2KuxVjnnP8Awhx0z/EPL1/rX+4j0PrH1v6z6bV+r/VP39fT5cuO1OuKppoH6F/Qtn+g /R/RPpL9S+r09L0+3Gn4+/XFUfirsVdirsVdiqTN/hr/ABavqcf8R/Ux6Pqc+X1Xm1fS5fu/tfb4 fF05bUxVOcVdirH/AD3/AIT/AMOy/wCK+X6E9SL16fWOHLmPT9T6v8XHnT7Xw1p3piqe2/D0I+HL hxXj6nLnSm3Ln8dfHlv44ql/mf8AQ3+HtQ/TfP8ARHoP+kPT9avoU/eV9D95x4/ap2rXauKr/Lv6 J/QVj+h+X6K9FPqPL1P7mn7unrfHx4/Zr26bYqmGKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K v//Z + + + + + + uuid:20547E781A4ADD119EEFF96D7801BC77 + uuid:a7a9523b-0c40-7d47-980c-c2d7a5d1ae87 + + uuid:0742cf20-2206-9d4e-9e3d-e542f631a88a + uuid:B7D572641149DD119EEFF96D7801BC77 + + + + Document + + + 1 + False + False + + 23.000000 + 12.000000 + Picas + + + + + Minion-Italic + Minion + Italic + Type 1 + 001.001 + False + MinioIta; Minion + + + Minion-BoldItalic + Minion + Bold Italic + Type 1 + 001.001 + False + MinioBolIta; Minion + + + Minion-Regular + Minion + Regular + Type 1 + 001.001 + False + MinioReg; Minion + + + + + + Black + Red 2 + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Lime + CMYK + PROCESS + 33.000000 + 0.000000 + 72.999992 + 0.000000 + + + Night Blue + CMYK + PROCESS + 100.000000 + 50.000000 + 0.000000 + 0.000000 + + + Pigeon + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 30.000002 + + + Red + SPOT + 100.000000 + CMYK + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + Red 2 + SPOT + 100.000000 + CMYK + 9.000000 + 82.000000 + 60.000004 + 14.999999 + + + + + + + + + + endstream endobj 54 0 obj <> endobj 52 0 obj <> endobj 57 0 obj <> endobj 335 0 obj <> endobj 337 0 obj <> endobj 339 0 obj <> endobj 341 0 obj <> endobj 342 0 obj <> endobj 405 0 obj <>stream +H‰|PmL[e¾·ìÖ»9»È]•õ}ï2hÐ…9ƒF'™Î°n%²A +…ví¥]ùè½£ÃÉh Ú[ +Œ¯•BË(EØ2ç”83&†á\Âtf™SÙßnwŠEÿ{Nr~<çEJr ÅÑÅÛ»Æê +s‚âÉßÒ*Î?9ãûnø*ôÏü}^²Ý×ïòƒáÁ†ú.h;`Üj*׫ e Cª—Tš€dŠ½‚þšÀ'‘òfZF©"ý€¥¤qó3-¯Ý  ·¯ý"›(;s @¡×äËS”ª“dºot‘3·ù‡ËrÁŠHi7Š›šv‘-m¾fô±Åð0”ìn7E™Ñ¶ßãçn}²ôá굌¸E_V¨Å²ó.HÝ›G"ÒîÕf{næ>è1}SƒÐÖdSǾ¸¼[9¬íÂAHý\­‘†úƒ'aÏIk¯›5z¬²wÕø¤³Ý„Vîã~‡2£J©!573ë_ÕþÉ@LµÑ²ŸƒeÂ6.‹Ë²îßtkÐñ]ïým“7Òö’áÁN—¸½'lnØvÜmw»Ü­íïò4u4¸É[µ§ +IW$eÃF±w–øÜce€ÄÂ^B¾ðÕO_Æ!+½sgéæ(7˜1µ=C!ÙXàt`Äo1uÊ]6½ÃÃ{š½v/ÙkWŸ.y¹UF˜[ðq¡Y–}‰9[&¿XÒj4ÈŠË •ºò¶p…¼Þm³[“56«¥VVn¿z$ $Eì\žioá°l3‡Å¿@é©1Ô†6HMLN.Žè»à†WQçŸ-CABØ(¡çê])Š£;ˆÄ:c+Kü ÎƉwªO•vƒ‹wφ ä v.o6Ç·NPcQ %HÓK uZp(¹Ÿ×@êÆÃûè-´'r¤ÆXž nXkL à MÎlèL395ÀRcUéa]ÇpÚžc ÓC}¡+çO§«ÉáƒÛBÀ’N$ËKšpú]-±âO5ÆÅYËYCI­ï‘Ü'ÔðhW÷> endobj 404 0 obj <>stream +H‰bd`ab`ddóð‹tñÓöÍÌËÌÏÓ JM/ÍI,É(üfü!Áò[ñw߯'?°Ê20LÙÅû=šÿ{’à¦K„@jêó *‹2Ó3J4’5 -- t@¤‘‚cJ~RªBpeqIjn±‚g^r~QA~QbIjŠž‚‚cNŽBHW±BPjqjQPâ…Ìb…D…’¢Ä”ÔÜÄ¢l…ü4|&100222ˆ22°=ÃÀÌàËÐÆp–ÑD¯~å+×?ü^ÿù{Ë\QÝâïúßå¿Ë/þ®ÿòÅâßú¿åËÿÖדÿñå·Nøo·ßj¿Õöÿvû®ó]{ÿw·ïjßÕ¿»ýÖ–çë^ôcÂýåŒßSo2gûqBôB'ë®þ¶t©?NìÁmm†­r%ß,b7œØ6á°Ômì~¥þUáu@ßuwýÐê\yƒyÑwÑï“LÙ`¦.b·kxøz—öíxvíßr:¿•µ«qœž/züÓ©÷g>pôþ>ÂÆW¿÷û¹£ßU/0~ÿp›ù;ûOÑìß;X'ÌÝ8k‹ôwŽýžzæ±.æYËæ•È7NnèijmhnihÂÞú©Mó×Vn•>Ûs~éÇö-;rVê¾ï³ßùqõ5IrK¾;°~oa›y•¯fÖO¹Y¿«~·™{¾›í{ó¤?5ÓÙå8WŠÿçáÜÈu“ûG‰È÷§¢L«õ‚ endstream endobj 338 0 obj <> endobj 403 0 obj <>stream +H‰|” PgÇ7ÂÆU4=X·%Ù6ëyÓ­V-½Ó¶§â·UAP”*H‘¯˜`>ò€„ˆ„@ˆ" +Š|@üD¸Zµ­­´v::wȵsz7½gí:7·A{×»éÝìÌ»3ï¾û¾¿ÿÿyÿ œp8þ战Øõ;mO•§*äo†+dI[ÔbYªÄÿq!Mrèyú93˜ŒåÕ@ÝÓ1ô5©.› ’—@ÜûꜲÿBý:EF¶259E-zCòkѲ•+ßZì—‹Ö&)¥¢èl•ZzH%Ú"—(” +¥X-MZ"­•ÉDQþ¿T¢(©JªÔ°³ÏAD©*‘X¤VŠ“¤‡ÄÊt‘âàÿÛ A8샼ÎAÞDÎA6 ÈŽ$:y…•‰Ì@9'€;›q:`M¸?ð{ô7’;:Ó‰-ÆÊg½>ëÄìù³³‚ƒóxYÖÛ/ÐB-'å)S/ÃqneûîÊl«n’/‡u +XÏŽ{òBß³c{–éÌ‘F¾)…v•Êo-©iâ»{Ž÷Õ·b°™ëfx¶¦B©™ŸQŒ–л ·“IA™E\¬(ë…îsPЛÞBoŠ ‚P|òÈËàá~zïXÛejìtÿÅ{‚©ðÞ5Âò™øÛµzÿ,ði;ÓŽ =)±öõ$SÇÅÇé_š¬F ƒð·0ß²¯ã£ôiÂRo©©¬À*lŽ£.r`XþÞžˆ”ŒÛ(!ðÉ;ŸÉ–,Ú²ié>uõǪRQÞeýô'íÝAO…„)}ÜdûÉÞEÆwM~½´Œ[×yzÊq&ÙªŠS§fj1µò€1‘|§°ñ®“ºwb·Wò+ÛQ¬-òæ´k5Ðwº§å¦ÿN¥Kˆ-òȘta–Ln:H怅EvTZø~d9v.i3Ť0 +¢™Ûf7¤Û)|•k·k§[ܶ½5Mm%¡¸³Ê«­Ò9r›øyǵ]ê‹Ÿê–ÁƒýÉóùÇð +ƒµ0ˆ©ââ1¦ô;ÿ%gí´èfË·ºÒdc©ù¼+Õúí|mH„‚ðq:P"K¬5Æ£vw…÷»õÂÌÆ¿š+BññÜRm¹ÊŠU¨U–<2,,>!Žú 2‘A– +Þ?•Ôqj°³é„°­¹g µ+ç漃¾ŸÛVPG6=è¾rb6ÂbB%‘‰U +,1%3¿ˆ,4¹¼=öÏ›G©æÑfOƒ³;,ÒU_ltPGÒ” Yϧ€É»eZ´öhC†!(ˆq˜‡ÑËè½>°­ô­•T ÷3x€vØŽÔ†_*sVQòî™e&©‘‡žmÎÛXª¶iøÉ5}™#äÙöO¨ûWG„Y‚±CñB|"†á Ãà2„}Ž9—LSy¾tPõ+¯îÂεtºH—=KJñ>e} óÑÂA?ÒiÀa>ðt@à÷ip‰,UŠÆÈúwÌïß ôÐσ)˜_¡ø}KaaY¹-,-~/µ)âÀüÅ‚ßv‰»N^èpÔ Ïvõ{»X+³–£tî/é}Ð}õÅ<9Kô9î4]z.{Zk±*‡Ëâ$Ýæ"'eŒS2H¶\“–¥ÌTaâ$U¾žÌ7xÚ(žTù8]ð,,€ž ¡DÜž=™2&{¸ÏZf;j¥¦NÂêS_ò™u[#dé‰Âµ;Å —˜ ÛòK¾qýå[!ßaÂî-’F‰ˆ©:˜yÖç­Ç*«UØI³Œ9¬¡ÿq¶~¿c4d}Ÿ=‡È +ø]3Wͼ›³AŸ‡Œ†’"R¯rZõ”ÞZ`6™Myº’C˜ÒchhöÕ^ð}×ï¹Õ|Usû‰=´©ef³möµ»ZØRxõÊf +Ÿ¬Ñ/·Wcöê—WÐxTÞ$&7mÇ‹©ø}ª¹¿Á"¸²dK!Ê33fý¸·XÛ¤ Q&Ù@—A§ðÈ€· U†gä|#Ìý¨Ã%[¿-ÂÛb™MDƒ©-ï¤ë9\¯Ôâc²¢Ä[Ü×»ÚÎ6ák:™ÀGrŒ©ÆÕF¬N-«N"ã"´ÉqÔn±**F°¾'áv¾0^‘™_ª-ÍnP{ò1|ì”î„?J{8C‰ƒ¢aar½ÖY-¨ª´Z+„ø±ÛžÁ†æÆS-ƒ¥w0gI­¹Vh;Ú\Ñêì8Ãç}ÁÞ¾¤q€¥@ÔAð6Æ€åNâ(·òJÚZ°‰þ‰ñ&Ò}D#)¢ðg±ŒݤsiÚÈl¯Qº”½¥þ”[¦SþÃ%¨@'\‰Î 2[mÌJ¥Ò²£“v®ÁØXÑÈÏßÞÏöî-Œ-ÜËç1ËŸ#ÍAÈ„DÁ ð>‰?~¢'دùÔ(R^´+[¶ßƒv˜;%dܺýQ”Sº»š«HkYA2‹ü8Š1¡›rÝ,2Û≧ۈ½ 2iSæ™þ“]'µ-I¾cÏ ™(c}˜ÇÞéy0÷Ìó{áƒuNÂæw¢ªÿš¼7î!]Ųìbê ³J­ßŇà¶+Íþ%ü‰?Œ{ɺçf Ƽ0ë¤?mWF¦Íb[¢‰4—N³û.ý£[âT9™Fœ’ë>Hˆ\]R긊N4$:³I ;¯ 2tâ¢ÃYkGÑëµæŽƒdü†i=Ó\MV²Z T2³R¿+‹Ä›œ6rZÎG0o;ü‚MO¸¿¬?Š™ð}=ÞH6<'}Qô†©+wØt†|ƒTëÑܬ5pÒS ­’ãó+² %¥*{¾‘+ªÖYT~}»ÐîooP-ûÞàÐÚ»«U†dˆ‰Xwò!ŸÁ[+úUä@`ä g³T#Q“áñëwâ#c—^ªßçÜGXÉ —ÃBÛføäâ¯?Ø"#CpB¶MþŽßÂòÿËàdôhsU&÷‹(oŸoS‘1éñÅžH ´HõÎWòQ°Z¨xøÛRC»=Œ·p¥BeÐì]—-K¬é™<êZÀuÕH‹¹§0I{§¾z;ù‘¼¯a£rèhÏNº¨édë%u¬MŠF;O—7Óäï¹[$œ¼! bs“úr^Ds<·âä1:[ëgÆ×ånXa¢,žŽ!9ª‰[`ĆCg:ÌÔáôÿû!ÂS|­]&”œÊC ¥˜*£²÷x)ÊD¥øí‡dYVd`ûlAÝUªõ÷®sýºhžÃ4fSu?ÿÒš8„’ ‰|9%9þôå; ž¼ÁÄÃ]1õs[aa±‘õÐÎ¥ÖD×êÌzMIA•µ(WÞ¡î‹{„uWõë(í¶½š> endobj 402 0 obj <>stream +H‰\ÑKkÃ0 à»…Ží¡8>!F×A{°¬? µ•Î°8Æqù÷“ìÒÁ ‰?[VPdylžkÈ?ªôÆjÓxó +á‚WcE^€6*ÜWñ­†Î IÉí<Û¢ª@~Rp +~†Å“/¸òÝkôÆ^aq>¶Kí͹ÐÈ ®AcOzíÜ[7 Ș¶j4ÅM˜W”ówâkvE\ç©5jœ\§ÐwöŠ¢ÊhÔP½Ð¨Zý/N?Ó.½ú +>œe4‘OÉ'r™öKÞ/óäœ]$ì2¹d¯“×ìMò†½MÞ²wÉ;ö>yÏ>$bÁ÷ʸtê0<ú¢nÞSKâ5Ä^pŒÅÇM¹Ñeñ#~ˆˆÐ endstream endobj 401 0 obj <>stream +H‰|SLSg}ÒöÉ´ +å9mç{o±NQ¦qÈ08†B:Fˆt 2£¦–§4Pª-ÒTŠYeLHµLÓTÄ®üЙ¦‚¬*A42aÌÌd°çtK6Üûð#ÙšìÏåKîß½÷䜓sq,6Ãq|•º(gWá»ëó SEŠ†5šÊKR4Ùi©© ¯òJœWÄ¢dÔôìÙÜWâUÖzs è—‚1¾÷•Ø‘„…!.ÛtÄf6.­dTúuÌëéé©êf&«Äte46K%k´0ê +½É|ÄdÖU²%&«¼œ)\ز0…¬…5W ¿/ˆ0 £c*ͺÖ¨3—1¦Cÿ‡„a¸ð°¥¿["èÂD˜KÂŽ`Ø<^ƒß‰Ùs.fJT!úš‘1²78XßJ‹92Ôè »ô¬Ñ¨?Ðe +Ò2.ÈñnÀˆàÿ„|àô3ˆ²"Uæv+¨€ÆÉßÑÁX”VŒr„nrå@l C$Cr1ä ­´¬1Àû×­8ìùSƒsËÈVµM}‚8*uŠ6;õŠùÍÒÝ Î-õ” ‚éWCó°BÖåË¿Ááö_¢_KvØÄÁÀ•Qåý 6w]~ºFMhwk5„_.õôzž~SË +ÍÑší”@<(Å3¿Üz¬xšI)8`)+£dÜm¾#’Wgó“Eø3d»U,Ÿùƒ¡Ï•á«eEù¹ì:Ýb·x»\~¥|ìÆ8»vMñ~­†íöYhG ×è¨çê¸jgÓÞä8SKX}![H9åãPxwÏ„ê Ý,•O_ñúÏ}â!|^w{‡bâ½Á×vï3—›(Á X=Ä«7.ü!‚»sqäz”¸%­E 4eýçCg@šñ܇û†6ñ*)êœW‘C³Ã†¦ˆÓ¨["ã†áú8È¢8L HÄ\,©G×Å.o¯'¤œÌß”VZ©e{Òµ­\cm]íIÎî¬ùÀÞÌyÏI÷*ïLøûé‘›]w#Šhn)lE\ÍAêSP‰á¤Ä 9€Û£pÊŠ_¢°0ÿÖÜrÒàTÛ Î""P…¥>J8ˆŸ™…%gM"Ìj«s£4¦¬˜þrÈ¿ò³sÁ¶ÞšÿžÌ+ž‚e—;\´»Ýï +('C;¶½]•MËZ«.Uñ—¢wB¿M^:*ˆª×9÷rj¢Gñ5»F”P*IC9)h'ÂÐ;„¼ÍÅ=qÿìO°ÿ èVÖ»Å/¢›šÍø2gý&Ÿ‘?€&!ußþfª:\)£å3Æš½¦êjÂf;fÔ*-€Ø‡7‰ó»‚”üçþÀE_«›ðúÜN…üÁä®/ÖP=¨ÌíÑ\U„:ÂáCvžÅpÌF pè)©Õ üñ‡ûüôøáöt±ã°®€’¹ªÀ5 +׎ ƒ÷…c¶“Á‰6ß5”·~2@å‚Q(q+ŠIJO±×ÛÜvê®@ôƒ’Ž®„è'3÷MGÎ{oê"ŠKµ5XÌtÝq‹Ã¨”ÙÏÎQgQu;l÷Þk”@ÝÇóv”:Ÿm{ùŸÅ‹úãž¾ôÑb<&ÉÈ€K” endstream endobj 58 0 obj <> endobj 361 0 obj <>stream +H‰\“ËnÛ0D÷ú +.“E yo »¼èuû²D»jIå…ÿ¾Ž ëÐ$gæò‘îûÃÐ/&ý1íÑ/æÜÝìoã}n½9ùK?$yaº¾]ÖVüm¯Í”¤aòñq[üõ0œÇ¤ªLú3tÞ–ùaž¶ÝxòÏIú}îüÜóô{w|6éñ>MýÕ‹ÉL]›ÎŸƒÐ×fúÖ\½Iã´—Cúûåñæ|Žøõ˜¼)b;g˜vìümjZ?7ÃÅ'UžÚTïá©?tÿõ;å´Ó¹ýÓÌI• ƒ³L$¼›:´ß?Û»Ð.²ØŸÀ;rüOÞƒ©>IUr|‰ñeNÎÁ¹—älÉìȬd¿’_Á2²–[ò6°¥—…—¥—…—¥—…—¥—…—²€©i¡i©i£&벨Ër]Â'©kt¨ÑÑËÁËÑËÁËÑËÁ˱.‡ºkq¨E˜YY¨#Ðêt„:¡Ž@GdÝ'0×J°VB}‰ú¬+‘ßÀÜǸ¿Â}죬gõÊzP¯²^E½ÊœŠœÊœŠœÊœŠœÊœŠœÊœŠœÊœŠœÊœŠœÊœŠœÊõW¬ÿs‹,‡þFÉ6êõôâx‡[h>îN{ŸçpmâU÷7¥üÇmžÆÉ„Yx“ R›ôn endstream endobj 352 0 obj <> endobj 360 0 obj <>stream +H‰|”yTSWÇ_ï‘¢DÉãÕ¼d&/:­"Š¨Õ©µ®,b "0E¶Dd–`ˆ¡(²'@1„D! ¬#›êÊfµ —ªE±#§ÌL—ߣ—ê¼èxæÌ?sÞrÏùÝwïû}~÷ûýñ0k+ŒÇãQx}âé¾ä㨸(eœóVµ"&*Ô2ñ+å±bëÔÙVˆA†_L÷à¿Ç°¢;øt²ïøÔ$²|—ºYŸ¤ŠŠˆTËCËW¸º._jy¯”oÜ£Ü&÷KJP‡Å&È·Æ…*UñJ•B¶g™\¾1&F¾Ã²*A¾#,!L¥á¢¯sG%ÈrµJ±',V¡Š–+ÃÿßNÆã.ÌÎ +³Ç11[ÀÇa˜s±ÂÞãc®¶I€}„c~,Ö +ËÅ°÷9l̳ÁÖaþX2v›çÀ‹äMY¹Y5[=ãgðÿn½Òº÷Ä›ˆùDñÀf•M—`– û­åo}i»Ð¶nÖºY³#f÷Úií&…ûç„Ìy27ÚÞÎ>Pä(:OÊÈó«ê^PzêùÛeó¶Ìë{Órú‰ÄV² +-·7B)/Vó HH]©¾}ºô¶àvIÐÉp©†«c6“›lÒæÑœY«Ô†iâ£ö +„Þ4À»¥ü[PHÜC.Q>€s›¥‚­“FÔVdÈD*ÕØ`î`Èê96J.#CbªÕ2aj#;ÞÈëÚQ>(ª('#¸sœáž à2%ýA‹\ÏpÏ'ÈÅY +6ì +9®DîhuTAžÀ…?wXXÏ€SC"lBÎRaž™m«¾È†“|ØÄ^¦Frk¾0è²"è53›ÓüuºZ:[C%‘o^aÔ”ôÑOÙ®íšmI^)´0oˆ-í籂1>¼|»ªóHkUǾBñŸ#ê¤(€€õà‚?™¹úÉã€AÇ»4Ñá2/×Ãðö–ΫÒûÇüæ#ÞâõëO_Ïí‚aêöÌYüóþúarVÂ(eª £`‡8>›©ÇIuð“Ò¶kuj1Dæ]±ù9%Ç{ióWÃÇ  êÑÆ°Ìte6­ÐáYl)e ¾DFyBXš×—ÀÔ 6‹X¿IÏä#°Ÿ–QäúžÖ”¥AíŽ^pCzÖûZZÇéû qûzics¹åTï°drýÏb™Þ†|4Ryïü÷’É-H$ã„ÞJ‚Ãa}a‘žÖWèK‡.%¸®ññB|&9Ž"'GG£-õ^‹lÜ +¯”2]pBlr ûkËÞDÑ•IVYGÞ™^Ä&SdwþC—¡O@Þ1îÝvô)JFŸrMM‡|Aä ®c׫M Lmû_G«O© âw¼¼ýÞ•¢E¾€ÃBð{ؾ?÷Ä"‘«{[^ ;þ +÷Ùcò̵À¶½åq°3ÜñVI€í“Ú¾û `ׇ@³%Ü_$þùÈ}(ÃáCŸ@_\®?+…å÷=ÑŸ²CkQD\|~ÁfŸ1¯¶è´@8ɵ“mPÓ’P+bKëÈIx £èµtLÑA¸ŠØ ÊÖ­–"ÑÍ•¢Õ¤Ïk—ƒ¹9åI¥ûõ{í¬3ˆMý¦›†Ã‚7‚;¡„ÿžÐo‰òôÌÿä\ÏÉÀјYXýœn†µ¸p)×Ç2ó ì\þ+\ ¬ñ¬Çÿ–r ׳LÕÀ£¯Â 7›îé3.\ˆhóô>³(œuE[Áƒ áÊ`ÑI¶z\[˜•Èíµ ý”²9%è@(½wkL´GfZl"ŠŽLõ̳†S50ëë > +¼BÓˆ1ß,BOž9C3-4‹À¿lìUj¹êdG+PLâ‚”€´:%RyÐ?'›Ó·–ë¬^ùª2}­o0ö}zÊÅz‚Œ‡›3xqëßt—{PÓÙÇELö·î4Îò›´$¿NîhYDZZÛu]±[]Eå¡°yÉ›@€„„Wž†‡äAÈH"<€„ò`q£â[Ä]kE‘Š[뺎•­ÓçâNÄéNÿhç÷ßoîÌ9ß{>ßsÎõÿºõÉgp1Œ=ÎfŸšŒ‚ÔjÞÍj»¨6›Q›'®a£†ÐZ*ºí7“¸]àD–ö<~_A‡Yð3ø%Ì…a(~„¶"úŠDÙh;\†>€aÀè¦#ƒ nýl†pÍ0Â…m ™ÜM¶Š,umœ0ÆŸ'KÝ럧¿wB€+ñÆŽÖ£U™Q9Åz­¬sÿÃq?×ÅFÖeVÑÐ +—1:à'Ó|JcSÒ ^é 1 ×2ñçÿü‡V³h0BÖ"µBSéé¥èOpt/E7© è&•ƒ˜M Û››x™¹UiÄQêX>½[_ÍiøP »+¢3Öy¸+÷EýT¨¦%C/mØüN¡»ÀÇ÷äßwcós“ Ì«Åý6–53¡á¤T<ïÿ +Ðÿ Ö’€ÕÚDàÞs!ƒvß=¸eFeÇgÉYªŒ!?>–o¹•ÿW?„Ëf >“8¾{™)Óû.1§FÎßgá3 ¦°è`WQp¯ò\݈zXªi˵þ¨)+O“C •ÃÑŠ¾¯|YÀQN™Jq³£˜»Ø~‹–¥ÿ8)'okiŒgî ÿ;{0íñ‚[W»ÿÖú¯¦oB[Þ˜¿6¸Œ½N“Oµ„µ| ë{em‰µ"N°Fz4%صÑ Âþ;ÜÖ †`.™šþ?†©uvÿ+k÷ml0|óK¨$Óß®­nÈ›fdæ~÷yFcç›ë'ë—BäP«x^Ekm­T,d°÷ÄíOˆL›OZm”¸Ôº^ÍM¨ÆJAòÔ5¹±Îqˆ±€Ê¶}²wKJ"#î`¡ìPÕÒHâ‘ANh +Uµ&»›áòøfÿüb +­³¤5e9'%ùÕÕ¡´1ñmv‰ÿ÷‘ ¤w~þσÃ^ú1i‹¤‘0ÍŽŽŸ¸EÒJás2 e„LÕìª-j‡”ö…*M¨¤\­ïn¶°Î žõz.`*j>,¥÷œ®RX@M:o­¨ÃÝ幩ŅXʉN!”w ôèîv^ΛîÎN†çiÍAŸ.’ ö èò}÷<üðaðü[@§v«I2ðéb¦ìø)nC #½q¤b€èñ5]s“7È}iÓÇsg¥¬Oût «–ú¾£Øê• !ûSqÙ0¾è ›žêí}£Øפo˜°›+bÑG{ÑÇ_q€´B(/"Ø\çl3 í_‚W¾?>2ôˆl˜3pWCÄ G'ï´ÞwzA¿ÕÑÞEt8Ê‹-¿c¨lÒ4é1üŒÙh4™˜m[æ¾È¬ŒTÖž«·37Æ_~Öwç&‹vW|=¥Ä¿e ZKI…!ý³ðàÌ™'x>'E^ v«–DâI’<´™BþÖð„u"j[rfˆ8”ð›ÕÌ­ýëD_£™u®ÿìÈÈ-r­-FeOe ŽGÇÇÁû*òd„\etiAŒî‡‡a4f«WYÄ„<¼¸l'Àû$(jñ':_âðL˜¾q^Ž‰NG{¦7YµÂÙ¡Y€<¾xCI.7½(‡ÇÃRR3óKZªø"|7ä™Ñ‚ákH£GEÆ—f’©‰zU“R ~è„;n‡ylOqkni;ºž#ÈL ©…‡b™ûÒ.‹X‰yâr¦Ä$p Xø= ZÃf3w?Íyx~6ô^ÎО!VŠ=ªËÊT4Úf†Ï‡_±zÚí˜ÓÞïfž®>-7³ôÊz¥^‰á×Ã[TænW•1”<È—qŸ+02ASi¡KÐfô%~p½NùKpÂ?>š˜‘ÞÇÏÂ_˜èZŸ.×uaøƒ‹.¸®œ ºjrÙ€{c‘œrD¬-²Í$}çôå/Ñ'U] ÿ*(/Ú2 „DT#/1E_²wnÂj©ý,Š½¾–t¨ü‹â²pPzáW€ÿ ‹ÉÒxi¼8žACÉœŽ à¦W!·Õ<Ùÿ’|ÿ¼†nN—D\ÙhÓ’o™)ØIé×{¹osbÌa`PÚmcFBW'O'õz/rQŽ‰Mb3á|ù— àßeøËéÝí®S õ”¨­€ÈdsU€¯´”;šM|-µÄϸèD!p×¼?監ñKe"B"ý7áåÕÔ•†ažxjÔá4Ùkr¼­™®åšŽ3YUÆbm«Ö BƒÆ€ áž›1;¹'Bp¿ÓpU)‚‚:*Z-EA­v´¶ãŒŽí>öt-ç$Xµ¿šu~íßλßï{÷³­µ¹xvïÞLJÇÚÚÜu.Ô^å.«•¦â"îÔ{Z+X6U%?qÍû·°KK…é”äoˆ¨g¡¤Þ <‰Ë†žIN'/ ÿÄ'WªâTå®õ‹JkÍö‹Ïìèòy?8¶Õ‡ÆÔר=ÀÓVqa’,’'+ü9yj²÷‹(„óÂ,n’èŠm5å8¤“Ô^ÅþãÝ$’E¼ØkÉOV$RîUƒÊodž{(˜z0>.†ë&Ï觰ÇñDôˆ!NO¦œÔ•œ|ì¾é™©º†þÇ›â7S^¨‘â{%ïp#–Sʪo#ÿò¬r ‘¨©uñÆ„ˆ? …´š»ÈˆÃà÷e=/&Öï‹×Ûí¥|)”Q¾$‘«s7kâæzãHœcr3GZá+1 ¼EÙ5øArµ"V›Ëœ®7Ô~mébŽ6QOÆ' I/ˆ§î$b›¿óŒ9Þ@áôoŸõq(\<ýp: +óÁßù[8PŸêwª…çÁ°O@}~ …û£IÂQ” ëf4#é…pŸû¦{Vx*%P=+\ºv÷ª_˜ü\ ½NÙI„u÷ÍÀŒ™x‚ØÉÈ> À£¼û&¹˜µ¡õ{}ç»zØÇ»}źµwôm6¹–ìfÀ7&§›ì2‹³Ì +N6&Eâ¥døFrÞþ<´P«Ð«AŒh|§Ÿ!µOƒ–SïÚ§Óª n¸Ã§’+zB?‚„M·°v˜L,f˜jªK<`tP´’\¸’ _“.v¸”ø=‚ÃP›r"©DÌTïKS¦jø2f™¨ÁZgi21ùäúCO½K«Û¤BEs¡ÚŽÔÌÅâÊù†B«u˜é… ¬]ç®-ª\WzOŒ c—o³fxÃË„izu +›þžEŸÞ†ø•C©ÏÙÄ‹áõXOu^E²8žJþYÅQqqÌ™zCWÅEÏ¿™Ž®ÊŽºv´£Þe´«C¯µâfµÄj´š,6£Ýh;êÌ·¢Ní›d¸}%/¢9Î"#¶’v /VAòxðÔø?ÇBà%ãË/ï\oWÕoõáiÕû[X Þ†Ö:™ÄÅ6jm%N›ÝVæ(q ž’$o*ˆç¥‹…8o_A¢”Åõ¦²™„9¬dANF¦ÀÜ‘ÎÖXµ% +*×*d¹,AÉ™ì@'Ãü¨õ4¸œò"h‰*(tr +Ë¢H _gHD{x" Ö× Xñ3ÐõCyc3B†ÑZ`¸Æ¸nûáµÈFZ¦Ð¤D¦i[Én$òˆ;¥ + ~}£·§?ÀC‚4ôæçÊéï§0ññ6C+{O+B1GDbäª8mh§žiÃP‹t[Š½Y@¼áiÑûñÈ$d‰°;ÏêZª\µø9ßÈÄàyŠ'2É°@¢×Çmÿ8(©qÈôƒ&èŸÃˆšF7‚9.»ÿFÀ%ãܵ;pþø zêjec#«MZ-ΖŠ„%lE)fLásÙYSy‚ýT\ÝÕÿO?†^.Èï‚”Ûx{q« ió¹]và,ÍH(à I&2º”º{¡‚Úi§´…ç¥ã>…ub—‰%Dc‰l%çl&ƒ©zÅWõ0¨h Åú' +ó;Å€½ƒ»Ï_²õãªJ°„» xi’‘Übú+ZG¾s.˜€¯P¬ê$ƒ-äërjõÔ5ø[ÝÔz»ªêšXD,ŠÙ‹‚µG˜ÈNã¤r…‡¨ ±ËJøªÎW~Ò[•?…ƒ÷¢.o¾@¥N‘ƒEa;/À댾^·ÙÌÖb¡"ÙHD g]:ÐèÊŒ¸± À®’#’l<£Ø+jm£|ƒrÈQy 4´^9cÅòJ„Ÿ’&ËbùñF5¾¾VUïöV×2[ëk«ÀjÖçQ)u@[f,2WMUÃ1i­à`â^] /!§¥ŠŽ,½›ÃÅéF?Z­§|{ó,\v7„XáŸD¡Pˆ—èìªÂL}ª89s· 6•+àúmz¨yTxš²Iç·)z/á…MCF‚/?ä"?*ŠÚ³>vý«,¹‹t?ß1:ò³oþniîCÛLÉÉK «ÙùK?¼ÿ·uýƒ¢i¥Á.+ä’|På5pqÃf‰drÅþ,> endobj 355 0 obj <>stream +H‰\“Ájã0†ïz +ÛC±ãÈ£Œa›´CÛeÓ}ÇV²†mç·ïüúMÖàèš’&Ùf·Ý ýl³Ÿql÷a¶Ç~èb¸Œ×Ø{§~0«Âv};/³ôÛž›Édš¼¿]æpÞ ÇÑT•Í~éâeŽ7{÷£áÞd± ±Nöî÷fo³ýušþ†sf›Ûº¶]8j¡·fzoÎÁf)ía×éz?ß4ç_Äçm +¶HóeÚ± —©iCl†S0U®Om«W}j†î¿u·¤ŽíŸ&šjõªÁy.¢ï¦6U‘§¹Ê[òüB~Q^¯ë \ ðš¼;²{²?‘Ÿ”ë8Ôq¬ãPÇ1×!×=’ÁÌu)wC†sIçÎ%딨S²N‰:Âo ¾%ŒÄÎÂxIñ%¹ËrF`îE°¡›ÀMè&p“gò3˜žél…ç)8Oáy +ÎS–;Ð «<÷â±OOOOOOOOOOOOOOOOOOO7ÐËÍ£5´ƒíwßµ×µåR›§^C—õCøþ'Lãd5 ¯ù`µ\Íô endstream endobj 350 0 obj <> endobj 354 0 obj <>stream +H‰|UyPgÿ†9ºEi”Þ±pZ§g1Ï$àjPWÔ ` +"÷9ÈÀÊ r_Ã9¢È5äEqEâÅD’òJeMܘìák«­r{”ªÄýc«»ºª¿÷½ßïý~ïõ×<$°@<ôðtsßê²ô‹è¸hEÜrEl˜yÙŽ¡xÌŸì"¶h¾ ýÕmá„ ‡­ÀÏŠæ Ì·ñ·1ïÒº*âÕÊèȨ$Ù¢ÐÅ2ÇÕ«?Yf~:É6„)BÂe;Õ‰Iáûeîq¡ +e¼Bœö‘L¶!6VæmÎJ”y‡'†+UÜê;~Yt¢,X–¤  ߬”Ëÿ !w!‚‡løÈ! Bvù^ü³‚•‚Á˜ðSá¤ÈUôæ×â¹3$–¶–Ù–÷fÆÏ<>ËkÖy+Ü*ÇêáI´Xl­³þÏì”93؇„ùÞÞ“¼>¨ç÷Aƒø3¨ŸÄ¶O Ž¼Ó°œ„V|ªÓ44Ó³oo§|€&òMo,,3Ñ´ Oáü˜ñÕÃBS^±.HòúClGÞáUz©†Lت’¼¢¯$L'¶6y£ÚM‹ù/ßG<k>³fnåɪK5g# ¶Þ š¼»R–0[øäÙ™±G°X{uÉÖ ®iÒ펭É“mý—¨ ÓîMŽÛ¶8Ó{<¼½||qFh¯3å·m  ,×Àrœ|_Í{ú+b´ÿÖ–Dao뉞!êLßþ=ž›C–FÒ‘²†öÒfŠ?3²xYX¸¯O`gC"­-×dé45©ú4}z±¶:OmPŸ¤®CÂMð¾±ûö¢ +º#vÕ«1Öà õUGI&¼.,”ùoÙ™‚Lt…YÀyÓ3ùuà*†B'QdN–2Wê¥ʡׄí.*‹r*º%OŸ\YÁ,pÁ>fgÙ³öì2üñ1ñÈÓ‹ÏMá…l…ˆ0¨˜Î™•6½Ì&rüÚ+X¤óË؈w‹F›ŠK®S ZÍ~¾„uû3ëRª±Q•<ñ„ü?CPv¥-Qª‚¢ èà5ÃØ sùˆ +¦Œ½FŽþ4¬—ÀüM€³ ÙÅ.,¹ÂþΧ0Ãh,©j’·$°¤kÁ.T΃ÍÌ„xò8ËwJËKÒÇк µNI¹Üšk¼7J`•o‚/Î1Ò^>üLÃg¬çB‹Iä[š^õ,ü×@˜ 3ÝÁÃÖOÃî{]嘡ߑ=O*¦, +(É­¬žW=P}ªª ‡¢Úˆ†]Õ1uAúÌ}BŽí +ÆC\$ºÃ†Yñ(Nôá¹ÉpNÙ* ì`!ùœ{Y.fÑ¡ìÏuÜVcäO“·*ÛÎÒ#]C’ëFìj¤…ùükÃÁ'’—Îý¬TÊvˆÈ)96®+Ïf‘„ØsNÜRÐTZ,-.­*‡Ü£3×wêw—¿åtkgjoÎgc~÷‹Æ:uiFÚ˜^©¨ðé.²ÕßÔ“wO¥ª3u ÔkQ|VáQ5*ÊÝ­Û”ãÆ,UÃU­Õ5x]mKÕÕüz·È̵ÒÌuÏ„9Ns¹iïù¨ SËFòSl:8#`IÆ0sáøDvwD³´^k¥>ËØ“€'©µê4I|_Jƒ”TÕËŒEtyoU«±7TT—TP=-I»èHL®Z»ß?÷INŠÞ#ñ>ë~¿~¤§¥_ª(oŒ¥]Êlêµ½–ÒdÔž¤É.ÖR.V'« ’£ŽŸî®=Ò^G7V¶Ô5Và„A;/o€o[W +op‡y|ØõÊOì®Y¯ ÌÆã°«9…yž’×°øg³þFÁbnŠ|«~a±¤ä,í~:,]!(­i,¬ &/ïa­ØÙ»<½éðÂä] žcÈ­¬‘2íS¸=Ê3Á,>c„8&J® ¡ö-í +xÃ_ö´ve† Ї*ŠóŠ©šãM}\–Ö@UÁ†8*tK†ÿvÚco”›«„EßÙôë+§¯ H‰jíUüë”>œHadJ&Y• ¿~/NONÎN¡‚ܸ)8=¨;ÒfÒ„iNéKñ6ÍM€Yâ·IE&Ka\ÚÙ®Òম+l×H÷AMF/,½ŽBh2M + mhHR6`c›ÅÆ áM›­Í¶ôdyÓnK²¼ Ë›žc0Áö6ÒÄe—»¸4´– 5É„öŠ\¦ôÊ&¤ £y¿tî¹ç;ç|ß9·NYZk¡ÐP¢Ð"8gí— ¾º@˜Æn?;ÆIá{ GìD$ä[\ƒ4ï5 nù)8·œ ß„ †‘äï“÷S«Öƒ³è);züuD‹½®¶O4ñÞµeˆ‡âðï4kb¤z'Zÿ:"F˜&¸êÅpȱ¡æ†ÖgÐâIÄî¶fYvÚòÄP“l¿'—ZürâlÜúG ]¤—ïÕTéE ¥^]H}BOý«õå©Ku„ÁhÖ«E8ŽÔ‹kà<1Žisô#Á¥ž£='#©Ék¥²¼½Ï_ÿ]`£î6›9L÷”…Š¤¢LEæ[k¶ÿ¤Ã×äoˆô7í/Œ«1õù e&q#-ÁËÜóʨAc]“ ²Œ}D«@(Ôåí¤ú{ 6Òh H³ZwÆ,Œ,HŸ±Ø îíYœ±ýL&æ¡J¬VËÕáBþ|ñqÝïÞ~ Hc˜¤éÁÍ‚$'ãÀ§‚dýûú” +"Œšk«6‰Èo†à¿¹²¼œ}ä?Á²žÈcshž;OžLƪ¶À³b´™Ä¥®"ÏÂL dƒ~•~o È(3 D‰0kc6³`ýÌ…qàªqYëK¡¥&Âß°\µ]e7z”mBùÑ× @ÙÛ;ØÜÒz„ý ÙÕãêu%²å”sÈ›y dmª´ZLZai4S§6êJt…‚‡\8´ïŸf5aò9(£ÿô+þ34ÁÕ¸ÿEöéêõ(:%…JZ#Ö¨uE5a›â¾“˜ú#+PØÂ0ɱ…cÛ㸠â¡3©:÷Íw0>NÁ Íg¸f +ÞâCî=Š·mÜ°R´âÖþñ°êˆB.ÚŸ_p =}ô÷±ÂÆÙç}Ï©kš‡”#Ô­©“ßÞHé{§“Î +w‰"áöžÈqå»,æò.ã•,Ut!rþMLd)ÌÆ~‡Ûä®e õÄÏà> endobj 359 0 obj <>stream +H‰\ÔÍŠâ@à}ž¢–Ý‹&?uëÞ‚`ë4¸˜Æ™Фtc 1.|û©“#Ý0‚æ&¹‡¤òõv³í»Éå?ÆK³‹“;v};Æëå66Ñâ©ë³²rm×LÕüÛœ÷C–§‹w÷ëÏÛþxÉêÚå?ÓŸ×i¼»§U{9Äç,ÿ>¶qìú“{ú½Þ=»|w†¿ñûÉn¹tm<¦}Ýßöçèòù²—m›þï¦ûKºæóŒ_÷!ºj^—Ä4—6^‡}Ç}ŠY]¤ÏÒÕïé³Ìbßþ÷¿-xÙáØüÙY]nÒÉUUVË”¿¤\ªé»Æúýs½H몘×érÉ\"¿2¿"/˜çóߘß×̸oµaÞ sf:¤ÌyéÕž³…} +úö)èSh˜û è3Ð`4˜Íæ@s€9Ð`4˜Î@[€-ÐàQv¥èJ9W1W9W1W9W1W9W1Wõñü!s®b®²+EWJÃü|*»Rt¥ô(<Ê®ægZiÓÙöxÞÑ•>žuteìÊЕÑoðý¿Ñoðý¿Ñoðý¿Ñoðý¿Ñoðýÿ÷¯Šæ…0üPf?¿Ü·¯yÚÜÇÒÜÆ1mó–5ïØ1º>~ìjÃepé*|³ ÜÄ(® endstream endobj 351 0 obj <> endobj 358 0 obj <>stream +H‰„TiPTÙ}¦PèçCxïµqA\Æ∣Èà†HelÙA»›E@Yd§¶fˆ j*‚b@éœQÅ…™1£™AËÔ÷˜ë$éŽe~Ī¤êÖýñÝ{N}ß©ï34Àp7w“nóÙâj»#4*4:ÊÎK ׿ÌcÅ8kaˆæ¡¼_&§{¸s1¬¤kì5,³‹V’x‘þ“jSô¡#òÐà¥dQÐbÉJGÇKõ÷g’¢e’]GJY¤B²5*(Z~(Z ”X&‘lŒˆxéQ +‰—L!“Çêª:„*$¥<à€,2@.‰>ø¿˜0 ×uáØLSL‚aÖ&Ø*.¶ÃÖaØz s¶ÄB1,ҋð óÐMŒb|l?VŠ coðyøoqo< +ïÄ߸Üå˜qâ9“† /p ®·œ'ä%ñø!ü¯JÁ+££ cKã}Æ?ÎX?£wæÆ™¥³Œf5 m…§MÄ&I&È4δÚôŽ™Ù5‘©è¬ˆ%’g‡Ìþš\Dž1ÿÂ\1ÇjÎñ9w-Ü-,Yž°¥~GµˆWŠïYí·˜»`níG¢‡èg(T¨?Î*0foʼnߥžx +”Šl©«m=/¯ —ËCCêçB;íh–›˜«ÌdÊQ 2V#‹‚ŒÓ9……j°(ã20ä_ÊÕœ¡ª +Ãh¡ó´oþôB- zÁéÝC:¹Š‹l–ì@h3…6ßA`³„.¯äZKÁ 6PP ÐÁ:Ú ENÖëèòx.ؼ¾°™‚Í;ÀÙ¼¦“ã¸ïœz‘ÒÁÀ¹:Š:qhíåÀ¤9Ab'J„)J@I~„ŠøBäfCä0ç6šMÕŒ^}Ly^–ÉñòÄâŒülº=­)êµ?2l÷!Zè¾}x?œàôC1é'úô*˜…À ÌT‘çëkÛZ×…†–‡¬W´0Bd2m‡W†óÀ„Ði_®…þê˪šÙ§Íø…g zÆô +ÒN˦–ÿõe-ZŽÄ(Ðòe ûC´Ô¹"ds¹ÂR°½®`6>àŠlaŽ†m«¾¡IöÉaŽ–ÍïÇalœÃ.4/½¨¾TÚ!/²ðRÍö#)h°ã>{Õ5ü‚šrº»zç>yxíýye"÷Bc[ßøÛN©½ËjOWf§ÔÓÛC̪®C_7H¯‹ ûÛÀ'ÄKX¢"ÇÀw ¶í±-frùÄT‡¦áì©rAe…ZSCz÷¬ðñ‹‰Œ¦·U阫;ºnŠ{.Gxlß.C¸?S¨äžm(i/G†Â† ¾”zîŠh¨T2ÇŠSN¦f¤¤¥§d¥d¦ä©Ô©‚øªóG:Ä:EÀ®‹µÕIÒü€£ŠVó>*¡Öð?ÿ·ºÑlY[¾-¢—¢ù¶ÈF0XEö¿½ûóД õñôÃÜ» ´8L=âÚ GÜ‚ŠöÓ—Ä ¸±u™Ã>°ÿî%+%÷c/—ÅÃ'Gê{þ(øSwCß05±ã{dí§J +¤ë`Òy§´úM€oº!/¿øTO8ìÚis2 ÝW%;*ø Ù"C$§ÐŠÉe`¦§`ÆÏ.‹‰ËH§·†5‚äÅÈÝfËöŠŽÒs…´þý+ÒÑ÷˜Ùv²¾ š9]ÛZÖ.þ¡c½K¼ƒ=#,‰eµ)¥¢ÖšÐjueî?îŸæ+¨åÝ©È+ƒœgÜ£ÖȽà˜Å¸šK´M@À÷ô#ø§—Z|X[Ñõq¯1ð¸¿û>1I<€cì[òZ×Ag×CÁ!‡·sn-cTWý­aš˜,}ÿ”ÜîÝýÝPóµ›ç™‘ûûÖPk÷ú»Ó)‘äàƒ`öܽsãe†xÐÝÚP]T,¨Ð”4×QãÛ—J6;®ÙzÕw$DG¿/âXŠ .&&JJ!ì±Ç;ZX e7¡¿ïx ‰Ï9ÃIdS_IM/â[?錴‰«MÀCfÈÜ –Yßs¼º2¿¬†Öv„¢5 — %a–°–}MNiå-?~„IŠ• ;øŽ¾¼Uûì óÁÞ°ÿ?g]ÉÞþèu=4ü¤¦Â0ÌéP»‡‰}ºÕÿ/_ˆžQ¶ýS~¡>3D£cþÀoè%´:[YOÛ‘GƒSQÌQUFªŠŠmHPÓ%-âÖ:eð÷ ðÃŒÇWñáÔ.­g[}ú,7º9®¶•êïjª§Ï7««[©§_Œ¯£ í™_? x!øé\¤lgMãðÀ8ëS25¼ÉEáÞø±ð²P¦¢À÷!Ÿ¥elK·TB˜†™ç—ŸZ^yÛòÔåú‡êzøó759)ÔY)³Â³,æ³d.ïÊæ¢/yB˜Ÿó{èo‚¢&ˆ& hÒû5ñ®cš&•üñŒÂô“ ÷|„§¥;è=œÀÿfPÝØÍÜni½þjʱwE9­‹öjÙ“+/¨ëG.„ÖÒš°À²MâÅîdU^~a.W|*¯E Æu[v:~åg˸ñnG‘Ä»·ö |žK€㜬¹GA_I-ì/-‡ãDW~"´ì?Ù$’h˸‘õ‡´›B[½¥Ê^Œ¢Ñ*4¢UG ðÏßU52gÚk•_‘çYXûúH‘¡Ù/‚Ù …•À +¶üm0ñ›uÊ^ÌùßUÕĹš™9.©Ç¼¼3ÇÄb]Z«=Gª–Zk‘ºûª(¨ jµ²”˜ö5»1„!ˆ2ŒÙÁ ]·b]°¢b£Ï>ß³r´ÏåÝá|éñMBÔ.§ïÏ™ï›ïw÷Þßï~ÓÀÞ®õ䈲¯ñFXÞT)‘'é&9{„$dCðAÿ¯¨Þ°ãâs+¦W£Ñzm%ÇÈäfôÕ:[~Düh}ÕÄ)$zû4EÅJM%Y¢L‹v7yúH‘´ô'ÃÆíÊoceÈÆÃd¡ÏiŒl^d­úOA ƦôØ´TBš¡^CEDë-)â‹êÐiýŒ·WérJÅ¥9ùÉQá»°À\­j65R°Zƒ¡Ft œo”iåâ²ô‰9ŒÉ÷QŸR÷î® Ë1xÈðþºü«\“µ¶í +L`‡íL#;®yÎ<ÔÒøt“¢µ…G+ëâzwéx„g/ qšŠÓÓÏ_ Ëñxîá›ãánC,Ø^3à fŸ ·ÿ&˜Áì£ñÙn~ÁxO,B‘'Ö0Æ6¤ZBNoéàš`̬§? öõ6×_ü–)è64RÉpAßQµU›Ÿ&÷Ý°’»SM ÿœàßåxïw©¸ãD§îtvý¯…‘›>"Œ0*2ÊP ì®9GòÙuîü’lÉ [Õ÷•…9JDæ (õ4Õ*U¼2Jž»VMÈ ›Æ—HÍêM¾Ëxß õ> Òû½ tl£·3:¦îA^Zí\§§råð/ÔækÁK-ðLÆrp”ç° 5kñæÃ×z:O>Ìw&·•ý U`&X¡ð©ñ¤±NTÐt°¬ËÀ}¡”áµÖÌ‚Âo õ#‘B‡;Ø=Ü=\†µi­ÊJ)±O¶'=ˆD ¸Ÿ&T/RÇH2Bt\ÔJ_–Ÿ¸WÝDhê4'Ÿ’PĹn +»ØQí}3ñ.—oz¶±‘C<ö/ÜŒBR4 +-A¢` Ñ› ka2¼Û! MæÞŠAâð¢Oßš‰Æ )S8› …Õ†`Lz‚F£xpN-ºèá sœïó`;{‡³À‚ 4ÔROoAžè¯q+cwšLYâ¯k)Þ– +½¡\üÀòð"¼NžßÕ±½FT·uMÉR +™dXßû½žÆßv÷;,É«Ì¥¡¼ÎŽŒ£ø +2¸Fù5j#uýÆV¿ðŒðÏbÅI‰_¨·QÁد“X]y®¤\,ø²&¢-°nóá¦ÀµÄ^ÌP]œZ.g|É­Ñ Ç¶õ¤"¾>{‹<#±}Έ˜¨5Å+(T(Ãú_F'Èx9ò*_é±Á•fiòø 7@òÃZFÐ× + Í¡%ŸI,ê} +FA(˜Fe3‚ŸnãüŽ.«/h\×p<ÛòÍ÷"AzE«+ÄL¾·à¨âœªUÓ”cÈ,È2‚¾By¬i'…þöñœih P éâïâ/ÄÌ!çoÜ°à À;žÎe.×ì÷<›÷BŒbÓ½oòþÔØõ§ÍâG†âs³ýãÂD¿XŸ¸’Zº‰9/Ž·å|w›„H—{õ¸WR™|x,ÍÝ„Âcx“TÂë°ÆÁW¥u-w‹ /9µ¸S†ÒÚÔ欔5¾IËg£äõH´V}a’k9u&sKA½Ñ‡F~NµWYÿ~;â=@úËh ÁguÀh&7y¼ …‰ÜµZÇÑD:vZU¦´¾ŽFŸ æ²é,udz[1;ÔôBZ1Óp¯Ðx±ˆ‹ F†×jlê‚ìÌ`ß´ `½ 't˜À†–±:o)†ÞsìöæžûÅ~”yÌTl3ùÖ9çxgļ8ð[vÀ`îA•ð€ÁTfµ÷î±]i»XPzÉiª‰2¼U}XS”›í°9`ë¼ðÁM·6ÛÓê +‹c‡ÉÇå»g”Fm{`{à‘ Û|¢2.?/•D˜Kmï:‹{ôåLç/Dsª‡ÏVsÆÙÉã,aŽü«±IE:ýMr˜ÄoôOŠDÕȵq·1g8Dˆü¥Ø…A?Ÿü…Äçëô“")p•Ù](‡Ù힇í0ã jæUy祦iTFVE‹’ðfuSÜAQYr|ñNꓬՑÒT")=;3‹Lµ¦——ZòEm%Ú¾¤:kãþ.ŽÅä;“‰õriì&2äøªÞ'[ÛD¦]e±*"ä¾Pž•*£¢™ÎæŠýM•âJó9kU1Á¿š]ÏòO@äþ¦dÏk7!÷.ÞFæ.OßœG$ã—ՆݫIÇy\ÒiË=E ø3˜ +^³þí—‘­ÓäˆgÆxïò2W0E‡¨ÇÝÜï >º8Ô ©W•šb¹ŒäK²/Àãÿ^íAM¥WÜ,†{wµQ¹½ÉÉõÕÝmë*­»«ÝßU‘± ¨<}$>gL~-NìünÞR8´YIŠy½J PÁ(|….ì¸ÂÍÅ¥™qy"pëçpOZ;Ývº§_•l']`OPæ†3ŽxÄô +z O¥)jªg/ +—&Áü­ª,µí$&Q<<ÍD®7¹Ž×ëQ;r¨œQ®®<Ããˆä·@´,<ÉrŒ€ˆ1/÷¢¿â‚£By2±ý½ðó +,ÖƒÅÐ jÕWèNðîìù“?½ð=šMóhôËÕk²¹ùt+ˆÅGL/‘GÓ‹5ùpW{ÿ›§À®™ƒŸ•I|f]ØmpÁ½ ¯6è5Õ(½¸ß.«½b±¢Öš:s-ÑÕ!ÛIlܬ2•¯2ÍU&½YgRVËlÂÚt]¬Fw,,:‘UËŠSŽðò¢´4½’}¾áªÑÁGO!ëšÊA¸pjhÍyyë~Ht·IM>'?ö +6ßľڂým‹ÛϽÇ&¶X -&‹Æä ÿŪc5ÑZÔf¦˜ÄÖwÂé7‚ú#>—’ØÔe±ìPF’¼T©Ë3å×d·g; +QlzYª4RP‡Ê T9Y¼°Ë;,ÈW/Ÿ¯³Dñ±—ã— +‰h™ÅVÛj³›ÈÒZS™ø¦]Ñ)¦HˆE/ï¯÷„lÝx8ñèïâ]#ýÎ>znÿö5îÚÿûÎzÊVOÖÙZM=„³K«h';ä™±¼è„U|μîùƒsbÂb\^`£çAæF1õ2¤Ö•ó¾-F>Õh>ašE"…4•W¡Ü@šÛ{kûtèpKÔv’Þóo“&$¸Òc’ˆŒï¿ö–¦ ;–$@9ôo!œ¿Ê–ÏÄK?6Ü¡øY„ yN³ óµÅ…|ìN|Nœ4^‚b“ÂùÔ‰KñôzTð?Ù¾/:¹®ILr†<ιQ§Â31.lÆžàØ£/t å6~ Ÿ3*©²DC(‹ËõrR©Ï×3 ô&…}›X}›FÀòU7›^ÏPÜÀPTÂÄCÑ„â +™¨(‹X»ñ`)XpwðnC‘ÝHr6Ã…áÁ×[G˜N>„õ‚phiih"¬Õ…r ‰ U©Y]‰6š«©zž-«U'âkg½¬Fý8« r…ø{9ëæòså6àÞ÷:xxœ!ÔÇÏm8'¾D|9vöÙHǶ2Öz¨­×ÕØ}öT§( ƒßdÐÖ+¯*)®Y’fï…lLºJfQ©Gx‰™‚˜[סº¦yòà>Åš‚¥¶"Àò>^]Q§‚³x÷žö'‘H*3N†i§÷ÇÝGnk**«øû”v¶Bš­’é É™‘_ŠÛ)ðM“Uâ3Í/Vá^ð<ñH|n"sÈ>E‚“H¼z›R‡Hµ9¡aS%fU!ï\I¸×Ül¬oçcÁ-pPVtbP³±5UöþJ«°#±:¶¸\UáäYŸè9?ÔìFmôñXÄî)V9X bÀ›^ ¬¿ ~öx«o¢y°\?ÈHÊM"¤O]£Õ+•Bnêúä_ ?JM|~쉢Ã`¬ÑdDs¤¹V¤+i Ëé¿ûr€Ü"þŽec:"W1ODùèÁ*÷ÀÆÎQÞ¾¯{gÀbú–o«÷Àíh÷´ý†ÑxQÉ;EöÀ¡i+Ö)‹Ò¸²mÉ+²v@•LsÀv¶w ýVüJÁZøc¨(l©4Ûô\ìlŸ‘MчEÈ¥"}©5,¤_ûrZ`Sð¥|*¡j]>8ØB¯+°ql¸Î½n(7Uº’îÐqšï››ž ¢ØÔÁ=¥e»T¨RˆP/Ò—í=\{ÕK¼O£¾u™ê¬bQ±¯¤Rÿd¼Lbš£8žŠ©@jÂÝ’6^¼¢Ô‚…DAA6´mÊN±-¥tß÷uJ ¥) )K¢RÐjUR\õà‚ M8iÌ7dHpJ \ËpŒ88äøê;P´ +f~DRûK/SštV7j°ª­ 9ï*~ªû‰Ÿ&å„)±1¦ˆ#C`žÂ2§”Þ°(g;Ž¬Áøy +g@Ïé‡U³¬BÕ1ª¦ûÇÉ ‘¡Ð2ë/tgœÃi§qš]E?¡àÜà,úè2!ùfk—ô 'AÈäwÀØ´ ¯óÒ©JŒ,¤Ä2È]Î?/8ŽF}§ÖÂáºù#qæâôDbŒ­ +‘ËúJo3+^5/°AUþaʨv]%L8ž³» õßÄÅS0auåi«kßQ  +á«ú÷ÿÇ.ž FÖ•Õ7ŒçY…¡Íp28Ì …Ð(kñ1·sŒãQ¹Í¨u{P›Óî6z4ÞaîÌekƒ¾^Ò"¨¬“Tk»)z±¾»•)Þ³Ë=¡óC£ì?˜`E§údA²éQ{­¡Êöë4Iš_¼¿Í‘u ‡uŽ6ù=M¯†Ñ?È÷õXnk¹-‚ªZYVBx¯®íÀ{©K >I2c† à>] endobj 67 0 obj [/Separation/All/DeviceGray<>] endobj 321 0 obj <>stream +H‰ŒWYsÛ8~ׯÀ#¹5‚ð®ry+vâÙMRI¬ª<ÄS[ŒD[\K”#R›dýö’qg£Ñýõ×o3güK­SYáÔ¾š}VÍìr1;»º1jÙ*«T»lfg¿C÷¾-ì¿ .îf°ÅÀ_ø‘Ê"§ÛÙ—àuÝvá< öáܦAý5Œ‚ü§±z­F‡.þ˜Ý<–ÍùùÙ«ew(7‹êGw~ýæúÚã...Ôåë+5Ktœã!‹Õ,Páâ?³7ï`Ôð±ê•²^)ËJð†/Á"œ»`]©pždÁ­‰²}肶ã>(YUhƒGîw¡5ÁŽÛ+вB}ÿÂ*³Ù…IðX7÷¼¢ä϶ìÖ,†o8‚zYndb‡}‘»åŒu)§WaüxÜ”uÓú©ªM÷¡uAÕ¢Ý6L×íTK4à<ÑXgnµãû>0 +ø¢e³‚]Ö8”N-P‰¼“’wìÄ;‘xGbûFM ƒŒG:ÁÆ°Æ_K”Qoja£à'ë†q‚’BÛÈŠщ©.Š”|È­Èå:Êb tjbÄQð€+„E‘Õ‰s1¬ÉtJ+ÏGQä}/¦+î¼ÒpÕŸ$Ã>y_°P”ÍÃÉ… + ÄXÉ‘ +_‚ßÂAÂwpY@øðF-åûöí§KiÞn݆âÒÈh“Ž\*¾B@ Žð"qÌJ×¼Wo:îÝÉõŽ< 7XrG£¡ÍQZü„ÁV‹Â. >¸Œ?ã¡ï&Áwîukæ_8ŸûP"ÁÚ"Òˆž![{ÏÝv[nÐP›Cƒ1¬I½©OÝÄÝ õSá›r’ÝŽd³D=Q<ü†âÃJ9|ἿéPcîb#?}‡x&”%Úx#rÙ[OÕòí íÞ@Ð^×÷ðÎâî?ÇQeušÇÏÂPÎkV²Úë4U¹ïíé%ê"õ÷|"ðÌ P¢xàUh#­Þ¡4€aŸMf¿ãv»f(`z…è°Î)F37%?šDf†µìãíã@]DÌ™ÑÑQÁïbä¬×CL=ÏÞ‰åà¿MH膙À ÷kB»>F‚$xgÿ8FÂ\¦‡‹—?ˆk#— +­a«ÝxnðXäaª`Jfzv»h†³»:貤% Ó)bÓ9gÚ!Àš²‚Ô@`bRfkÓ–Q=BGP†¿¬Î€…ËÒ·&„NíK™†· ÏðÝ„‡ú‡*Ï@y| O™qpØ”¢Kb'ãÒF]¿û ý<"rÉ€$qëE‹OrHçýU±Ûìè3¢, Æ9Ú]u—$KyT0¬+n÷ù"*žN/ÇÒ¢Z9²yËóõ (æùTòpCöÕµ°fZ›úÚ&n8ßyg´¿±,EX–yÒÎNÙ?;bÿÌ×<+"þ (\ŒQÇÕR«b¬„Í3È®-1Ãc¬×¦Øn¥N¤ü‹ÕDŽU•Z7N/ƒ_ËÖ»ƒ³]4 +oþÄñ+ IÄc (xØrH £c$î—.koCïXùÏÐ~ÈYˆµ0u}Á +k|CM´;lVÜÝÔ\5rox*¹ íëÒĽœ8èòH[ËÀW68K—zutÚàš„M`ö—Ð ,»•Zj×ò¶Q ¯º±ý²`` X(&ñ|˦$Û‚0XÝ$ýBïÙšŠÆt( NJ,ñHà(ÚújÐYªáC±qótFÛ±ždDºÚ°më§esQ`ŠE§8¼y‰ympÀȇ©»“ x )ý¾ÄK”<xXÉ>#@“î]wðÞ4òP‰^yÒA,P­äÉP M’1¥BcZ®¢M»“»Ãö5Û­›0Ã]»¬9tÊi£ç¡9\–!`HBcÚ¯—}Ñ….Z2*õ¡ïQ…/²zx“ÅÁ«Xµëßsh>_ðþ]ÖÙX]5ƒC½ôXvkjP†nf©7es~~öjÙO.ªÝùõ›ëkgŒ»¸¸P—¯¯<˜ÒT(ŸJÿ7ï`Ð(ükÕjb½&ýÛ0ñ§ "lp ©Øè—@Ità õ›þ9„DRéy.öU‡p$ŒŠç……àšž3ŸÚñ,%ü¦‡Ð‚Î7@ÕÁ?`Q£ºBÞ|6壱›Á‡fÈ%Ô^&õU;´¸6Au~>µ bCÞÇðůOœ|ûöÓe¿é¨zô´“£W†9N##ÝpÕÆ;ŒÆ§#šS¶àfíG'E{åGo“2îÍbvöaS.«Õ‡××êìÝ•a´}œ}›¨ˆTœä:Ï”-rµ¯fŸU3»\L‘×Ç@$/U£ ø£æFkàÉÊ?ì¢LG.Oœ`cpÙ\ö!Œ“ã6G«€†Èšß‘[åg°ún«ÈÜ…çž +(öŸŠOÐ)fŠA%S8%L® “úy¡ñ¢¤Ò~xILÈ),D-–Êj›«y¤£8gäí+2ü +ïÀ‹KÜ{#°æ\JuH¹Ä4ñÐö…^":ÓÖ é¼€ŠËZ«‹ØŨ_àŒÎ²\x!ŧÓÜ…38ë"·2Ç8Rè$Êd¤ 5€ƒ½¦ÿB©‰ú®bõNõþý¦¬ÌƒëtT$ Ž³ÚdàÁå–6ão†LÕ+y¬£(=0йùk„=ïJ+Šå\ªã"H¶lGì¸# ŽÞK¸¬‚Áo°‚ðEΩÐÖÆH08Y=ŽPYBÂìG+öÙ Úb`ÉIèûŽ¤Õ»ÆGØÇ™cŽ h- Üäb õ"Ðê}~‚›¦ÆßÛà“,@ªñ—¤\Y² J(°„ù[S1Ð’ÓŸ\c1LopN#g„Œ1½WཤvI¸õÎóïo~hæðÖâo+=¼tëñI …\¢ì’d}Uúˆý×:ŽðJ7]BÒ6UNòìP•- Õú¥ÕÂn‡ÊÚ•™¢áM;¨*-=úþ ’ö!ùþrÌ'h)ÓC U¨‘”i]LÓAÄ2-$ÝŠ%®ó±Å'#•ú±Ã3­íQú¬.j20òr䨠¿/°½IËè«…ªÏŠ &´\FQé÷w9jÛÒ ]뿱n®=N1HèK4 ê +·ë +å GÇZÀOõ¾· î­ð&Ê^ÎåueÇŸóáa8(Ótuy·L2%pCnL¼¶¼£ê/Øéë1¦e¶Lk¥×Uûo¼Äž)e¹opKm­sïóì6J–­‰«Ý¡|Ýs›æ% T™¨„ì6ßï+oø–^"ííkó~ºŒçý;ïË°ÖÆ {ƒ²T_’¥Þ­(SZ£0Q*æþ¼ò?&í½ŒWÄkóá·.‚Æð£VeÌArX=b§³ž–i¼Ëú{%)‰·ê˜å+’¦òuÞöµÈႧnB[A­˜ù#…>^bÏÍ¡æåh{±p–žkgÛx7:SÿýMF¢rié’å†ÁUF$¾üïÏßþqùÏëgþëq‚’a„­ÝÂå›ÔÄåGZŠ2È,·ùço,±”×W£\:Ûë“·ßÂím/ÿ•¿ÇËý™‡•òýyãíÓî¼?^Ö¸._Ð'ú?o»ó/7©¶•½¶àKO{à/÷Gž,ìënÀµóåJÖf÷óLoݺöβ(®%ì/+™Ý53òî]yòÞå¾²¯hLø'ö7ôc¥»áÖÆeÜ ”„c¯Ü ¸vž!Éé«¥Wî…[—{GRWš³J¯Û´v]¡6ÌúŽ÷Lž*’mì<ãÚ´vÝ€Jª›¹ƒû€Ã>O…‰#tåe¶Še«Zm÷N¶ëν`kß R­ÉÁaßw®B¡“GbïÛ´v]!†Ð\„aoܺöÎЗ!K’±!B$îÎÄ‘wGèÊ{ +ÀR0ûN¢Ĺnm˜mÓÞݦâÅ ·6ž¡dÞ:ú ÆcÎP?àÚ9AÍÁ„Û+÷­3`¼ÙŸFâîLIw„®¼çÒ¨Ò¤UJ‡å†qÖ\¼:åÖÆ#´V6{ôëS±7î…[OÀ…ö6è)¦sOèÚ{[ܾ~Ìí­»×Î+Žùüsn¯Ü ·6Þ g¬¤¥!B0&ݺò^"¤ à!¯~ѵ÷‘(;ÇÞºpí¼@@®Î^f830ú€Ö® d÷<‡>+Íý€kç µÄ$Qƒ?!÷¦áÀ¸lå›PL´Õš_Ÿ„W§ÜÚ8B®åÐöü”¹Ü ·6žå½5í<îûöüh±¼#Uü€kç±1¹l{ëŽÐµw†@¡m^ä ÆÝÉ8òî]{oÐ0áùÓ±—î…[¯*˳çÇ«Wpí<åeØ3u`•Kî~<“ç§r‰ƒrÁGø×®5ñV.åéŽÐ•wŽZŠçÏÆ«Snm¡•’]c/ݺöž% ·*æ¨hÜ›Œã. µk©Ú¢ƒ!·÷í\;g(9äó'b¯Ü ·2ÞäÅå¼÷‡W¿èÚ;R9y&öÂ=0kÓ’‚Hé‚¡4äOˆÃÝy8î]{/иîmÏ…âîTyw„®½Wà²óðÿP(îÍÄs'ØÚwƒ1<{Û. {×$k¢6æWd¹+tí=AN¥ÉAÔ@ÆÜsVK/ܳ6][Ei̼L·=w|*“ÜUË3w~*“8(|d/ìå¹LÊ¡kïUÖign{ã. µkiHùÇEöÆ¡+ï13îmÐ×Ïcí®-—'û³ÅºöŽË£›múõ³m/Ý ·6žñæuâ\qî„ZÛ&ÈÄòÌ + g­Cqo&„»×ÎYÞ*cíV æŽù×[?óÑÎrGèÊ;ˆ-òù3ñê”[GE^>°\žª¥OÅ£ÊÜ ·6ž Å’] ¹½tGèÚ{Z©îëÑž½<±ó;¿±óC–iôt/ÜÚxJr›£¥!B*îŽÅ‘s?äÚzƒbÚlÒ£æÜ݃îȹne\Ž DrmÝ,¾~нz×ÎH2Y,tèT;"×Ö &éÑ*w;®éÌÁØkw„®½´Ì´5{ëe`Ü´vÍr¡hÍÅÛw„®¼çT,—wœEï(s7ÜÚ8BI‰vÿ¿}fnñ®gH­´“‡bïÛ´vMB[ÑEöÆ¡kï 1¶rþDì¥{áÖÆ4|AŠPò™‡Û^º#tå½DàœâɃñêZ»NPƒ<ê!{ãŽÐµ÷…ˆÏŸŠ½t/ÜÚx…ŒŒ·½r7àÚ¹I ùä¡Øûv­\Ó²L¬.âðê]{O¢T 5¢9möÊ}PkÛ¸–¥9eÞ +Xz|*•ÜUÌ3z~Bt|d/ìå¹TÊÊ¡kï5ÕzòP컀֮YîlÍEöÂý+ëU^¥˜Î?Ù^rkã ‘ ¶½r7àÚ¹³äÕ¹#±÷íZ»&™­(¹ˆÃÞ¸#tí½B LçOÄ^ºnm¼A¥åà—›\iÈŸˆ»q$ݺòÎHN¢“ãÕ#´vdÅT\Dboܺö^ •Â›ÃÖ×ÇboÝ ¸v^cÅÓ£—wL1ØçjÝúÍûß¾ÿ—ï?þòãûß¾K (Ëb½Ä ~:›ÇË_/+„û¿Ï>œJ¾?l||†óê1€ *-˜â¥`Yð߯¿³ ìhÒמ„“¬2¡®Ò!ðO8ìàðBluÆÚ RhÛtjªëòcnÅ'‘Éä3VŸäk@ëpØ¢!OÊ>5n´ôY” 8ØWémæ±9ÙYN¦9kõI¾ Ó@CHdÈK—M>kõ¶#é=™}V—h“]zM"ôVŸ¬r·”„^[ƒÄB1Ë/ ½ÃÆê³€|»‡­.I_Œòl1Õ'ÅR­a}p9n¬ ™-@kõY@¼ø@ΆÀˆ¦@kñY¾,±œÑ«|²|¨¦ÀšÌãÃZ}n³ã* ªh\>ÞÞacõY@–1K —l” !3­Õ'åÉPÛ`‹3$²Î‘ò2Á€Öê³€’9¶8C!+å”.æ)l­> (ÛÒ`‹ `²j 3§­Õg Ð2*­ƒ¸BÄdâkÏâU(HëSšàµ·”^ñW¥‡M>cñY>xxpˆ³Ö!R7ü—"oâå(5»K÷YÍ8DÌ곟åKãà~%|…šy†;`¬Õg3´:ôÇ1šþ8ØÇ‹ÏâÑ2¬¯â(ƒ~´n!yòL>cõY@y[«ƒ1PúÓò'GðŸ±ø$_‘'K4°ÄC³ dß1­Õg2.[XÉš£³ìŸ9eY«Ïf¹On[x» +‡˜Ì´VŸ$Nl±ÌHh1S–µú, ÜxÃè.Çò'+ ä @cõYÀ&ŸÅƒ1å¢c›c µú$àÿ©/—$NJνŠÚ@!2ü®ÇžxÿÓ‡”TÉ$.AUõksàhK%A‡¿ =«Ã6j Ù]Ó°GPp/Ÿ®ªn¹À®6 +}-0f¢{µŒ²qmé[‘3È°ú8Qp/_%‰Æ±5ø:Ú#úÝ‚3 ¢{5‹Õ8¶ô­Â 2¬{á­‰¢;kÔmo˜µX1`ËE÷2õ÷Íš¾Õ3vú=`@Ý ˜tÛm¦—b ¨GÅoÝ X´ÎŒsK¥ 7’§ Šîl”Z5R¬€¹U]„+¢;[Pöw¹òeF%¨¿ÀЭ‚à^ îåÓ2ÊlXA¦Üðe‚V÷òJ1N©Ák$S,¨‡at/`Óà ʲ‡wÇ©At'`Ô£R¬{NCœaÜÃ0ºPGqïFŠ5Dé°6¨ Šî”ñ[fŠS@Sp¼†MŒ¢{U6L/wù:<çPp/^Õ9’ /(T*:F +Ý®Q÷òu5Äv ·!g\€ ºõ¢ †M-o4uÂeF| ¸O(Öhä7©KBõWÔëCýPt/ .*±®9츛ÀFѽ€ú#]Œ « €¶ŠîlTs1Œ`zÜ“vŠ;žÑ(ºP¿Yônµ3¬ÁJ¡‚(ºPÍ^µÎ9l¤X¼@>Ü˧YŠf†Ë_NE÷ê¤ Ö5§N9à ó ˆîlJ6¬¾Îˆ€Æt¥·0 +îåëÔ¹F0Ÿ 3œq£èNÀÕÌ5ÃǨUf4«¾†Fѽ€jV²uÌe}«€ k±“Aѽ€ +ÅLñbÈì6¬ ˆî¬$Õ:çîFÓNq;š2(º°K6¼ A<¹€b;ñr¤ÐÍìa~¥A'‚{ñ˜z †T¾„ë/ã-‡¢{5¶N9=5"NpfX(º°èª5T>¸…•¯Ã%‚{ñô7’uÊ)ßA‚ î_Ý X‚ºåjXý¢ä+Dѽ€<¬ˆá°v˜áš ‚(º0©Ù †T—Ô3„#÷òåqñ>P¯Ý‚g`«8à ºpX‘df8dT»öÒ(º°SÖ1—MjeXs„€ :×ak¤\«‘bu ‚\‚è„5ˆ¢{…’Ø{¸eauyf÷òeõ"lúÀV¬¸GPt/à¸ÅðºG TÀŽѽ€}@‹MA¡Ž{Ew¶@­YלRœÔé@Qt/ ë²êfŠ90¬PAÝ ˜¨Ä`zAÎhëcèµPt/ .‹j.b‰¨G”¯Á)‚ŸÄÓ¥ˆ,#ŒSã˧¼¾!5h_ª¬,êT›ç7nÔŸ•RB“G*kßèÃI+<§µÜnÇ[„ñË°üz>èX«Y€}:vàµL¡„¤;P/©Ô’D¡ =C<—‹çþ|]xÒó^#Ø3ýÿÜXƒ’)Fu&MôAb\.=(£8殦¦¥±9Þ3'Ÿ÷†¸ 2Š0èT"mÁÖùÕå²·So?ãÁ¯M©ÙòVÙ…Ô©÷”„çÑ,TSc2RsïÞ*éÕš=ŸåàqíŸXl²ãºiú±b÷¶Ãqh;ëˆKd +±é¾ýž|hüTàþþkxmþüù°¢k?X_9ºwTØù‹3{9§Ù< ¶^É’$‡D<î—#­£¸ôižl–ÉúõY–ƒŽwµQF3EÏtj­YpØL/f=¯êžEÆá½;¶ËÿØ„ßØ™'µëXCE«ždÙÃ;•ìÐÒŽÁZhÍ‹¢ÏÜ$g gaŠ)YÊ®)/+v/…Í|åênX6þeÕ¦iizN·©dÅëV›z2cF8qSdé”ûh•Ù§o/.$éÖŽYN¹Ì8ù§ôCÛê³ÈZÔﮪ{˜u3N'Qñt£ý##{¥V£WXvS¾3Ø^_”ÒõgõYæ«4||jHt­è?ãb¸ýó|õ÷ˆs~þ5j߶ç7ï¯Âýc·ÿÕ÷‡P·ï¬>ãÝíþ2<¾n1~"^ê!þÙf ¶tÚH=ÿ4zöêIðYóq»ê‡çqÿ€ç;|:ߟ߼¿zÂ÷çCaø´‚†êBŸuOT$—ÃF]× |]Â÷eͼÐû²bêÇ* ·Jý*ܳâEcê½tÐ¥gÀãŠ<¾ÐãÏj~òYõFjH÷\˺IyŸ6ðe ïlÒò± +¸‚g×|¹ú¤{ ÄËQÍl‡âO¶éf0fO©_{Ö›)´Ø—Ñ&€ àXFâ©ó+¡Ïº õ¤‡Å©ÙÙ=ã7V_{Ö;S %ï\iÈtÁeäŠþedÕù…ÐgÝ+•¢ÝÃ,Ô"çÿ² Øê~!ôY÷NYB<ô»x8þèFr¤—ážï‘ô¿|n4º\W4º”]—«Ð/D>«.Z&Üë›Ý] °·” Ùµd¿ú¬{¦s<4_'œ€s)ùÍ€±O¯„>ë^¨×šÎõêv'­zÕ3WúÎ.½ +ö¬w£&½~p*㘯/À† ø)ßx%ô­î)视 8ð^Üüº&ö¬7S.’—Ñù7’g—àWážO”XêÑHÄ¥òííÿV‘_‡|V½·rò¦síþ¯ëßý–ê×!ŸUoS“Ã.=±ŠœðþUdÉ~!ôI÷(ÄPNZÝÿ‚{¹ú¬{¤Vc?,š?_…{V\¨ŽŸ:0Ò|u`8»tuc¤7Ì…ÈgÕ3å®=Â¥iJK±šT ü®`à +Ä¥”PÉXóåBè³î•R.ýäpt™6ŠfšK÷ ¡Ïºw’Øøƒ³P }Eó»á}õ~!ôIwÖ8-æK˜_×EŸu +‰›ɨÿÓå½¢Ùó¼ëöÈß)öËpÏŠ'êAø°\Öä²!ÿöZ’wD¿ú¬{¡Z4ÐOŽÇ7àß*ö ¡Ïº7*\Û9÷ëÚJî×ï ß~!òIu #h<Ùªøèð• ::\Õ~%ôYw&É1}pÍÔ“8á·E³‚÷ì¥òÝsîYñD¥ž,—?ï`.Ã=+^(Ôr¸¶Ä¿<»¿ö¬w¥.%]Âvm5¿ú¬{§Úk=yclQz>}¬¾¡û…Ð'ÝS¤R¾9ÿˆO¿ø¬¹PfýðÑt\›Ý²_OǸñ5£9 Ë>¹T¿ú¬{&iÃàƒOx]ß¼.{®£ ‘ϪWbýÔQ§®ÙñVZy™ýÔ—K’$¹ D¯Ò'€~@r=K™iÓw˜Õèþ[yVõG x 3K¦álÚº§Êó¥G`+åP±ïC¾º>ESG£Ú@'aRþäÙöÐß[’iÓî:õ8Ïz`?4ê9øæ ðS›ÖÈ€Ù{õ;Ë(i>øhŒ ¡:ß }õ½ŠM £» ðD“F.¼·‡Ë6Ü«ã& ÿ½yû³äýmÇwá^ÇþQ›·‡ŸŠö,9ëÎPH߆{qÜ’ä>ò—F®Vÿ+aq'ôÕ÷,Zf{r*ž+¦¾_IÑ„ÆËNè«ïURÒñæl|ûÄxe¬ï„¾úÞdXÕoy)S_LïMÈ—Lß…{u¼KÏVïŒçC=0â!À¹‹vÁ^ýžÒÆè·íYŸ ×C©èov¯P|Ù }ñ½Cô¡š‹Jns…UÌe PgågÇ¢Së;¡¯¾c ªÞ6*¼WgmÔ8¼žç›`¯~7Ñžû›±Ë®Šå&v±3#´DwB_}ï’J{o]†.uB×—M—mÀWχŒÙË›Q÷*ÐÔO^¡ï½8>ðSínVŸ‹W9—ÎEÖŸ¡q¾ ÷êxËwÝ™Øå„ývw–#y9¾ ÷êx…hFwšJª³¼s/ãÖÍb#1”ÐwB_}7)µØ›èlû>ä«ëCrjóÉ]™Œt½·á^ŸI’üdÌýÿ§–m¸WÇUfv[+Ϭ£Æ"]Gžé¡¯¾éSÑ£6ð¨f¯­£÷zô•5º ÷êxkå6wñ˜ûö&z%¡oD¾ºÞ¥)~ì wQ°Iß^£;¡¯¾O)Ýƹëlû>äg×[RÉeêß?ü¹)÷êxMZo›ôŒÌÈõ€®¿Ù5 +ßB¦o„¾ú^eš¢KM%!|Eø:”ÌÚ¦_”·B_}7¹¢S Z¶Íµh.Ãã0—¥‘³úêû­î°•Î¶ïC¾¸®IZíýÉö?½6BûtîÕñ,}"‹%œ2ß|õ¼Jî¹¹^(šW‚ËNè«ïMfÎý¹ñ` ÜÉ.»`¯~wéã~!ñc¤¿Ñ5šBwèFä«ëS¬6´¨á°«³xðù@]NðÇÑkÑÃh,Gø²}#ôÅ÷¦ÒÒèO͹Oß»éì…Z߆{u¼H±ùæ.ª‡j‰e€Jº4´F7"ÿtý|Oßþøöoßÿø×}„_) ÛYó”iíP>&ŒöׇBúñ ÿŒþrî_7ß“¨µy© I†A߶&‚ÿþù×!:2ƒcÒA¸,)ãC.᲌Ÿlù—¿~Ó¨uL{ÂÕyOWdŒym¾Vyü¯|zâÃßñµQ>¢äkÒ›Žk>“<‰}(ü2)âu1­z×e¶BŸw£|D=È7¥v«×|CR1ÂW1­åcêÿtßC1tÌyß)ZšÛ»øb‚Gµƒx'æ¼~œ$i£õ—2}_¦lŸ·Ø%àg˜tû€3ÑþeêQ@û<\Àž•8Xi2õ(àøˆù—|ïÃ46·ÒõAăx3!÷âñYê´ƒÓ ©Gógt¼,’{&x;b˜z°JqñÆÇ÷ð–¡x®v;¬¨ó¼x¾Éñ:ß¿L= +ˆ-1±&Àfl6d¿J‰z¿Ùœ„–¾&€&µÑÍÔc€5á³Ô id¸‹fVT;Š‡!Ö‡óÀ ·Ã¯ˆuÞÀÀ«lºPi¤ÓqOפÕä¾îPöºë…½.U„”×5ÑDôí~£êQÀ)Ùª³à ã‹ NÔÊU*bJvb|Sñ(_Æó2`G†f%ˆ^i 2õ( î´–œF)©ÀŠç£=ÌÄ£|&]3 |ݘ´‰zpHëÅ}áÏ3ÃE) QâÔ¨¥9)`DZxb¨z0KžÝIYøþ™ÖÎRUV¸p7AØŒAÊ2ŽçjGá —¢wÄM±¿Ü[V0ø‡·>ÑŽâuÃ;ápàTv"Ù£ø) QÎ ìðÍ›×啉ñŠâL3'ãc² >Ó„ÀÄ£|Eªy pb6°æ½KÐT= +ØÐ^„½R@ãHÕ°7€ê³8!öIñǃL=ˆ!×¼+nþpèzÂdIF÷ÕŽáÕ$S«ûÀŸþx-‚åÐhSõ N‰Þ¯Ÿ ¤› ˜ÑB´‡™z9©Ìë1@ŽgÊý#ÚQ<¬ä„4àvƒÀœA3>ò 08wøLôÇä'Óâ5¼`nîëZû5_ʉ¯ÓŽâáÇš¹¯ÛëŠöœ¨GqÆêõߘ¬=ªäAÛƒˆGñ w„^ÇpðÍÁ`EB¤ÝÁÔ£€CFuRZyÌ×B[§©;Ö„7ÿ¯¹ýxbôy‰t.K{„d‡®æ_'æÅ®2 +í_¦D eçÊú¬¤›¤DO$¦Ä%;¦ÓÀøþCoé|fêQÀ!Ú¼ˆ ZØ‘‰ùaÜA¢¸3´: .ËlâÆå ©GñYÝ ERæV£3©G žÑ»âÊ'¼ž1MŒW ÓŽâ5is8 ¼Æ{¸WþÀD= +ØñHÞ‰ÑÉ`áõ(à”’‹“ò‹TmÔÁÇÁ‰zpªèðR R<ï9éaâQ>´iõb B¼±)m¢9S@¢¬2Ót_¸Ó+K¢Ò)ÍÔ£€/Çà̘,H›ðaâQ¾!VÔyaùĆŒ!¨Ò!ÃÔc€-%Á;x|ªlËrãcâQ¼,¥™“‡ųÉêŠGùÀ ^DŒ«,çÛÇ33@¢4IÝÉCèס´ìàŽÁ_×—ŽÂu™5¹¯;ç$Ý>cóªG§Œ”çE +­ÏKÂä§Ä3 +,’Qg8·ú©€Y~ÝÛÐ.QÏ`…½¹V¹¹¯«ÜßÜ]\]»¿J>p»õ$ Xgœ•m÷9ËRçë_.þ¼¹Þ:ë7Ÿ·Îon·—ò§Ûz»ùjû—ëo/$'ºìåë×?>yç›þ®o®›ÈÆp÷k×<ˆ³5mQݬÔ>Ã¥zä$œqßúÇT(¤rÊídƒ ¤c·‹$è]Xý›wo»‹«ï?ýpsûã÷_ÿ®»z÷Öuo¾–‹Òœæ7j¤Â†ˆŸ +Éf”Q½.I:mßVÿ¼ ™’Ä¡*ÚQ’¾•}”½ø|{ñ§îîñ¶Ç]ÇÙzWé.­±ÒsÝîe™œŒU_,Z¼nÃó_¼Ž$VkÏOx^¡5^?³áDÕ+”=ÍÃù„vŸ1˜OÀÕÐ'ð¼OJ¬I^½X½øüjŒGŒ§ +¼ GŒ§c8b¼ §cJÖPI§Æš‚tÞÁãù„vj]Ãx³/Áu^±¼°¾pÄx]§ÄšÙiñÒêWÏðÄp§$¼,Õu€õÅ#†Rž«á)χ•Xó¼O`Õï„GŒ¥¥UÚm²†JŠ@‰nZ槼®Ó0œ"°ê‹E‹×mªßuOEž¥°ryXßÀú¬?GùB‰°¾xÄPŠ`Ǧ°ó´§².rCÊ#R^Önt†,g AG w ‚oÚlkJWs¤æHX”/1Žýb5”áÉï„%_ÀYFÌ6šíêM×j‚bÓÆ À8ÓM-x} Æó¼ã¹’GÀéW‰_€X'Çê“NÇx“ƒr61•4E|òì°KÓ㨠+Ÿ†µ¾êÈŠÀ«/1àÔÀËk`]W_<âè YÎ@Īáu}ر)ìüñ©¼ µå†•G¬|DmÑfb²DÓ/ £áÕ®ó4]ª»ƒŽñjÌž¥°r‰\ßàú®ï#\yñˆ­Î&ðBêxuㆠœML%Mû“‰ýSħòªOè„>gb¬®ÃËJüÄ:ëVí:(Zvl +;?A{*ë)7¤<"ååºâe(%€Ñª‹­ë ž¥°ryXßÀú¬?7éÂÅ^¶ÑähWo¶–˜bÓ1ÄŒ ´<,bKÇÄq‰¸©ü‘ +v÷ 4 g¿€F²`¼òjžT‹@Ì`ŠÀ¢ÅÓ/T}'F²F¶Åàýð/õaȦÃûbËP +ù$¶à\·»Ý™ìj%†×úŒlÝþª|-ïnÞïÚª?1|£­Äð^*D©û8J.l,yö`lü ükÜI@âŒ÷䀈ú…¸ôZž&~¾SÎs{\¤©Î Üó˜˜Û?yfxVUÔ“ä‹–˜`óQÀp2†37v´~óı%Žcâ¸DÜhEn÷ ±ûñ Ç3±cìÇϧò¹Ïåæç_WÛ)ÎÕ{>™”ËšªÕÐëy“ç¿F\z}œ]^´(?•ÔûéååžÌÏ¿wùwþ#«gËÛìååËãë]šÅõ×¾I±<.Iš~¿¢žØ«?DÍ(¦œZÄ|˜øÝkò¨õ¶G¥«¾·•l~8¢“#Ô3eö¹³¾-W´¼¢åmÿSôÖÔö|þÅ›8ÉB)äÐ >Ê»9mûh'Ñ°ôùÛ{#GR5?üÛ)°h‡úê‹• P´ê™+GßÝšäçhá.M‰¼n7u­‰uM¬÷ÌÀî€×&áˆÁr‚•œ´Ö[X®`yËÁH´`Ë8xòŽ(zÕ(¤Øø†ÑkLÑ[Ó'$†;/kÞBöL™ýv±<ŎÛ:<ãm¼SªXâ d¡rKߣ¼›fØGÛÔ‹Î x<1OìÈœ³ûí¸]žxŒŒwÊá•J8bÄÑ+#ðŽ"<ÿJr$9E b8••œ´ªðɆNÌ(¦Ü”÷pu¯†g†Q|îÃjRìN|ËPCš:°@ƒ‹8b¬,Y(…ÜòïQÖÍ0Û§íXÈÿ“w¡n",懲dÑ ®köÂiŒW½Q6¤1VN`e0^F`é›ING_ÀD ž¼cJ45 +)v'¾¡+°2¯G`éËJNZ°g‹`¬£/~‡º™*ð¶š:GæœÝÏ»ŸqàVÚ6<ÿ‚ÝBp«Íeó@‡G ¶ã° nâ°Ü8mxŽÀš8,ÿ:¬þ EËJNZF8[5CÖ¯2$G’S‘; ͺƒvtÇjÿF²èˆƒ'ïXqˆÁ<Œç8bÄ‹)zkÖ‡Ãi v ©¥ý(‚#˼®†·çàˆ±<Œ—x{NYÉIë@ê`®py…ËÛ¡æ²y¤âu€‚ÑÂÅbqGÓ/‚ÁN ¼Òã™2ûŒ±ãý‹æÄTƒ#V£b÷ô†9T…ñbìöŒB2 /…Ñ$s0ž!ñŠÜÞðFÙ¼ô&®çN*bYKEü@“—…RÈ­îs”wSß}´£¯OÞq÷2|;«gÊì3FÆÚÌX´bF1åæ´N÷n>ÜŒ-ÀôMŽ$§ˆ£/Ö´å.Þ^ƒrX6`ÑBu^,ß‚Ñ–‹lK檕ßõF[ŽOͱ<þóí{ +–çU)™]ž*öãçSùÜçòaÓó¯¿ÿr™„4'¤+ÃáòJ uaQ"ûù—Þ~Èók¿½üèIÊ_ÞáÉüü«—ç¿R¿>[Þg//__?éúÓüK–wÔj,‹F’¦ßµ6œ(†¢@Œ¹ˆ©üñ7Éõ7>ø&ÓË7™V“’ V ÏNŠXñž•u&öñÝVî[ˆÛ %’E'8Ï-Å©¦ñQÞwh}Îõ½¼ãAô•\b3Åñ•—k^^óòÇúÞÒ¿b‘œyÅ™8ØÆëïCâþã%žÆÉB«axvŸ¼í™ƒ b¨ Tr$I®A»¼ïˆ*¶æÀíÓ·Ý.á.$¸½ŒçF +W¦Ø)qSà¥p:’œºßðæÀ<¨MW}°ŽP¼M§>7Ü{J^¸=‡·5ð2Oã¤3çMb­‰uM¬[Ä·,ñX'âI‡Ä€«.%F]Ý6 °ÄE‚E,XÞ‹1À²ƒT&«œ#Š¾$9u/g7œ:,›#³ò"}§¯®Ã¹B§›1q>‰¯N<‰Ñæ‘ÍÆb‘œùÖMwÂlÃ#tET +Ž6àŽÍx4ãµ#‚‘ãÜØwñNï@ŒV‚Má"Yt‚³<40Yhí磖؄Ýgˆæ¦Ã3\+ÆklxÛ/&ð&ÐDZ¼ÆÅ DŒ7ycÝ¡Ã^ÐPVŸˆ¬g40àfNJ1óöÖКX×ĺE\)¿ÓË·;BâjñÙ§Øòñ•—k^^óòVJ|éç`°FŽsãȨöÅN/Ü¡ÃEXO_°ô…›8¼Þ.æȬ¼‡x´´þ-ÂyŠ± |¾`<æà¢B}"n”µs* h +cÕ5¨kïòÄkÃH†³ÖoÖðœ‹ÖÏð$FlLNµÑ_Þ»0zÓÂEbŽÌÊ‹`;ÖÎ@¼áà2bìå¾µÇÈqnWÞý-Œe¼£ŽoËá•a8`¨ÀÛpUìÔ´Ýh×…Ťv!NlZûLZ–µ›þ|ûžæ*·<­Fê—§ŸÊgýøùT>ö¹|Öôüëï*Øõ%ØÌ—Xk¡×äÉÎ + ”Cçõ‡ìò¢Åü£'ñ~zy‡/dó‡_þÿÊêYÊþåÕ—‡×Ïyùaþ ×_û&Äò¸$iúý¯êSžm—Ê_R+6w‘ïÆæѯ±9$J¹LJƒöCR“jEª+RÝ&uLÁGÙÔu÷Ø{IÄ,q“ø< Æ bPSÆJNB öFÙ^ÁrË+XÞ!­;hwÚ{´7Ý©¬KÍh8áîôeÝ8mi|ååš—×¼<}옂Mb>¬qoW(Ïé¶mŠÏI|p}´P4 #V6¸åUÙ 1š‡•jßÐøÊË5/¯y¹R¸ûÒ¸,æÜ[ß[#é 8qx›Ù+eõ¼áˆ½;ccchŪ+V¶6†zOâ´¥íɼ‹ØxЦ +Íð¶b@ÓÌÃaÜC_Àî0tí¢«¤Kz5'ìV-熣-Øf£Ur;δÏÙ¶Âå +—W¸çƒsvyÇûÞ͉R´Æ1±¼ïˆ*¶æ’ˆq\ÇiÇ"6¨ØÅs\ÑÁó0XªAmcÄÚ{™¸ÜÛ¿_yÏaÕ_8yÇÒ¸CñI—¥Ñ >£Æ€Á†µ˜áVØ%Ù¶sXkb]ëñ:ÙöhüÑâÀó0ҪÂ…J¼aF1åÔ"æÃnxW㣠+?LúbùoWHÄ,͆öª°ÔIJ&–iË¿·ÌA#ÆkÁ€®€K6¼kN½RVÏY¼Wá=§«®XuzÀ=ç=‰ÓÖæ8Ýž­§¯`&- 9Ë·€‚•ÜŽúû¹A«p÷oa]¼ó/V<ŒÊÐQÛ äƒØæ´Åš6®iã´1m•£wfÙ25ïë{!ÞÎ^­‰uM¬Çˆ÷(üXÄPfG%ƒ=F>àí7•@ÌÒØo•äöË&¹mÂûœBxüÌ €uŽà#d™T6¾ÕIË\‚–I[ææEö³èÏ­žžž’˜kb¾ôÜ°e‡DÃîoH ×!Äͧ½‰¿µÆpYqnŽ7‡Jb]‡vTÙŽ®R°JÅ*}]#oµéÛwÖáƳ»¶p=ë*” `)†¥mBk“€i†³)`Ho +¨ã8oàÖ>ûÐwxÊúx„÷ÎÆkçç´»Æ8‰†Ö Ñ:^ÓÁË<ÅÊ:[”©Cêâ掖ööï·¾- ü ˜hP­p+Ÿúîª/X«d!Í’f1”°6N»$¿þûã¿À4}ó÷Er¢Ìß~Éúùë%?õ5?êòúû_•ìÒ¢ƒRÒ+äúÉ%“› _$“%¦/³˜Ö^ÞÞa)Ú‰bùwú+Åøëw)YûöãËëë“®_M¿dyG©Åò:kÄáòçÓfŠÎLüBªÎÞoV~´YÅ·Ï2VŸeú,ýýÏ2b)Znºýè­ø™ØĽ[ÑßÍzqŒ:¹M\l§A¯s|Oã1âv_QŠj€4æÄ|jùx-o—vÌÃÏB)ÄfF¬Mˆ[´kYŸgÒ¼e¯8“†— â-YÓrʼn9Ì××î®Øp+ù+ƒõ=·ÆÙÏÞÝ•TRèKI,5±ôˆ å=Ѿp9:RûćÉ`œ‰Ã!Eœ44ßæ¯Odc«µă?€Ø2%¶M¯ž9s»ñlH ç +œT"…»„ðò—C$ H¦1«‹6ò÷®ð–¬imŒ#v5±†’iºb‹6«“¸Ý,á³çÄ8Š®IºK>|»=ãLâõ¡÷…¼Rñʈ¶€"RŠí|Àmá<×ÜoGÛ§#öwÞÖH†4E‡¤±RTä +ÄÍŒç +¸ÉÌc¦Äí<ÞCã1W´}Ì|ê5ÌQ…»þÚ†Ô.Ùð:G%•Ô×XJb©‰¥G\\$ƒ/WÏsh ÖäS¤›»n Úµ¬M'J¦é„ƒéŠæ¨Ý†×ÚÁôÅë¿LâµÑ—í²Fábƒ5‰¥ –ŠX†ˆÑ;Þ‡×(9âtºâÌbdGÀ4JÈh«£[cudkŒy·¥-Z«„qÔm–`P´€Ý7*©¤~Ë‘’Xjb¹t6D‘mƒÄK~>Á´Áé 6q6RŠM7œ ò›å¯RTƒä¼†"I8‰÷$Ûq8Mïf;÷ÛÙØQ§Í2%n{wm¿6m@Ú6¸-Œ— xãí·¨¤’B—XJb©‰¥G\4‹A—öò,®@ê¿â<×j•‡£ÅÛpwnŽs;?1Cœ \×'’!MÑá‹·dMsß‘Ø2Ú"^r|Í仢éã¯]¢x[/ÝÄ'²Ñ7Ò­pÅ Æû»‚£#µ±ß„Ž“Çx®Ü ‘Blj¼Vá[´kÕ}ÿ²*±èî»nCâóZz@FJ¦™[LœY=swò)øÔˇQïM —â…,·zÄ7ÞÄá¹kêï ¨ Fl•†4E‡CŒ—j€SGÌ!’„°ûvþÎ 1+à| §1"1Tgû; :&ñÚÐwIÃ5ú‰ÛÜRKE,—Íå_¸ ó/`þžÄ»«KŽœ>Œ×àá\–lx±xKÖ¸ÝsbË›ÎQt¦Õ~Ìj›Û>Þ.'‰Ïζog‹bÓ[Юe}ïB9pÒต-S⦇wÑxÌí. “hΓqÍÆs´|ÀJ3<ßÂeGGjcŸø‹cË)Ŷ+ηÁŽS%ÝýŽÛ81Ÿzc”÷Ìalÿ†H‚âøOcñž„5ebÍH¸ ¶y jȯÿþøO§×²|Ÿ¥yýýñ’öó×K~îk~Øåõ÷¿Jü›­O³Öª«Ôëç—Ìô‡° _$“5¦/-±µ—·wXŠvRcùwú;%ËýöÝâÇë'•¿dyG©Æò:³r¸ü©¶j~–‘˜ù}þFï?N‰$†t›xékˆ‹Ž²ÛŒçO%Í3Ž¢±Ì3qJb]ƒx‹­Z°JÁ*«|°67*“õÜŸ8-YµfÕž¶uóv¯«xÝ;ï½æIÃ|+Ü$^­îíÄ_ë…æ´ +úÐx²Ã3aŽÛ±®+y]Íë.Šµe˜¡ÉËžœãfú°¯à%D®NQ P‹¯El–i›öîYãÝwr™Ã\sEÌqûC›<¸pã(dØ ÎàVKmÜÚÏ'ñÄpG`»)+üÎÀîH§h·ø¹õi¥¤•šVz´u1Ä$ÓjWÒ1—Ô]F ·˜O}w^qŽ¼ÕæÂx×w8ÑvoÃxÄÑAºC¡–2ÜÐá xÄ€1}è±ñµ¦†wlöw¬þƒ7tp˃ƒ!N¡Å$Æò0 #Їƒ2ÜÀ‰ Ä6ÅÕŽˆ7‰K…µ ÖŠX/ýÅ,v^ÌýIKb­‰µ§q½˜GnŽ;‹Î¬s]:CñˆÁ’- %±®A»–µC:´3ðI¡ÊŽOÎq3ÅÞi¹¤åš–»´ß»°C9‚S"‰á¡mò»9B̼×xoâÒ\sEÌ—~?Ã;1à*0Þà.˜¨-\ ãMÜéßµE[q,³}woßѾ¬³}-¶pñ+Ö§ÐÒøÊëJ^W󺎾/­›Üàw6Cë +\WáºKwØÐ’ð~ƒ«:xqg0YϱK¬%±ÖÄÚ#.Ü=mË=‡ÆfûËCJb©‰eÆ#ÄO¥1±LÝÝœ-·ó8Zb#ýt;Ž+ðˆáʦ€c£VØWÇ›ÄeÙÔ‚X+b-ˆ[eSÜlŠÖ¹ëTâICj[QÛ†-|“x-o3Ô¦¶®£í(k‡tȹOT‡áÂ Ç p)ÆÉ‘·ùí=ÿ×àÝý q +͉; uÎ DŒWÜñ\7ypÄb”¢š&ñV®(ó˜ b®ˆù2ÇpÛ­£% ‡Ï,~@Ãtb<ÿÂe`ÃL‰$†Ôº”ÒJâùgÃü4y³+šÄï)Á%1×Ä|yd_Ãê€[Ž80YÏ-G|LÝ0ñ­©+ÒcxI¨'™:8bŽ‘4¤Ð%Îâ^âmékçÍÑÚÎGK5¸ Ë X´âïõ´Íh7Ýqçe´Ûe„×tÖ)ÍðTk?§îìgðúâeÞæÖÞ$>Þæ@L¶{írqÓâ±»%›a'8®ÀéìsFX$mÑü+6PÐØH5›âjâØÍ-ˆµ"ÖŒ;çpËGk—§¾gþžñhõKÀ®wsÃ]¢bgcWc-‰µ&Öu»‚ØUÄn@c¼¬Üy1’†º÷îŽ!Þ§ÙЀŽÀ¹BÃ܇›ùp@m±¦ o+ŸÓ¶ß´é܃ûýáÔv½¶X¹×}9Zb#HÞ•¹éì~unH¬s[·@Ä!PЇ–É¡xšú&¯ø{×Åfòn:sh;YÌœÍÎþ®1—Ä\óC5†kÁbfWì¾;Ê à‚˜+b.4nE…Øù’kíŽ+¯+y]Íë.÷›Ú–v9ØX'ÚlàcAkóÿ +ùåßÿK&¤åÛâÉ›4ÿ%?ë篗üØ×ü¬Ëë•3ºá4ÏI)„\?º4=+7šðñÅôßYŠéEn;Ö^ÞÞa³¢“Ë¿ÓŸ™‡ðúÝüãñíÇ—××']¿š~ÉòŽRŒåu‰ÃåϧñáiCÙܽÓ>™¿Öw­ÉNJ‰ß„=šé¦mjML·a˜ôXêÆ@ÆiWÝÃd<0œñž—¨â(œ<©·—ÅVÀµÂ®v°QÎ1[ÂúÛ–8â Æ)ÿ¤·vgo×\ñ,qÝ9tŸ€% Œ£°8%MâÀïå’K`®¹î×˱”hw 4KÀ ^¬¡Yn5«§ó‡ãa4`±J!¤nßÊáM'¾› ÝZ?M¤¡cÙ!²&vWòó·\#Ãv¯Cøü$ӳ㳥ÿÙ/ƒä8nŠîsŠ¹€@p#øY&•ï_ŽF#±“¦»»Ütñ{ek4Óz‚>þÿHº]zæ.FE¢¬?qc‹—¸±Á ‹WÚ­~:—õ†6¥r­”%_ÀŽÁ:0œÃžW,ŽHrèÔÊÉR*’á +»X]¶ÂHËV.¤õ„;íÂXk¬ `ÝŒæ¿p†ëxÀ—Ó¯r"UY>ÍÒŽŠ¡‰Üm³ìLdgPÚE‚Å;6Ñœª¨Ã53¸嬳•u´ëB¹~W;¸ '-®,q¥Å¿r©>‰7ÃxšùâC¹ÖŽëžÑÔÐŒfiŒr.ik»¼6áSŒVܸؕÓgŒe´Z‰W|à&ŒV|àšž£"±ck·Én9¸…CÓ¯d&)Ùp€Ñ,MC"É¡£áÉNs'‘gcE,Üʼn5]ͳàLîÞ ¶zor\~üaŽ7ü.°6ÀºÖ=ÀV? P{­!­Ï8a,Kƒs8`¤KH9‘ª¬k÷´ekp¥Á•®|⾌àÂ-Ž±¼.ÙR¡¶NZ`YËmCËþ»Ç¾Óá +;š$ÀÒ­~W;bˆ‡Õ{áþ粨q\'ŽÑæ WwJ}g +a0ðá:ÉýB‰ÖÏà€á$×€±.80ýjL”¼¬÷³)õ‹¶pÊFnÜ)”ðÀH!™ŠyÂñßpÏæ·³Uîq´}jèó&’ÖÕ0Ý6\±úé<<.N¬ìž‰£mÞÚëX·€›¹ï~ümד” 4a¸+MÊõ§h÷ÃÑvzD¼£æ‹×ЀúÃÕήûmaf©>‰×§t_4wbT$vn²>‰Æpu­=ZZ•DH›GÑ<ÀPaÕ! +ã8„†û{6Õ°³þîQþ¼x€Ãs4´Ì°úé\€€/ Ö0ÖU„6]¸…Ó`”sIàxxÂk5âÜ £Õ6rãNI›ÐÒ°©cM6×EcÇY´ëÞ Œv)×ïêV´íÄ]¶sí +.‰¥$²äëö{ð²ëÄ8.€ãð Ý›h +†;/<Õ'ñzÄ]‚øqÜëîÁõ)˜kÐ#à€ÁL îÐsa¸ÚwÈ6a°•Ã›ð¥áÁV6rcª>hÁlÕ%Ü6§©>ïO +w GJ1¦†¸ž"±®#ßþþí‹ É×Å)³¿½þµ>ì÷?¾Öç~«»}ûóŸÅ_ÏŸ¡_÷:,f¡ÏÔ/áþ+ +çÏ/î×ÄÛ,î_Þ?nïŸäáþƒÿÞKåð|µ~ÎßßþøÿóIϯî?äñ‰vÿ×Y×_ï¯õPÈYÄ'$)»’I.ëÄSZ~½vÅꛀfÉ‚#©oñJ¦lÞ!>OÇm°ZCl bÛ¬ÙHÕÎŒ5h Ô;ÄGy×hºDw¶‰4ZÇÕ¦œíg/J|b1,B9•žŸ¡†í¾ùöh«l©Ä0Z ïž;á5f+%Ô6:ºBn7Œ,—n.oٮᾎ-àÅ׃1qx¢XSfr®‡ÔO3±Ñ.ž‰U)‰ö*Ù„ÄÊ…¼ÄíÓÂZb[Ûq“!;£ø‘Sëª(¤ž‡{ð‰ª°LbÖ«3CUˆK— p;% |¡æ{õÉK·°]Ç#Yðî¦Í7cñ2Ï&ðTQ2eóNxœ§ŠÖÚ¬!¶±5ÄÝò•XF‹¢ÁÝsjô›P­Ä3adÁ‘ˆ-°:ñÕ.‡+'òT¿=îÞhXw…òËXÖ)—Æ`ó…“/^žh™¬ÌäÌ£‰ò¾ˆE µÀ£SR®Ë‰CìN–Kׇ«˜·ZÚlœ²‘Ëèù><û[‡—spU"RÏÃEq&±‘ª÷΢‰K Ì£»ÏÑ­{¦å€)‡×$°º%’=€pqŒwgà&1^IÃËåë:_$2es½xmÞYCl bkˆ»‰'F)èvYÓ–X—Äú3g¬läÆÃ/Ðà ¨?c<;ƳŠÌT·¯³ySãy1ØõuØò·ÎZZ[ÒÚÖh›ß¡¾=6¼qÁ?xsZ75'Ë¥kjñ°âÆ|D x1§A©hˆ⣼³Ýp/ddpÛ†wÑAùÞ|58e•G¾Õ¾–âP¯Z7ùö÷o_LIůK©}{ùk}Öï|­ýVŸuûöç?ÿiØÅC}´–Jt1 }þé +ß©?ùã‹Róöm÷/I·÷Oòp§xü{ÿ5›W›·/ŸÔþçOþÆãÿuH’o-ø™kýcªSÔzŽM!”Hžu¸Ùie ,·­]9õ@pr÷Ø#žo_Ä3E¿—Wb©ºÉFŸ×YgüÑ aflµmqõÃ-bm‰uI¬[ÄËî²gÆßë.p^QÛ—pˆ•EËÛ^1O£-Lœs'¤§Ü<¸Z˜ Bâ© ¹šWHÑz™…íÿñQ¿L§Ì;8gL¬­tµHžµŸÀÒËXZà8®Èk4 Ýci§:çNx4Æ[â¸$Ž·CÆf ±-ˆm±²[êéø ïðùf&);ÎŽylnëë 1\Ü™Pá^˜²²áÍï…«ÅœXwœwÖÛ’Ø~Š<\ÞiLd’†wŠO;¼䙢ïغyˆáòÐÙÔHCêm™¼ZȵwJ‰ä¹wŒòÇ€¥–%°4æñi¢XD$\(&]‹†Ýˇ²‘WÄ™uíPœ1š±iÐ +Ú9즌Žìäî@e1žáˆáN%Do»T1Þ+”,÷ÎÑ­m×1ÚÕp¡ +Úõâ ãŽEÛ¡k‰mIl[óm”ÝH~¹ í¢<·ç5¶NYˆ-õJÐAÞá—ZcòÀº&õ=¡>êM!ê'1? ¾,X—ÿ¼1¿Ó¾¿|ûüäþímâ÷×?‘ÿ?ƒðñ%7ðÿC÷LѹãSnûðô¬FZ D 7cÀ2ïÌ5lÖŠÄ{jÅ®ùŽUÀ¡ t{ÄÓã‰oñ.âŸA ud#.!áÄ]µaÊÌy“X[b]ëqã;‰õ3ÖI´çÅñ(ïmÃÖ¸`Ÿ¬¯£½ÿ¬ÎöYÕΫjù<8#qºdN£_¶jéÈ“¬3‰,¯,xå6“ÈéŠ{¾‘Oé2.¡*”Á±›wEU*˜âéÍòÈ.œNÇN`-ªÂ¬Ü Ìât½'”±°¶ÀÜ«˜<‘f¬Bb]ëÄŒó©"!±(H)‰ˆ…˜K¸y×s·|ÇRÂBŸoóò•Í| ’Ž8c¯@ÀÖ‚Ãô“øbA‡ºÛõ2¯o4Ä–(A\@[ÙμçT1ðÊÀ+ ^ù1áH…€E" ïeÝ i!)9Pµú~sÚµ°GT çÓý÷çNåT›† ¨U66mrº§ûn>ý6ôr¶?üäÙ–Î#Ò] R °Æ­’v¯yEqÛMl§é ðe,„`}ór„Gºñ²28FMb žTð ñT—ø@i'X€´é&±ŽÄº$Ö-â¥ÏÜæ’KÖ/Ø'Ôpý¦²à|þÀV@m"5.ãÁùbN*ÚéEígnéºpÂîãÖ¢ ûq ñÌK`G|º§³¶|ñœpñ¬Z¦'[¼|ñ‘ÏŒz[ræD{—Ð)Ò¹±ôë.˜ñ%½"q>kƒ†Ø6‰e$–%±l“Ÿ$~üuW#*(×Ó›Û›×ÐKM¤Šf`f”ˆ8aJ§»@òÍ8_ÛtmñaªØËûqæ›Î‹Lñô6`Þå󉄪(@:‘:ë’X·ˆ—½bZÓ+qÜÛθ°D:¦½¼><3Ýhã„š|»”´xHK?I¤õÇýò«: ñãu)ÐÔ^^ÿÒ?ì·ß¿ôÏýÚ?ìöõ¿ÿuéë} +ýT(‹ÖǼÜÇÎýŽx}âè)ÜŸàB·oï(`åþƒÿÞÇ®æï¯ö÷Ù·o<þþIߟÝÈãã,ï¤íöçb2ÈwÑigpvœ>ógd¨Ht2í‘•°ŸæîyˆïK"- >`©’ð‘E"›*RÅF¾Tfw@mAOˆ'›Ú ñ“6aÚ<¼5h·"V­ø EH!@‘ˆv/ë醖‹ÖÁzu¯CZ]ÐêT¼e»:–à|n–­gŒ¸l#NXÒL1Ø»+:…ÆÍýøZI.-pén8^ÒVž«Ñf[…þuö‘qèÂeR›Z -øzóí­Ì=‘"X r¦Ð¨ý«½£?sÈ%Ôp3 ³@CS›$žij2Ë‚Xfˆ ¡oŸH×™qºäHx"¥S…‰Òy/ï +í0õIÚÇ_öcœ oÐtf¨H™ˆ½5¶¶u‡z0KØ~h§†‡{èsë^}˜A…·g,#±,‰ekÆGz±T«QÉÜ+‰Õñî.ÄVâ& NÛågz¼kqèx±€j˜tŸ;wÄÎ5 @ÀWäMx×å#–‚øð/Ñ\>œÎ$²UµZýô‰vÏ7TDºs#_Uc¯`-tᣀm7°}ˆ¥Kx¦[:nÔ‘år!@‘ êhï„O¶ˆ„¦Ö* Ë¶†/sÒ±; ¶ÀÕ OúÚŒ†ŸÝ:övz80œ±€j¼»¯ÊøØ ¨“ç‘qB«HwR¸NÜIOÆÝØãu Ö±ÄQO¨Š|›—ÎÜL­„—ÇL1º<#b^ómbñÐe[ÅÏïpè (Ãàj“ž)@sà å@›ÚñÃ¥—¸´9Ü„1—k¼Ú<:èp÷I·n¿mZ¾tËì¨i·}çÜÙa,µÿoµwܶ§’"]'ó‡tÛ&È@ZÃù^--²…q¾Äj ÕÃè‚‘*1¸U@—m _G™Ž!¶ +ýëlÚCÀÞN_¸‰• !g"vÔXÄCú{LbX¯³ˆÓU öÚ0¨ÃŒy$æ%1ï›ñ\pÄÄ©‚#ÝÖIq0Ö¨\>_huA«O Í€zÞܶI5Ìl› IJ – â\§F.Z6mÒÒnÚUýîUo4[¸3æmºEëŽ æž©Ö³óø¨…ÄMû½ñƒ¸ôìÿúå×Æý<µÇë" ­¾¼þ¥Øo¿éŸûµØíë/þ~¯f)`b¼˜†`}LÃñþ‹p¯ˆ¯Oý1ûÓ\èöí¬Ü1ÿÞOé¿Û·W_Þ÷øöÇãïŸôýÙý‡<Þ1Nãñ¸O‰ÛíÏ™=×vŸ ƒµÈ>Wª+¯T×À>7þš¼ë¯)àÒýuâ7ÔÇkêÛðÏÿúÿ×ÂÝfhÕ뉤øv0­Íõ­ØÏ¥öÖ¿‡KDü–­Nø¤éwÞ‰ZE}kQ¶Ô°âó¼âóŸ[ö#ú©e®ë¤åÅÐ÷°¾¼ccÓ¦xÃMãFàTødݺiÔTCâW=ÈH,Kb¹½gJP«yÕô›ÊÅØ°jäbWÔ®Ýwšm“xZ»kÄCïž$~tû±m =Ø´XË£c©µŸ*¡*ï:Ðê‚V?äÖ `©ÛŠÐ‘X—ĺxÆ‰ß .Z¿ù‚¥óÝKç+ÀãÊñ€Ë \¾m‡†R'q¡ñjµÀÔž¶ˆÏÒþ#âÄÚÙÚ=r¶ùìH8˜ñ!±wº‘Ä ¶.›4¬5±n‰µ§áÊçª/dû]Õ_ã»—¾ÆÖfrôäÝùÝrâ}wm ö÷DIÏ.?౿N@Ùñfì™|dšqNå5ìOžñAÞ¦±e¦sKGY»6<¦†6m&±ôTWûÍlXB$‹®%ß‚8ÊÚì=F1µNÐåàqÔRAKjäÒ@N r}áÝñ°/Õž¦Ú`¤)7Åp˜õó«s’t+VüâÝPó•IByþ/„š5lYÃÒ©7õlµbÕ «ÌV‚'vÒ+cÓhT‚e2ËöÙ§„}J|ØyÛõoÛR |K¿_Ĉ±°šA™œ|93¥˜{ó}¤úºÃâm[°:2çZ´œ¯x- Öº3gÙÃT £Y„S2u§/]-c®ˆyCÌ#2¶@ê­]FÆœEßl¿d,5±l‰ey¦Œ-«YÞŒñÌMÇÔìðÄ\󖘟JŒU€àœ P.ó±?c­‰uK¬½W¹]Ih«®ZxïÝàóJ!YŽ*ðt ˜Ñ“w¡¹yWìmBŽÏ'þÝ °·}ŸOœåàO¿ñfº›'Oìk`odý—|û#Er!ßÿ^^˜’¿ýý{yÖŸ}/ýYžµüüûßÕeÉ·';§¶™EÙøû,²_? »ôë—ìï£X+­Ò‡åí žÌ¯@÷ÿ®Rœÿ+ego/¿ÿüö ÷_Öâþ†z÷ŸË„8-ÿlúlyG.S%Prå¡Wî³²~WµA{EÿÔqk¾Ü6#M9ugüØy”·¥ˆP ÕŠðÙÒÞÞÑi-Zñê†W—~kY{–©ã³1±gái87:®6ÊÛѯT¬²a•¥§_6&9vg;|'|6Ûíõ82Ûöõ(NÁô+!“XÊ-ȇ="J<³­ÀyDŽ`É Ö|\^}ºŠÐšW·¼ºò‰P‡ qXú>Á¦¥‹JŸø2©çE¿»ígñÄöE¯MgûØ»á¼;ó¹€~LÆ×®]'ð–Ɇ9­çÆSb¨]¾@ÆsV)³u G P^†W‚%2ZIËä¾xóÔ0’E°iÊ ®2c˜¶—pCnŽ–Ñî À„C›±x£¸qÃU暘·Ä¼<±÷`Uv,CƒÊc0û…kl7â¾v‡O¢>ñÈ„÷úd¢¤Ö0³yö[kB+bÝëâº}‡sD³ß¨ÄNZª¸šG¤[X4ç;«O$ÆSD»[g‡·ÎNÞ:ñk±, ûÕD'5†*åˤV=ãìP”àãnÛ™ß$i;lžL]_·×ñ]½Í·¥„+Ãõ3qºª‚Ïžq­b®ˆyCÌË+%Ž“}Ým''0ŒfÅe´Ù†DÑkÓÁ>¦;ì¹ç_@™ÄÒéž;ñžk:Jì¨éˆãU¹u¯åƒÄÕ~¦áõÂ|*ð­íHÇ‚á*\ srÄ9)ŽEÚ²pÖ ž·qµ*´"Ö ±.}UœxÁ W×€Ž"À»ùpìªa¸ +÷Õ0¢ßò¡Oo7SブkZÞÒr—vjjÀl\¡Œ·+£µlAæ [ÞÐíT!ÈZx<­8GnÀǦ›#™öJ®Áˆ®7À[HʲÁi½xYát=…N?,jsEÌb®ˆÛ¦æÒ pépŠ™0‰¥Óµû;««ï`ÁÂ9/£•3°Û®®ã³ùuëú|™Ì`Ékfô]MjbÙKx›#Ä{µ­CUJÎh6,Á!Ù0\0³iÊ©«ˆaâ^mšðËX°¸@ÑkSó¶àó7.¯§ÑS=øÑ`ÖÕƒ‘Tá…²Ð}WåílÜP½Œ~YoŲ•WTƒCº=}Ü Œù´\ááìP¬!"Ua”¹âi)ÎÐ +ºDE:0¡Î ¨àÅk¹œ…8§V»˜tÅeò‘ûóÕšW·¼Ú›ou êá~q½È¥– +¨>x(-Ú¢ˆ,/ðÚ¯‹×·á᳿x#Ä{‹·ÊØ3öÙëغªÐŠX7ĺôU!ÞCµˆÛÖ!ETïùªgßCqW ó‹åcj@ó_058 + +–S¢è¥Ñ'g)w®B!ÖfŸ ‡‰OWoAˆÊR ÷a”µC:tZ´Hñ ¸˜à€b‚ÓzT4¼ìþ!ݹ <$à×ȵ¢ƒÝ“mÖx'žlñ¶oý’®5±n‰µ7ßí¾LxgßpÜ7„]5Øa5ØÙj™ÄÒSíáÑ#È(n̸ª:\ó–˜—gV§h™œ#،ٌ4åÔ%žqÏ'†x_¤AÀCPówµ;¿ñ<¢]Î%±æjJì¤ßËL‰™[¶ú‚6síC þpú¦Aùg¢—Áî +N·î{z/›8ãˆÔrŠvw¯¡Y·ÅÄkNÃx÷¢*lÆâ9ŽÏ+>#"~š&Ñ“©;=4j^®xyÃËòå$E Apb0˜½_Ë{kã®VÕ°h]@;3œ‚y˜s¤äÓZÓ"9®h}¦Ëc—ßþ(6’¢Ýÿ.™ìöñ|û^öç_ßËs–‡-?ÿþwóÝE2Î÷zâ¥,I=‰òï“ÈnýìÒ¯_²¿bý­ìW™áÛJ`ø•âþßõCI¿ÿu}ÛýÕ·ßóöóúüû«ëAÜ.ãá´üóŸµöÑÖ/ÑÝ?çk=úžùlå²Måc}NzEƒLªöœÑJ…*TéŽvuK1îNvâ32Ù ¸,&‡qu æçÈ90vÀ4û”%RghÝB±ÇØÅeâ(Öí‡=pMË[Z^žYPJ܇”c—ø¡J5uéPü·°•W iÎÎ$–Äêv‡g\Í .«$žù£ ¾£ÞA8}×ðÜ=9“ÍÁ…ðíÓ­XYH]Ò5a¯—ÆœKñµfRœbÀ#yñÍ °è„H9ù†.I —mx ÇÙ(:nO +¸£–Ö¢ML)1R^àŸHDÎ{á +_yM¼×éëÁèì—Ar7…÷9Å\ $°Î|„,ÿT6¾ÕOY‘ÃN5Bv ©jHZÙÏô|‚Þ{ IQ¦«‘½l[eÀWyÝÑ&Ð<ηçÌa,†k¾qŠN,!p{Nõ.Ž •«ã_·”m$ÕdPLÆýñ>y뼌×Ïs{§šÛpVUÞ~ÆÜó˜'fÌZ¡ Z ’KÃèŽö~öðb‹%†xK¾­óò²xîÛÛ{Ü€»Ÿ( hÁÝ÷ÅÊH®(mgÄKå‹îxj—{X>Âòh×Ö:o¨]Ãæewwô1wÄ| æ)bÑ1ðSîð™Í× ˜Œ‹ï}.3”âÅÅâ¦#ªPå1ŠŠ`6N±öŒHÒv²óî-›BFöF‹—‡{.†«¼îhã]-ÓÈÆËöÜ|?ç}‡4Þ]ÉÄ„hÞÝtWyr{Žçaw-kÛ1#·Þ¬º"V–ÆxŽ­± +pm_󥊯ØÊX+Ô@®ÆjP¹:|ÇÇʹP}§ñµ÷ŒÛämòB2C)ú>V&ªPeheñÖ,^Ç3ßPæ ¹½SÍu‡UãíWŽ;b>sGìö‡pÄmိn'^ +ÙKãUý÷*¯ÛÚ|™8Ž K. ¨ãL.=q9—Ñ|»ßcr¯³úý,µ˜K^ƒøgá¦Ç{ºpîSQª ";O7¼¼jÈ~ƒÍ7’t¹ ð¸NJO+GZÑ®ô16¤âdÅÝ|,X§)ëÎE[e¹±Ò,ÒAïÂŒ—h\›|+[ GJµx‚x!¨Ë±ôJÅ$£˜{b>ócÅKØ rurã–¢7c¡)e—x½±=UÐÚD4b¶ªn Þâl3a÷_'QÓpqÓî†KN‚´à8îîÓ((ƒUïBºçŒ£©‚5µo¡¯¿©Æ‡„¤ +"âeÇU9 -bN îª +j(ùFë—ñ²95OËnýY!áEöÀÕ…i(_éYåÈ*#ù.=Aãçö$|QCJÙ:â^×>þøó—_k{HJ¯¯ Aýñú·ö°ß~ÿÖžû½=ìñý¿ÓP(‰_—9#×Ã4äíÿÏðåa,ÿü`h¯Óxù1µ@K¿?Ѫ{«<ø÷Ÿ/¿§`~{,¥¿ßþú÷·'½ýôò%¯Ÿè§ñú÷ö 6ÂÿôWÚ4= ++˜éýÝ“ žóîß³VÄ`œØðïœëÜ~ƒ}»¶*bÝ‘ÀÚV°ZMxxä÷S‚ø°B°Œ–mR»3Ëö¬v ”šõ½ß²=Ù¬´´œqåp¿ôgc¨Ùœ ¯(V o¡V®t³“}Ú]#doÕÖ÷™–.Ó$°B¶5&Öú‚BUÏy¯úîÆ=㪠µ–8…—ÛÑ‚²¹¡¯Z´œ ¡ãb÷\´—ûÉ«ç+t»2Ï¢ÙX¼ëQcT†\Û;8ˆ3¤Æ¨Þ¢ÝP»‚ +Zí<‚»BF=0éq©=©Ýp 2$ÍçQÜOJâ=€£¥[4àx‘Œ][»Ü N‹úR ‡ëZ ˆÕ°ôÀr–ðÊSHHÙ¹„n–ÊlªØûõç`Š)Å‘®)TEG +W­a0Ù§š$e@òrbèÊ+ˆSûW‰Q{YÛg­žkvOÇ‘W¸ò˜ÈJ€x>Ü[¶^ u±EëcÑ,7ÞÕ­IΈÞÓ!J\Àef‘ò"œý†. çÝaœ;ܹ0ΞýV¶Z6›ÃB9äÚÞÃAä@¨›÷êh]%(H ¤Ö¥5ß°ôÀr–p·“À¯[~®dçV»™rYJu‡K—a÷—q+ Á09žð†Ê=*Q¹C=]±Ëcý®éô ×sS+t~I¬Ú±¥í¸”Ô8Õ[¶;s"öBø²?œÛîÒf(YÏ ï[ƒ$cW;&<' 8š†£¹µ'á°ëLÉsÖË>¬nß tV„.2('¯ó¬^—Êl 5›S¯Ša¸kO6Êpö‹*p¸4fC(¶xeV¥ßxÕ¡ÑfáâµÉhÁV Š½ßÂQ‡K\F8;£ +X‡xíHWäÐõ°Mr,8—@N€xîhÝ€©ç¥#/]ðgs´hfmŸ¶znðä„g€¥–°L(x$‰éîL+O8A%tN¸-!÷do¯’j ÞméÂÙW¶º;èj8Z÷aS¨ê¹ÄU8ƒ½:[wÙ P7Kw+*hmë¥ï°2”¼]¶Ÿ¸ q- ¢_á¶1Ü +X¡ó¥ëúÎô„ÏÜleA‹×(Qò&¼Þƒ©Ã¥.=ƬþJHœww…7g¸”‹VÎ$1»)·CÃOz0%@<¹;*B‚¡7àí/wJ_ á™2 9Àw›.µ'¡—Æ?q§Óø¼>èEàŸøÚ–¡¦¯Iæ =g¸c‡k“X@ zÕá~fmŸ¶z^Î:‡˜žqé€å,q¡,MÈuóp¯ÒzÒ­ ’ËùåvGé²2”¼ýZèfáò"×ö>¿„vè—:\:àÒc¨_S¨ê…Û +cX¶h +Rëù¢ÝQ·a&ï¶L Æ^˜m)dÏ°BçP<­ÝóûraG6á0ËƪPª{®­‘Â2gÈIó{–›'2 y]án575Fu—ì~ņ ¡Øö기‰‘²c +w+bñú µ'áÐɤ–#°<†¡¦—CM?J¨…æZ@D7_> 5,H äÕ†-þ$GEPIFÉëæ÷ +‰pz•œ ¡WÈîX•2mŸ¶z^Êötté€å,IÔöÞ«.°Bž;¬9׺™O—û0ÀœÚ·H9PÄsÖnרg¥#+=.íÚ³u!ØÅÆÆP³ jÃ,îvnº¾õ2”¼}º Ó8Z¸ *hµs7»çÂÒ¯$COW»änØpÕ”“Ž€¥–#°Œ€W&1×"º9‰WN8\+Tõ$¼bß®¢~”Á† ✠!I  . #5‡`î+Œ)’§ß›ÁrUZK wȈÞÓK\Àe*Ø +T1oÙM¸Ã¥—¸ô†[´›"Ô² {-ý^J`%(Ië—1ì2†HjˆWq²AÒ|žk&gÔ0ìÆÄ×¹™— L/Š°—ïÎqj©×2þòkÈ?Ò^—íÿåÇëßÚÃ~ûý[{î÷ö°Ç÷?þúWlÚÿÙ/ƒäXnˆîç}Á$’kÁG˜¥Þøþî¶þgy"+š%WJÚø«%Wë5”ÈL(?n,iÌnÚ®Úm5Ü?ˆ„üóE õ1ûK&a¾ýõSá|÷íßûçlµýí»ÛsÿýñõÛ;½½ºÿ’Çý4_·)I¾ýö·ÈÊ÷ØÏÄÒÊýùë¢Ý_SwMR_¦ÊÂω¯fŸRr{ŸO¦]¹-Üâ?$õˆW+çF,‰·'žÏ¸&KŽ†—TÁ£ÓuôPÎ*ÃÙN«áyq]§@à@VŠ§ßƒétö|5 +…!쬞®»b€ i¬XŠÅ¦8É#qö¼ö»Ù¼¬Ü(˜ž=ߥĕ,i>›¸×ÄÜ1ë«B©„rv;_êgíìË6,8 ÏYë€mlSÀLÚšäÇÙÄ—Ib´Ñfª,gïÚ¢¼ÀJ7 FÅ‚{©};Ó~ªÙݶÃ]2<÷>Ǥ"³zî.ìæðåÊzÍ«“‚'G<£à×ü«ôHM$–<Ú£7 }­ú"ÍëÂ둉)KŒCbë‰mOlCâEÒ•ZÛoPo¾+Ôð%e›…RœHß˔ɅX=ëÒlrÂ3i¦±îˆõ6¿Ù(&ï`»"±ÆL•ål3[µp©RªæmÜ ´/e0-\u”’¨Tç¼¼d #kPÙ5YÀEƒ+¼±R‰ùtâxxƾ‚ÛOÕkçÈøEUàÔô”ÈTÓ€tv²Ò—²2tÝØ“Æ=i.52¥”çíŒlwÆȬ¶°McW“¶§³Sp®8_KI˜ÝÖð# ´gÕ=«ÞÑM|R ¿ê'i `õo•I5¸aшe9Àõ]¸]kª¥œÕ%>,‡Ó¯6™*ËÙ¢X$a¼sBYHÙk“Ý|­'¶=±æ»Oä™ ¿“ÈY(µ!ãt°þ‹§˜ˆÓ T%§o7;ÉÍ ÒB²QLÞ|»ê;I;S}µãÕ¯NÌ°ð$ +)Å”ð—«hÉBòâmÑŒ¹–ƒÄÛN`(%/ẽ›L䙽³ØvÀ61b)Lõìƒs¡$Ðxñ$ h1g®Ù¬l$)xWÆQ=öýù|‰¥ +rÉBrOÌìá-×rx¶Å#–D1Šsg®"^»m0w )gw¶kÊï~ÓfxýMÓ‰3{›v‚“½4ßX©Ä|z¶-Lc'ÃKa™*ËÙjX¤]¼ê‹UrðŠzUJ^V\óÚ„ÉáT)Us[Ùµ¤‹–Áígš][8£?¾fdŒŠÁ± BUrÂPž‘e£˜< wÄ“ã!ÖŽXwÄ:#a.”$Ž‰/3c LÌÅ«“+Â"6`á ,O¿€ÇEHRr‰Ïˆ¹W‰ å¬nÌÞ¹ †›q +Åë•35©‰Ä’gjG‡;0´—Ž·HªW!.iÑ…½¢j`¥$*õô²¾ÒÅà΋X©ÄÌ8Ä€§fŠÕq<¹w3Às#ö÷Ž©:¾äÚ¥D¦š®ŸnX§¥Êéæð• ¥’%Í8Æ«‰)ËÄáf=±í‰mH¼j¾U)y5²3ÝØÃÆ=lý*úÊE ®½ƒ%X«L$–ªC{Ô N$Õèžô1aJ¡zÄWìÛuÿ81e™¨g/›_pÉsñæzTCÌéöóÜll$)äó„Ð}†Éñ>æôt¼Y(Eõh.™ö¼ºçÕÑ’­$VRöºÍ*[ØÏt…wˆ[PD±‡†•›4~·fëýWÿþ¯çÔÞ$>¾¯B¥¦íû¿¶7ûÏ/¿¶÷ý³½ÙíÏÿþñ·Þdí?í½,°í¦ÑŽƒÇ4j¸i¿úÇ‹êc÷—LÂ|ûë ¦ÂùþîÛ¿÷ÏÙ,ãí»ÛsÿýñõÛ;½½ºÿ’Çý4_·iK¾ý¶O|*¶ñk›„ÔËÇ’Ôöë¤Ïˆ/û’+iɧÏwaQá¸>'î’xÆñ_±RÕÍñ?ŒX;bÝëÌŒ›Y­ž*.§áH‰ÕQĪŒZJ\”‚DÅÙ:)‰bÏÕ®H\ï[Çq áWjìÑ}{§±p’2œíe‹X!ËÕ›íÕ qÓ¯yć{w8ÝÕ€ô —Èpn†×ƒ5 c5w›;­²s´éùŽ×ñÖ~¼>|µ­ƒk>Rñ’£åš‡ÄÓ[7êkS¼ŸÇÕð•Ì æÖ€SXZ„{ð`WÕ‡w&Š?‘”-ðûAQE9;(l bÏÈ.XÑPsFÅ‚ëd«tÛOW:bÙËm¼i*P±çdÐÎ6ßÕáT WÒ’ëÙWÛ—½Xˆ“”¡~­çµ=¯Ýúí¦>©àÇ_¾ô] ^¥ß…e²Ü -*P™„ó P5.”¥lQOkxTÚ§x]À9/ðÒÎóæf§EßÛvõmÃóÝ6V´ûé|Óˆ&¼2‰ffh¬Œb¿xÚEô¤mÓ€ ͤj}Ö{Þ¸ç·÷­aå²%´®#e³o¾44)FÅÂX×!V~ÿÞ,‰·'þÇ~µ$InëÀ½OÑ0L¬}„9‚—vx3÷x¬®® j¦P¤ž¤Â3›îúHªT*‘™¸vß´÷}Ó<Ķ±]Íqy®»5y½Ž©CLÄô6Öq@U„s7’w¯¸\g&H´Ïc•x²p>a¯;ÅYŠ8±S„›ºˆyg@%ݧ®²å1*´GÐ^ÿóÛïRÀŠÝ?gâûç_ÚÅþøóK»î×v±·¯ý»a#ÝôF ¼a‚LXºÝµßÿöÆ’Ý™¸½E Ä·3oLÜÿßî‘Sy| +†øqøýõãJw·¹ŸÑ3qÝ"yûû»ù–b·®U€¨Ðó-rö9ŸâœîܧØö…÷9y‚µ›lêÑÒ-½íòú9ÕùéT ¥ª»—Ì wˆyƒ˜'¦* +Éñ2Ý›” áP'6€9Ž]÷Ì-SÅUÅé3wÐ9‘ñ=O?MÃ'6tø½FÇ|¢¹5ÇÙVsaª¥mŸÊïÁ‰K ˜Õ< cx29œÎ}frh†Š:öáu:a(W#«@’~—ìb€Ìã.q(™OU¶#sÉ‘’¡V7ê®°‰ƒL^%^‘âˆu­] ‹{5ñ í^=¸ÜVHŠ—«á<ý’0¹Ü.¨ßˆU"Ç—P \JœÉ Ψ`Šq¼É‹çnŒ³ç{¾Ø'šŽÝ†¹ž"È ¬‡x¯?C»×Ó\í(&^û9A [^çü×w³pJ×ÜIfãP8­¼ó*Äbòm:€,Õãö6÷hóm¡=±ìIJ†œHvËä!|´L +d‡ÝÎ&ñÎÃÁÒ@ÆÕ±²Î¦/3ˆ_‡L€Rõ³|´ªÇÒi…¤èùÊë[Qb€ÌãTæ1oóñyÇk›ªƒô˜ÕÄ3´{õàv´Åd´w.Ò9 Ôb¯+úC¸Ôèh±ö8­½‰[Pœ*hM¿ºÚ¥Í‡¡uâ@ÎÆ(w™<Ù-g2y¯ïRªc_;‘á¹áª8âxý=šŠ3$f¹.ëº{˜tµ;OÏѧ¹/¹…”½.qÍ®ñS)"Ô¾AjÀT,Ÿ%„ZݱÞÀ‘f¨¨ž|¬j¤Šã6|l?Ú ×õ³ +Ù$’‚sn@ÙÛæV”p¼žŽcÎE²×$öâ½râB%gZ,ÐÞIš@µ^¾cüÔþJÃ$È<æ÷X"Ÿª„,Õ뼹Ǜ·xóˆß½71`V·C\‘w¢Ü®„no_*-Âq[R6§;Ü7¿=îÐm—!èáÇÛ;ÍÀ +yˆ÷|¡E°šÆ ç2…' ©…*<×·‚€){ü^R®U ’k-¸ ¿IŽïûœã +Ùĺ9ÊÅÕñ‚ήüpª Ÿ'ªB¨¶'Œ*"¶)ÕqÁ08UКÆh—±N +lèÈ÷šÎs°AX’$CÄ“¾q ÈÙmÀ šZ¬ ƒQÁf•âÖ¬©$OÂgØCÚ-े!‘«àµ²‚³Bi5øê,ÖÝòU×ÏJ»Rû™0ò ¶e ¾/¸Q +peࢮ„D¸Êq¼\3ä‚ÇK"gÅœ*hMžŸ†¸ç9wó—¹pª©HñtLV u—ºsoýx¦fþ—ü˜± Ž¶Ž_µíÿ¬mÂ@\]Ä VŠxC§ ‹SWº€‡ÚîH0é¸È¯uÊP$GZïâqlíÈ‚¨›º HIᦎ Ber +f×€¦_^ÙJ’ØɺóÒ¹ŸºÚ!®ÄufêÂu¶pµ˜“BÛ<..@½$fêoà ÙÜܸ‚ÞŸ/›› lÂ%&9žéðG7»¶u˜ÊŽ€ýG¤bŽÄq¤ÆÆ©‚Öä¡]Qá|‚As7¶uÒ#žOTÅí'qTmÉ ZÆ^HáÊO³OftñYĽ&æn:¿Âg(Y/öá½*fœø'ªçÅB ’òë¢î=6a¡ \qtRÏJ{VêX/_8„¦ìÍöèdsŠ ·T(˜ÝR¹˜ +’Í5áh®ïRÁaV×Ä$eaG³§U‡£¦û1ª¯$k9qì6`‘Œi¨À9Râ=¾û ûC-éê¾pj‰LÑjo­€IC¹Z¤cS2BvÛÎI´gÎ7œ"$‰ýß‹÷—Û ðO.·p·¦@òU¼ZSËöž©E„K:¡ Y›Ó-—$Žæ‚JiÜóž˜o/ŒŽ€2HŒÐzÄo¼ÔóÒž—:Þ!íûŽXe-`.‡Rƒ`ZÛØѤç•=¯ŒÔpjSӌى¹í¹#ŠèØ\–ŽXvÄr{0— ªe\~¦g|y.”ÑIæ5g¬ œ¯H,¨À9yÎvÔ×®ö‰¤ ˜/öáÓÎp©Á­@cº45Nl•™Á=4Žvà‹•ËU€ÅV2ŽûVävñ]t¦¸*Ô‚ã„[‡Xr%OÃ+‡Ó± ‚RwËY§x~iœék±R.ž"r‚dKˆcÍö¦ÈÔ$Ð’¼qq/`îˆyGÌ·‰pV‚Tj ¨‹7c¡fçç·ºÖ¤`GŒ¨©}ýÏo¿—ömsíçbŸ|üô‹½ê?¿Ø[¿Ú«n_ÿúwWZÅßÖ9qi»QÈ›¿7¼ÿ†l—Î÷oZjÛ(îß"°ýùí K ¼ólÿ½ÿ’ÝOí¹úíãÛ×oozûŽÊF±}m#âzû{—O2sûÜ ²Õ—¥íÈ.܆"í‚«ro…œ°"n&d+åuçkæYk 4ßjæIxõ|OUDµ;Á]º+,”zùÒu¼ïª°Z-›”>qáÎY.¶P.OÊö&kVaˆ­#¢;ã£*~B{æÝh% rŽ3ß`MBññìçx¯¯4`jβm²?BÛ­–;_éxeÇ+Sóµ‘'ŠÚtÌ=›ïÞ"f®\ß"$ dJyÌÒËžXn¯ æp3æ&P[wËeˆ%e(íú*A‰7=~Œ£N’=«[~V¬Ä”[3cÖ ÈcQL›ÛxñÞ×ØŠ"œ¹qmÐt‚xK²Å³!¿²ÍÙñGRE4sD()ËP“3~*Âm« 5¹ª8§cÓà ¢®*Hj/<ñ¨ã¥/ý˜°;ß9©›wë%t@ <˜É1žñå-¨H×&´tIJ#–âp›ÍÙØÞSÆó]Ç'¢KÜ*äêôŸo%!Íü:OáºA—¡H¤BÌŠ§ã7…&âyÄQÞ¦º»ë½æfÅ3‡­Ë7}:Ûžw.ß>q@ÿ¨m¢ +¯S,«' TÞ…¬¼×ˉ;Þw•žb††âFòzó§aIöt®n±\¯öÄ3¶Jj¯#ã€5;÷çŠÄ‚çš»&Ÿ§ŸÏáf§_²Z[£âšÚz³BHª^p¼ñRÏK{^Ìv§ÝÒÑ–m™Ñn- „ζ-9ßdUѹæ6ï>s]>¸Äsþà;šÅœº9wŠ"~Io(¶ih€a´ËZ '»Ù:'` 6G+Éñ‡óTqbˆ³qÍ6Î øuGçÔ¾} ^i¾’2”¦—ûï/¹iÕZN±ﮣ]mÀ5Uøût§³íÙ|»kn:Ûôƒl›Y{ï$í zo"@týáhsxª†›Nµùææêw½Ð|uÑ9I¾,fÔ1\#_éxeÇ+ãåjE’ðj{8Ó‚ã…F«« 3cúºxšÉgÎrùuñ«vJÖ9©×Ð~ÐN·ˆg´§æ†VP½¾Ÿ˜Él‚ÑÑpgÅ“[w}“àJj-qfÌÊö¦2ÖñBÄáú»f@‹b«D();q·äâ5‚’':Ðt@gš»Å#´¢©nÓ|㥞—ö¼ôó¼ûuÓYR†Ò®o˜'öµÆ@HmèjÓÄ—»ZÀÓ.šGp¨’%‡PF¾úîèx©ã¥/ýàuÑ€krûVÄsgÓƒóÝ.Êçó5Ÿg¼›ŽÄF'ÖË‚#\ÁÄ’ÚØØÖp¼à·t‰ÙÞT®¶áS}B€jËCg›$žq¶9Ÿð …sËîæ-X€šB/=;ÅÀÕ¦¦ë‘V+ðÒÜ[O¿¬T¯?9Î,ðr•¡©MË÷ú‹#p¼ƒ# §…#® +œpL¼S”ŒãF¼ÌŒ% øn¼¢WDë˜B¦Šz¹Ž;Þ÷ÜIñîЀ[K˜ y}âŒ6¼SÃœ?¸jçF VÙJ œ« šNt‰eˆ%Y—`t\mÛÔ#ѹK<çj.1Z'æâéø—z^ÚóÒm°u'*¢HÃ<œï¤"fæ+±ìˆe†¸ZÎÑDj,£aV|<X’ÙÍñJQ¼oélß g 5ã ¥ùþ³®½¿®Å[¼,)9‹wV:7?Š×1œ±56ÈÕ¦Ã*¾zÄÝX+¨^ïm'Š¢ZÍL—v§– +«™IqH“m[ íJ³Êá‘n +:ÂÚ©ÔíïOÔ@PPÇÛ¶Œâó‡fuZØ˶3h²ºIQ@D½¹®¨„xM=ÜŒÙNÀ&Éñ‡%=8\ã‰çÁ\-\?ã*˜\W[8ÜŒ8IŽÑ!$%Дôâùž´qB„ìáͶt¬eÇZ¦¶íAë9Ù‚Ú ¸m¡ôû?öË ¹‘›‡ÂûœBB‚¬s„9B–Ie3÷¯úÙRd³«7ûW·ŠÐx33öHòçפ +RÍÝƸ›öÜýÆ TÿÎØÏ8Ð’¶î·Qu7´b}Ÿl°ˆäfÃ|'„’ÝmñI<ÜÖO¿áÂå/)A.äµOâ‰.¢xÄán¸pÄœL³›G÷ûƒ:bZSGìn@&oƒÑ…÷ªû&­'­P 4hñ¢!^ñiXëéav$±³zÅ}Fb#¨Å¼±—wsYŒÑz1é0RHu Ñæ©gñ¼«rÚnÀó”8Ü•nð¯®Ø^ÌÏ5µC—F…*ñí7ÝCÜ©é.éˆeE,#‹#žÆ•!r ¬V% +ñö}4Q.Ð|l‘‘¡&ø°˜èp©Ã¥.}â¾M›Pi7ÒÙ)ÜUbŸ˜ Ô¼ú>%±T ‘oWœ©1 ”ÌÛ¹öTc;Tc! Š9)lyìÚwKühÙeÓÄ×w8Ë΀µÒ·Æ'j¬ +Rm»=WŠ÷*ìê+€L^LÜY±gÅ5+^¾®—G‘Æ‹àxÇF¼.€HÛè<÷F˜ãŒ`˜Ï¾Œ:ZìhqE‹Û´©€¯ïÝ Ò¡`pƒŒ Ún¿O5³.Þ†Wš¹ž uq†Ú¿¢`zú`-’m9_W¯[&ÜdŠ Y#µ…pÃOã@ñP 0J 7pÎ@‰½æpDw<Ò»Õ€µR}Ik{Mq¯‰ ‰Ã\ñ´åÌ`í +dq\`µØV‚=£iÚÍšür^D¶/µy<›hJz2ñAnà|Õ×¥=èTû¥7Äw;S[…R=3Ì»5™K:¡´djr¼Ív_ßñ¥¼ÔáÒ +—¶åýN…óRA r¡íÌ=+¯YyKÛ΃ÚÞ<ønˆG©›@$WÛVêYiÍJ—vN*‰ÎvÃîôõ{z`V/Í&ô/)ƒP={¿­ˆ‡\üÅBŽu¹P© Q XëéC÷«64[~»-âÿÃ-⑃³éNy¯ïpR¡dq q ñ±†ˆ¦ñw¦}³L3ä´}MãªÅ‘wJâxGgEH¹xÑŒÄf€J['ö¼¸æÅ­ð=2Ë ÔÐ=ã>ô•žWÖ¼²O_ìˆqEŒ#úÆk”á¦.`I çŠ@-B s mÉ + ’›jêROLkbº¼Ò¿ZÛkÊvÏ£qUHu ·O“jdÈäõµ#6ó^uÝlPI§OÜîêîq±NN[|ÂîF>f¿eÓÝÞU7ƒ h`ئ‰ÆëqäYøð,­¬he€–ª³zËxF}sÑM Ÿ~jൢ9ñ{‹í=ÄÝj8kÅY…*ê,åãˆû`ó±¿8JõZÄT.¦äÚ÷ ;Š6g äî‹ÃÃìÙf†rÁHÍ,Ü a‚F½u½Mãˆkô†ºàÂ5´€7'‚d T*I¤šK|Pé9hk2½¶ðpÇË+^Ñ7\ ¦z=3§$6dòˆ'êhHNZ´ŽÆ™Á8{Ä{çlà CêzÚ +•@k-Øy¯šÅ[ñˆãp ¡dq¢c||hNàuil'›ôIJ&–Ë®¥1®ˆñ²½4Hk{Mq¢}ïŒË“ÇJ,K“HŽ§lk‚`˜Ý¨˜PcËPÓÙ…¸Ã¥—V¸ô‰ën»mDJ‰h“Ø@­ýw˜™ã$ ’NŸ¹Ý&v ™2y¥ír@ßë·H¤¦mYv†6d´Ž´yÒF1]þùí÷{õúë¶ïS…„·ïÿhöÇŸ?Úçþlvùù׿«udÀ÷’R¨èJnôªƒååqPÛ_XË««Ë—í"jþ÷Ž š—rû{ù-9åûwÛûô¿—ßþ}ÿ¤ûW˹½£Wãöï¦ÕËß«§È÷ Šæù €¥û¤<$žoRÚ³€Dådàw¤Åú°v¿lÐÞ®Î}Ñ©›ò>wÙ´å=O˜õ-tXëK‰Ÿ-Ýe!>}æŽL iÁnu3׆‰ÏÜPË¡Ä^D±KÔ–.6Ç %•{Ýâ]FäÝZïj}ã5Ò´8i¬Ü:r âpM8X¯ µ4̾+ÚéöU(Y\âOpOÌkb¾¼pàÆ°X´®5Ö5GV°:{ã8â>ˆ¥#–±\¶Ûg ÅÑÚZ¬UÇ©€qöBm¯ºh÷Κë‰t~¯·Ó³!šÆ±²jZhÝ›h>GDJ³x'†DsC&È…t“XzbYËq§|7žëÉí‡úþtO\J¼M<ÆTiégˆ™Ò ¶F6ÝI|}‡3yíŒÓ²¤Ûé­ýHKs;yÜ»âüt uÇÔ7"¹ûîCaê‰iML—¶K²´dñéS×w êˆiEL±Û‚î;[\áMÝ„ÄœkÛådàw¤ùµ˜£ ]ÍíäHõ•E~èðøb9G+òñêgwÞÕ—ûX:bYËÆát¸c‰!—íñTmë¼2H|óãCW¤Ò|œq£*¼±ë†’ømR-Þ®ã”ã”Né¢3]¢a;̤ç•5¯li»Ž†uýhˆ¸â¤šC|†‡<áêkË5çMÛtþE(YÜøýà^mgGsCZh½E<ãz“ U^ÚÙŸ½äÂI¯óHF\m¹‹¼1#±q¸K.œÆb­ #"6ùrÝí¾å»â¨ug TÒé9ÑóRÇK+^êôõ‰£ RY$7'æó0§ÒNŽìmè½¼þjoãNmâ„¢õ5i¯ÌìtâŽxا+Ûsœs´öÏ5·NN—˜ñ¶ã”›ËÉ6îp±ÃÅ.n/Èe€ö)Ct¢âö`ߣJĪÃ\8JñQJìy÷NŠ=)®IqƒôPè2iºé[éyeÍ+û&m$ÞkÒ8ØBŽµ,ÂÉK•–Kc{覱0'ƒ*êhœMw÷}HÜ{B:bYKGìÇp}yC#~“…œ8ÒšÓ´hëÕ‡ 'Ž£Uàx9,ÖÖr$W„*—áªg rfpÂEÛÄ Ò^™ÙÎM³c½[€µR$ïR¸S.TšIYö›7q3:"ÒðĨ.ÔÂÕàp¥’±#¦š‚Õ42 ·ê8Ø©Á9‡ó±…[Ð%ȹqsÈB\7ý;L¼¥ï¯ë]•´hßúþ_úrÖeÇyÙp™ìÔ¨¹åBr´½m™}]Ø6‰‡Òá‹$“Å¿t¶{?PGL+bêˆý‰«íÞpÊûŒ“¥h‡+露ËrîI·.–#Ä_Ëx®ŠV%´¾<Ž¥#–± ÇZwœ(±7u“Ñ’Ê¢­›j3ú7ÚñðÜW'jŠfc3`­/ÕøÉ`î•EãÓëÄ/bÁâ˜Fª%Ë 2„’ź…‡ÏŽÓs¢–¥²ỉo_@í´‹W4YA%²1'ÇBáÏ–p+A*E*-&²§ï^uÑî74ãâ'ÐsÂ^eßgʼn@.äùö“x8w©úV[¦.òp¼œ°UÔ!¾=›=wÏEÜ»X:bYKGình,€VíJL)SGœÊõÿüö»´GÑZÝõû¤`I®ßÿÑ>ì?´ÏýÙ>ìòó¯Wj´ëËpiVíÌ5Ä•|wœ-ŸÛ~výüÂ’ýý²Éq,Çð~Ná G¢HŠ\Ïú³ìÁlúþÀÈù«˜)=X¯ ºkQ¨tú§>³‚Áˆ÷iÜf œoïÈ ùŽñþ÷ý{¶4ôù[°üñê·??çãÁý_xy?Š÷ŸÛˆ¨Þþ<,xÔ· Û2Œ¶]Ý~]”AËoâk-Ij¶‹‰;Þ§âw"HmùÚOVìYñÈŠëÕ³ek~£9jÒ·È„˜SsbAW¿‹BÖÒ#ÀŠ# ?SvÓéPèžSjGÇó‡u Ÿï”C¼ˆ£¼Ò>)‰§ß ‰[Ì”·²û3±ôÄr$–ñ±Ú`GŒbü"þ¡ÚhQv.Ç–[W[?°IÇf ¢8ðáÙ*6Tije·å}›Ðð6ó –Õj«\i¼¹Ø ‡˜œïŒCH,`™™p¼þnçH¤5ô<훘{b>óˆx­¯iË?® o9ck—Î"µ:¥ÖêÊ8xù'TëàÄ@‚.íéš.¿Ïá4pÆñî]<â€ÎV[Ž·Ë›ÝioK¾»i‹ÆvuÒìx±ãÅ/ÞF^0Ôp‚Tëå™­×uÄt ¦ Ç»w’2E"æÖ=ðrg[yïjS…ÕHÄÒÚRŽ4c!°ä%ù-ÝM*ԔƪØgóD $Ä8ÄŒ ´ Ú!þäÅž¼Øñ^®ak[g—ß»…ÄáR&ƒTÏ'®H™S¼.-Vä~gY‡³SƒK¯×™ŠzŽöÉK=/yéçù.õ_ShfætŽîÆMúÙÌ“ŽXÄ25ßxÄZú¹ZÃïS-4à|´z†–N¯\zljçðÎ A|¯q6=íkú;§DÙIi[6ª ê^¹%œ (Ç&ºOjxfÆÔÓ˜ffO³{´kÇ)ÊD"–žXŽÄ2šñ1cÎxÛS,yýhKÇkª­ƒú‘ât¯{‚Îò¾LœPj‰­8îÁ=1‰ùvjéž,vñˆãp!(V,æÄí8£«áE¦¶4dM(bÚÙÆž ™þŒ©m‹¿&<®žoªbFÅ?xp¸"PÇá¼"`¬bhqtLUAuBÇû[…$v¹Wôª˜Ë¾*4ê±o4ãP)Ó´z°ß~ÚŠ¯/·Ê‘¯¶‰³~¡… gjB`ÉSÄŽE‰´¶j—®.J+g®ŒÆ‹lœÄñ*+Φ§õu2&”¤—¯[î1=à±"füBI@%yŠXådxøÅ„-˜b`1Èd‘²"ØÎEsáhæÔ^3ê»D²"HÖgÛª!??߶V†’¯öß•fP¥@6„ÔRãZà÷C}ÛëJrúúÿ°ÒÃÊVF°GóÁ}a¾ñö-zÑŽ¼UkuâbGàh“¶ïy®Ü¯ÎDí5Ã~¶…ŸÅ;/‚•Iby¼ã¶‘Æ!0õÀt¦ðqÝfñbÝ2’—·Íúz­€%Íl£ãM¡jrúÃY1 œlj¶Ÿ'‡£9C-M(ã Þ˜“3Õ–ÄÑ/§ TÉÓïéUKÏ–-›žvõäÀ +¥FÒ¯0!º¸;ôÀÜó˜g€Ã•3¶áÂm“nœÚwÑٹݪƒU R®5ˆµöi¸ÁÎ +E¬GÛÒ‡é‘ Úªê‘ÑjÙ¯X»:ÖH +ã°šMGÅxf¯®Ìp’Ö%C…±2”|µVò*¤D¸fÐÖ%è—4ÖgÀáüÌ +ùÃ,î3Ø;T< âÿ¨ŸÅ¢)!TPÔ +XòÐx÷)fq® ¾Ÿ¢Q‚çâtôÅ6…Þi2??"¶”@.ÀÆÞ™vz½ÒÕöŹB}Ì÷-"þçÍ éþ;ßþùíwioÁòø:q›#¾}ýK{«?þüÒÞõk{«Û׿þ=¤dÁ7‘åf8–³àDYØýw¡T¿lÉ“hŸåö×Ï·o/o}1ëý­ßþ¿ÿŠÜÆóí«í1ýöòÇÇïoôþÙýG<žèñø¸ývTo÷ðÔà3ÝÿŽíQ-´½­sFHÌñ‚¥^Bµ@2ÆHómžÉoVôšXzb9Ë9âë|1c© f6$Þ¨¨ÞO¬öøk ïÒü!+ç@ó•v¸$oÝ>Ä-DŠ&O·„“âmÝ ŸnØî¥lãjƒ´*qÔ@†ÀUÆ·OjX+„¢ÎŒ×uî^ÃÒËXn®¬5GÄÓ1·kÀZż®]®ºm¹bÑrñlÏNÖMd„š(Èš~;£ó‡É×󇞘:b:Ó ±*H5÷–;­Þ4ÒïGÁÈèÊw&.|ëeÃñ‰±ÍG’k …cÌ^^È=ñ”¿X¸r txrº¿²^}µ´OTxÂùD¸Ã3^0s"@)n0o–uñN9®ÀÉœ.±er„;Œ¨ÛÄ>Æ& %áÕQ·rÄáê™A/ »ÅÞÄx;µx,@¹½W·¿‘&Ãù‘V7P,ú¥\uÃ#^@B9†ªB¬}W¯®lK:ܱ¤V+_M|úMþA*`jc¯Ø¦hÌ»`ÇR¬âmÝÉþs½Pá¾ãN—øgÀÍ6O¿=ñÆÎ"Zpd<®û¢¡4Ì ÁÄ=B—О>6\5pÊ ­†I7ª bèwGùª@Ò|¹E¬ì•Y9G"N :qmCnñbùZÀóS2Pb÷ÐظóbyK'ŽæËš–;è8ŸÍø…¸BuÂcÝ™ÔÛ±tÄr – ;æte½zó:Þ©#É¥PIcgÛç¨S©æÆž&~ÐgwîS¨!`j˜A’êè·ó‡É²æùÃBâPú xUVO[Ç›±V(z}j¬#æd@|uU[µtñL­ +˜z¦¶®¦õÄÜó˜gˆ¥‚šE*ï&@5gL=1‰é܌窚KÌ +šÔ1¶-Ua ¹âX“3ž9ffüê5°Z9NçD€RÜ´Þ‹±ãÅ/ÞÆ^í%A¨‰â--^zÄó‰pµ˜·§Ñu6<=㧇ÒJbdHTb'•ë;üºà hmâò¨[hlá.;Î +ܼ³b=mÅzuÜųb+ ~cûîkÜó˜o_ë?)ŠÇ÷s\œ „}+^5c;=ãÏ”Ï&Å[¼w^ìyñÈ‹ïÐ&æh]›¨’1ç;­ˆ±M|PZ¡èõ½2îÂ[¬â/ÑðÊù*Hõî¤ÎÕ¦çû”ø,¯ë÷×ÕñÆ-«ÃS™áÎÖÀªŸÊÖá*`ê©¡Kåéª6Neîˆù@Ì·™T6PO¿Ë·m®Xú´ +óXÒóÊ‘Wn§cæ {U, ’x¢SÄä„gñSù¯!p•±£m£N(ÅMŒõ<Ãë;Zƒ´*qúC´ù†ëÀá6î—£ýšodG‹×ƒ9S^EÓ®öL+]³S5¯§éÉ¿=1˜ñ\v“à +¨/ŠU#ÖÓ#VWÆUñê`^ºxY9Ç!æ”AÄõ¶ï¢ ˜ŽÀtˆbmÚ…»ªª:3bLÌ1ˆy†8ÞâÌèMãÖ¶q…¢Ékm;× ÕÜž¹%±€©9›·¥WC®èô nÆÓ òlÆÇæ6Ó5_]ª\ïÇ ›[¸ÍcD âqŸß¦Wp6P/óN¶Š1íœ"üÚ†`R¼­[B‹§gëê7œ«qº¿²^Î'=Í÷‡r‡{ð6þ@†Àu¢ýHO,GbS;b<ãm"5j8ÜiW@+¹æ#0€³éIà·'M°z·è–{¯‡ë>$ %a¨ËN iv7oGb«¾W¬">Ð/:|¼ŒwÙ AJ%’WÄóc±{"zwÒ†ÄÁn%%¨ŠæKV¡Š:Es]3îg,±ˆejÆ T'®}fïúÈ +Ü +²G¬§‰õ)ñBUH{M’H ΋mÞõ›GfÄ»J;âÉÄ›!þÙÚ<§û+ëÕ:>ËëúD5‹älÕ€ÕÓðŽÄ\´x¾<•†òý`É4ªilj“¼31·p¾©…;FÃ'”ruèx±ãÅ/ÞƦ¯üD‹9ª +¨×Ÿv+5*˜kd<¦åž–´<¢=ºÚŒ†_¹A±q.ï¬Y9G² ¤ùr›XØ}ðþô·ò£­mvÄ™[-ºëÿŸß~—õñuªÐZÈÛ׿´7ûãÏ/í}¿¶7»}ýëßÃ4,¥¦8lîYš{öÓàTÓ°|ÿu¨UšïŸX²Ç4îŸf öï·'2h¾c<þ¿ÿžœòûWÛsúíåßßéý³ûy<ÑOãñq›ÕÛßþ¶âEš…¢‚”ûÏÛý¯™$ ]M¼0¦ÚÆTÓiÆ +9“G|–÷êùZÓ°TOï´ØÓâ‘G´ ý³ÝŽXÉ⨬=ÍæyÄvóUH˜#·«ëg§·-=ðY\Ïr+XJzñx;Úa³Âî9ï*!vM˜èòù®\¶¦_Ä«³x•~sËaO Ð~ÄÈ J©n²-r²¥YÑšCâPúmWÛ‹Bè÷~¥&âHþÉúo¸[ˆ*²E"ÖæÉëºÞæh] Ç›¯4b¼ÜÔÖsj5"“7âå‚ø™*0ç‚î½¹-ISó¬aCí’¶e³tu^XÉ­Á‡Ú¸x¥Óì—ArÉ E÷>E_`àL$€Ö>ÂÁK;¼™ûGÝ-JY +BU5]ÉHP\‰¤ºšèÿØLv‹Ä´%¦‘xþŒ=¦I\mÁ“ h+³‰Þ—‚{¾Ð“®jpqW£0¯¸u o]6/&swQ +ŸÈw9²uTW#WNKèfî µÍö†ß7õ˜Ak=lF§ÝaþE6šCÿ]lã¸øÓæiæËÕ¯Él8Ë©A¼5绞?äš/)2=M^˜òõ¸TŽFêO£fÚ8, æß=8ßÕ(üd+ÊFL½Y›çz›—˜«{b”ÞWóâ\í3]V#A°N³»Ü¥®æ鲆·î,ï»´×eµ„wî˾´û-{Ï°2»Ç]z+t®™ˆ­A‘µÏåô›-QrP)Ñ|/SÄ…[—/Ct…ŒÍ5ÔÄE7ù,îç¸Çùn†ø͸„iˆ¹xæ!îy\˜Ô=Í4Ê=+θ6¨h–eë˜hú•»Ò‚ ZëÑ|ìE¤~48nr &‰„3v/V mA«?š)­™{E—Ù÷nàÅ7¼xÛK?_ýèˇ&öF×Êìºq•~óùCºÏ(`ˆ¡†¼Ì_ª˜¯ŠâO[œ×t6õ[×Dò̘̟f‹ˆ»ÎÙh+h ³Äj´ÝSem³Så¥óÍ•ƒS©!ݵ õ\8jžgyߥÅÓ´±ri7m®Mè¦-ϦqQ¨•"âË7íÕ¤^¡+F¾°à|“9Y/@Ö3eÞ„ŠH×+Äg|M"b÷áÆaÛ\8ßæ%Ë qöe¾Š6_K—|¨`'ËCœ+«1¶ûkj4ßï¼4òÒ–—ÆùÎOï¾uD”GÔ}뤇3^Ø<·nÝi€*²9•2]Çöº|ªøJ˜ cÏlÜ8ÑI7ã„D<·Qëyˆ¹0H‘L~¬ºb¢'lLâ^!’(Wäó +.”8Ôñz$ßÍãâO[ “ÐzÙÍ}*Z”6ßxqäÅ-/¼Ó·Îï]§0¯·ud ŠôèÞ­6_U(ëwÁ뜰{xžàºÚ‚Ä& ­Ì¾u/¼¸áż¡†ýYÔLŠ¦–)aš?Íu»Õ\Í‹àZ@0œñr ç´ËìzÕÂu§­m6ío;_.-< Ö¸„œJ k\¾Ð. ¤5ÕŒ³ÅqSK”Û¹¸±‰F6q–÷]Zt‰ÃcáIºp›xˆ/53‚Þlv•TÖ;t™-„Íx]ã_Œ÷+”ÍR®v ‘H¹+6 JPéש˜w*ò©‚ŒÁ¸F3¾ÂÏÚY8ÛÇeÛ×ï:³ÍGL^5­åb͇мí^‰yKÌ·¼" R©‚ ƒPçJi2ÐʆVÚÐ'„€4¢eÆKÁ°†^X¤jª 0k`lK«‚t g|zíÞ7¶³¼¡ °öíF¯šB©|b™8Lzÿßþð©Û'>2ã_¨ZPëªéiUèîñ8'â"j€J{qG^ÜòâmçÔ]è¬ÐºD‡yEWË׬cH|¹"Ž…ŸØÕ R°qÃ|iä¥-/}è|ó¹ZghÄ‘G¬¸u]Á´×yIb«P Nw¶ñrÐ@Lbºí_2ãºw9^)Ig¯ÜçQC>âqDÇ¿ð #èÍ"â³*Þï±­‹5œM¹\´žÝ.½z±É¦vÖ„?'“o®PY +h)³—íìt£Ù²kŸx.´¼o‡Çø»ã÷1œÃÇX??dÛ¸t¡½#ÖD[Gò˜q¢A Ôggˆ+·.Ÿ„R[ß%–‘X¶Ä²G¼-F8ã†o?¼8,F¢Púâ…ªÜCªã7¯+˜Ö€xMgÊlùî]²ùæ*Ÿü8‡qx½e#@æ}ù.cÁù*#‚TÅT»öpLŸ's1@¥½ù^V^¥}Daþ(5«sŸÇѸ4@$Ùõ‰iKL·¸6¢uè’¨%´à|¢Pév£ÓFñ>ñYÞp¾&Yð›8<ßýq$¨ý¢É¥ëEd½Y´uËň{n×àÌ­èjÄ Æ%ظ%‰õþ[h¿É­Þë#\ÎÞº^ÜðâmßÕ2KÒGÍ/ÆŠŽÖý5Ts¨!_L˵l©h½JÙ·Þe–ëý Ï–ï€{$Ÿ}çåzw Úų•œ›­¾KÛ>âþ†~÷ÇmFToïè„_~KC­Þžxÿ-Ëø·|¾–Aâ—æš6–øÑÒõð~éšö—.ª¸Põˆóá?oEGÌ©‰É$EÀp&¹šøˆ‰–Ç&Ž˜*AÊÕÕñ1÷ļ'æñ©^ÎŽ9a»F]?~›1õÄ´'¦c3žQÅ#?V¨I9WäyiBëdžeìgÓƒ3~yÇÀ+¤#–±Ü&¼"17ÐÖPÇ·ª\•Ð!~åÅž÷¼Øñ^îl +µÕ ŒÇÓ0)¢;âZ,›kÅë…UÙÎÍxÆËs²ö×HÆ8–“*$»Ú'ð(¯;Ûp%>T)u †YÞÁl¹cå+g«í¤I¨%T ¸º³]Ðãeç Ì^U»¦ø<™%Yùï3'.ö³Ï¤ápLl`Å< Ûa ÛxʈŒ8T…ƒ‚‘$ÜÔ œcE]´à kËQ"Wo*–žXöÄ2´‰£¼î|3$vOÜ’ó-`ì˜ÚYãí¬nøn§ïºfþ&·`nT…š”㈂!g?›ßˆ©'¦=1ˆ÷ª˜16_±¢ŽsòÊði‚èp±ÃÅ.ÞÆž/3 ±\XÝ;Ö©Žö)dKZ ˜¹a±ž4¹'í %œÙÎ*CÖ@ã ¸uªJ¨Ê.Ü$ìYÄ’k§2TbgÆk‡‹¸p'Ñ 7‡û(+ž£õNcÛ2ŠKûs˘nÀ×oD< ¯yêR#j˜{bÞóí@ žš°[ÕZ8£[~V«jµ +äs΄“›‡=í<‚ 嚯=qÝä'‰ï¿nìUŽSs³RÆúLŒýÎ5K_¿qf‹íŠ‰Íh:Ǻ™­¯[Î ©º³=Ë;^ìxqÇ‹ÃùÜŠbu‡ÚNšzI±d¶UÙ”3žï:ý!œ†9·+ë¥ò,ý†Û6ƒùCÀ&ÏÑÚþ6Q!–‘0c+=ÙÅz¥‡Ä `(›¨ Èêå¡q"±Uhá|5qÇûµŠ%#Cë=®O¼Yñô©[ñ“k\%H¹æk£nï3~àáTA–A\/Φ‡ãN‡ÄÒËŽXftœ +ÊnZ°RXóâ¢|a>3Só ­íŠ>j¾¤xu?ÓÔ8µº&s™ºÆ)™¸Á±žEpj[])8Ü:&g<³uO+—VÀxÜ"¤‡•=¬Ü‚Øï3¸þÞIJÀµÔ86Lš!1aœùrjó-Å!î,b² ÏXÄsM˜ªªgÃkšš +]Þ„ñðŒýî­NĪkœزëj V‰pQOÂÃA´º3~SÅdxÌÈø¹ðàÜ®¬—ÚÄÑé~šªÆ( É5µ£¼Gç +ä;ðIãíp±ÃÅ.Þ†b°¶Èe¿óèáΣÃñJÇ+;^™o<ùÆ ÎH’¯ ås#NÀ²9:^qÆd ¨¸ªX¬Wþ¢½²ì$0›8mËtvNØ®Q·´¿¶ézöÞiÛ—ö™P~PÚÅ `¨Ô¥aR†J,^°Ã=†ÄÜóŽ˜§æ« ì5ŸOUÙ~Ô«›åw¶¶jˆ¯Š³f|ÞºAµ +ålU c8'kõ5¼ž"¦³0vÏY7öÀ3¢xn¥#QÈœÇ¢àž˜÷Ä<">sÆœ›M 8•â´w¼ØñâŽNØ¥ÍÀœpΦ‡ ^Á +&NtŸuä‹ ­¬MmÚ…Ç#ž„ŸËŠX‚˜=nƒÃ6ÕÞ]1($»Z =í”x?Qƒ àLW[ï×nÁñˆµéXB©B ³qéYfƜەÕ%>#”Orµ€j¨JÅË·Õ@• å:NŽeZO¬dŽè +lޚѵÊiâë‹{†Ä„qfnÕ (ɯo¢žXöÄ2ÅY‡®Ê–Rãù.$ˆpQgŒÇ»çS‚8W ¨(_Ø{Nua†Tñê&ÑñbÇ‹;^¼œj¢÷iï¿ÉÚîwwçË/ïxyf¾©µˆRœÌ舩'¦=1#ž;p®EX…flW[ÄYŠøehWglwŠ"Æ +V=A¬xàbY0ç Ì^mϦ‡-X¯>pJÀµ¸r½–Æ)™ä8«7P./«vÀMÝ¥útûç·ß%CQ½¿N‰òËëßÚ½þøó[»í÷v¯Û÷¿þýŸ_jÑ»a–öh7 ~ýù,m߃’ü|²ýû2ŒíA†öa?ÞAóFtÿû–œÊë«`9߯¾?|½Ïë³í#îoèGqÜFÔ¾êßÿË'Ͳ5–ÒNyÍÞO9½‚]¿åäBÅ#·‰ß;.§fB:$žŽÔ1ñŒ…>Ú’Vªb™NÚŽ‡¤ñŒ—1Qbnw¢ˆ¸mŽÖÚ–C|”÷=ÚŽuj¯ù<ú­­u'Ž¤_Ujõâåý4©Aš¢ùCU NŽ"ºÕfºzW›)—øL©®¯qjÕÛõâkTñ䌅[Î…ÒqœdèÃmc”•ï³¦*˜+B4^.fÕËåW^ìyqÏ‹·Çgík»¯Õ&•«‰{KG,;béˆ} gXž&e³//–ì=‘L­•‡H9Ìlã5àx‡qÛäBôÉÊ9Ž“qÙîDN¾uú¥ž˜öÄô±ú}i<.ñz3&¡æì´ž³NܹÄÖ®LhÆñT¡”8ÒŒ !¹íý´dþÒ:æ„P‚õ‰H]˜4ƒ†RD¬ùÔoÍ ¡ú0…Ùç¨Ö¦ˆPíÇ,±§ˆÕæ«8ÔÎAÕ€µº±1§ºµË('N­í¡<8^*Wj²xŸøîÝGˆ»|p‰¹#æ1OsÆæã˜{nÄ.v¸¸ÃÅÛ°Fä¼-GA,˜¡Š:Ëg6=,}—¸Ÿ®tIJ#–ŽØ­ÁBÍ""…2ç—UîòÐègL1íˆibÆŒ9Lq'a°P†F•!…*>œh+>Ω»fÆ_ªø„*îÑf[‘œŒëÜŒz^ÚóÒíKeÀÄH©9ZŠ¯B!$×~O äS‹¥ RÜL͵‰õB™”åCGüdï1 +ækdõá~tÖŒÏÛ8om8ã ›g'<°á)=¸¤ío¡vONùá^t~Ì=µÕ R&Bù©˜ë=É{?5ñç˹>å#Ž±BÉâú/VÄõ›FŠáfÁ´»UàPJÈn‹Cà0;‘ä_aqaoÖjç”l»'áxÄœ¤0žfé?öË 9Žc¢{Ÿb.`¸€ +ÀÚGм´ÃÝ?âW“¦\í°«ƒ]Œõ79¶s€ÌD’SˆÛK• ãø"]/­’–¤˜±+è;gæUFvå™ÙÀZY> #1ļ#æ)bIv +Uð"‘“½ñÒÈK{^z¼?¿Wfqº à¶•_’<Ž–¯¡IÅd>‘oŽ“ù„"´Tú² ô„Æ$úæs5ÓtÄÙ<‚À]ƒ†yK½‡Ä?öŽGbÞóH¼zó [˜utz*Ö{1õ»ãS+ñÔ™ôŽÄšº.㳇ò6@õè½áÒ ½‡úÒiâ§#|™¾Ùê0«@IuB/u͉ÛHÜöÄí\ÔÑ@L;bzÌDÝö$ŽêÚ 5fódÁ!¥%;넶Í;nl—Ç̇°…AL?5˜º«.]8³5à"ÇV|bçþÎL6Á®½[pu\·y#qˆÛŽ¸ÍkÏ5ùˆ „~|Y-¾4 e+AÁÄ<óž˜?—¸ä è|—GªþÃÆ€¹ÚDó-éyZ>‡HØ&LA˜$ÏT°Û–ÍÑæ½ñÒÈK{^x—Ó¶íê8Þº6ò¶=o;Òwï3¾öžOèÖ$–Ïð…ç»:L€ZÍ×UøX`ÙË° n'Y:Aꦖ¦I8¶pß~ˆ;Ý$Ö÷à–+åRe†fË /à}ëô‡ƒm›²²PÛí,Jµm©ÌL XŠ&J¶¢àÞASXkÝŒ,UÕIW仆gçýˆ¥P2SKxy"§â‡Æ<óž˜?UãtÅ’¶Ó3¸‹âéÍ[Îý_›Sn§óΞùÜâ¶#nq\…³T5Ö—|Ü|¦ç÷Ø#f¦á+Ô`6ÚZO¢Œc“¾i5ܱX&´_m€êÑøÞq(œû;K¨ñUÄãÚñ@Ì;b~ÌØoºâcÖJ¦ŸŽXŠ¦š +)¸y….Öø¬ÂÑDpIW%²RÚ¶u‰¼XJ21—ðÌÊÅmX¡¢„·Ñ5#|ímT¡å±S&Iä ¦ŸZ‰ºŸ­Iä»:¤p¶1v‚OOÅòË.ßTu;ÆàÞÞxF…Ö¶÷ýõ˯Ú{ËëëBàV_^ÿÖŸõÛïßúc¿÷g=¾ÿñ÷«ê¶ÔR‰vbÈÛR{Ù~.íßo¶?_Äؾ@èxÿü@w Ôíá/o¿¥”úö*8âë»_¿|{ÎÛwÛñú£¯_w‰Xþ'UYqKUì QÚþ£|û iü iÿAÒðA.ÿÄÉrв cD{ÃÒÍÞGV9Ðw–÷)íé†nÖ +VúÂ=¥½c¢àüp"îcõ¹&ºÿamy&‚[ëáïMÄý*¡`mh<O»Úsâq*x æ1?Ž§B:(OÅdnÌLEˆÛŽ¸}Íä°ÚŸT/¾ã'ôŠ~> +*j<]»Ÿi<ü“¿jõ5æX¨t?^mÇgqCyûP£^S'æ¬8a£x îg¹"Ÿ kï?EkbÁ +¬¨InÐt!D@æÇ)×Fâ¶'nGÄû”£˜vÄô˜H9u¨˜IâRA„ƒ¾¬úœMp„œj`·,jÁMS¥\ƒæÚðŠ¢öÑ&¡P¨y¢2l - +ŽNEĈ °§GžƒƒÕ€°¬.˜W»AáhŒn§ýØžù1çÇQ‚ä«‚Û{‚Ãnˆ¼É1ž‰¼Ù± õÈÃåc|ºTÄC‘Ž˜½B««äÒ1®}ñŠ/ÞÇ4>ÉMªErÐJ!`¡ÕÚ^9¿¢@ʉ*›`VŒ6î—F^ÚóÒÀ{èÁ­ké +f:Gc0Æð´»_ÁÌçR*ˆp0Cû™.˜OÛÏYÞ/AËVûsºôÿ÷ˆu¡I,¥µõ7è•å½ª×Cž®ÏløÊ*Áf€ýÍìR5 Ž«4¶Ó[¸x ^$ çûÌ\'G¯Â îË«Ä••8•¾ù¢Î +µD']Âdk[\0wÄ2ËŽX&ˆ…zÔûD‰Ûž¸}æ'+ñZÁ +3|lj`pªA_»#q†Ùzû1=n?·q6) +Þè¸O¯îÄ‚M£†¹Â'¦¦8ô ÂõwÝ•AÀBËæ…—hA¨Ý,’4Ì|W¨ööãºZßKûƒfòa¬Ðo»èîx㥑—ö¼4𮦭XhõMw¡Gä»9¤ +–Å—èÏ­1+–õ_élاBÓyº?#¾´{gŠÐÍœM¡P Óù~úækðù.QöþΊ‰:qFŸÈ¦±‚º{Åt“?Öx†ø=5êmgyõó‰/Ô'Œ ¡%ê½aö÷§Ý`Å“#1cÅsK+˜z´tw«ÚmØ}¹©]Hì Z=çÓebµE¸AáLº®vH”FÞ6ð¶o›ñbu¨˜Ê&2 D¾:!¥‚¯áwªb†•¸@±Õòž÷ë$\¾áƱÆ+n¤.\¾ÌÈwq‚`|qܯ÷¸áòà8mÄïLEgÅcoC,XƒÍûá4òÒž—ÞÕ> T½:Ûô ?#¾´»+–é{Ëô¨Ðª-&Þk;«õ5§ÌðuY7Ï%G¼u ¢uyºÐ‡µ»¶D[gk@|Ç©`S(Ô‚tÇ>‘¯%l™ AÕ˜˜N/O5 ,Ë{ñ•Ä +XìØ+îClµ?©,ϼ »qA¨½ /&xgZ[|æKlÄR¼QH|Cgsc´Cb‰yOÌŸJ¬ÙDF+ζxìRã¢yú$}:ÆC™›&¶/¤±²J@|Ö(žÎ0¤}¯d6Põºz".Ô·!4ËälB šË±Æ†ÇÜéãöž ±½~4g€‡pVÔƒ¥£‘—ö¼ô8Xº+ƒƒ ¡E´wáJý_% Ž»uølú²÷wV\­ï.8æ6.Ô8]•$èÀÇÄ÷¹:Ò•)*ÞIwó £øª»ŸOHÅ~$QT.oè ·®9TÊÏ=—NÁ…6q?‰… ¼^K|©ÆéÆXP ©æ6”øIâ Ä¼2ðÊŽW‡Vì œ)šˆÇÍ +¼`×c¸Mp°#p­!ñŠùýØIÇΠÕëÁDÌòÆÜœ¾ñü®¿–ÒsÛf‡ÄSû3U¨6‘s·©ùê0[íOê¿P"Ÿ¨ÐªéZâ½Æ3þ+i,¡ +®Þ¼“ +‡>QX‹»Úý|BêË;_“CÌ| F…JýÇýòëÖó__W~yõ[Ôo¿ëOýÞõøþÇß»íèç-¾¸|fEwZÈ›^¶_ƒKû÷›íÏ-¶/zããŸ@0Ôíá/o¿¤”úöêÿØ/ƒäVrˆîçºÀ`@õ¡0ËžèMß?b(«m³æEV«è(øÿ•%«ªü'3à)=®~¼|Îû»ûŸxÜÐNâñºNˆËí÷Mk0–zRRýæõûÎÿ#ù´ƒÂ‡JýŠo¥p¸i°;­ð¸i…»ÖX7À:ãž…ª{jœ ³X-YÉÃK2PÒ}Þ'ùÿAÛæÿÀ5§H»Ò­9*i_ºÏÖ™=áþòº7Ôn±úXg‚¨ ÂeéL÷˜[`Þóx[R~Œ¤wàÏHê—©¹#"å¹fç»XBÒ=Ü"ÀÞë_ÎIâh×ê5Ô³°+—Z°Q‡žu݉Ã6üd#ˆÖsص^ÓSÄlj›v³ý3wfkPÏ9΀µ|ÆH5 ö&|=I /VDCûãFûN;±Ñ2yªá¥ö0ZhlO2.\ÝA±!¯¶¼ºåÕc¼/&F¸L¶ºïT4<\Òöýá(nO ¹ª¡¸µ°§NW îD¿ +ĺG+íÑ:°`•Ô±àw\jqi‹K î0ß^Üአ+ÏÛu¦›ë•æ«óâ¼!ˆÀLûrx|Ï#‚hfÙ=pÚëXo3Q@Ñâ4öp\R½[öÜ(brÀ3ŠX6À2o%Bâi4àIÞ™¿ªà;g/â®7ßp©Á.€.û¥}"æR㵞ž±³Uðj9D+Á¡:¥$…ºÇõÎ7¿XÑÕOž£ãí*ësÒàœ½¤„eK$û9|5Vö”;ªmT0ÂcÇQí3Ç%òjË«[^=ÆûbB„C´¾¬A +H6ª ³Ž»8Щ!T“”Š·Ë骻¼=z3ëLw‰óRL`š™0"0S¯}èwÒ|gô« °n€õ6áfEÀX†ûåeú9—Tï–ý +ÙLxºòŽ', °l€eØ \´“ƧMøLŽp53¸gjçï3ñ]fËšSÚÃtb¬®¾l\0ŽŸEÛ-Ø,•ðÁ|[n ¨`ŠÃéžè½su²ëF@:>oבoåT—a¥¼Œ£I®çÆxzÂËCfl9pìZ¯Ñ0jˆ9ƒ¸š°3 iŒ¼`7ÈȽ}ó$s8ŠÛ5†)ÛÀfQ ?Ué gbZ<†jÙ„±§† n%Õ»Åw·™nƒÖ•ƒ4À²–ÛDD`­­a¡ãC¿ðFr\.Üò¾®Ø¸K zC’áÂL;Q»’TíKòwʾKžë ’J¶ÞJyÒ);Ëô®ØÐî“¿.€.û–Ðäï¤fò—`ÞómF¾ÑŽ[,ÞPÁŽ`©¬,c?³2xICk˜ïŒ5h¬`NX°—œp¢úéâÂ{V²…So 6þºÖ@ -mhi8[ɬtf{1$ë8îç\µ¥Õ-­ŽæzfÁ ¥L )w²÷b°\Ø{ª= ö'V.c¡@V0Åá„_n<·Kô%ì€Âà _g[3-Þ3ˆÃõ|?… +â»è·ºP–¡~§;ÎX3ú}"Hì‹ ä™V¦H&Pƒ.°¤"Òqˆ£¸Cÿƒí:„eÈ9I éÛ0ÙRõ +䥀[Ž,¹¶Jò¡$^‹äS%Q@ÑâL˜]ë5½=ãzg.Üžá.š¾°¶¿Ñ€%Õ‘l©"ZZjhiCKŸ´Ýá"X*ù¾£R‹J[Tº +ę֭±;’™®*P²ýh{|Ç#笙cX`ÙË pQð”÷£âšÀ(<\/¤–-°Ü¾2+Š€±ڇȀ¤W;o%CA®C×QƒÕ\+H ¹^iÞë’+šÃL^<«:‘ÒØ ´xY» +ÅíCe$†Ûdu˜ÉŠ9)tµ‹TÒJ)œXÑã-™‘š'0³ÞAû˜î‰+æÌJñ,( +—ýnÛä|g›6ÀºÖ‰ K* " UïêÃæèØ+ZY¼µ-ž…Ú3˜Jœn +ç’j•¤NO¿܃öXŽ¶«*á2+›$,ÚÛtôië]¿T³^ÁžqPfç»Xᚤd‚ºº õûÚŽyj¸)P²áž9 m³¹LòÎl.SÓý&.&T T*#Ý^%ÓTê’E¡<7Cé:Ù±¶Äº%ÖñöÄÍèáɉ‹—k–jÍ—Õ÷Ô&™¡<ö—Uit˜¶ï4ûjGÛsCÌbž!þÕÔë7\?3dûðe<‚1wUqAb¯Ÿf[íÃGy»V0Ååó=ÓÕÂg7ï("¹$~»c@¬ ±nˆu†8ÖväbÅ¿r;zÑ#Šƒq‰Ô.Ar÷u¼Â'^s¶x}B2ƒ'JC¯˜ìl3^17ã~òûr¹ŽOTEaPÉ6$žnò{Äg&ˆ$†”yL¬-±n‰õ15Ä´!¦ bö +ŠÞ#>!¡[=HÃ*Vù`ý>}] vÚÏ=BPÀˆ¾pç˜Qo¾œ'æ{b_›ëÃýùx¶^νóRËK[^º=?m§öˆT´wâ.G­½ "(é¯ñ./)(¦Þ|/ff’ ,œa2)öÅ@‡GÛ…­½¶~É\#~€®k9gN7 ¸¤^S¿P'ã’@îÑgo‹e +É€Ì;[楔`I|ùvyfúÆÛ'Âìj¹>GJçî{p¿²¬ÖïQ-ô”  ¤9Ðic+#%”ž÷^-)"ÕÇ@F–P¤¬#mÊïä\û{„0;ANÚ á KK,[b¹}aP°;ˆ.?“3žY~^%ÎEzÞð© +m‰uK¬#Ulu….` Xûs/íðfîaj4ï Ë!ˆ¬PQA¼Þ̼ª:;;‘ *Ëùýe÷"y÷•z¨t„J·×ÞûK·Ê`bH ©’Ó;´Óö;n”3ùöªQ&0â@ý,bk·>Ã4Êx‹È X«ãk:廬`Y½‹Û-ãT5ýaEÄóàj ¥†r´hË3T±ä,`jŽ„“éiSÓ§ˆûرK‡Ø_qájDœP– +YÑûÙ§ hìØC7Œ¦‹û3~;UO"~\ÎÑo¼¯\DNµB•ö÷)3þIÝ'dªiµ(NÞ‹:A“¸‘÷ Ü#æ#b¾ äÚó{¼,?¼žã9Ux,™UAÛãœTóÜíªZÑ3æ ÀL +RÍÝGtZO%|¡ R¦G^¨JíÐþ¿¶¯ÿó·¿×ö"ÔÇϹ @Müü·ö²üó·öÞßÛËn¿ÿë¿ÿ·bPñ.6«õÈc~0aéN~AùëC{0qÿ6Aiÿýó‰šî0ÿ¿ÿ-›#ý´=§~üñõ×›¾¾»ÿ!'z6_7ŽJ½ýû`D´¤;7mÜÔû›žÿKNošgÿ’×.Ý´ü±Ÿ ÞñZŠÖ–§V<ŽW´Ø÷ ‰smŸ)i1âï;»‘±uM.Ú‹ÜèÂ@åd`Fô9~ßÚ¦P³ƒöl¹Zéô)·Z…u€t–Õ§*8Õ_·ÕZÈÔú»ºM_Õêõ¥m4 îÕJeuZôª±Ëm¬Š{·ÂšÇÞpᘙI‹•È­µU %cÊæÖ´½9bá¹O„2æWzÄrD,#ÄÇ£›aøÕш*¢Žz¼tÄK·AÔ]©_1]]x6<§¿ôD³ˆ*À÷ͧMÜž„4Pc‹wxœ +XI.Ç+.ï½ð(µßí?PÿÉP3záqQÜ]U'b­:ÆŠæ¨a·`æ¤`ê_Û†þ@ ˜ëŽm’à™cûå&((aT~âqœŒ’Yt¡#Þþ,ÆP]vw¼·PzÆ.c­i<>§õ»¾FT°šFm—ÒC +XóxM+â™zÃsÆ~Òð VÚHk‘¼m‡uj¼yH3Z{QKÀ¶1>¥‚w§….?²³äº–P@²ŽMlK(fPmœjûäp20£Õ_%“ÖrÌ»µÍwbî6Þ `$PB—ß-T…̵}¦¸f¶™~M¡ª«†³ZXibÒ>g'Ôñƒ®û^i ¤Þ‘íÈoR0MË­÷ºY4 Ú1÷ˆùˆ˜Gˆër†c]2U@!~Žøñ܃è°-Š·`]' ˜«ˆÓ;èi_©ˆRŠÕ@>\ª×Pˆ­BuwW7‰Ø»º^ÅÒ!–b™p6F5s,=b9"–ÇGÏÜÝ+´b¹º¦]Ú'T0RÞ™A5—âý–F¼5WTPskÛ5rUÉddЖyAÂ9ZbÀâ ¹ÝÀbÍèYÃY¬¤Ü!åR"-j ªNþFJ=R:"¥ÒK3¢‚Ö4¶Ü÷ìàJÄ$€mÊ-TÂ¥ N@Ø·Ûï+ÛfÁÅÛœ¥fhª#Þ¦™•ÊÀEÇÞ» ÇLhäj³ÅlxusüúWמ¶J«÷P¯ˆ©Ìða•ÍsµÝÒ8Ru(† ¦Ž¶œA5A æÕü^ʉÀ(­¶à«j1h;sl …¦<.=Ò#–#b9‡xF/*„T·àÙ|û@ Ž”ÇÁÐæ ]´—Ô~Ë®~7³ßp†¯OrB0L%ÈÅ¡€ +zhw¼¸pˆc•Î‘ãhÝÅQ–Žhévêâ¤Ã+¼r_\±wœk-â¬\{(`ŵ‡%…gN¾?ea¼~s^W(‹ˆê¨¢MžÛêú[¬@Í–hgÙ]o”ñ£^ö®êøضihL¨«ãøªp 羱7á¸êLË÷âdzZ¾ú#øçgÆP½h[rnïâ Ô%#†EÌÙmgû "^b0"(¢FIä +V“—Ûµß +UTûÃ!1¤C,Ä2‘¥"4Ôâ÷c­É ¹îâ¦/÷Ì Ù‹åK:D‡•;¬|ÀÊ·ñµ)˜únv•N'Ü‹F©Ÿ¼¶œ !¹mCETÖº\ÃW¦FnÆ1ÇÒ#–#b"îðR‡—xé6òˆXh9˜‘Û(7k;Ä€Å3³`ߣ6R5 †6H¹ŒKú[Gvœn3Zð§[±wœk›ïÙ”p﬊—jÚÉÕæõôt¯/ˆpˆ‹ T¶îÌ·RM $©g¶Î)å†Å;É«§3(¡Ëí7ÞÉk[¿1ãé·h{ÚªÓÌ.KŒbîó1Ï ®µ=]ŒÛ‘c¦˜³Û~7ÔqUàZ%ÇX@Krsî›cîó18>VµįªZ(/&LyìlûTaQ(UR g UÞsmŸ(½ÛËx¡ +Zm¬êÓ1ÝNÉ÷ÝÐ0`­%Ç Í‹¹“ ¯eF\Îïi‡pC£¨6 æ†Æé{^|Î2ì¢Í ¤¡ôm 1àrŠ¯D¸\Œ¡r9ö â›áéÖ>n•ÿc¿ +’ܸaàݯЂ ç<ÁOÈ1©\üÿªP+{Í©–œ¹5tY—•´3T«Õht¿šÚ µ@óRe«amë±Þú&,Ù-/GܪblmÄ*Þª¥TCD +›çŬ±Š!ëÏØr!&<Ý¿'ýùÂï¬}ùþ«bß®¯‡á‡Çßû7”Ù¾¿ ^/{\üxþ㜯îñ¸£åáñ¼òÃåöÏa°+sò=רA+˜•áfólVÐíäïøvÇóß‘Ä$|±@(T ‚zÅ8X{nNo‹ÿ)â Nõ^KÎ]CÄósÊÞp-USÑìYLÚËg­úºZ×^B;qÔÜ !ëêQ;ª>àWjÔ¾9 OÛrÄ|ßåu“|Ú´½Ò +î³”}Á.´pgâF£ÃJ'£Úh±¬ž¶iJ(5¡fÚh¯a=ÉÃ9§¿Ì¢w¯¹ërÑšq"S¸b†¬@KŽÔûh"g7mg™ñÖ ++éÛk1ÒÀH#;›1p³œa+Û*ïJ&`äÕÕr·{¡ÝnGHv A»½l¥~Âúª6oØØ m¥ãNEkp=¿÷¯)P}ì£! ºŸÎ8Þ™8iðʯܺ·—~K‚ZÙ6òA„R$Ìè§^^0Ù¨.Œ… rÌîà†ýôÒRnæpÐÕ³¾èaË@…|EЂ«OâWÈ€Gô{™­,\ÿ[4B|vÞ:Üi!äÖ5Jh¶ñ`y ¶ñ[mðꯎp»Ÿör3WHa>[ö%ý&síocmÑê­öÐwÛÞvr=)îïî -b9"–['ñ ÛiÄöë¤Ê­:†d…ÌRºŠÎg«3°‚&Zž'zpÊàH7Šä8ÚsxqÈqfÈÅú›ù:ˆScŠ6ÇÉ$±\ÃÛñËž®öáïK©}»‰c ì¡Ïáwf–`S úØg3³åÚŒhu󜊘D‚¾1-K¥‰| aœ0¯·÷ãXR×éxÊ®;Ý‘b~Ñ"Ÿ8«‡ÕçRΡ«]/³×k„óFn¿Í¡byy瘩 +…¶Ðymoèh[¥wràЛ1ˆ7Ú-»Ú ÖbÚq»Mœ‚`Ù¤opqÈœC~G;ìÁ«Ó» דâœvÅ­A@žvòà ûÆvˆ‹AûTį6$†d«ëFw¨…6QÏñ¾¯i V`µËî$–ÌK¤…†ÚÁì>Òäƺg¬ÞRëFž¶WRÛjÖö3_!ªµ(RïY¸OÁžnq. +Ù-\“ÝZ:3G¡ýl@[>jRÎaÅxÇ;h¾Ïå\+#pòòycï/Ä/‚s采kT8c ‘Õ»bj¬×‡ü^¯Â 9°æ~@ŒÇ­&´A¬Äzë/ A’»žºç[ãt†ˆ×Üv>ÁŽ€YVûðLŽ !'ë«â2Y‚Í­„Eオ(ÕŒ+2¼Ÿ£ƒfë϶ˆõˆX{7=¸¡{à9Ç0¡î’(êu´Þ×f6‘LÝ´ ÔàJ@Úœk¡ÓÐÓ®•ß%%ð0û¼»Ã`òy±Æ¹‡r½»ixÚ‰ºÍ ¹X?Wn·‘ì>– â}œ +Ejøí ¯zЂ«ù´)öBË®B%\Îw¡‰œìg.F»¾ýN’«“¤$'_Ífi80òê¾9ËŒ$š¸i›â0qC»âš86Ê«õ{œ¸1ÄñÄep¤@×Ìhû©ÂÜ0Üux’ãUŒp«‚­^I²Ú‡§v¼x¿ô#HP¤„é’Nkxy^+ Ø‹n¤aR¨c5âY&qµùmñŽmŽqJàš£>÷/µx鈗¼]´cjóZQȾœÞ‰g +T!ö ˜p—K–¬Üå«‚êVåÍ ´xYÌñ$wd,aq{çW[´zD«=~enäÇôìŸ X (i€/¨_IܼWÞFñ>E;1OfÅÜWÃDýŽðë—Ýë§H”Ðfð;I»ò?ûå’$InѽNQhˆÄkaŽ ¥dÚÌýÍÄ윙Ž%Š %£ŒœžU×'3Ò íp¨T¾’s†¸ìO‘» Œ5¡Þs—½ ½Û Sá AŠöÒÙÈ„G²ì“fC„jžX£ÙœÁ¥Þ~iNl6 p´ÛÏk76l’»Šå¨XΊ¥§xj»Yîóä2®Ø-פˆD6á«©vcÇ U0F¼·ã¦5²(*w§ïÔ†«Í _ÉgïÍ7@IúY¶NúîE”-Ç +âFþ4ˆÊw÷ñAï[¼È=<ñÛñQßΟòí(àÛ©uÓùêA¯žôêÈ|‰A+ÑWÞïу†`ë+^ÂR¯À¾#»xÄon\¡Æ:‘Í÷êtïÎß `¥,Ñ"}”>PˆR&»¬õu§ý´-!@Ñn®-˜ldž@(¦ý›b 7`ûXJèwlÛXææ7E´ßJ¶m3bÖl›@å»7mªwQ!DïN²© ,@¦;!/Šôg"fW0MmÁs- O çà†AÅ#nƒb9)–7`bÝ9g?C8ÚFy¶!ý’{åléüòÒywÆcK÷ÙŒ÷¹1÷£ö%±¶n? +Þ¯êAÃûwÑðŒowÅ~·g`ã>SÈQ±œËGÇLJ„Vìi?^ƒIC|<芿˰R²yLxðàè·Ç˜Úâ <’r^ÙØÔ"-Ëõü:Š¯êMÍ°¿3xÉ}Ì 5€JI{y’â«—Í7Ú{3µS’á§æöÍÜPAä+Õ¾dÈÖïáA÷Žô°ôêI¯~Œdƒyve¬èßÍò ¢òÝmqЋ½xÒ‹}ÿ +%e¼¦} ¨»ìb…½&oe»Ãb/G(L7súTü-PT²ÃmAüݬ0¨=É÷P»á1TŠi6ßÕ +ÙjñdÛù;Œgýüó<Ø8aˆC¢ÉQ±œËG'ј9èˆ'ʾvAxd|Õ/ç;¯‘9X)Ëß‹}üRíÕ]K•"HÑþé6ªõå¦=8ÛçÖ¼Î^Aá¯Ü¶17äDÉPº°3ͺcÑ›­= ïŽÞ©ÀŽP­Þ ;³ÊÂÔÂn†ÉIñ ÅÁ,[¶%Ñw+d³@œ¨]ÈéëN7=¨Õ“Zš¯’m5_éÎè°’íwƒVÊæûC±ëY±öŸÑl ÒS4Û t *fWÛ¡Ú†É÷î²tpË-¼b; [¢ø¿ƒu1¿ï†T-”yx’+¾ß¹—ÎÓ`S0•‚m?W°x¤¼Þˆ +÷«c“( 0úv\¹;Œ±DN•è˜ÞpŒWŽŠå¬XzãÙÌ›]Õ ‰Úg^£v¥öcÔž³ðã5ø¥~3!j•’\FwDÄЄS6`¯I¯è6kŸÂ]žû)~\ …wBøzYªSÉJãêpo®8)ñÉlW¼ŽˆÒL›´o¹CÔ“¦CÖ˜Ú¾Ý=ß©\¹ÝŒ¹6ŠˆLñǵCîö…ÛîŒ+f™…×Ì´ +"_‰•ï;r +¦’Kzx¿cn»cC +B1MAx-®d£ö:ßhë¤(¸–Û›ã2¬åŽÀö[±4‡ï8Þ„ŸÝÊ™C€,AŸ^ÂÏ^êA°žëˆ`-hw§ÄTþ!(D©â;\ü.b +xñúy¿£ƒÝA-Òþ˜DÅWõ~âáð Î‰4ªõæÞà``¬ÑuƒõêY¯~\êæ–ø¤›‰@EzóMˆ;@ÒÞk)W®×RŒ2^‘{8ˆú#F÷—#¾*7…4·š–Ť ›Ê<Øc# c€c¦xE KˆÂY -è +©"‘!ÄBÌní9¸ïWÈÑ>E²›<µ¦›Æ­â¼)Exœ?„ÖâǧþûoßÌ€¿}ÿ¹8–ï?ÿ¥=ëïÿø¥=ö×ö¬_ÿùŸÿ¡>¯(߇ÀˆqBûís QýñM”xŽáñm{o«‡ßÞQÛ’žÿ>þHiÿ™¿ýôûûž/~ýû“~ÿîñ!Ïw‡ñüºŠ¥´W\1ÏÿÅ<ì\¥¯x!CXx¡3°StËQ±œË×*ÞíîÜ/ØÅŒY²]DŸÛ1˜Ly£r–Ê@Xú¨¶  :P‘ÌÃ3P­\nº|¾„PÈ’ãó0ßáT{¥¸†_N5Oç»Û$Õ!½±«%Š—Ì5à*©+ap’,&VT‚q“`ÛK­`’!÷ aZºmí9ByWJTÓ®b=*Ö³bí)>gðY~–Á{ù׊؇[ÆÀ}üËn€þ_öË&¹‘†ÂûœBB‚¬çs„,“Êfî_¶ä2EvÔT52Þx,%‚Þ{ãñEüÓw…Àó=ÐÑžk•TÂòÔØrÿ#ŸðwÎ1Ðrl8ÙºP~syñÙ‹ÛCy®õÏáNž÷Æ{¨E¤ú±»H,—/Y€stdj–@»UíöÙì!®>ÿ"–†Xffœ3D{%1WÄÜó ±*`ìŸÑ†}d ’cw¾Çû𔺮!d?Á©üÎÌ|Ÿ*—5/V¼ØðâÄ|Lr/çN¦]”"/×ï‘ÄÞü—S9>Mº=âƒxzãÖw5W#0v=x¯‚‡þ;§†~G+jÑIsÀ¢EGùˆ¹·mG¨á0Ýz»á( ‹Ý|;_ZpPé_'Ô¯»#H”;Äg¼á8 +D%ñâÁ6Ó¦±œ¥Þ|O¨agŠ@„<ÓÏÓ(Ý]FþfLjIÆ·ÜS­ýXUxjîþ\4‚h¯ Ÿ2™1CÊ8&žtâb©ˆ¥!–bw}‘€³ôˆØºŠõ™ É_³ôGÌh€IWßt{ÕûÿH W´d8åñqžŽ–L²:iíî:0eÅØ›ï§7pMÌ-1_^Ø(Ér²ÞŒO·q"ùÐ/儶¼éI¬ º¾›Hlxñ ÷óö3Ž +¦Ý;e[gà`c>¬Ÿ=¥cíu´SzèÒ&ÐÀù•ú}îÚô•oŒDým;_ãqÖ(C‚ˆÖÙ¶J¿“¼ëõË!ç®~Ãn¯W•ËMTÌ¢.YBaûËþòkN h·Ÿ3bºþü{y­ß¾}//û£¼ÖåÇï5_‰ON%ìƒ瘚aðû0,nï†Bþ|`ÁnÃØ–VV¾¾=#‚Æ éöïö6«Ÿ–çå·_¿}ÿþJïèú•ÿ±Ð·ïË(_þhø b¢2› €Âò¸¬`]VR[VRmöùíÃÌÍy«pJU8¥&œ®_»ç§òm;qï·ë‚õº¤v]Òçz·´Õ{ø^ª¤—éá`½3dQ¹OMÛeÁzYR»,éòþŒ;ÄXKE, ±TÄâ?P +bø¾ jÜ9tÓ) ¨ZLÛŒ—*^jxib¼½“"¤È6$暘[b·t['D¤ÎÒý«³`ÝY>ˆ©&^mdÅÒ÷¶ît¦¶)BºÆÝŠX?_W¦æM¾œÜµˆèjáÜ…'É–‡ž&¾;ã½îÑ¢¿–æMk„?WóFLêÊ'¢»dvx°æŽOÜ”´ØÏØß¹á1ïŒ#úÚ¬K <‚+VnXù2òÒm¶/•ïÜhûáe´Ü-Zpuf §0&½ª!®®ÀE¾ªa\ÏND¼yCè(b›M9D_Ãi;3¤{}hxúÌX¿uÞN9NÈroóNæj¤ +åa®ö¥GŠðæÃœÜt4t¥„|õ†å›v ±ŸCÈ\)Á_›tGìçÒ,º…,Ú¹4ë½5¯T¼ÒðÊeœÀ¤ ý¨ìQ/[s[ü,úåè¯AÄDãN&5±´Ä2"®4RÅK›Á5-·´|y¥ Л H…F5ãiE,Ÿqp§ŠàÏØÜÅ]tS%‚»šFÞ\ññ¹¡»g¬Cý>yndÉÖÓï Ï >ìÅ#È®jÈ‹Syïd»ÞëO Èr(k^lyñòX Ò’l¥Ù“7xëdî2Ε†9ù»3"Pàäd¾n²Í¡7ä-߸«Ýâé|[î¿ÉÛÅé¯ÿ’¹»ã’§Ä s§aÛzZ/0Ž’p…;S ú¥Ý›|ɼ“§ +ñ%߯›ó“3dÑŽûFÓÝóÕá²IE, ±\Æ˶É×INîŒÌ]gç´uvéèaº³¯oÀÛƽÔЦDüÀ"|š¿Àð&an,8zê:þ¤›—2AL´Ó{v¶úäxo¬ó=CoÅòuÙ–¸l”‘:U½Ê ª‰©%¦ËKsÂÛqáËÐÌ,‡¸G{²I扖ÉUC×Ö¡n¥æ•–W.»rxF¹ý&}TÌ*çÞ´õ3ö–nj޲£*ÜÑ*ì1ñQ3>RÇW¯ûñyš°;w#ó×ݽ“¹ër%7x®‰¹%æ}Ä33~@œ·“Ù‘W|]tË`]ÝHQA²å×ÍvŠ·›ÉîöÌ_^ècEÔßR„y¢åàiÛ8z²]wg§³ ÞNN‡ÄÉ]U÷ÔÌ8>²ˆÛ›Ü'»G{h;s'aôÖw˜Ü-]¾Î8zjÁ)–Ïu¤ +®‰¹%æWª‚r²ÜÕñùfL& º3>Š¸ö +ªˆ©!¦ËLܹs·à)î’7AP¾Zñx¾Ó61¶â™¥ë[1'oÆÆñjl½ð¸œíêPlùu7ÅÛ­»òƒ Æj˜î`¶\±rÃÊãÙ¢»šf^fK÷|÷džàÖ +ܹ—«,#}œe»µp¾eY™ëÃrn;i+gmæ{`9GW¾ ×v>γ˜ŽŽ2wÇ¿… žì—ƒ·ÉÁKuð¥ÒmÓlõ¢ÕÀs‹Ö—®«ñº32?BŠÒµV®Y¹eå˨Ci»äïª0`Í/õ‡g‰ýE›§®Îññåv|õ}êrËWý.¯¾GòvY û!f|¬ˆÝ™qßÕRÄæÁÂoÛ&¨VÑi³–D¸üù˯™ ß~Î ™óõçßË‹ýöí{yÝåÅ.?~ÿ«ÙdRÚÔVb?–‘Ô“àn“°¸ ŸBþ|`Án“Ø;(_ßžA£n¯~ýw{—Å/ÞZž§o¿~ûþý•ÞmäöŒz·ïËŒ(_þhv;ossûòF"ŃòIß>Im´§GlK9m1fíïmËi¨ ÷æû_wûÄ{y»Ndã`¶»riálE .í‘ÀZþ—ù!Þª•Ž–í$‚ØE)È+iw¯Z÷ìÚ¢C%,WCML15Ä4CŒ†±ÿµh·ÄïEûFü\Ñöf¿XÚ@?þ@YzîðÉ;Æëý¬^œ¬p ôÀ/7¼|W_~†lÖUï «¤7õÆ­Þk§ñÜ\pÏ„+§]6aÛ,?;r4Ë`†«[åa‰¡€‰¿:ÄÊ‘4æqµu“3žÙº©Ôx aÍÚñùœ˜CÐÞŒ+âiÿ[óè–›M»ÕóÅãˆvVÁC˜qµ¡ œyœsOu‰–xf¾}b&„”<é—c‚COÏxýÆeˆ_x}Î$]ÿÚ í/,n>‡&³»öCF@„âªKLÞt3]B*biˆå2±u)É05žºAÜ85ˆˆÑ­¿{ÎW*sB`=5œÐüµÊØ2‰£[ ØÌq + AÇÄRKK,/%vØ%Ü5x^¢¦Å:>rÆ”KB[î• GºÛö;ã?u$EÓÝ#Ö•Â’öŽ¤#*ÛÞávå›C/Üi‚ÃÙŠmT.gY’’1¤4Q,§•°:,È„Ðíé”àêÌ@”݉ W³Ã< c×s?h§+Ãò"i":&>ÏÑéoÆ!Rûïiji$Gç"(Ê }â©Ä%5^Øtžq5oiìì¤ E°Ø¿3Ïgœ2„HâÛ;ÝC\M³\sCÌ—‰ÐH©ZU´³”ž( 1;)=Ï‹Ìœ{úµÝúµ{óm!±4Är™PD`°ÜÛ¸ÊÕ¦g¼¾¸ûó…ü7ûÕ’$GnC÷>E]À0 ¸öæ^ÚáÍÜ?¬.iœé(ˆL'YAŒ´P¨Õ]•zýêá}ª+ãƒÃ€²ô[Ú6Ý=ÞÚà’¥8V±e8ó×»½n¹YÔ=»¥U Ò„cs0´dÐòÂQ´P¾ê n 0‰S(W  +·„qmiÜE;è +Ÿ(<‘øåŠP,»—¶a= X(ƒÕ3É-Ú’õ)Ö#b=#ÖRL Rk$Q‹¸$Õ15ºŠµƒ”Hé„”úHãi7ñ󧋕pˆ‘A†_Q¿ð°å¦ˆ” ¡œµô®m“!$ŒÀ²Z¿Óü*TÂÚE;ì¿®í\([a¯%ׂd¿›ÍG{k …R‚d$s/mE'Âûƒ$Î1;ü^îé+u§¥ +Bèqº0‰ÃëŠ »å±6dó7Ú¬v™Ýäg™a·‡Ýñƒ©;Â@3{h7ëa\2 ”¨•Çâ×Ôz§Ù‰Þ±cóé a˜­¶F^Å}ì5&¹20wu;ˆwD·z@¬'Ä:€XRtÏá÷²jýHSkOâþà µ·Wv`}ñë“}¯ˆ +Eù£µalFøµ@Õ>".ÁvKs]¡Xv‹ïŠiy³<‘~°ªßm˜!•”»ü+b=¿Ï׸&10V»lkæÆrK>Åûõ_® Ú| RÐ"ÆF¨µIÒ"C¼Ú³%¿Ñ!¹@BñË[®8ë"q.âX#®4M4,ˆ@5;ÕrKE`NæŸÃ ¬j#ƒîf΃Z馸xŒbߊ šK8G7 ñU»h+¤ìu÷5‚;:—ßxGGHj¯JŒÚZG ÷–FI·;.¹X5ø¹äª(Š¸p¡Ì5ƒˆ|41ô€XOˆuÄÑÂq,É@3{Ž¶àêî¸[©Ôçwt̽E{ÐÉ K¼´ø±åXs.ÜÕBì¥òhÒu1¯¯ˆxÉÁ•@ÕÜ.ñ ñϘÎñö—Ö‰kÎqÒC2Cnf#Ÿ>\³yh¿c¥#V:c¥Ç}xZ{wm\Jbýd*˱œËc •1'û¨?Ü[ ’˜ÄéÓ8¾Ê°Û, d®Ë{Ä<~¦2V ¢ŽO1èië»0WÂÒë£ ·\½Ž«m©ˆx­'Üþz÷Ê1UÃ9c߇G÷çZ¥19^Ñ*ït5®VüÔ Ëü®V„ Õì Æj—{„u/n¬«ù'H©z©±ÙÎ`cP+ªp¨ƒ‹(ßh̵@­QñD‹I¼@ÞÌ$#h•'0Øéòaô3#Žçj’3°v§Ü¯üÿzpÓpż||NÔ01H­.â -VÎY̵¯á}Ê#„3ù63J)ù€ ²¿ó»ðÒ /=Fº•aß}åVÎ`å +Ø[·†mÖÔJ&°ìEñÕ+ëšî˜j]” +(âEÄ,!L½³h6®7Ä2ª áÂ{›…4´…H]éóú-V»ˆ÷ë‚L“”ÀRê{Ù4´÷Bͱ¸jø­Ñê­~ -#puµ;áÊxX·õ·Ÿç–¯N³I–Ðh+^ÛÑq»5™£…ìTÃȬ¼ÛÇB¹.1`QíU¬o¹=båV>aå·¾|íùS¯ÛL«Žó 2¨øö0ëâ&úY¨ŽÃ֮ʹŸlÛŒ ɘÈõàý4Ì–¡ý©8n}§Ž,¶8V¨ìúð†³ êêâ35™C9[)À”#ñ‹í•äööM¯..÷â‰W¯ÀWÈÅ­lûcnZ'_IHæóevߪá,ß1ľ|¨¨ÌßñÒ/ñÒãÇj˜jhŠwn¬à÷&bFháixµM$üm´W‡˵BÍìU«)±Òu“‚5”q\7·\* HT ·…õõFK*ᅵ䊃ÜjQ¢In?ÍöA_¸umd ‰½Æ°]þ –~#Ó#^=ãÕq¯-´þX«öó»q~uûㆳ!”{­Ome)¥ÔOM-P- xpÔž„¹7Å´²ïРzÜî¦]ÊSujï¡š –‡‘j¦¼z«ëmE=iq±ñÝúeZÄñIª¥6É­G&ì·Þ=l!\#“ÔŒ¬éHw”Ý·h/‹7¹±ÎÄ+kùÔƼ±Ú.WMâiw3oàZ çâœË·¶~­Õœªã½;–Áäèá€wÐ}Gðò/ŸðòÃá4aÍ!LWçñÔ€ÉSÅ<ÄGŸS…?Þ +.ÞnÓL¸4®Ôßmû,Í$P«b÷èôˆXψõñÑ£ $ˆ'½HÖ÷´‰øž G„a{iF‚JØ·‰=ºšh©^kŸ•ËÓ.NÁÒ@ ¬¹+pIŽvì•B’Ø»¶ÇìÕyÓ8’›J{’zh·“n¬C‹6‡3+ýê0±ìülsHR3³ŠÖµßAÄŸ°ßö$Ì=ûÕDçânU‡,Ày Únr{Ä«¼z«ê` +Ép¹~g&ivËä^«¨ 0‹;„öóßxe’k…š¹×ÏäˆWÎxåCn–2äZüÿ ÝÀ›¢ §R^§Y M4õ Š{ÛPÂ^¬Hu4í«ivZܤ¤¼vRAGÝŠ‡¥©eÜþD¼Ý¦^„X¯&Žns¸ØµMYmü:´OùB¬-¤Ôs{¡}°¶6œ!߇ÅÁ„R5Œ¨ß©r9J”oçZ]â­k¼u‹ßGýïsÄŸì+@FÉÅ-öáN ïÙ‡»2ã y°4Žýl›èYÏ HQæ f%•ºÍñîÃ;·¬¨<‰§‰µhi™§èJz]«™|Gã7:2é[HŒ¡””ÛŸ‡¦K´ºF«—Cë™pÊ +RëvçÙøôLna¿¸#0†áX ¡î(ÂÃVŽOzjÁ2yxOb|B±—8¼ø5s ¹j`XÏr]„Aì¨e‡êœXñ"˜wÝž`® Äu…¸î⸩¦Q7XKChÚ£zxÈíáXÆm!(&YÌõ@»Àº« ¥º­PÐïQ·b.­ÌÀít¹fõ7[nC΋¢P©dj8!‰eWVxe[¥ÅµI2߆›­–퀽1¼ÒAôÁ¯,˱lòûK#¯”ÓAÔIÃ]OÕÖÍ€U^êÁÏ6É5¹ƒâüƒ«`Óƒëej‡##/“X@š¥E}D‹h jiñ±²IVƒˆu‰X׈u 1¹D|{" g„àùärÙ•ãÂÀÏœp ¬O÷ù.ÎzRÕF,îâSƒ¶9¢ ++4$žgÊi‰§‹g¥g kã¨gm;‘w{ï6·û¼7綀3¥¸¡|Ž_ Væñ†ù:Ú|óž-QÅHþ HЬ¥óm¼4VD@×$ÇD¬ñ;ÛÑz®"æðà¬ñ,8®KÄu¸nqÜ55Сx;³ÿ®øݧˆÔÑš‚FlLähÍÀU¶Ñ0ˆ'ÜNP‹¥W׿ùìiÁ©†½D*cš£¡e“³[O'´“uàVÀìüFÙñÒLÀ'n6dkg‡êœp¼@ÌKļFÌÇ×âºB\÷ Ž´#1†i=êØx¢„Ób@š3|¸§˜˜jÊñ‡&v7áSsƒ+ôm_Ç%¨@ÍŒ˜Â=½ Y½==Oj jº3Ž^ÛÉþ@¡!ñ¹þ»Þ{®í“Á\¬œë]WQá@Œ™ŸõPÄQõ~¬˜±{M7Ü€ˆÉA¥n/£Aò¸…",u´~u‰V×hu‹_r;ì–FœƒGßÄ,º¯$J8'Ÿë:óÕ‡iÂBœALΞn½lAJ³ÔÄÆnâ5€ò6âa‚Bœ ks(b>k ´T—ÃmIî>1äô ˖ŘüN·…¡ZËÂb@S›¯ýJ ÄQ7U±»Ož½7Å4€ZÒ'G¼N¿çu‰«¯…àø±WþE7ßz:„¯^Ej'œÔ´r§•GÃÐtp¼ßžpŽ,/Wï̼ òtôf<:á¥Y‘!Pj϶[ íܧ·g…œð NÉZ6®pœ®ut +ÄóO3B\ýù]b©ˆåF,Äèú¤ƒj;›Ss;ĆÀÙ@4%ãŒÑi–;Êø<7>oñ¯÷´EÑ Ü#Š¾2á·K„ÅY¼gm“±¾$®+EªˆÓ8UÄ?Ï$Ázæö˜qo W6Ÿ8'Ÿitº‹i«?ÇÝžšÔ«Ã›iᢠk¡Â¥ +—n¸ô×…=åŠÌ‚¸)¼Ù\ÿO»P³¡™µì`šyõ×¼‚‚`ô‚l·Ùb‚œÍu¯aGxÙu§¶óh õœ²ËË'O¿;¶…óê¹H`ïÊÜ®àœäh¬cû¼ìVC{ã¤"–±ôÌ—”ÆÛvµîk5O<˜­$†‰“;:š ’[hØïLà€rZmÁ“!È@–=3›4<_—8Hyu1ðÌÁV€ ¿RÁŸEŠº +ÞX°„œÅVÈõJb± γ4ŠÕœTÞÒ$ˆÊÓÑ›ñcðÒhp—xÝe#Ð5|xé ï³y{ò5Á…ËV϶«y³Í¥MZ^®Û™FF8¹j˜_>ÑîY¶ËZ6ÍœCsK1ƒX|·YÖ;7¯¬×rè;ßü…K@JÎy±åŒ1AÎÖ>ß>´ß™uÁ”=od¿×%d[¤ê}]r†­ìvX:¬·[ « ‰ÁP›þÐY$=˜X$C‚¹)b¢7Bd¿öîXÍN +ä³üAH °ó›U¸tÃ¥GÓz)A2iÇÚ67&›‚˜8ÕaG3;¯Ožçg±€RÆÕ3®×®On‹0&r:û,â» ÷¿;‹r]íkSG\Þñ QHÌÀQ½j¹YíaË“:6Q9qç|ן‚Hnsß0ìŽÛ9å“‚W,7 ;6NÑ3âÍÊeIe0¦¥Uxæl æÕjåý)f+!fst[¹o'oOîs_ŸXÊ«_Úx~¥»óÀºƒR7çÛU¼tã¥GË$j[¿Ýíauc¢òtlÕÉÞ+n©õžv ]gÞ²m–¬%‡Móê¦^KE,7bé >ËzälnO^µ—‡ÅÌh;¬õ*AHy±=ÌÝ8)íŒÒ9ÄBÅÐÔ[¸ÍªºDó†;šÃ«ÅkÅÊ”[VÖ;×ÆT»l×j„dyLÔ¼}'…O,5»wX /wîÙ¦ o×yjèWL¨­¶°_ÕsÙJ‰ÄL§ÐUpŽ»XJ#s}l8×^;ï$5œåcBšÔÛ´aæñ $ù<Ëvkâí¾#fÀÈÚ$N5qº§ñ}Ûzôðî\;Ë{3ä¤N?ß³G&Hãó `úÃ]»=¬¾v*9¤áåŠ]¿åþö÷L€„Ïï C0úöýßʇý㟿•Ïý½|Øã÷ý÷VýSùÈðŒÌˆQn“òC¿MÂÂõkpyß÷/,Øs×—Œøøã ÅkϯßRÊ|þøî·çžoþÿÏOúó«ë‡<Ÿ¨§ñü™çÇ¿ok­åØ*?TJ[ !ëkÙ=86O­ÿŠñ­%ˆRâþ5é_5?לT´r£•&í÷ÌÙ›ëÚV½§-Ïš%ö»¤¦•;­<ÅMµðí G ÂÙšóíUî„rßZ&ëµÁåǬUÄïöîÛ_œ¢ö6‚€17‰SM¼¶Rµf\J¶àA3f-%E¬=ãîÍkϸoóÜè/‰¤DÑûÄèðËùŽœÏù¾«U%È[´TÓÒ–Z´ÕPJ6&^­ßY©Á±tn§F·¯žïyŽ&¡¼ÓÒ¶žO:š„ )i;•?¢™ÊB¥KiõßMü¡Ø.`¦Åóë¿Ù\CÛÓ"”܃hKâ“,‚CˆÔ¶à*šeásÁJPšñyÆÆ)ÓAÅ2„DŽO<ŸÑqÅ檢oƾ*X@oóF÷®©ˆ> »ŠÈQS[Ûl[$rÒ¹RDgýéQDªˆÓ8u "äàØDÜ9bxTÀ? ŸW~¢BÌÞ :êÁ 1|t¤Üï8dÀÈÚ$N5qº§1bªˆéFL]ħU ÄÑ ¸i¾÷Å…K P£cóˆ'Vžã6s„ì&ƆG HØ›ð`åYdPŽÏöl'zÚ‡'FH )x…}GO;*–#CŒÎG£³mNöÃs¨ƒ×~§ÐNt…ãÒ˜5SnŸ›½åw¹;pÍ«—mª* ²áAçÐq3ƒ\oýBQHE,7bé˜1+ABõŒmÃÊÃzÍ¥ã8ÚÆ*Î+l ¢ˆγˆGUìVË !‘C[m]§³­?Œ8#Ä‚|Ž†Y ¨®–ð¨Iüò½º%9Á\É·óŠë‘o_̹ÁLy 7\$šföYwBà Þå98Ýå¥'–W-º½R‡+„. ‰†ž~·,–(]wØ7dHIßs÷¸èÑÄ»ÊC0¶keª‰Ó8SEL7bê"VàìUwð¼*Ïšy¤?ôÛ]^ÑV¾Ñ]ÔÝ7ctÛÊû° YËèéw»Ì0A¯Nî¤ÝPÞgé ›Ù'=R"•Ï ®‹m¸i$Àœ½®³`¾=®ë«á¼”H )¬¾ƒ&¶3Ö œÒjELt³Ã®7PA·ýî8ßÉÔK‹ 5,Q!æV5ë5á•9¸·› N¶r.¶k®nVz—朎3$éH!esii˜veegSȼÔÕÂBR‰å5óœ Mçú퉥 âÊ7‹ÁS¨–û‚€ ÒBÚŠU*V¹±Ê£©Ž@ÄnJlè`ˆƒ+]–îË¢3*\W¶ÂÙ« ?ì¶{¼¯ìöì—M’#» „÷>….`\ûï^ÚáÍ»„©ÖtË!ˆ,‹ÕAÎx5ý£Ò|B'2Ígä}Ìéym0 M¾Om'pÂ0„×#V6`•+‹ä¬ à ž©_pÞ à©³- îýÓÍZb;ÛíÔÆ¿Ø8¯ ~õ4KµñrØÑg-ۼ栘ÁÌûüñL ¾/Z4ã&âC#ˆ¸ÃÒÍ8´à‚`Å£¾³¤*Rÿšh#—Ð Ul·y÷ÎNÌAx4: º[Clb»è8CÉÔ»2Þ æ©Q§ ’ûQ7-9Fªa«˜ÃìÒ;à‚†DÎö‹W[^=òêí;[š0Wç’ —3d»úê<k¬`™0¨z0â%›;:Ôë3">ËÛq‡¡é¾(Î/Ÿ”ïõ³70-ýº3ìýºóÞU¤‰ë;aH<ÇÓ¨øib7ŽA)‡·Vïèûr /¤ Xñ«Ãyj*À.ñŒ*ü{'ÇvVv°ûðé£ãùŒÏN8T„KTןò m3Épã¬áµ¯ lÜý¤#æÀƒâÁ‹ˆé4qÜ%8k˜sëmr´èmfÌ <…}ø¬CtüAV=°ê­ë‰€0RŠ‰,…@ï ûl[ÕnÁ°ŸåíÎwŒ6T%HlWw´†÷¬©þ®¤ ?PñÓùæëWÑÀ /¿Š&ï¥"È +bRá9;ÜV!‡æ»ž•‰ß'"¡ù~IA[b=ë­#…c]!~Uט"ƒ˜S景xáÜ_µuæ»Ý±S9H)²‡ 3{2 ¥Ü•®µ¼väµÛ)éŽäÄ éƒR¶Mr­Þlž)’-žÖÃõ½ë+‹]}[œå Õ°UKGÉiw)Ûí¬žpeúΛâÝH«O—:Ù—†kÃ3E4Ÿc¸6ø/St¤0$²ðn›3ã©þ[‹r¸yË9Z3Šú$Ÿ8*bÄ'^Ußíˆ)Abëoݧ6Jg |¸Ù¸Q_¾qâTA)ظyÇPK<”ͱG$®ï„ak_/96kíRM-ÔH÷úþ“–Prýú_ùkf ·ÇÏU€RùøùõÍþö÷?êûþYßìöç?þý_þ“MeШ&¡Ÿ“(xÿRÿÆ_ß,IÜ¿%Šõã §û$ÿÞ?¥ÖüñS(D?^þøúó>¿»ÿ''Úi<¾®3ªöŸ‡D­?«ì•?é}ª‹vX1…¬IÒivbö ƒ¤dω¯q¢±Ö{§ƒå’£OºoÏNøE·ãÒ¥µ–ÖŽ´Ö£Ù_5%ÈÉÓÅž5_!¨'X ß†v8û¯îVR˜ñž~gz`ÆPëõ«ýˆ%[í°eÜ‚É!4eÝhÄ¥Z1S¸xóí*¡©>›?N°o¢}«¾Öƒ‘\"þdå–•¬|{]ÑfÚÈž©«ÝuŽ™T›»S¿X.sõH€ÄñŒgŸ$~üuŸkXAU£by–·K;¦áðÔp†¤¡ý®—J4yØÛ¿ˆ‡›p_Â#–öª©¨;7í4:;àÐÓ¸žEß™nïäÅ~åÁ¥¾“]ng3ëŽbêßëÌx¯‚&HaåY0àÄkÀÑõ‘<13¡ ‡%x= +$±^‰X¤×JùñôF‚0pÃˉ'.]!p!ßHÂìPJu§›ð7,2Guâ,oWï5w¥äap,f{ªÁ)õÔðÎ|ϲþ2Þp'FÅx~E{ï&ª¯ÃÚ‰'çï‹“3sÍ7ê‰,Åëk¼ „½€d GüE¬-±‰µGLÅO‹Â;X.ý¿—Ó\"ƒ\}5´ÜÐò–»´â°äà$z8ËÚƽB5hë^½4Ö`¼ ð` ¿kiRŽúÂû¦¬€’vp­¿aûý ;l¿—gr1PNÎi 7ÉÌö«”Ê Ä¸t‰‡KÚó<ž)ˆýfÌ5)œñZ¡h€C?[q¾¥XX!&ž©>žÞæÎPÌ`JñYI<¥=mÂKX ‘„ÏN·khÒÐÊVn†¶U_ßÏ~%;^n¿3·*hòP_ÄáÜoi#‘kXSδö+jÚÈÎÅ%¸€dìoÜp ~î~RO<'6Êéê#ã·M É¥N?®ÁëÍw«»H‘Èù:1̼0”kÄå‰á“–[Z>ÒòkÚ¹‹ÆP0œí‚¼WX즆:ÛÚî4#;=ݸ¬‹€£Fa¼œ7°§f#ÝA9Ò*ˆn!%ƒ$ÖÃ"Ë&Ù†·Ðz­a¿°Â`)¾7é4qÿzSÃHj¾ícÁâôñô>2æÙã/xÀy‚’‚ã½Îs˜±6Äz Öï' +RPí‰7’næÅ©©žDº“+! sPÛW›¯¸Ôw²Ë]xbÒy÷X —Z†‰£ÓOkâÚêåí,oèµIX¾Z³h¹6µL¡æÓrCËZîÒÞ•à÷Êý·:š‰EÂOWJÜNx¬B„ŠØ® ßï#¢ÐƒÏjâ íñÒ+•Ñ¥!E1õýw! #8¥^‡à–—¼üz¾ÓÜ p¢ËûïÄ+.(«a½þ \ÓØ="ž¡†Ã|­¡µ­x{ýmt­–oÊõu8Ðt¬¥µ#­õhgºÙ^ó•ì xyÛ™ºm{õ3‡¢¡βvH‡œ7$Íri+†ðvµLÜ«tK¾øÐ<;áÐ 0]~dNT„xÉØŸ¯¶Äz$ÖÞ|›ƒc8,<Ô°ç’¢c¨œœqdáŒÇ4θ0q¿¬¿§á©>ÁP0<†Vt6J@.ve¡œ[=—KëïL §·15e”À!þ_wþ׺³_{PrÈ”£<^nϤ¾“]>߉‹–¸‚î”›õÉí!žKqM;Ó†XÄ:@¬XŸN±«-¨a«í9ܺ/U wögªh&?Hüøë>¿‹2EwÑŠªRg,^r ª¢ö²¨¯¼•+)¨jD;£¦áiÖ°øˆ$ô~p,c÷Îîéê#c’Ä”uöýl³&¼Ÿ—í'ˆZ-M‚SñÓÄÞõ´1âpéŠB.©t-bX}O9?_xZªµ§PhjëéXE)RżƒƒOÎ8V…2×A}UL nxùÀË·^p(g’«ºI´n¸áÕ5b¢~ïQW4JŽ)½ò,k¨Ýbªá‹ÕZV;²ZÏͦžVk×pÙ¦K1Pä;­Fœ‹0Þ”Kºø€û{¥¢çhÄ×ôÊ1?û•ˆëÓ)‡™¼¢* +:oD¼]vÜ›fì›ÛB3®M¢X_ÇËرbª÷Q¬ãÛš3$íŠ7gŠ‚Ý£Åûäå–—¼|{]/㵆Ö´62ÞLÀîýós™Â¶Û|k8§’÷ѯd)¹¯ˆuˆK:¦0ê&7¼ÚðêWòþ´Ê –¿“–ÿÃ~$7rÃÀ{^¡!HÏyÂ>!ǤrÙÿWc­½œZÁäD¤ŠÜäbK²H·ZîF…6žÐÆ6ÚÄbG…èv³éœ¬XRö_ewªnBHíB¹N=à %Šz‹‘^d÷íÄÔ²³_¦"ÀJ“wÏ«p]°2uôõuèU²›|Ä †±&(‰ÄÃqBÜekŸHØ".¡cÇݪhWà›ð+ðVCÇÁΦ¼ÓÐ…ž„GgrWb¸ÃÆ`)·“=lØ"„y¢ÂåYóD´íBb›_©ñʯ´ø=›YâÏÌLí=ž 6Ìäý†.ZSÓŽÐxj‘« +}·ŒÕCLŠ–{ug,\!F=^±Çýòk&kørͽYÞ^ÿb—ýöû»÷«]vûúÇߧµNÅínÁ@'6ì¯w6J8>…üýI åÎÆñoßN (Ÿåþûøœl÷~{õíÜýí÷Çï7½?;þÉýDÍÆý±±Mùöç T;Â&Äì¯s:á@¥tgüâa3^áÞxÂ;j@MZ´ïXc5ž±ÆÛË"Š +BRvÔ0Î?kÄ}‚X!Yénê·Ó?{vš®ZøéNS9ˆ/»gC»Ï­Lè‰aE£73.ÙC€9X—øÂ6Ù¥a72„Ùãw±€#M 6tû¨T ·®Û"!šË1ª]µOÒmµí×QIÜ”û°ÔˆåŒX^*áA¹^«Zërq£ª=î©=Rá•^¹õD\ÂÜÚŠzÙmpËV>aånw+h›y™Ñ«!ÏnìãS±­Óì>y¯ÇoÊ AÝöpyԦ뗣ݤ¹½Ãu¶‡3{¶¯›"2Î‚Ñ@flóûäÄÕüví?‰£‘Úi¦vä·+à|~sżÕN´“"8$ÈBŽßkó5EhqŸ"~žÒ“é0“é5bàÐíF1£­D%ÒÌ™(£WKöø½êh³‚Äè9D¥†ÎÎó5„¥D'åftž®áª!);ö0.áF:°@ˆÅÝ2ìí[ùGŠÅUÄ ~¯âu§ÍÔ ~C[O ¤0¸ò]¯RkgÀ4Û"*¼O-qŒm2l¤dÖ6R«ìaò¼U%³ð½È>.À HöyZw÷ÉGE¼ÅÛYš¥†JðLbJëéji~$£+ŠÅLhL³;ðH~S„T¢·g\Å;“ÛP XʽiWWwU @"ºQ7+0rpwTÌ_-ì¦\ă&5b9#–káÖ#^?+öÅ~S±V©¸Q¼Q‰Pµì·wî¦öÔÂ-Ú4¶õK5V:c¥Û+õ»M´*@.Nm¸ëýÊöV͔˭Txå„Wz¸EšÑ ã +q'»=ˆû&ÍWC‚B¾7ŒÉ8,zQ¿o'œÂƒ@Äîz±ÞÄíW#ö£8Èž3x]]Øç8ÚMšÛVÑÉqâ'9Ö Ü±rv˸Ý{úœÂí=j½'&WÆ£zÏÈÁ‹1{mâbÞÍ:Ѽ½¶lu +Åÿ¾6Ä×Crmb=Ž9e‰4²çPQH¦†æœuʶgÎúÄàÎY¶9KÉåx½¸ ÍÀØÜm¾¯(¿&=7.FQü_tN”ØíêëuÊBÈíd[hàØÔ-^º-‰8‚fqwŒõ3Z£,âéøo¬ñÆ3Þxk4ˆ‘h8ø¡±àÔí§áB@ŠÓ÷¸©‘“i·r¶šÔÓñ©»œtŸ¤rÁ4›ß«xšbÉÉzš·K¬7q›¥F(€êñ[-GüzËѸ‰ãh7ivšûœuîYŽdñš;½Ì±69æ +1ŸsÇûåÜ¡ãÂìísWñ6<¸‹]×ÑÐCãD¤#§Í÷ÄëjßÁâ1iýòkÛâý5[úŽ×¾Ø¿ýþÅ®ûjwܾþñ÷é«ŠïWdV=`Ãr§ à¡2kúxRB¹SpSÃ#K<ÞãêxAÄ´è|Ž?ÏÐuü‰×'{'qÞGÇ;zE<ÒßåxEg˜Úˆ¥F,gÄrãžÄûŒc«*ôV0 þ|§yÄqφðc#|GÌ=›oæn¢‡»9¯ˆx«ÚfË`˜ v¤¸€–€ûÌœÕ}`Öv3îæxzk+9̶µ‹Qç/´Y)fL ¹ÌŽæ«x]f(´k\MžE\··]X=¤Ä`µ§…4ÖHãiìGúLNìgbŒñX=g‡AüR)•¼c„†D0OÀÚ&l¤"$´­ ã+Ÿ±òí•5a»îh@m—p)…ørµ ¾|3Líª 5b9#–â*’;mìû·„ÈäÙîàH{ªØ”$¢ûÇõ«ÀÑ5µá±&Z9¡•~÷[%þa¿Z’ÜØàÞ§à\ +õÃÚGxGðÒoÞý#Œ&% ú™E ƒ´ÒÌMåädå‡ðâíKÝ¡Ñö‡Ä/ü!(H´™.;„«_,×#›jyúœ\L¦s;±ÞñFi¬A;šÎ2NFÆ ¤·ç®¨¡Â檡k`¼è[Ìí®í›1³»ˆÆL¸˜í²†ÍÍ79&ÜfGe§£ÛPÆ I6…éññ‚ÄçO¹‘ˆw‹»‚±˜ºæ6ŠãºQ…˜Nˆ©BìÎt蘼? +q…+¼x‹_x]Eˆf·²]sÏ}⪂]W‹ a¶|¯JÁÍe¶ÏÛ»¹Ì`!¸Ýg=CãÈ9¶Úp/Þ†º¬ÌCºÍŠc +»pÓKóoµo™—•÷{¼.x]ûÕ^©¤ïÜõ61êfˆK,ü +½ULÔ€+¸TÁ¥\ú‚ûƒØ“ù=!æ +1Ÿsb&,µ­9:ºÛS _eØ=6†Ìqf¾Ê¬‹TD\뽌uú˜ãíò§–†Thå„V*´.¿oø襽É/%@$·º´_º¢q”}âcM¹Õ†\µnÛ±; óûDÞw§ƒx½fF[©A¢é>ÕŒC‚ É«_ˆ»í÷âJÕîð¸œçGˆÁÄŠ#ƒ…0{n^Åë +"l„v/{Ø*‡d‹‰Ú‡öVÍ9;C½¾3pˆÀlí*¹Ì¸ EPùh[³<ĸuo‹”‡½ÐRæŠcdòVд¿d¢qÈeP kb?ÐJVÎhåšíb…OxñÖ¶]R†@È;52…Ë#­ èŽ¶ß×ö…!ÄÔž@Ëè÷¸¸RtÚþ° ⣚YNR¬Ø¨E¤v5ëž™óÓ8áiLj´ãê–)ëdbh¯‹eBƒ2‰¸6± „õnÅž„WÅv3òFå’LŽA4íH~£ö)¢ñtE¤òNb׊×Óð†V,›´aÊ +*æôžqM­Æ+^9á•ŠÛWˆ÷êï”#hpÄ0Œâ +.Upé—n-ApàÝÜ¡Íi¶=\fØ•0„ÅEüƒãîÞ3=3bÑÜ>º%Z“°“"ƒr#0zñN¶àõ^éUˆ<´ïèñ'”W,<ÇÊ4»¡Up{ÙoÐÈ›‹‰_64»\l²=%H*ž™-(ß­eF×}‡Ë·O ?µ’AÓôš3ÒBfϪ(îF<ÝÏ›ÎVÄPw@&ñƒ»ŠÕå6ìöôH@Émé_ÇF5b:#¦Û +Ðlq+ŽïÜjêÖP¿~äîŠAK¨ªlˆµÐ³ Á>çïÚ~ü’!H´**¤èöÉA­ ,•—çyD…•+¬|ÂÊ·fÆ¥»ZSs7ãD`Ý2ùC»Rã•3^¹5´[¶Îñ(…ÏkyyJX¬ñÊQÖg£Úh§4¶IÅíg ò«‡÷²7-¾w{ïô´HwŽ7ØBQ@Ãì™Yíê½?Å1Þ}Ì͉Ëxç7†7Ûš”És†…m/í’ÄDî¢ã¸çŽÓ·(ÜŽƒhÔêï(aä¥Å¼•(°íÓPÖÖöYD d¢Y''Å 'ÛgW’&()ÜîËè–ìžÀ]‚Dsµ»bz n%Å"ÞË!@èâ÷è­àbOpñÖ.92ǙԎ²†l‡5xUwx@H…UNX¥G²é^ÇÚ¶ 5^9ã•Û¥:Ö£ƒu,`²‡n-*Uˆ£Ã·ÿüíïÊe#ÅÇÏY@Ž-?ÿ£|Ø?þùGùÜ?ˇÝþü×ÿr$xØ:BŠ'6J<=ØÈáøE(è×79>È8¾‹@1Þ¾=P\7d<þ=~M.}ûiy{þööÇ×ß>èû7Çñx æâñuášôöï¿ÚOH\ÐÇòE/ì©þ[ÒùoI·VØ´x-fñ‚Tîd#ŽsJæ¨âqgW©ºåYˆ-AŒh;©Â ™xAUX™‰Ù•ñjá ´‰¶›ÞvHQ…—NxéÖ)Ê\>IÝ£³‹üÞŸh´Á®Òâ·Á!qÚâø­"0J\’^ÑçôûÞZÔ’ë¾òe5´-¸O ¯,ØØm :p(@ÅUïz¼aYˤž W*îDÜ£â~…!Dk{Ú›2ÆË»¾¶›Œ÷£˜´ Ýc ¶s˜Ïˆ¹…ø\&z¿X¼±” ÑÉÑ|FÜίêÏnVÁX6‡y½äåYyÏô44ñ +Å\ÄxñüŒÎLóFˆQÀ²+ã«xg[±!$ ÓÃcdÜ•§aƒ_¬ñâ/¶ø«_Kåå­¤w6Y¹6ö9´]ìzhEÑf£©†Xª³Ê#¼ahé ’èƒjxG»Œ i“Kc,Û3å–ö¾zæ^[Î@Éœ\« +e§óöÊw“Â@²z3cDSCy-ªwiÃ3M*¬rÂ*?¯ÉÐu°'…RyÕ»²Ê¸FÌgÄÜò…‘)AY‹vÑiè•/têaþÐ$ÅòII± Çœ¸ô/-æxï{ÁAÎNã‘ù¦ +9z»mŽŽ¹BÌ'ÄÜÁ1åâ$.Ç?ÜMjÄrF,·†»Ål—ulbK`Ü6·e +; ¨å‘-Æ&CJÙC»"¿V€¢m„˜AÂà•Ÿ¯£ëÙGÇ(`Ù3¶!uídÃ}üº•m«Ñ¹a]3Ί;]\VmW‰îß渧J¼ªkûyÅŽJ¼ÆÕm—$¥øDuFÒŠˆ9•YgÞÕUu¸óêæÏ:N¡Þ~†ix·*Ì©c‚.3 ’¡Û$𢂟»ðPŠÕ@J8ïÃ1™–§y'_à Ý»[Q +9zõ}EQp(@ÅqŠ5)@Y]Ä ª8!„ìzÛÕ~9›ß,P8nûÚ2]bGÄEѦk¸î?}ªðÐnK” !iØÉ'B‚ÈÁíÄxñïôÿªÈ 9m2;ö3¶ý*&!ÅÙCôdÅ}{ª` àM»Ë1=62î¬o]x]´Å€£?BToÈ`©¼¼‰Ÿ%(!çºÃå*ü4àb¶‹üÞŸp!`˜^R[b ˆ]~œŸV€¢MÏ‹_9á(—Z™Õki#2n£q4ÐD³¹­ÐvÕ_—W.Ÿ£ìõI»ˆ¶rZW }uÝG¬€Ę30ÞlÀ™ ;Š˜Ã±Tˆå„Xz8Ö²2Rr:Ä’#N3Pˆ]ïÎNΊ¥ÆV+C Xt|mIvCËèñ»Zo×âiÚ-¸»·?C[ùF'¿ozîÂPÅËåïx±Æ‹g¼xû` &D³wç(5l·â8–MÄîÊàfcµ[ÐF›í ý—#ZrÓm=E”Ä é½} GlØ„•ËŠó¯˜Œ +`7ç.;ÅS_¾»ŸÆ'H „=~—\Ûõv²\².|°K¼£áÍš•ÖÎÍ RJ)îspœ"$ŽmS“±œËÇ‘sá×ETüv~ÿÇ}Ù$7r+AxïSð†Bý®}„9‚—vx3÷xÕ¢$£_40ˆftÍjD>•²2³^·±cß,)Ÿî¾‹¼ ÍÓͤ7ÛgYO•mI Ük¿OŠöt¡dƒ]oì F貈e¹”½ß¨t¯ŠE}¥å²$=»ã¬TDÎ~M\n /‹¹[³ßÌ8)Ôîåv½£H*B´¸d5ËœJÑ^¯È·•·f¬;¨P–“=xŸs3.ü çü*¹ +y?›p5j‰iOLÏÍøµ.AX’Ôn[¿ØÆ@Bì9Z“ÌØòâžoïLfñ\-PjxMKÞ€Æ[w!Ÿ`ïk…âÌxKfóh”ÌÅß-ÐݼõY÷ZƒÖ.)פãt¾Æ|ÁçÛc½Zfx§TÎG ñ. Êâ µëÀ×Ëeª”4—NÊ­sàVÜóŽ˜o¿šC aä2TÄt‹8RD1}Rïèd2&s!Çéî(–0—ÓSn]‹@ÿ$ìªâz3¦BIXÆ[w6lœPz:nœmÒ‹gºå\ÞuU¡â醴êøÅþnšØ¤×†W4 E>¼55(Ò»æ¾H¡%…=) Hws˸¾,eÊãÛsYÆMé ;[JX&Ü쉬ި[Ñ®¸dn½ â{?WÑô¸ð\¼õGœ“ªÿ-â̘}áJDlàÄzv ^x€¢H²Ò×ñªSceMó +QkÇØ.Ilâ1 +qñ‹¥Ç¼¼W«b2šgˆ_Û<*N,üÆtJ] G;5P9e-šËéhÃûZŠ6߈YW’ééŠX©á,Z»ªø>‘°%Æ=1¶Äã#éEâJI]gg]«Š¹³®« +CWá;›ü«Ä5Q®]«b:=ŽTÑüÓé¡]/¶¤,g7ùgUüÀÙ„³ i§·nœÎ3}íq:+Ô1ñ…œ fí*âšÎ–É:ywN'žó‰~Bkb“Ú™ñ³šlÜ+퇲öËûõÄÏ‚·#Ôˆz'Çb1LŸÝ°¨ÉÀºfö4ë±…AI’a|Ê-¬ÁSÓíÖªšJÉ÷ÂcLÚKÞ’ýç~û]$©ÂýyÒ„>žÿáöÇŸ?üsú‡Ý~þõïNeæ߯÷½ÈD²›}MÃòæ}èûýÀÊ}Û£òñeŸo(IË6Œû¿Û¯é‹÷õ¬¿\?_~ÿùóƒ¾l_qC;‹ûÏ>#”Ûßÿ·#˜É S- oȤ½Ÿï@ê•jû+°^Pu¨9±œË»v¾¥¢x¹åå=/x÷p&@ûŠ¯¨ùîFЮê¦9žíµü6{Â:˜Îù±ær¾«ƒZ©ØoSR§ÙqI}õàX{˜jáŽï®é}Kç[<ä©ûîâÖG )íHé6Ü3oÔÂÊç궥;®ú¾ ýö‚yFâäƒWOá7ZØ”p™ª€Ânat8ßU‘¶VºÊrÑr¨jîWVÊÆóî“âíß®J +Ts(k Êqš¹QˆfC5çÖhŒòáßþœØk`}›Å0†j$Ö&0LrÅÛ.I˜éx¶WSl± [¶™ŽÚÀenÆP ’Í[ZÜÓâíÍ0Ú†Š¡x)Cí¢ÔP¾@™C¸hŒ7ζi!Ô…[4Ž/¨ÒAœ*¨Ö Y"•ÃØ=çlxµ†ÕP¼È5¡S¯½h9–Ýb qšEá ÷÷Ï'dkáǬ‹ÊÊf#]cTK¨Ù¢–P×#*¦Zèp¾ /µ¼´ç¥wòä0-•’ð¥;•eÚ %ì´¯ïÑbË‹{^Žv©t?¤pÜ®¸jB›•a^Ê1Ze +S¶Æ¨œOÖ@;YlxqÇ‹ ‰—²zœq‡÷[ Óqv¾4Ö|bñÖXúEÆP™¶]”ÂzØŠéÓG‡ó冗w¼<åg#ÓJs¢¡qœJnõ^Wuòuz% ”ñ¸Ú¬²ƒXØÁÂp´Qê"ÆY-Õ8«%æÿ|ÈzÅs7Z•A-Û™£QªjVe¢øW  Ǿ(—8c¥P¥;Ú‘@YS-ÜI†oÙRËK{^ºd»Ò¹JÝ’áX»Wk4¡RÍ©ØûZÍ«¼þšŠ£–À-/ïyy4ßæ·˜t²û¤Žµ+al7ãƒ4[ÏúZ¯¡ÊâVÆCÉ6s(ÞP‡¤ÖÍrO>ÌVÆoIxXošÙbË‹{^Îv%oå8Z0 +r”•nMX6Ó•ðk'R%VkPÅu›wìœÚ87ß¾jˆ=£b!8QlË„%ÃÐ4Ô~mz”¹(œj¡N>|Ï—Z^ÚóÒh¾Kyõ£î²—x÷z˜á}à·&Û½sÌûE --ìiáöØ–fo°ÛÁꃮ°*ËVv…(1PwÄ(ûµeï{»×” +Ü«‹+¥Œ@QºM”nË$V¿ å_›VÅ+ÚjM¤‚a¤àõ ÔélÕ¨X» à ªP6¯£Ëñ5¹6°3·M_êÛ$ɺ¢Í7œÕÖ(—nb ¡Jx´&cš”óÉM±.6¼¸ãÅÛ8ÉÐr,ûMhÒÑÃõìk;t2Åáýˆ³‘QËK{^ñîõ0Ãû .d¥_Ê5˜ŸÅÉ +‚‡5Õ‚a|²$R±ã Ížäm6ê4³`57‡ê TJ0ß7îÌ÷›w:×NçÚöíd=,äU +Õsxë‘ÇþðE --ìi¡¡=5N®ùLf:î›ë¦Yá7F5¸´Ã¥\‹ñN5Kæ='Žâ¬ÚvöxÈ:«„}MMµk è5=¡ÑìtM8=ÆŠxìK`ÕŠ5°ÐÀÂ&F+o^/nhyGË¿¢h Õ)[éRæT*ꀕ[VÞ³òˆµÈ$í]„¿DòZÙ¤ÛqÝEwiSXű†Ù´@yfÊ(«WîäÃ÷’MW›ó¯3 To1±ØaW8C·S´ÝãP: г]‹f‹ +›'Œüë¥óaï 3´<¡ä­(”;aXQiÖsL9Ÿ|7´´ØÐ⎛Ùvý 0–UrLñž`þââæð±·*Û ÿùíwÉÞ|àþßP’–m÷·_“rùz6YÖÏ—ßþü ¯ÛWÜßÐÎâþ³Ïåö÷n2>CµíL‘¤¦xyí¡QB‚‰¸¤"¤Câ…=õÅLòýfÅŽ*šûjÒëgî+nˆyGÌ·™drUÔñõ²Igµ³5¼ÖA«X‡ø’ŠðŽ] G|5EDôap —³‰^hxaÇ ·QâêŽÆ= ~uJ (í@i Zj±Úëšrµ4,²w@ß´!ñkU{éƒþIEbXªG›øP„*§7xÙB`«~ÏT +"qA¨Œûäeæ¯O¢°ÿoîYÄg\ÜÔ2|íƒc&‘ûÁð’:–1ñt8güj8kí{¶Ä¸'ÆÛÃÍÃCú·Ñ‰Å¯9àNz4î6©ãw›ª˜f\’ªŽÝ[bÞóí­^‘òDÉœ&>½ךŒº~ü¬·)âÉév]M5U€ÞÉñì¾ H_9Ž&F¼òN–²"×ÕÐ|ã2v‰Ÿv‡ãŒ{–·KëͲÚÈ^q²ü4kwã(cÊÙN¾ŽÖf›$²Ò%¾bã‰ÖƒQ9­§'ǺSõWªq¤¬+É2¼yKg\ÜÙr·£]Ñ+Øß]Î&^êìéì«è: +×Ù,±poó–'ôk>A  †‡´°°‡…ìBùªGö¢®‘ï$ïŒ|¹!æÿ±_6ÉqåFÞû}—Býa=G˜#xi‡7sÿW“/‚EàE +€¡•ÄÖëîT1+ó«‹bRìDtÀWS«Ðqñt…²F¿¥âÓj†¬$­b¹*–žâ™X| ù1šP¢tÛ¬=8ùi§eyNÌ„ø +©P x˾;nëHj.Ái·'+HŠúwOÈâäXliîHAœ|ÆÌýÓn›¬àä}‡YOiïºTûÞ§-CM[·ONXêëåV/_õò½ ¿ØNØS¢âIÝqÞåáÔ¦uÇžIb¿¢#u(抷Œ 1(<lÛ(>Š€% 0¾Q<Œ˜Ÿ)ž[§•iêïÝ>AìI¡»xÇÕ³-Qñ{7¬øÓ¤¸«7J‰ì;‡Ëç;Kmrµ„tHœ×Íœ +`•~7÷FÏ#G]䪞ÁŒËa¸ÕK^ºè¥½)Vì–øàØ°—UAÐ]ØÛºÁl7Šù¢˜[gJÉâ-[Ã:«!¬í(˜ Q¼¥bÀlåsR`-Ësb¸©Ç±éI¸&ŽÄãÚ†Š«n™a¬Õbf÷x(ÔïámsÉ.?äf²ÎI&ÍP±„ô°_sò>.ÑÖáM¯N´³X‡”@•N*äƒ8Ý“¬XtgÎÈ…FéKX¦Že(gw„ª>[åÅ>õ:}+ºâ|ÈiÁ˜ÁJÀé+Ä 7¬4·/sb;bÙ0§Õó‰ nˆŒ9w¡aÅëÑá¸Ps|H\[š¢T®‘âíXÒY'QD³,<)Ô¨:K–Ú#³]î óe«xRÈêÙJÁ*ß8 4nóU1÷ÏåÊÔ¯Œmôr*€Uú~©ä¦]FÕ,!ß>7×3„UP‡µsÈ’‹qÂàøœ­%¨QLÅô¨Žê3.iµâF/7zù¢—= sö…Ó°–?<<Ÿyx.UúáYŽÂÊäŽÈ1Lìxkœ„–œXËrGÌ̈£æ‹ªæ@í–­‘Œ0Ÿ›zWoƒJfðüÆx z +”\¢~Ûl¶¤¾i¥R×»ƒ³ñîPÑ T(¢ÊÍæËÉ Âþ|·Éª>_ÆågçĶ0gàóÆăb‘‡·t…¤“ ’¤BÒU܇âapÿLñTpw×Ä}Åû̸:F¨õÁZÅtUL¦ME T¹–/žsvÛÎØϹ”£ºÛ ~Ìá§ä~¶ô0–Áå]½ÝªSŸr®£Sc7ø9íŒó4ÃÕwmŒ‘]û¢1j3 çûS±´ŠåªX~¥â§Sª‹;nꌵ‚ŠöqxŽàd€+Þ¯•ÉœÕ +›·#s.P+ö³bâæ½J—¾yDÁ!ºe3[:‰ßUü[R?÷™°³OB‰<±M˜@¶ÒOâmæ{^sA` ix±M±3X¿;GÝÑRæXw„7’fÀœŽJbçxÄÞ4êâÏÔ6Z¹ÑÊ­ü¡5ìeÊýÒx©–[±#pùŒpÖAWü9«²z¾­^jôÒE/=¢AÊÓ€!— +Â5áÝBüÝ™Bˆƒ¢Ý *QöÞìâM{bCfæºåɉ:euYÌŠÞó¨ì¸ë‚¬B*ÔŸñ>>îzÎX)R¼åŒý‚«ÅØû°µQœý•ôüêÿþ㟊ž&åýu&ä·×ÿôû×úçþåöøëßÿ»àŸøu˜ùm…ý-í4ø}õù @I?~¨ù}ÏŸ²ó9>Þ÷ˆÈO5ï>ÿ‹ì0üãU¸þxøýï?>æïž_ðþ†vï÷ù8£þçRü +)½)H$5Únn|ý=ò£³ÝÍowÐyïú|W˜ßàõ3Å»•‹d˜ï6éÉø ¿šï+¸Òh}åLä’¡”`´[V©ÇDÑvIÌÑ`h_õ¬Xϱ/iõ…S:Hqõ–ZV+¾}ÏÄ7BΘuaD\ÔŽÍ7ÞºI5ܺó}í## +ý­Û¦”ÉÌp¹‡gn*Fż™‡ÑÑMúÍ1<ßåàS .­ÛÎûg¥š_h)˜ï–w +§ U$œñœ­›šÃ•A4¯æµFïI„óE‰.¹I8œ«Ý¯…‚ËóQÍMˆ×0‚{Çð¾aih¬t¼ÿ†ËÕpÉ©‚°áÚœ˜[u +õ¨jN®—û°6¨xÖÆNÐo¤¸VÆú{7ìâþÞ$ÅW0‘4îçù0^¼èÅ k(ÚW+­Z¹ª•{óÑûÕ|²F^1ß¡”ˆæ› —ß›ôïÈÆ5]¼qXKØvóqüùQÜÍsRmîŒ ò@ ï3â¤À\£`û[/¶zñª½‹Õº Xt"íXÌŒH"ü†g’P#= áÅŸÁþŒ÷Ax?ìT%Šâݶ® +Í¿t¾/–³ X¢ååꉻZo— ¥ðêEkK#X.‚e@0U‚ª9:†¶³®‚Š˜³ã|918¬‡Ë¶æœXod¥hÜ*æ«bî)¾ÂïÈŒcø%-€•¢ÂØñ* \bWüô1µŠéª˜çj·gl¡â꟤Aoéãã6s†ÄÜkiå<æáx¾L,šï]/ÎNâjÓòŒ˜é_TŒ6n77X‚j¿¢—#$‰Xx7µgy÷¼6>k¾çÝÏnËb}vDŸGÚâ 6ѱìËè®'Â4S`®#öK³ßþ]î_­À¦'Ýp¨`%œñÏä³ bœÏá3Î 8 xpÀ#‚Ç–.Œ c0ÃrŽ…© +ÍÁŒgÏUñØQ+f¯¹Ü¶×f|×Ä¡#Ô¢“üpZÑq®@d!ºÏ)º«â1ÇÕl@¢+¶Ì5‡ “pÆw'ü‰Ú+HŒFH0Š;"‡ ±"Ó^Ü:К¢cnÇœ0²ÒOanóU1÷OuEiÓ½šÅÜщ´ é°Ñ‹½øè6]%@ÅÈÃwµv3ø5>0#Ĺ'E¤¶#¾ŸÇ$–¨Ïåpu~OÐ }ÌÅ ”æð^©ÆÈ.rõA7-‚ýsT¢P»‰•ËͲ•¾6Bˆ U$<çn—ܧË6W1y=Ä¿Rƒmõ¶ME4…$u¹âvÂc¥ÏX $ìWÜ6[wXæ ÊòfÌ…  +í§¤Õ+W½ò¸å†‘„ø*јktí6_o íŸpÛÌ—Ì@´†1§ãnï[¨¶€õûmŸ4s¡l9J³ ;ŽIBN›äˆ©­\€µ,?ãZS£˜.Šé1Òˆ¬¯xøŒ[¯˜#WÌhå›™ö]®¢ bÑ\ßsåÎd›ì +å÷aR†R±yn“Áçµ™ÿ«I@>[ú8û“æĆ­AÆ`†Ë¯Ï™<\žïˆÏh©ó-ŒûŽØ†.ÿÏ~Ù$ÇmQxŸSÌÒAý»ö|„,“ÊÆ÷¯ +¨±l25-‚E@$YY’‡ôSûõëïq2ÈìçY|Ï“8dˆ¥Ü°q°‡ÛöCo3£ g ­BÊr‚¬9ºsÝѦ6Ì5@ó…Æ»\’ ÅóòÙqéÚb"V¬ bÃÁgocÙ)–ƒby4ØXªâ”t3·ž+s4ã ƒÍ*Y.”lJ ž—Êb¯Ž¯Ç|8Á ÁEB¸¼ìâ—Šûâ0A’r†y¯7õæÇÉÖõœïö´Fuãj +¿R{Uk˜¿&a>\uîpHU›ÎkÜÍlèX5R‘!zEº]±ýkÀ’I|0ú„YßnÄ Š£OÜÕ ‡Àã@ԀͿtë9"ƒitÝ&$2´rû|Mƒ“ó'îܽ³\ߣrÿãÎÕ¹Ö:„1©Ï×-ä‹Å|&U¨N×QÌ™ PŽf<[6 ×Øų‚Ñ:Ý“l¸Ç9õsfî„å‚\ (†Gx6´)ŽÝP™Êg¶‹ÿÒ¶­Æ .^‹>œÞ"×Û¸õ@Üëg íVß<*n™ñGÕÂAØ¢7c}S¶Øg¤žå²bSœECvÿ1cÙ+–£b¹æã¼SœŠs“â²=\ç.¬Ö“~,Õ¦Á#Æ°D_~pDqtý¼ª7ÌñÂFõ®p´ÚýŽéöŸ¹ýv/ïni£÷Zn©ìËA°´¸ë¾¹ïåˆûdº]Ü—·'‚í.€ÅF›b§·…Ã,âjˆ7TêàŽÇÉêþ*[xÔ Ì’OgÌ{Å|TÌg3îYiÖ3ÅR;Ç)ÉB)œȬ ^º«+FÕsþÖWñoE+¢…"B+RI´qsÆp©°ªç1<+”@0>žrÆfPJkWüRl¿Æ%é`²ì{å2St—/^ájE X:Ï´‰ö ­h9£âZxJX@¯:xôͨ”f¹„e¯WŽzål¾GÅ-œöâIÂ!å|Á“8‚S†:Þ€„wÜ<ßÑ©¶žâÅ®†Õ7Y<ß 7n­ùªA¢†¦1Ï|ÅÁ0WyN +È*#¦T\]¡e!O,×å¸0ˆJDWõ¾T»¯F´SKµ´SV£ä ‰ÃnÔi¾;½-œªÍÜܲn²“+¹òh1C/e)ˆ`0Ãá ¼·D[¤E¦ ¯ŸôxÆ#ß\:B0Ñý§âVx©øˆï-Š?Âw2 G·CwÕ¡#2ç 'ftÄz°ÆhP-*ž1ÙÖsZ®¸£+’£EiÆ›‚WŒ—Ç3.@%é `¶ÞŽÓËÑâˆ.GHšGWŽÞ;€IÂRTf,t‡¡h˜j‰øe_M‡… J¢À·#¢iÏÂk¡à„ç÷­™ÑFß7N–Br¿ºgƒswÁK¡\ý›F'YWâAHÕq5ÇBšT@·­GŠ¥Ë9öw3(•üY›vS-&pµ°möI2t»¨øí‰ÕoZ0IÃ{[OÞ%ÈÛ_Ÿ)æ½b>*æ3Å= ’4³¬¤x¹¦ÉY(>Þ±Yãεp¯ìËA±4ܶµhgAG¬[ç2ò"wdߥø¬—4¡I’ÑÁ\†˜­»1HEÃmûá‡æ‹1žx$qÈh±Ó›wzóAo>Ÿo¥TŽ²÷§ZÙ«•£Z¹¢ö£%£ Éf¼mä +Našu"ö®MS sàˆnùpPÜÔ7?˜q,6:ƒ»mœ“øjÉR…³lvÕ\ŠZ4#LF9¤Z¢†¢U/‡96!õVŽ´¢ÁžÉ±6Å1™Õ¿õ`Õv‚OÅxÁ V¡ìÀQšÍȵ[€—u·t9ÇóÃr¦X‘ÑL"♑ј +ä‘ûŒ3^¯y®ÅÁ«iÏšWR¼Ø„«Ð¼­É™âæ{¥x—uÍçÿÆLÛJŸÖ |88e¨~(_žï躱¼“HF{€;S4 +n1E›àØ õ#R†’Òh¾ìšÄ«9˜Œ—š1ƒYØ‘†ÐD[‡)‘¤ÞŽtžÄóð& o Ši\Á¨`EƒdsŸoFqM77î㎛W‰"«|êŒo2ÐzÍcAj+`¹Òø:írmùª#NýжsñíX­)q60”ÐÁ?&ÜÌ@¯gÜ“( +>qDㄇ«µú&³…ns% ÈLQë˜n¾¹~Ïç;O/§x#bÔö¹u3ºõÐõGa@’g¢1»ì£}ÿ§ÿüåW%ðÄÏŸóö_òüù×ú²ß¾|­ïýV_öøöû_ÿØfqÚcáZköÓà÷|÷íw¤¤?¾öäÏYÔïññýãXÏ…n¯~ûsû%9•÷ŸÖÇìûÇŸ_¿¿èý»íŸx>±Åóë:"ÒLJӿ=‡ÛqÊP¨Øë(j=M§ÿw®h•J vÂSÊ!%|-x ­ÜMûòÎÛ+žªÓ¤zN?Sñ½¦»Ùø{T|Uo¨¶†¼X´sÂ~'¶¥ÌÄuÁ‰F«íºp«)f”ÙOS¸Yñ«î‹Wõo³œ¹Yx[30jp3¦4ÄjGn£žœ-à)9b-0©¤yæàiúiÅk*³_-É•Ü8p?§Ð€¬}a–31ß?bøZ–\åxYñX +²íMwKýª”ÊHä')–+¶Å6ªdŠ˜$a +¿Ì±§A§®¸µA[é8 XÓ´ÇÊ +(w>À}¥]*(ܱáQ¬O©åËÔæ]x¿)ÇíM˜Ü'ÃÃw»©U&L8^ñà$ 0«>óDq”±Û ° ɘ€wªÃb%s‰cC±‚–ñ‚õ’Óý¹ "Zõ)ÔÄ2€·JåýJ˜·òn‰§­™Ìh–æÜœ¹1UÂÔþ—³ [±x{:jb+ªB‘Äî.¼rÀ+'¼òÖõ‰P’~“°#Z;£µ·ïr5°â;…*(•¬½_ÅÛávH¹)ÒUIwÆü|b6Í7kh}£¬ˆ­£ïÂo…À’ ]Ñw®j|#¿¯8™b‰Ò[¯ø^ÖB>7ƒÛ›0õ†O¼Ãëíb +¿ˆøÇ b‹û“ârço—m‹Ã¬Lγˆ#Åvl'À6BquÐZm'Šj‰lÆ­f^€Ûêìò;lÏø=èdØ&"µao?%îm¿3‹+ÚÈ$“3¤£àÑÁy{Ðí{‰½J°KÍFÆV>bå3Vîq;ñÒŠx–ïUéZûSÄ3óÂQúö»Ž›¡yM=-ÂSD5PõLÃ+rÌÅ£ßÒ†9î‡òˆÊ¦Æv:Þ­ø<ª;šeÅgIŠw«ï-›Á¥¤‘7k‚9Öb=!ÖŽ7«ÃÖ*…Z_Ë\’[ÍÂcF¾ª…/®-L%¬¨]© +L˜:Úzj70º‘£msÛ¶ +T¶RqTmkì^ļ|ÀË'¼üÖóµýª¥·*ÑÉ >âå3^~ëdò̃s°š{ÚåŒ{ÎïU¼if0(¥Ü.xmŠÒ:%¥×öÉïpf<ãwff()IÒ‚§tž‰ÓSÁÂoOŒyˆµ¸æKnAÄ *ýÞ3-1^òoÏFM±dÞ­ô(:xm¼ô( ¹Š_¹íD±UM ɱ¢†Å¬Ü×né¼b @ñ¤J¬yuÜÛÝ:žuu!€–W‰Ç?€†íƒøQ0‘5áø Õµ¯Ò™±/a;¶3`ëIxêâ@gÌÇ‚¢x &±ÄŠ§‰âª$¾°áʼSÔµF®w—Ÿ™Š ƒ0N¯Ž/#~¦á©WW¨9Û>;t?+(:Àñ°³õ½xq® +1ÑÌÙV¼¼ ‹¼)aßÝôˆXψµ‡xnB#8 žV‹‡ÎømC)XÓ>±ž"éÁ´ÇìP$*7—x +¿¬_ÿB¬´‘«)VÐ"™«}àå#^>ãåÞÛ=ØÁjÔ{ÛÏ4ˆ%8ÓïU¬·^ÚV¾»¯T@Cûzý{q¾ó?5ß í~Û¢"HÔ4ÓÖKˆý¶…RmM]27›ìzÀª'¬úÖu²í¤T&”»iÞ>/³‚Ä BRý®Èq”ÊÙ®X¬E*¸Ý¯á¿tjì¥2ã¸wWLõˆðÖ|l# +*´>œùðJ©Ü¸­ŽY*_í;¤¯-!ƒªñ»í•5$Áí=Ø_CÃIüüÊüò•yê»Zwò]---6Zœâ +…xŠ¥¨zm+"ÞnÂí83¸n$ +Åöάmµ‚Æ +(Y"¯–sµ4icÚ&Ô9ô4çæôß¹&, ÅÄïÆrñÁ¼RÄCò ƒ`0ò4™TW@ËbãÀñ`lŒp<¶1òöà zw™8݈SäA·Ñ*r«Ño–¯yÄUõþ<þP ¨R¿ò ¯£¾vÇÖQZÒ¢@‰n…˜¤ÝWYYÚç<ó…Hñ²r1ÕnTm£t‹¶£€~wSŸe V ZÙim†@-‘UßÕ¤ë +åîüÝqjÑÛ‡æ‘ⱎ“ÞÛ6A‘ åpU öÇçÂ/'š§ò-&‰Vl r\Ü%3´=‚¬©‚ãÞæ;µ™íhÃ{MM BÛ)8ˆ@kÖ}Þöš¹yñ˜¹å#®´Ÿ‚éá­§c±ç4œWDÜú%Z®ã921rVÙî é½Â L£¯ +="Ö3b}ë¨bj€ÔVJüxE++àí­â—pù—ÿ€ûÓä3VÐ"â¼|ÄËg¼|À{7ÚVØ؃6C(ÁY…¿ŠõVÙÍZÚ×á¬èû؈ó~ác-+,üöK›×ÒÚ˜k—f‰Vœ â¥Í#ùÖ<~ ±bvu=7{åâNŠs³´·³C”ú~u`©y{úí¿ÿø§yûyúþ}mM_ôÇ÷mïú×/¿¶×þÖÞõöÛ¿ÿ÷§ò÷û$ ¨ág"ôã<kC(íÏÏ/­ü/ „èí÷'œêãí?þ~üšîïBýþñ÷¼éã+ùñöÇG2ÞÿÝH’úöŸ#~ö\<¤× æõ‹• ”¶vB€Ø¶^ñ"a*ÀQãf´ _¹…jññÁ>ËUfŸGÄv@l'Ä6Qònø·r<±–6‘À ¾}ßîgQÁPu‹¨ªõïm™ºÒ@BÔ•pzµØÈŽm1´ûå…¸¶(}5,d!œåÅjök­T?Jé6éö¹¥ÐÝ7UÃXµîñR€0߬ŠóÕpüUoo¡ìßJñ˜(RŠÑÀ o¯•e¼_xüÝ}nm»Ýœx€Uê+ØŽˆíŒØzˆÏ¶6BðW¶¶]t ƒG¹[Â]B±‚2%{nšM\Å›¡å +åñð6üŠiKºïõ‰W+æV~³Ðh )ó‡UC¹P~qŸzž ·+¢ áÛ'ÒÄÔ Ò¼ óeÄwsüèïΙŽý²Ž½ëÃc:N“cÃQGP‹úF^QªßîÅS/Ï Ö(÷ºÛY#ˆ¿REb$ªX-ï ¨JÒ~–k—ä@H}ý¾´¦u‰j b;ùƒ7@éó;|m}~ñÚ¶s´Gj`Õö†@Ã~_[GáÀ6 ã‰+ôµö#µ¥FP’sKzE(SªŠÏd–#b9#–·oìÄÝáÈi'^c¯`þ­V1Ï_P¼Œ­‚kÚ/×sãG#&ª‰Šïè—CxSA8H¡»ÑÎä—¹¥]•ñ^>âå3^>à½ÛÓ\ 8÷õ»P6#D”LWSãf´Š \(Q…_64ªˆyMB±‚2é‹NB€£Æw6µ±ˆû‰šÚ~«n¿nÙ8FáäêV̹ý6Ò^ζ_rlØÕ°u Œ^—˜ÖÕì€ÖNhmèâ"»·«Üvµ0Ælª Š¬¯˜Û©÷Ñ„KÉSnÁîãXµîñ + ÷UaGÄvFl=Äs»Ao³?+˜« Æ$œ®bÒ7¶e$,VÁ5Ù+Vz|& ºCM,ï#é5M(¶Jæݹ1LñÝg·a¹Œf¨w¤^>àå^þﶆl±QýÙ͈·s ©"™KL›Ÿ'Äc7—SÌàÄéÍñe?óµƒw «ØS—hNµwËTbe…R9)ñU ¶UügG-ºÕåÕ»ÇèUM¤ü*T”Ä‹—L»€AI)^Q⥽ ïVÄTŸø?ûe“äFnDá½OÁ (LäÖs„9‚—vx3÷0(N·P“@™(Ðã…¢Õ-õuòå{/wób6θь%aÐÓt|vÂ/¶Î$WÇŠóåâ@:àl5üæä Ù)p¶5½Ø“_îU±ÝŒ…r%.¿TÇïv6½¿ò—¤oªB3¸k?=ÖQEÎPÔ‚^üyÝ ^Ïn»¹[ç9Öð'¯¶¼zäÕv¾W_£‚˜èbg;*bdë^(b«>q¿’ÌJèߊ޸犘˜uµOÒÞÆêáb–D@ƒ¾öÐý95x—ø½ö#©ÞÎ7žðSEÌuµ +Š9pµ%/ÑR_™÷é‚Ø0ê«åÜ~WÒvÉÌ.˜‚œ[sÆ–.ÑeÚ%›_Ý%f:ÛvÄ’\Óå^1ñ®3óyÁ½ÛÏ‹€RœÏŸnÌ-1‰ùö ;ä)EÀËÅs5b×¾¯#GH&QýY‘Ø 0yÙˆØK•p¹ÚØ^jxéÀK?x#Z-€ÕÕ6šï~Ä¥ž¢Å.×ðÄ3)!ˆÑÕ3ž¥áê¦Áx—ìj¤ %–ð¹<&ˆx+AHÊ ÂAÌMSÄÙ醴”1è•Ëõ­wíaL¿á‡BEÜY-\lf{Ñ +z5³tyEû ßqµ ©a?Žµ%Ö#±öˆÏt³‡/=Ï‹úN¬ý;n˜øòÓ¨VžFÓ7nŒ5Ôï^…½dÐìûÃLõr) ÕßkúÙ{êT@4úuŠâ õ‹L.OŒ™î` Idb0¤0/NûÙõîk ¬4Ê%¡‚ùê›:cæ¨U.yuVW3+ý«SZb9Ë­£ãcrŒÌøUr(¦HǼÔòÒ‘—n1³WäåÜ’V׫»ÄlbJÞOŽa ÷ÛÏ»&(¦Q^,ëX \B‹XO’(c`Xü´ ûSâvÀc6x·¨“äàÌYÁá'‰ŸnDŒžÃ¥[±²Õ#´`°ykÖ‰ l©bµp–%]}rÌ$®å‡<ö‰Ï sKÌGbþ¥Þ/<$Ü#›ïQç%6µYómy¹áå/ßúQ'¤2G^Ì"$!ˆÑÕú¤¶;¤]®†‰öà–Å÷‰8vƒDÚ¿è–¹6 0ÑÅ7è‘xÄ#^'! ‚yš*ÎzÚ '‹«ð‚[g +\oŽ¶Î2x¢ 5–$.\Ë¥]¼u3“™ï u‰%gl¨xŽ¬'hÂ~>kK¬Gbí7¼oµ‰" „a^ðØp½?±‘  $îÎx˜øò—¥„'èYM<¡Ú}êµÁÙMÂïï󃵞Nu›nÿúÛ·z¥JyüXh¡ï?þ½¾×ßû½¾íõ½nüã߇A(S]f+Pj@!)?FQÒý÷àd?¾)©¾»ÿ''Úa<þ^G]÷âŸót(¹æSýª\Méå®P«¼übWìÏÏÒʳà³Ì‡Ï’:Ê«Ÿ¥Õßñ)q“OÜó‘¸ÑÞ‡Î^ÿœ¨ÄJ=ÒT9È&+šTß^¤é®~‚™‰ 1¤é5í¼xr"– ±¼u,Þ~Å2+p´‘*4ƒqÚÈ+ç”Ú^1PÇ}3®ê8)dËmUt÷¨¢oóêå=`® ».ÑÞeýÿña f•º¶¢ØR¥º/É« ‚_t§˜¥íÂr&–+±¼Ýê?=.ü¬ÿìâÇ1’¿yâ±1²AìD»‘ +T bØ©çd ¡â»ÃˆO¼=Q5‡ù¿Ž¶kºUÝÈóÌ-»ÍZíB¢H{¶zæÕ+¯ÞK‡-ÔÓ3ƒ„P#á çËI@s¨©aÉô%P­TÈÇ/z§ôž†9ËÌüŠL³Íl(ñ»¡m¼ÕÎmx·m5ßC¾)W{ä’úUà„iE-"R}ÆŸšèÎé}=@³#é2 r>“ºßáÛ_¿üªìã£ÇÏÙÜÃûÏ¿ùÃ~ûý›?÷»?ìíûŸÿ~–!çøhØ~̦Ë4äCqÍÙÿΟßdÌiß0ÑÛwÙñô÷ßS0~üÔýƒ~¼üñõÇ“>¾;>äñŽó4_û”8½ýùýáÃñÕWgÒ¾„Ûê«o¸9&Ê\Þ‘êBÊ%ÞÓvwòölw×½øÔï i®N´¯\_læ¯Cn°ì¯=Ú}vdÿ¡"ïˆ$5Wˆ¹5ÖeVL0AÅÆde» ûþŽJHäðT½´ tµê[8ä2ç”Ýzí6älþîTím8Ó†+møš¹ +ú\À³6°–õÄð³¹—$Hu¾KÖe Ò´?ì⻚ÁÄö©»õ±Mt DÞœ­¼È‰·Ië^àˆ!&ÛÆ vÓlP¤m:¹G,fÈ»ö„Ö'=Á{˜Ÿ;Å=[R»ž»Id£{r·; çTÞµ!¾;pÏZZèÝ´ù<{gDÒ©Ú=цm¸Ð†·fþb‚Êñð)ƒîc§lböv×Ĭ*ZTÙ§4&®»î.¼‚bÖÖ1©g^½òê½E{-Ô½zÀÃLLO¬zaÕŽÙ²&ˆh--tïÚìÙ²E•^1Ð$$n–Ý—´;êèáœý*¾p×f†¹b®”»­+±^´žà}r å9ä²àíÉól˜,ƒF©°ŽÊ†³Ýì8;üËòF÷ÃfUÄïÉò½3lÕFÎW Äb«Ú,3ߣ.dfÛ…WЀv²³€,õpª77eO½éã­ûCÖ°ŸIpýÏõ³í+5‡ r¬xÙ'ëBÕ\ÝÐöá5È9=¯»Ãδ}7G`ù)k§+̬‚|œ“úuçÙ‹þµS5W?ÏŽø²ÙʉV.´Ò1[ þ¿’*~p[µ]ìU-ì±cœÈ;M¹ã.© ³¶:®žyõÊ«_š É;£PQkÎw/Ï=:yJRéŒ Þh Ás¢8ß;.§LÔâ]§‡%EšÛɇÎ7²µzù:¼ÞL¬œk+òZ%«t²y3asßÖ¸)³ÿ_ +Å,—gZ=Ñê…VO³­òú+Y1ÃËz²­îe»u!ô@þ*í¾vÿ(¨æ–ÖñÇ´ÔÔÂ2¼‚~WïËÛ­¬é }¬u_pݪl“i‚4•oŠÕ2Bˆ k,³~†3i¸’†·/ÓÁ1WŒ±¬ÙŸ·ŸiùJËç¹Î¾%¶»}4ÏM‡‘Ó%o Š¼§vÓ©ÝZ»9óöµ›*o`˜ËÍqȦl¹¼”·šcç¦õ̶§‰=»"")oÚ¸¦{敯\x¥ƒW}Ó¨Õnºl~Ó+—›»°ÓC"S m¤« "Z‘wÎÑóâá6F•›t^ɽk5 $’òLW´/¶êù°KU`3È9•wl±è• þJ¬D™ÝÖ‚5ý¶Ï¿ê;† ÖȆUf»ÑÑ+‘!G,ïØb¬l ÐbY úÁ~õk³CÒPenG|îX­'¬Öi\ eröŽË‡­²ùèâúu=ìÕ³Wü5y£³— I²†uûî|S`Ö +ïç®-s›qöOI¡˜Ããôpö=ñê…W;¼AÈï¬õ†1z85àîùZµ“‰¿;µö­ÓÍzö­o¾õ\c ¤¢Ÿ­–kœä+¹6¨ãÜu†ª/¸nÉ&gðH#È-[ˆ–AbØgºIÜŨÜpþãý÷¥°f‡mÒÊ8g0åùÞÌ´é,ˆŸ@_•h¯¥„?ynúœ­ ‚)ÛÍŠ—åq­eNq‹v“05›Ø2&ˆà­¡¥…îfÞæíÑÂÏ5CÛ'Ór/­K­s¾=Ñ·kU^ˆy²5Œ¬ ÉŸŠ¼"¯„!Ie¾ƒŽŸ¡¼–µ(ßåbØëM@)[Ã]Ò™aæ¯kÆïÀˆøwY®Ÿ•”Z¬g^½òê½ùö¨áÙ¡€qrÕ½Ì÷Å3"™câ\O™I@‘¶Ñïn™ÆŽiirF õ‚´<ßÁ9ѵi5ÎèÕ\cnTÇp& WÒðÖ¬ŽgZ=Ñê…VOs­çªyWÔÁv>–ýSh¼_ ‡Í|W0‚&š«ßí+RнÁ¨Õ!;ÏÊ/èÛtóAÊ÷Ù¸ÙÅ\³–vY±mdR +ûD™ˆÅm¢l;ûÒ &¶²ëASy¾7‹ckϺH«œ „¤;Dî^¬™B¥z}* {¿Š©×ÍNÁ17O^=óê•W[¼Wÿêá}â_›åÙQÅ1Æ°~C Òêaræ•+¯´æ;Tš 3Û.z`cöé¹@i§^À‚VömµlÛ£Ûš{nù”ã‘ÁŸý•[×ËÛTDmµ®‰¤iº«T„¦º"U«»¼Õù&ÏIÞh¼ÞU<™«Ä+Z„Š'þ66Ì9~tí-‚Ùi£êžY%"$IU ¯GÌ$ïT×Жvp¬3c?²-ï4ãý +æng‡Ÿt@«3^øؼ@Uw[-ï’÷‰°U#Þ. 5ƒ%܈XPÁ§ù%Ó/;bÜIÇ›€¢n¤ŠýZÐßëç]¸=ãùµ-CàX-šë阓'Þ©h’—ùT ÕE6H5#¾;Ú¦Aô±Ö B!Džmi'Þpâ Þð“·Z}<äM7à‘ZpP¶°OdpJóN#NBqúˆGfœ‡ÙÄwy«Kg )WómP"£u5üý2H²ä¶èÞ§ø0L‚¬uÁK;¼Ñý#Œš¯±©ªh²ƒi£™nýª~ƒNd&h¹¡ÍÔ¯:h•D=˜Ø-¢ÕLÄ&@Ü—_Gó‚9_G;ˆ­ÔLÄæ­²†×Ñfµ2WUãÒü==ªì›Ñ’º? ·DÚõT.\5Q±TƒV8êOyWû/»ÿVLÔ#¼CE‹üw37#‡D¶Lg¾q +b³ìª=ÑQD].7´™®¾p”©ç#Ö¥-¯S‰³s\„pµWLs6…î·Fžù’õÃí¿ôøü\Uã⇅Uí¬£‘˜ÎÄôºÊº¿®†{iœ(ë¸8¨–Õ®6ð~ Š¡~÷›/AC\]‡'Í—+—zðŽþàóåêwCbdè]—çܼÔÈ—s¤„œê5h-n?“®Ð™ÄjÚ¿!±_IÂ5QƒOx%%ôŠl3ö„ö7-'x?ÕÙ„k[Ýà§j¸BUIÔ)ÈA‘-UÞ5èFˉçùc+êxCUtW&;Fs•yR77"Ê4c¯mÖÀް¶™—yŽ‰WXÅ=âÐ*ª4K¸yê8ÝùÁÅŸ¶z=ãˆ+` UñG^<óâÀû7íɇº˜,VÃSÞp¶ +B¸ºO¢MX.S©ÄÏ ¤°õl8ß.Çz'j–ǹQºD=m;7ó³’H\J-áÆ­èhŸ=çØ8‡3z£T[ÝZhñD‹—´Gb¨öÕùö×M w³n´<‘çmÛ1ßÂq[ߘ[}ƒæH ë ­$ñ‡#-zÓÕi1ËÍÌû™J˜Æ?´@#-iéuå “ûƒÕ˜xCÿ5ëÍVnÛc÷ݬ#˜Ðêm›9_ñÄh˜é†3O +ûnœï„®-UEsb¢PAÃåK7+æÄ+0IdÁ[Î×!ËÏŒIóåâÏZ\'9ÚÌùv¤¶º¦M$æR«D3žR#fê7ß×ALÕˆãÔ(µ,×ðÄ B“¸ùì7ãd9—ï8RƒV8ÒðSÞKý~ò82š­'ñàî\j¦S®W(ÖypÂœ3߸wá »šxWJÔÞ¹.ïOyCZ!üÂ[ã3´Ç-W0“©Y­- +åÝB#Ÿ¡¥;åÎØ£*5UqwS‹\b·Z)®‡¶üȘÉÄïÏDĆ@+ø‡&h$¦31½¾°ö0¶ã3aÒíGLÚ ´G[ª"‘K¨+¸X¢œãâ͇8$ÞSÁ½·D +vöìÐÕªxqàÅ/þÁî[?~‹ËÛûÜæ#¶ü”›ªaÏfÅD>‘ï¤EƒcGb3°Þlå:1êºÏ·±æ™ïuX%"ž2߉´X|ázT†7£=ÔP‹FÚÝP ¹j¥?šj×·ðøÜ°VŠF…ÃãsÇ7ÓòSnàýT­ìr|.‘†I ÐJ¨á ‰»JIt‘20Q¢­ËçÇA§­¬n³|Â\âù›v:-ÖjèÁ{Ϥ²÷JZ®Ý©ÄM4•?øÓlQj¼6»4RuùÆM¯õÝFSæ;óÖÈ–ÈÜê4‡~s¥±6è½ej”†@TCýîwy2-âÄ ® ˆ+ÊñÁÿþ㟽BQyŸÔÿÇ÷õ—ýë—_ý½¿ùË^¿ýûòö¦*ß¦Ñ ûi~A¾§aõøç3üøŠ½§q|Yü¿¿?QýGëñöoÿN.õûwý9ýýãï¿Ó÷¯Žò~bœÆûï>%’×þ´-M¿5¯ÝÚíÄ_MêïÛþÉÃo“O¿M¾ãŸÞ¥Kÿ˜x»ý– +Ò³NMƒŠ/‰y$æ31_W³‡ÄßžûJ5 +¼çŒ›D°ûÙýQé]?"Þ®î‰ÄÀE¡F ·[ÌgZ­f + SP²0’çxÄP-n‡††•Ð»^“šÈÕÔ žP@üŽÇgEÍ.‰ïµ˜˜½’r¦ÍKs]ü +à릶Íx¹úÓ¬×6q›øzÆ4Ó‰˜î—îS ÂyÞÒu¢ÄýDÜ_7êD& s1h¸¼û ¼Ÿ:åý'D§Ñ–LÞ}XBEìgdìÄ…¾Ò">K\¼N¬žñ¨â{¦é˜K ûå†3–ÅÅœIÇþ±$òâ|3>ÂY{ìûm Bs³H” â b”©Ã«@mººSÌ$ö”!ËCÌE¡Fªø΋#/žyqà]îlÙ4Ì…¡£†ŠØ0= ¡t ¼xp¶›š¸ãl÷¥¸+t’D[G" vw<󘯀‡Áß~ÿr?¶b‚.-,šû8ãâ¥ê˜ „’)›EK|+íGÌ AH¢{ô©&>¢}Ê‘V¼"Ý¥E¤K8×-4ì«·màÅO¼øºRõµÔH n©’ã°Ø¸¨–ë +± 1— +­6NâéæKÖ¡i n£júøÛ.Á1Ÿˆy }B•ë­Û§›»[DvâŸTw…bs»5 ®žËv]-iÄ¥3.½-ܽñƦæE­bž}#)@&«÷m&±1TŽ= /Wq)Ð-ì—OyWú™6 *×Í}ŸLV‚.-Qw§^ ÔLÇ‘‡œR\Ô~ø¦ ¼pÕô±(4…@mšÉ†­€¶åí}ô‰{Íòg=B‚`~,ˆKÖ{Ã[7ŠäðÔÓVKA zÁ@ ;vJ’MÝž]€*/ŸñÌž–¬Xú çoª(v;4H+°ÕL5B%“"J g¼_q'AhÄÁŒ·46·‰j¤yTAR¡V ˆwœñqέQùÙ1 ­CÓÎXÏX/‰ïÍ8®— —WŠ§³N 5 nº5¾§ˆXÙæKJÐ¥eJç|%^ ˜Pàj;ú0YçD>œ°©€0ÓåŒy$æ31_ÍxÐÊMâ·?öâ +b×2¦˜ÎÀôúB+>J¦u¼ñFæÆ€ª=1¦ô4â^<ñâë:îÒY±Tì×q·M$+@ÙêD²ë +¢¿¥£ùÉaÌ«ËϬù¦«j$:/÷‡‰Ì… Ù þÔŒgz0ƒtYÝ#¦i¸A+UÚ‡½ò£â~žíýþl¶t‡+ã.êò+ÃJ“Ðö#&#àFx!†»ug9mm3Ìó²qÓúÜOÀýŽû¦Ro)ÐMÚ…îšØB ãÂÐQÚ³ßlSÓ +G¦»a1ËXÕ‹ƒÖLå,•û§f«‘ýþ Å‘Ï´øu´¤Øjäfn\BWË¥ßÚýM5JäÝô+jt)ß»ÃýP¾s¯ „®]AÛ×@(ÆökÙH¬ãµ~7šo¶ãB +÷H[ŽXAÉ"‹˜”pÕô±©iH\uÊl)—͆ùÿì—Ar#7…÷9….`„\çs„,“Êfî_õ³[ã1;1Dv©©"üÏ&#Ë’òéùáá!VPd3Ø~*,-±‰åÖõð…‹9Sý-yº=‹iˆK°2”Àžäu7tT +$ë4º$Ôð4­¹˜Y aôäˆÚ݃d#Ôšò3¨°U~Zâ±òc'(Ó%np±ÁÅ.~àZ;#D(h…Úeݲ¡ê-Ö}µwhŒ*;}»¹ 3 P*òìK£%憘Ę2O»!獵©›&eaK(D À½%±ÈÀq`V³>žŽ²ùW»ŠÎ!¦Ð[m ,‹´vǾ¨e¥#+Ý^醒!‹åßËò÷°0¤!–±ÜFM4 Á‘·²“ˆ³'W¸«y¿Ø‘+r®¯IfV¬GÌA¢Î,í—žožŠ¥*„œ,i§Ô´ÞG5€R6nÁPËÛÍŒ¾nÕµÄCeâAUÛÎ\+F„?Wì«Îȉ5vèãÅ1àôåü«NxªþQ‡“— +Î/òWº¢*õJ&¶¼xäÅ[§dþßÒúKµ²¥ÅÉÄ /6¼xàÅÞ¯£¯&@œ®ï¥ŽØ28Î<ªpgâ†læC†êSÛÓ¬/èj®n¼9!×ç’‰VöD›(ïeË‚!÷£u‚¬.‹¢ÓÏ+ëYÌRŽ;1—" qLPbuÔíïßÞ˜A˜ïÏSÝá”öç¿Õûýoõs¿×»}ÿóŸrØÄ Zø ‡t£ÔMêq¦?”x×bû©Þmq×i{Cº}öþïö-¹~³ÏÖ——/¿?þñAï?ÐþÙü/)î«D”orSë7Þz«HZ—“‘›Òþ)åø§”^n^º“ꋨðzKt_M,±K¼ÔiBuJxØÓ‹Š&èÉ›S_ãe2”JªhûøgTPKLGbº½°bq@%š®X°ˆÕ4Ÿ/V +ë’JÜwÄ:úÖ梔’£©s˜ œ¶ÃƇ‡ýeD®O­Œ¸ÈÇ]7Ò'ìºë+­’‹ž$ÞßÑi@ÒËXÍ›¬îK¼LÚ*[ =~3âS4׉Ù6®§hv³œ#ÖųW]Ë /xñƒ÷« )ÅÒ·ï:{Y3L_×»;êüH±@Éut¦Þu)Q [ß«<|a‘¨ %ÄþÔ­ãaÄZ€s²Ž)®i¶+’£ÝLÈ:‘î—3©ÖüíÍTÓ×ÜEê' ¤ÚeúrÃË^îë+œhš¸ê_7MØßV&‘š);êjþ<ìÏî +|fP(ð + eG6怊µœk<ýäˆ_[⟫k¤Ð×ë+YMOJ¼¿cêÄ!:jÿc¿l’+Ém ¼÷)tà €ÀÚG˜#xi‡7sÿ£¤Q‹5ñ ²¢X +rµ~Þ+} %2ìiGÑűm%Hu«6aþ$¡§ûûL‹8@S¤ˆæFÞ¸þ4ts|Ó& ¸–HÃ+ÎX $äǃc¦Ž«÷ø\:>1ÊûŠöªBRÌûøof +mRé¹Êê–¡X8ÛuË™ü6Š¼až›Íë¤ +VÃûs¥Ms@KØWÃ:mr»ú»_´A¡èŠkŽZb:ÓÛ¥ú0F[°AM?{ÅÝ=1Ç3^ð(BÁèŒ[SÇÆ}o“XÎÀÒžkÅG¼“¹qBð¶.Þ¤î3µ­àV2>úRåÛĉvl¾q÷Ù.Ÿ3Ú゘(a%ÿ©F‚X’As O¤‰ÍŸ$UømbÃk‚Th#bÎþîšËÃÄ onxó‰7ñFóåêghߊ×oÊ %ÝŠ‡'¼™M$õŸfÆÇGÆÜó‰˜fLj¾t%ï4ã +¨ýÃcÅCt'ŽF¼äâíUŠ÷kU!Sí/Óã9U ŽOÑg, XoS[±bKÎØ­¸êN“”ÁŒƒÍ[2 k²¯XgÆFPƒj¼dÞ%…Ä1±^V…v7Ob9ËP‚dÈáæ-©ccàBQÑüäÍ-o>óæ·N§˜ésÿ¼[&¡Ó#•¼xÇNQÀJpz¬¸tœR KÐÕ¿¢mXsÚO¬ù‹õCS¨kë,\5 H +îÛÑ/kúÙ}»—rŒžrYžî>“$¼-Õê'Ìãõˬö#y`Àl‘E¬Vyª‚Ré;ðBóõ' =~Í,†Fû4ˆã˜³¢ÜÑðh*w mH¡ý$,QžÜu†¦Î4s\Õ/³¦'çJªPê6.v@¦(Ö–Ü0?5òãµl¦ïV(ù§®Š{›ÆÀ%,9«i·2d©}%¬sIñt¬aÍe`(9ëŒØ + § 2L ‹™2VÍa¯hhJþÓ°ä¬H¼]õå”!†çÛz:æÄ ¢Qñùš1µÄt&¦ÞŒÏ^12ãï¼b?U$°´“»qRHéM/gžvg, ±œˆehÆ»ïèÇäE($¾Ú*^Ñ^e K&ˆ©­3Z­P•¶ªsu –LM %²á‹<§Z-ÒñÛj—]õN¼‘"ªñV¼ß-š •­ŒÍŒûÙ!-°œ¥ñæ/Þ0;ÄŸó“´CéÎÖ¯¤üh½¼ªƒ”|ÓJä W§úàLIØÊF%˜ÑÀê€foùî¼ C]|Äéå¬/¬å•†WN¼òÅ›bâã5Ú/”7=·%¦†˜NÄ4Bì –°O¼Œ†IŠ…N¶`®‘”°Ÿ5—µÄt&¦·FÇýKnLqißÎÙCª9"žœ÷\­BÉ?Ez+ߪ•­Í1 +Œí—SÑ”ô%­A˜ýEûX +˜IxºýZ¹áÒójéf›™ŒÔˆAUŒÌxDß„r-@5H¸­‚S­ÞCS-ûÒQt¥Ë©ñR³.82ñç \÷Ô0-åȗ͉j74Œˆ›Ð¾‹ú¡14áo¶Í Ó€ßÓïÔÛJÃZ@0÷ýw™P&+PG1qO+‚‘AStÅMéí3‹%"¤R‚š¶b±dÌ ñ]ôÀÆݹâ8 ¨ìujT Ž7n=bÒ +UãÖ³`2oÖÓŽW œ )"¹«m¥5àùð’3ödFŽmÅ®æOzº«M±âNéAÊPÌ÷Š‰}-'«}¢ž€‘—öÏÿó·¿³BFüø>y‹f{ÿþoþ¬üó7ìïþ¬·ßÿõßÓŸí½ +*h©v§ò1 ;ž ”ôë ÃY_!¾Ïéx‚úóÒÿÿKNøù]0ÆÇË?>ÿãAŸ_ÐûGþÓ(>>÷¹_þûOÕ%W>ÄWŽøÄ‚O=*¾çÔKàõ´G®‹ZªnDì9¥Œ_å}EÛ°Þºu}ùR~Z¾Sg[Ð÷Ö²‰8çOï|’¸á½s‹‘1T/²¯i—¼uSþlÞßÏwøõ|ÏZqeÚ%êÔ@#E\ÕÃ+Ú†•V>±òë_£BT9~aK†²"$¦¾ý®Cl‚‰~2”¥!–±¼õÝìðß’¨>›ùê„#Z°º•„  -bEb—pÊH¸Ä0ñÓƶ_ ÷‘¡…3^PÂQË>ÄŒUJdlKÕ÷ˆŠø“ú½ë +ÂQÌ­èV OӬ㖘ÏÄÜ#ž{Êmw{î¶xœœ˜0Åz‹ÇI קëÄTU¨›[µ~#¾7ã«5œ¡jhlo‹Ý ,@w*>{ÝG•@ÒN--% d=ùŽfÜÓb¨"Qoÿ°”+óml+$j–ßÈ×ç[4ºV³‡ªPSH» ~I ¸†WÆŠÄÛ͘“ùO%¬i³ˆ[¦†˜NÄÔÇ¡Ì€Ù¢*¼ØÖqAð*ÜóàÑévg;FÎVÝÑDwʸœA¬>MÜðæ†7Ÿxó[¯BlXØÍ ;§‡‰ç–Ê­RÙ<ã¨Dn¶¢ÿª÷4JAb¬ØÓ8ùÇ´Ibì•o¤rÖ®|GŒ—òkh¨úÕ¸E`”¼UÞË~Õ!SÈ+Η¡¢×Ø/µÄt&¦·Kö;!±$ÿðxÈ#ªÏkÿ„[g¾Š;- +ÚFÄŒì½]ƒ»ó›¸klªöôÒMl Z£¨ûºg¯­·GÀím#ðVÄï”ñýËF]åT­%ÅŒ2f%P¼|…þ§ã£{|°öDˆÝ)jÇÀW‡ÇkÄüˆ˜ß^yxÍ7^aJtxÞ ö㟪5byD,oªiÇÌ®ã‚a€L¨ã^€­_žÑãKqÄÅÓQM\~uþjj™Ñ *ÕD^,h^)ê]jþõ~"Fîòö÷o¿·÷ÿcy˜˜êíñïþ^|ûîoûÃßëíÇŸÿü²v¹ÑòõùeëkE†·¯;†Ë§á¢Ÿ¿Þ¹X~C`¼ñ´¼½Lèòæ·¿—O)?u÷Ð÷§ß~£_øö§üBÅýg§ˆûÛ_Ä8t3P¦Øæ/àZÝ^YŸ#ž3¤¼¨k)b?ps’¯VÅHK"0»YRĽ/¨bNÄ î9•°õvÈ-¹¹mCk!à'C¶»ó€ë‘(Vn¼“ã=n|1ƒ‰GG¾X¬ Š¢äQ×ix¿#]ØM­ìàwšÉ»˜ZQ‚㨧mêw¿±~ „ëå17ðâ:–F™.Ž¡W‹ºÏpG;©ˆt·ô÷Ê©º¥ŠoÖ,Ž7’ /÷ù2 ŸôïiŒhxF~Ù|ƒÖ°¼½¹ghª7ôDNÔv´î¸FËhVýÖåå‰z„/£V.G…8SÊujdyD!¥Bµ.9r™M¡kÙj¤œ^Úå†6®A$SBS@Muhž/¨ì#Ñ«n b‚µ)Å+%×(‹'“îb H±v'ì“¡ôš¨O.ff=pSvkÀ½_ƒø¤*<Œ]{‰".ßô,ݯoþ¾ÃÝÛƒRÐÌfä6¡©¡ˆ¦6— P$¸´Qõl¬ýÔååiÌ,aH³ÞýöŠÛóboXü×^0/þˈý™ÎŒ)=‚=10òá£x/FËÚ ‰m'ò©ÔX5‹Š¸·—犨îha?»ÄƒÏj¸BXÙ‡ëaÖX½Þ)­K´lÔÃñ–Öhé-m¡é¾ÙÚo¹ټï4¹ñXwÈåg¬·KĹ¡qnVXwÜ<‚(nŽŒ£r¸Ü‚ý9´o3 c¶5…&‰6)þj,—ëv`ñ¥¥QPî…îˆV¥1¼´}ˆc##(\¢²3¡7,×ÖLÍ!VõÉÙ·æÐÞ¬¸Ôò8Y‡F-¥y¾üLFJÒ¸À”NÛ(÷mß:ÅïêsìdøÎÕsŽ +rtdS:­pz㌈ÓøXïÀT£ê8eQÐ…øpUN(†FÀ(Ûõq'â=¦&+Äò€XöpÜÍ^~pU‘ІŠjÄñˆR6p´-W×µlMÌ *¤ ^sm'+„5à^z¦ÒS½ý–íR9‘?¤s4CP¡ 5¦Ì¹.€ÈŽgäXзõD]B¨B¡PÓ¥†£-M_Éï¾æ#f÷ Ûʹ½x/ç·CqkË£_Võäè‘"Ž¶´gh²ûEãI¶3ܛѶ¦éÀì@«ÛY¢Ä( +bèwÊv©Ü8QWòæÓ4RŪa+~u!Ú}"_³L‡XPÀ—h˃˜•¡:ѯt¶}]-t6ïjþœmÄ;ÛðÄgWhj™FhBQ PoQÜ}à¥5^zÄK_‡ÇXAT¨JÁܘ’_%Ÿår+Èqóç”TW× P$IŸˆOù±whX¶ÏÃq30´Dµ˜UÝ+,S¥èØúåˆÇq,…@©~|ÿ¤G*ÅŠÍ«c+¸•w{ñn*bÚ°“ÿ«ÔÅ‹›ÇÛ +­7ærû¯ÿþí÷Ųý3ÝgÜ‹ôòøw³?¾}÷÷ýáoööãÏ~bhýþÝae}`B>¾;s—rYúŸ?ñ~s£bù ñFÓò_¨Ë›ßþ^>¦øñþ¨?ÝÞŸ~ÿùý>~áÛ{Ë/ßÜýggûÛ_èýºk_˜© Õ_u}8éGæM@#Ä«[Ù}Ý—·-ï.LFâùüˆµ¹ŽnM b?¾ª\7Ÿê.+uïD|¿ ç)åÃ$‰8VyŸ‘/³Šs£AJm…¯¦x\u‘ ¡¹ýoÇc¬‚@ÒžÖ~¹ŽG"fè¥ô<^‘ÎÜXq1·LíMÙ£tï3´GÙlˆ¸mšÚD{Ìü™™¢ŽÛc̤ß½i Šq±æ¸­·ÄmÇ ƒcy§Lªbu)\­Tl¡~bݽ‘.¯jÝ `ªPN×"²6NtR*pŠÚÃÚÀz&óeUhÝ‚1l}Å)JKeÀ ‘ÍÐzU®›ïÅ3ŠWŸc'Åw®¢æÞ$(¤ HÄñ^Zã¥G¼´aÁ#%Ü%Ðð(E å—tî‘MLÆï¢ßÁŽ[Ù0¯ñò#^~{¥ ·MD]Ö/ƒyâ£x¿Ð/¦©¬„3ù/«ýË~Ù$7’ÜPxïSð#‘ø]ûs/íðfîá,qF“eªªP£ÐÓ‹VKj’ýññáá¨L>Ô«ÑŠZŒGb¥@CŠí–vZžÑ„K+\zlæYÃioµð7 1,lUä­W€Ùûxv¥JÉA€žYø´•|jBT«•µÎ"A¦*•’Cu6ü;½•ò©U6q##.¯錰X|\Hãeò°yRzZøáÉó—Äs®éD¬+bˆÓ]ç}<[’¬˜4–™XÖÄòNÙšEVÓîèŠf€¥ò¸àTêå@)qj¨Ã6©3m¬2´Å¤YÞñ:b‘Z›¹^—pàZ®Ž:7Gú–H4WàRÞ”ñJœ´ÊçNüe^”Ÿ?LÄ<_¿ßTªlci Â~ê{ÝFŽñH,4q +Úy›Xgb]ëñ´C¦dýYÍã{*»Šl|©£±4â:û›'ú¶ðÃýÁ_Ï[N'b]ëDœí¹%Õ¸ÎEdâvùÅyfªÙ’Á…RMÚøW-åajÐðãúäñßužˆ›Æ¨{ÿí/èôü= ÛÇï/ö÷ü:^÷·ñbßþùŸUÆ#D£gþwZ©1úìSÀåMòøúùC´§ËOcÆÚ‡PËx[D|þ½¼Moí÷ß.O{>úãÛß_æ÷ïùã…å„x~KL>þµ’EÀë-ÍÅ%+,2²þ åñÎÂ2ίN¡ñý†…ƒA¤%Ÿw0ž7,":%Uøj}ÝÆÔaêá:ÂûÒó­ñ8Üd3&ns×P÷~±Ä/O¼¼âå?y¿è„Jä«»KÃö êWk{êÒ5Eàóx– XVÀ²Kâ1oÈYßPbAæ=ÝËŸ&Þ}è^ˆ>EzµÆ/M¼´â¥ÇVD°KšFðQJ_õÑ®-êd„4…n-[NÜn}·'n×’û‘b¸\Q3Çl«´›5† ‡A`lG·ik:ÓÒÅ|C}ëM]è¸6ÚÅžòng?3õuNPÃJSWУÄ[ÚØ>ƒ‚g`^ó㘭ÊåíT‰ÇÕÑ.?Eò¦F@´JËÙ ¼Çå1qXaüq²©´äò˜ˆe&–5±l¯—Çâ/–‡ò(@ñ-‹¼"„‹"v†±ò*¹ÂxF¡ÉSoVÉÇ6\ÑúÏ2©+˜¬R *xâÕkB!Ûq|¢i#ØÜ+YØ:¸$~¸c 2 ö¬gþÁK3/­yiøjyc´â¸|Þ&^šxiÅK-ûJo0ZñÕyvmÁ¦Vo'—ò/A³,Ín©oµøå@é›X¸…&ö—Ät˜8 5TpE¾Ú31Oļ"æĬˆ¸²ñ¶ ^jð¬‹Z?Ãíòp+x8r¥ƒc4 +ÎZÛãfýÝGÿ!Í®[ê n‰¾×LÝ÷ˆT<õð§'x&æ51Ï_î + ˆžv ›2t®´Ÿ¤ÇÕhâýÖá +ÔÛÅsÝ&öt̼M6 5Ý$Ö™X×ÄzŒxÂ_ôg=3[wllÖ[ø~¹&HгR|ÔÄ·+ÒÒ@C`²J½Ç †{ßz†î#þqB­X·´(ZÉÃf`úÖjù݃΀³@»¡ÄÒx\~påMõE@´B½r9"%>¼ä®?6ªµö.·ðɦ··Û÷/Ðn~y›8“˜ a%S(Cç^)ÛT`È\É1ö‡YngÏûnOÅÌK± Aøå>žxiâ¥/=6÷stˆèYÅ<ÊúÓ¿ÿç†ñ¶Ì §è{âAçŠ-™¶[ö÷‘ÚÅ2b?Lì›ï#þ±)¨´¤üLÄ2ËšX¶ˆ'¯ì$~úñµÆŒ˜æÄçÜéL¬kb}lTâS‰Å†sâº"FVØWœ¶çvÍÝ´­]ÞÕŽª›ú×€½|ôªÔ…¥é8²]7eÄnâíö³¯YæxË3âÄ> +ÔÛÅÄëÞ£qžÃÒôžÔµó +Ð,±NÀºÖ=;þBËY:öü¤£Ãį—³&ö§²9±hbA‚`I5þtÏļ&æÇ¡8þn-vpwª£1ƒHKjÅÓMäD㣠+¿¢Xib¥+ýÉúÅÄ9r!7ŽJì=͈sŽ¤¿zª9Ht×D|–‡­6µ:]¢ÞÙ±t Q+Ô×W h¡d«w( *¸â[‰÷£ù¾ Ub;‹w÷µmó´ÃŒØÞwßj˜§ÞÑ;gÄG“bcsìrpFªª"u2BA‰¶š%ͼ´æ¥ mOmî½iš‡½ð†ëHFó¡J]Âx€R©='0NŽBSWX0‰;‡‚åÇ9[î\`í’$Ås;‘xÚÀ+ây×ÉDü_ö«&Éq›‡îsŠ¾@@`#̲L*›¹Õµ§{¨¯“*K]äTÓc»eùùõãûábnÿ:;‰solÑN:+â.¿¯vKu›XèЉA©z{¿Ò‰3d”…œØ׆ïФ]ÄÒ"–=bùÊS·ÇT (6ñø¢ç¬Øº€Ç¬8l@¤}+ž†âŬأ.±¬dÅH, !¶ •ÉÖ˜¢œ\¿Y´3Ö5N YK¨ˆO†‡ƒã~ŽWCL!×(9æ’D¹xž>¬äí²D]bBUŠß)§î?Ž/áØ[¼d鯤y¯§Š* œWR…9ǘ[S€íø +× * ³¡=‹5ŠºäåÒâªv ·ÍtƒFÜ +A¡²Pç$ ’ènÄ­&¨AL;ÄÔ U´ý6¬zÚÔ´‹xÌÔ"Ä› gOŽuTA–—z·Ž¼ØàÅ^|ëúDfÀ~9¸9FRN¸²ƒ+#ôŠ‚æ¤Ü”¹ì)‡%ßlû\±‰';ÉE¡y`æTÀÿ…ÝçÄcV#Π(A¿œÏ&œßZîF{aÔQ%Š·#¾28¼²¡…Á§ßê–+™† u!cÛdL¹,Õ*hlÒ"–=bé!ÞÇ݈µ=›¡+56+u¥þS€ +E‚øÀË-^Þãå†ÜµCâªgíKwØînj+vKļé¡PÖ±×΢ÛGÿóÛïþ}˜èñ:ùd}ý›ßì?¿ù}¿ûÍÞ¾ÿõïîï§@¤Ì§âÔ²ÁlXÚ…üççË2¶gþÖüNÔö/iyûäÇÿÛ×ôšùñª¿-ÿ¸üñøÇ>žÐû½·7´\<;×Tßþþ?«/¼¹ó·1?ý¹VHôÞ¹ëiÀzO·%PE=,·/HJ½;‘/\!¡tsc“X°( !¡†¹Ì;Àüö jxÛœ)•Hw$ó«3.Cá¼JowýæÛCãJKK`◮✠¸)7g,#p ›%žføèÀeÓÓ k8ƒ)>Ëoç° ¹o$DÐ͸³FÖ•ÁØA‹a±ÍI&Pìîd»ÊwWÛ›œpJàëÙ‚†Dñ+l¡TsíaÇ°…‹{¸øÖq† ÁV„L¶3xÉ©’ïŽà+“WÈãŽ3å¨p7+%G•aÆŽc.áz<Û¦Kb󤵻€¤…+{¸ÒËŠ++/©‚T«=ÀÃr蕲—²BÄÙ])+Ä<+¤›Äó, DÞ$¥Ëðp×éq‡'ú•âvÆ]À1ìÕ7YP}§«–xýnû’J‰†ÅEv¶cx,Ýb‡JwÇñu’àŒPjØî`øõ5„A{˜p¼Q5P Öæ”…RÙÑ‘›OÁ¤X×9qd +l|\ÑE JxD/zZÍH7Ñ” {M+Q$ÿ—r(Â*ø4Â/4µW‘ ¡v‹Ï4æLÀ5`ø:Àí’“D¸å4ç¾ Osè8g@Ñ®K¼4.eØкEm¢æ#À¬ ³"HÖã`ž°(¨ÇRÝÒp!À› 'ŒæÆYAt bL¡AHuJ’­£ßÅš;'oî¹Ül \làâ.þ„‚õ¸¸Y —–àÕv'gõÖž5Ìæ –@£|øÒÒ¾ZpPUÀœhI0f¨…?¾ç9—ÐCÀmÒIXv€e é8p-w÷à £ÙƒÃ”Iœ…{ö¬?ñ_ ÏÚ|Ò]ÏÍ|Âe±uÌD éJ€½ó”ŠÝÞ> `Nþ[^gÈ©AÕtÜ)?áb ÷pñí¹—]ª^,ÙÖ)ÀâåÁ9Ìx5õZ)7÷õ}``w€ñð“À¨ÅùÍÃóÙi üaÂHvrA*wˆËŽÜÙê—A)G…gÂW+d/ëèW¨Ük×,À¬ uv­PºŠ˜Æ ¶ÌHZ#ÀŸgNZÀ²,o3wíÈ@HžQ«®…3nÆ–F!“-D°Põ‹–1 W„¥ EL Ø’3Œ 5 -~Ñ:Vò’K,V%8«wµ”µ³pÁâi°QuçTœ]:{ÇΠ.íàÒO¸¡vÜÒŽ¥0¥vÕ j +fç\láâ.ö¤p¥3,ÇîjV¶\g76îºÃ`0<ä¿Ns@TîIb¸¡KBOKBCIC¹—á.6pqò‚%ȱ;›ÿÖdõff/ŒPSTtfÌ +¥JtØæÌÉ@2E §§N·ÇMÀ², ม¡Ö…$!ævÖ=sÃö{„÷ÊDÞò¢V åeyqe…XÉ‚ÍÏ›)Þ,ßÓ{(>oæW–|ÜÙ§\+ä¤QžÐ –cx¹çl$ºŒ“e0¥`dœÄ»g¹Â+T ÷æ'³ƒóm„Ùí>aV0å…êÃzQ@ÊÍm/‰‘÷L jצ‘'ÿm41>ÝaøÈÝ^y4‰D…r>÷åÄPÙnÄIýÆœ¡>ŽŠ§Ìtì—µ‡³všƒRŽ¤0ßaã¬@%î{EsØIa l,•Ôœ³m¹¨XIë ¡Õ¦&£_™~Ø™Ó âÌ@i‹‹~û]²W8|¼Nˆôþú7¿Ù~óû~÷›½}ÿëß]ÌnAĬ¸#ƒ?È°í#üƒäç“íç;Ûƒ ¾+¼!ƒfÙîýþÿö-=;>^ËùqõãáÇ}>žmñxCKÅã±Säùó÷NzžIþ—d¬þ-æמn5ïF|mm-¾¿Äx±Å‹{¼øÖ1£íXM [k-€y˦Uø%õb…x»†/D\ÍïäGxÄÊ FÚE<ٜ͘-% +TÑôíÁsôíK9¨UûÏ£ +S¿SŠœí¢™ÐL³aUhÈ1‚­Ä°&ýÔwŠiÎ'ƒTJ˜Ïxñíšð­KåGリqŠ±çGuo³ò•ˆ¹AÌ;Ä<€Øû($A¾×)®=yø?öË&9–ÜÂ{ŸB0Lø]ûs/íðfîa–4UM4š¬è*ñäÕ“ÔÝ¥^"óC¿ Ãh[0*¤BccÐ2Q±Ù˜;¹%š±c¿w1ˆã%£BœIò̘Q §qäã“ØvLôWEôæa‘ÛÞºÓ[zëׄÌ^Î’¨êÈK Ø !˜SžˆH¸tjPœ3UÖ^uÛŠ‹Ç¥£Ý^uûh›+ç8ÜÐ0“+Üú“JˆÅ×pü•áÆX@Ø£¯† 뮂&ºë¸0è&t¤xzçî÷[ g¼`Ûƒ8Y"Å"€]mž$æ‚à*w·ÝNïKïÜë.O732”!æjµáŽŒ÷£ÏÕ† Ç;W1ú0xå è–Œˆ^tµÈøè¸ÐÂs®ˆgœ­8+XÃñŒ§qâv„OXb6>ì&³m1e§XŠe&ݬ‚§š0µVó‚ˆi +­b¢o×4j¼ÝŒ§³íöà ¬”`Æ—v;½S ý ¥„‚ i¦~V`®5ÓÖ5¨>†¶EnŽ1ýœ•z³”bº\°3¼@i:VüRï.‘iº´P±ªD-w¹#^=@³±p>îáÒßIuÆÉŽ«}µáT-¥1vòLÉ ãk´p—©=ŒwnáBC¨AqNÙ°´vWЄ/tŸ?™±“†3¾„_+B ‹cA³÷Íóq9¯£8 “Rë”i¼µ¿óûK÷úõYJtÌ­l­™ùí1ñ“ž´¹fŠbé3ö¨î–ô1j¿Ck¦‚6‚"ȯè +. +T(H·oQ®’hÆd=±ŒÓmæ)Þíã¤âÿE@S¸ož["ÅÚ bÉÄn6«K&ÅVš&¬Ÿ+FE·*š)ÜòMb`b™|l# _6;̃4º»@vzëNo=è­_zC; aÍäñ‰ù®“Ž Bãd[Â\ È<ùO­´×JG­´Ó:œíÌ¡ô,ƒ +•T=×úÙqÿ1zÝÆuµ eâe¯XŽŠåÜŒgüÌÖ3Ø¥—þN’¨™?õÖ½ÞzÔ[ßžnÝQ­ìÔÊA­L¨Í—ÁŒ +¨÷oÝ>…g’íýa3k½½5®læN>Å1tÅéî(c¿Êà EünV»4'*0Ú8‹—òñÿ ón¦p oÑŒÏNx船ùÆŽ °æ”È©n:.ÔZ˜§ýp³€WgÄKwmFPoNEñ\ñÛóGñ° +ôì1éàG¼ºq#Ÿf÷á|g¨òñTÈÄí¤Ö Â2QpºÛˆ»ÐqH,#˜ ƒnBó€š#ˆÐÝ3Þé} „3Acƒ¦<4ÃtÇ=Î`;Ýqf0Bc Ì°"õ÷Oké9ÅöPq=­8$ŸT—çÖrÅ9QËqh¨Q_?é*Ê5[R†hÿ.èÝ-Šc˜ §™ýv|Èvctµ%föõæÛg ä-R|ÖÁÃn›Sw[¾6¦Žhæ÷2ÚÏuD²~Ã.’}Ìf²×+G½ò6hŒc¢ÍÐÙ“Dìj3uœƒ9â²Æ˜»ˆÂùºõ'•HíEqé §h˜ˆØ© -%Ú’W§XóˆƒWœ±VQΣ˜ ƒnBG›7­øþ{£ôfVÉ4c$ \qÙæíôÎð{ÈjÖ€k YmÍùŠÙx¾“ü3“l¯YÃünÆÓ<<& :7Âã~‰0÷zgøò½›ùí‰v:!â{Îcx.ÈÆàqœjël\ºž#Ážjc\[gÄŽ×hïø¢˜ 1h5<éV4D?B«´±â—bø舙 ?q„lO²<#f(¦a®­Èï +¥xËÔhÂÅ˘"_=sh¨Qw¼øÛ-ì jäàåjÃû¾9†™öçpi¯–Žjéí; œ1º5–›oº’ËÇÂ.À·ÜU|á…”¯åºbæz÷Öýàœ(Pš†ÇÆŸ9<½urÝNo…¥¬à¤7÷ܥɦ… +gJ¶l® g ©Aß“lsY愈۸¡—qņÃ&%ÂáûÎD(ôñZYÌhÐô#&¤ug|‰E£þŸýöŸ¿ýýý]ï?'nõýç¿õgý㟿õÇþÞŸõöû¿þû—R{¶‚¶žEûApiƒð²¹…Š|}ãÅ>±}‹ÐgùÇ e{øû¿ÛßÈ}:üôýcïïþøòó9Ÿßm¿âãûQ||ÝDúöï¿\6äï @µÙíÿSÆ=÷«±àÍj¯D–YDïQ”Fqº[íÞíá o Õ\8ÉÖåʈ-Õë§Õ>¬ëf«PÓp¶´WKGµ4šíUfŠÿr;¦±Ö«ÚK+߸m¯¡ +¶°1Îj½Ui?e´´á¦M{÷¡ÚKs·¢Þ½ì”9¹kq6ô׬…›¶Þ|É +k*ÚéÄì*‰»€–Ûi碌 g(Î#v7éá`ãó;lŸÍ%4Ä‚K'.uŒËXx‹aaŒê­{½õ¨·¾=¯¸RO« k®"X»{¼gå†î­]$ú÷Ðï”òA)•jë96q­Ã‘iÈ,_$wÅÅ£V;ë…;7Ì´So7Úk y˜íÔž=¡2¦‰ûg™MÛf,Å¢[Ñ¿FÐÜÅ+º‚K'_Š2b§x²†gËN±ËÌŒEû=d™X ´…m¼¢bsPRÌä +„n–gÆ\´gÅù,A”¹ÔnT‰ž º¤€uÎÓäÔ?]CGœ¦µòˆ×ÐíäŒß?(Fh+¾Ê{ÓN1ÓnÆñ—†‡¡´]EKÒ¥R»#®tCg ZùÅs©_Iý=µfb5¨h-Q§»9H Ìë˜.×Q¬ª”ŠàJáDÄXûÍÑF]7«÷îöLÌwEwðÖè¦[²ïÒy8ßÝÁ¥+F ¶î2ŸõÄfõ2O§ÄÛã2&N—¤È5¯qQðV"G|꥽^:ꥷïk ÃþjÍÄ=Ñ´tóä¹ëœú§k¨¸žVüØvZ±… qÚÀíG‚K…BzûÒ]>ŽÐ8¶ðzŠ»…à½îõÖ£Þú<†¯õpWkšÓÈšŽ3m™˜à* ÅÄr\©"¬eêe£Î=|û5w¥…û«Ö¢ˆXÐÃdJÌxçáÉX›áwÙ)–ƒbù%gÌ…A}<âIÁ3#~Õ +R,UT(mÁ‰´æJP›'RÌ¥Q ˆbŨب˜mŒ@²,GÁò6°ñµw]òfÛE‹wví"µl  3Å„´~' »cZñÃî¸j¾V¡ +Þí†Kc¸AkxûQw¥#jzø¬Þ¦8,Œ +X0 w7˜H¸m *v©>rÃdÁÝÏ•ÔŸ„Ñ|SK꽌uÜÆK¹¡8íBp§b:(¦Å ó7ߌódÛõ4®à¢à­Œ’mÒ’íRjïŽb™88a+¨˜Ü½u{Z›;>C^s-·ÓûNoÝé­½õKo¤VþÇ~¹$×’Û@tîUh†Iø½„^‚‡vxÒû0®ô¤fE\ˆ,_RA¶=zúU)…—È<ðˈÞeT僫']î7î¼S#P©?vj¼ŽÁÙÖÏwf ãÕÇÑ]½ßô[2 +R­aàÁÆaà1ÿÆó% .¹5‚_5iÄ“KøµK®J‚jrToH•¾)SmÄÜ(æ‹bRœýMÚ1µ‚é*˜z#žk +¯ Ï¢ Má%Ìш7"K*j´m7ãì™Î©6°êOcÿÂ6îsÅz[±†›–€INâvŸqBŽVm;B+PJ^Í;S ¹¸#òÒùÞæ³ox½@ÎðzÓmƒó º­Ñ;Äg¡wŒ8hâ5÷Ðkó­ÊTlÕŠóFÜnÆqùPÍÀ’Eó½Ûp+gkì?‚úmxxZÆsGKÀè tDµw¹q«)ï–»æßÕfÙ†ö[séYø^Ÿ—¼Ù½‚'¹A’”€Õ§±ÎEñÐåö'ŠˆóêXr-aË­@Ê!þÙÏ90ª"ˆ…ç掎ð#£bîEð¨ÞNDä„œe}Ïóîy¡·¤Õ‰ÖèÅF/^ôâ[·”Y@1ª¸-·M +Hâþ|G¢õ'ÕYâ¤W÷°>•„ÊQ­áŠSOÝr"úÚäˆã8­šøÖQßÃÃÇg?ÙFÇÉF)ååí1ÉÔ’ç0óm<>ö yšÿó²re_Ëö¦{,´ççŠ +´ÝP`róq¡`Æo÷8{u'Q¢Ç”“æ[‘ûžv×¾E¸ Äž^ Ít»’RLÙîÝÍv¨QLÅô6PøV¼FÃDÛlÛiV%IäÝÛ×Sfͦ·óW#ÅU€ ù°#RV¨DAcì–üÕD#æmÜÄŒ odâ(Ñ6tÄãîÂbáÖí¨Øg¬ïgÌAŠëQ®8Œ#!Y>(‡+{3œÛ¦ŒÀ¤Ø-çÚ*®WÅõ­SÎsqB@5V¼ßŒOŒ‰ dY»®VüÙì¦â4xŽÄ^w,‹7ïªx$Ú¾Q,Žl)ŸTwæ>Ö\#lÓÛئO·õQÅõ¢¸6ŠãQ°ŠâÝ%J>_ãâçlÝìÓÎBÅó@¾U<æˆØÃçåÄiíQÍ!HC +ÚlëªùÓˆÑ|ïN·›h/¢æ­ñY÷¥—[½|ÕËÝŒ¸«7ô®³šÔ`¶kò½tÑKC‰&þ“)$Ÿ ·íÀ#©B–r’b÷q©6ó—bjÓU1õÏåá +˜1¤ËYŸι×m4ã£zî0ö§‹ôY¸¶zëUo}ûAÿRÊ@–Ã昳qSý{\;Svz·ÕÅÑÈA÷~8AÕFðŽ5WAr;⬦„Àµ,>>¯ç7Šù¢˜Å1ÀÈOB5ó–¸8V̸6ŠëEq™±2h)Åða[‡8K,§µÆÞp¶–ò!˜VÕÀŒƒm[ãݱm‹3ØO9U9„!„xjä† ó÷Dp÷È%÷Ý6N2$¬}ª¤V/]õÒ[ÇsÏ …šòI¬~fP9hëªxŸukøŒES´u;*„$²œÞç&[­K4í<˜ÅëÛ¹ªÏØòI÷†P•òÄW çñ³ɦ·óXCÂd(Ù‚ª=FäÕí1ËæW¢ŒÀ»Z»ù06Û02ƒ +ÕüiÄHñfã}”2g=(ýHR +ãmÆI×Ηµ|QËCó-À2€iÃ…ÜÇ´±BŽý«`Dy¡­CHÎV@Uñï>f[1.ã¯ér«˜¯Šù­—fwõ†óõè-%H²=½{TöŠoÚQþõì¥åh6Ë¿†…ì°–±I:É ’(…ÇæŽù`P5nc½­X»1Ôp1þ¦éœc“ÝEû‡Ð0­/÷0+”!¶ô°`‰b¿œ ìŠÃ{s; g« %œïnÐsÎyq\½Q’‡wWGäM£T‘ûe±‡Úœn8}!‰¬žíÌ"öc³$ra:4;8¨øcÏÿ$À®ÞÈýo¤ØŸÎ¹?ã}\¡¢ËsbæŒ%Aµ“²â¬£È²d;Cm5„œˆÎPKÉO ‰Øw £ 1e¼mæT)²<ƒoSpHì”Ýh‘?õb«¯z±Ñ»<Í<yý|'¦b´qŸzk«·^õÖïç;µßÈ ¢¼åUTüÎຼßæm\UŸ±¤ðŽûòÄ0õˆ*©8£U Zc#¸QÌÅ<âÉ°ö9mŸ[ÃJŽégŌDzø»­+Âåí²{lsÏÀ´¬†÷™Š™Ï:@µ€[Å;"ÅaåáóÍü³Q®!ph»á˜è+¡‰ï;±iláýø‡°<~KÀñ³f<•Ø<Š+qXû%' +.½Ëîÿ1ñßÆØ@7ïêÀ–4Ÿ3cJŽñÉVÓD£½xÑ‹_zãˆ@H"}oU¬â)$ÁˆøwKR;ð¨; %ªúÖYÎÐ=·î¸‹C<'Ðú¸¶ÏŒâs¢Õ¸6­9ŽË aP8’¶qewZ4ãݺN=‡%I4_¼íˆgŠ›tv„†§PÑúŠ¹UÌWÅÜSŒw'ªuδƚžËàHñƒ…©HHï_ó¾7~ÂÃf?Ëkc,÷œ€J ZcÇf¦ä>.À/¨¹W–Žr,ÑÒÝ6p·âFÌð]ÅÇ ·_Å–çE„¹‡#º1<ìŠõ1ì‘´ïã}àÒŠ„ì¾aÓ1âÏÚøÕÞ𫆴¶Ù}¤®–ÓA×F6-ý‹nÅ”4Qàˆy¾ !W.órÏœ1 +X +zËd3.¹¿yÊûåñ"¶‘gq®«‘xjV0 ¥XÝgm^2¨!hîˆm”2$.}êÅV/^õb£w¹‡ ÏqD?–è?ì—Ar#¹D÷} +]`0 €ÀzŽÐG˜åțïñYRÛfE.V¨¨ {þ¶$«ÊÏP23áKi˜@<öâk4|i‘·z5ѱ*¦Y=„êz—=œºÞ´u%–¢+iXÁ‡g]:9ã¸e +Ö–Yht“oxŸÙ”¶ùæíÓí×–t»ùýçöoÖ–ùöj}·?ÞýxøvŸ·gÛŸx\ÐÎâñ¸ÎˆËíŸÝgɵpç­¾¦:l,Óû';AqõCâIòÉ@Ëý¬|J{ÑŠ{ÑɬE[sH;Ûl«ý¤4Z Wæ’ 'Y‡x-EVHZƒ–Í«ÏY­†ëÖ®-ùÕ;NÜ4H‘…B™m{§Ž®Á—® ˆ9TŌĞ$/Dì +\0PEãéÑã}î×ßf=ã³þmÒCˆ@r ÐkúDót;›…ŠÈEäPÚëžXÏyqjˆÓŽ8ÝŽ½x«Ã¦QB_çª,¥žºž ‡ ¨&‡¤5Ì)}ØA¬Äc:Û³Y'€œŽOÝT3F-ǽ¸sóxÁŒk“/Á™›²Çöî¢j¢Zv3ÎXÐe´µph”1,#ñ\½¬ (£‰/ +:!ãp©;ihŸµýlµaÕ«vÍ–¡XNc«å|u'>Öï4ex#ΞC£[ÇÄ} GXß3A*ÑRwý©{R"À9+BZ^ÙóÊKç‹Ä:ºZ^•q%Š†®6¡G¨“/äj[*S º5NÜZþ ¤(…ò·;1>#¾ÒØꪴž¦´w&FOi®UnÄn®rvòÄݯø„¸õ´¾®»Zt9vµ‰R#CJ¡GÌØ.—Ó±¤ºÏe?îjO&G:MoH’KØ~®QEs»ul‘*,+/”Îì 2…y÷1ãn¯xÅ^')μùf,Ä ÂA‚\5ãkSš ¸ŽžqÃÛ³‡†y·\B %2zïØ+¢gÂ_(¢8X]—Ö9u›³YŽѳÑ1úÀÕñæºwÖ‰n × iˆeG,=ã5³Ñ¾68jb ëÄâ'WM@&/%~vÆê×BáÌ…rÎïÄ-Kõ·U¶1q÷\‘gS@£È‹§TEõŸ9íx9s[/òV…`G<^îºE1|¹sÔzÛûŒSKœöÄéÜŒŸ_Gs8ã½m[G³­“x[•Ï%^£ãnâá:VS<žñ<ªð Vˆ¾fÄMÕè……2POÇUs"ä2Q4¼©áM;ÞôΕ¶k¦f(œËB‡Î¶wêRÄ…Jdl'ãy¸ ›‰§uæ+hÀd£=âÂS'$@¥Ã‡¹%æ=1ï}¸‡ø ®®n4\Î TƒU© çîïñ N|¼ŽjK¬{b='Šž°ûBŠ IÃ4£U'>Ëû{G!@*ÇúF \2(ñq•˜¨; –°`úIM4lÃf¼E]Î ÍX,ÑJ{h=y’㬛Ø2Ô¯á•íÂä öÐݦób…œ¹Æ%º×Ðc—†Wv¼Ò5]‡œÆgG:Mfsa ÌKùCÒ¼Ðb·e‡zÇš4ÏŒKÄôËOC NޔĦPÿ¿uŒÚ:œ ¸ŽÎ憶g ýʇUòq[›È# ’YÐÖ¦v3myuÏ«·Sͧ§·ÿ&‹'»—ùvÖ´ùöÙClh(áqž&Þ 8bP!š*ÜM<\µXz’¼ÎŒYî" ž²¼Ë½X¾´Jo϶?ñ¸ Åãq5—Û?;áÈ%mƒA0uú\x©ý ÓþƒLG»Ò<½ŽXísÚÆŠºÍós+jŠ6ĺ#Öó¬V”kà +æ;¡m«Fê1q§ÝGÄWÚQU…ÜOàתèTqO@õ©"®-uÇ ˆç¬†ÕéÍt!—ªE"ö5¨Bâw7Ö–X÷Äz{a¬²IMO©c­ÄfiUÖ“§¹ &nxSÛv¼éƒ7,Z[õ.az¼k¸;=ÆwŠºôŠDó=;ÝájpàD¾†XdL 6ö”<šïY?;˜mkè½õwÖ;Ïh oÅ2ˆ·ëÊ{K, ±ìˆ¥ƒXP §<\¾­$¸!æ17Ä¡(Ö[Š‚òBMx…å:ðŒ-m¹înVS.N¹+Þz3®û‰, k5á-îÄå8<¦q6V…ìa÷™P¬Õ'ØF+âÒ~¹Z@ %`JÐŒÄëÍ­QÆã4Ž·=Ôsó.&þûeInCѽO¡ L€¬çs/íðfîaTË­fFŠÌ©Ìr¢WÝR)KO¨ÿ?žÞJ⹄ÎgìÐ0ÙgÆM³x2ãNÇÔÓ‘˜>NéxnórwÃð +ÅŸ©Šw›&?ÚüF›ÇM@q§Ì U´’©‚{b>óÇÏTE«ñ´oÕCÇHIæ­8cA~Œ·7¡+U±[£¤4ÞÝè;Þw.&)•²¦yÝÖõ¼s"ošXt§‹ÉâUÚÈØØâÄ#º}ÄŠb»ô(šäm§o·x‚Jiéæ}©b:<îèíj›)D—OKÐzª`W¥ît~µ½6¯G£kO¬GbkÛL ÊkÛ†:æÅêNÄ­ŠìÔ„šCCëxâб™Þ^è/$öðŠ†YæÍèg´gY3W+Õ[¶qg³ùé\O³¾èÄÁ˜æÜ‚]b?°öPÄFÉ›Bé¡´°T·\ÆxZÆã*1s(½¨.Ì8žñ[Ä—ZEœvŠ–žë©‚U"æl£˜4@²Ô*V´c¬e«CÉçÎŽ÷ˆ;Þ™£#Ý:Ch*yñ†G’Å«´S£Ø¦ ohÊPe"˜×!n â2Ž¹Y=L”ŸâWå'ˆµ%ªø|î·Þ¿¾èˆéqÇ–ÎX;b=ëÔÆÑ£§¦öµsÚë‘X?Á|錛ÇoaÝH­ÆÓ¾“qÛÉ+¬B-%)?ÝæMÏlžtÄr –bo Lc/S×Hê8ïÖÙ:3`¢ôä¸JÃý„¹#æ1ÿ˜p~ˆA3»[—nÆ!ª;¢åÛ'p»³]¨ +(6ÑÛ¸'æ#1Ÿ#ž›ñ+SÓÛ7ïB{´ù"wŸvWyñfÉ!PÙý®™Ì¥hÒ×0ŠÜYbnÜq6ã ]­5@‘:±9¸$¦v™ŒÏ8ƒÕå§îT‡÷;ë<Ž¤ZÓòC§ƒ™†3~·üÔfIJü=ªxséÔmT0Y+Xõñ¡´ñ~›×äþ´»pñ°sKì¸#ÖžXÄznÄ3핹pã»e|’÷U›Pmw÷÷KmÂÀµü²‰[m¢ÆÓþ«cÞÓ1 ´úÝgè•G‡!ÔñÒ-$a¬[ÙÄv­˜M¡6Þ)<,£¦Vü—z^:òRÇ{3­ F•ÀÛ5|OH‰wšøð5ó¥ÓóÍ]-^¥RNËœ ¯C¼EH!hZÛý]J3éÈÐfY¤Ò‘ÊT†¤ììšÞž§Yï7(†)ñ—¦yl¿oZ\ ãG·Ù6v‚R4ñ`Œälq·áŒ§Tü"4öª%¿‹î0³)Ü X8m+ö”xºe¼š¨‰ß]. +ŒÍ¤k€¡ÝÒͬ¦Ò]1+ £™É8×!öÊ”eÅb]’Mrâ’žVŽ´2¢E÷“óýöDÒwbëšÓFŠØ®¡Iq`ŸèÃoiØ pÃìz;«àC°–*Yóõs×E·W©æÊNª]up“üA¨€š%3^­ž=ÜL½$›Ö)bú+bîʽ!¹zæfga¨†ý¾H 5`¶Ìô^v!Ìôû£UjO¬Gbý´ÊK7®Ä;azÂ]²q§8?ߊ<:pšmëÍ7² JI7nE A3»»_I¬ Up§;c»VÉ TJ¼xŬc(6¡ŠÉ¾–ÍøJwc0¤qzLßÞ€¼†*jzÏ­HìÑÙ÷!ä˜qu¶E:±” +Ô$™ï=>ñ¾†…Ót™÷>1w×e>ÁMâÕÛ‰¯Lª-u¶‰­†§6± pÄ8Ù6W8â¸dJÏ+G^Í÷Òct?›pŽ§ÛØŠ'51cÅÚëX?æTQ=?ïܺíŒM +‘f›w–÷mÇ:Uá³Ùª‡$ö™-»‚bKêðeåç¬C¤´B8>7´§Õ#­~ ªðуgæûƒ[8šKznÜ‘oEÞªªiøC³¬G¬8ãɬ>&^gƯ¦UmE`&ˆåÃ}ˆÛ +¾Œø,ï A´h>7Ça¾SÑü"ê"îREœ.OÃãêâ3®÷ŸkÏ ‚R4ñ ·;«{:ßÓe-?7ÌÀ+Šå¯ô/*B(~²>ÚZt%î€Q@%Þãã?ÿøM ”ðóû¬à†ßÿ#Þ럿ÿoûg¼×ÇŸÿúïa…äóRŒ·¦Ã0¤ÔÏaļ‚‹þø‹}ãñe8~üÿÇF?ÿ}ü•±ß¿ûí±o?ýùßïïóý«Ç¯ø| ÅçÿcÔÜ>þ}L zŠÉpüØô¹ð¸ÿ ùøAòHx§>]“X?í5í +÷—1h5JH }Ö +LmL¼Lw}„’×1Ím-ÒîÛ´«o/ÄGÍÞF¿J¨5SÂĂÏFÞÅ{ÛãÖç´÷”*íˆõ@¬“iQIïöàŽ—:^:ðÒÇ(1¤8˜ÓX¿ÚÓê‘VG´G˜á}á-@­fÝaÅÛOÃÄ µ%§;n']b温Ú'fupÇ,™W$öê÷·Ë^ÇsªHûp3ÖvR…K\K5™q·yÓ^1Þ¼9¯H‰EÁ´lÔÙ¤•Ä?Õtª•ç-èJU0´êñÙ ·îÝÎfPÓ¥û¸à@:‹šÆ\!UáËN¹7Mx£Ûí÷ÊEC°âw*áâxC—±-HÏ+G^ÙBWÞ&‰? âsëý¶h;Uá­ŽO¶ +J–Ñ.9_'ô]ŽÏxÍkB{Ïaô^¡Ü˜kv|vŠ˜vµgŠèjæ´«yêÃ5ÊN»šöÄz$ÖñUæÖâÙv÷Æ]™sæ fÙ|KeAç41n)ës—÷ˆ­ô»•6LäâPMÚÝÄ&Fc‡“ŒóÓçÃKG,b™˜ñ~ÄR´øXÇ‹x–q…Xhé¾F7zÚYÔî‹VªrßM7„VÒ|ðYÜt¼ +(ÕöQ.;Å;•4.¾Ä;]ןɷ;;&‰?O›¿IöMíö¥ëU¬±ˆµ#ÎÏNÓr{í¹²D6ÜHÚÀÑ>ÄRj5÷YÜ¡ æ`s W¨¤w·ã}§ñ=e&ßÎ"&¯ÎŸ‘Ë +´ëwÁ +Lš…òÉÉ>7?9×ÏOô¹‘”VÇ÷Ût ?Óí‘x.3bAWJù´3$â:bÖ^p\!–™1¢U±LXp« ¤;Õ´¸Ôl”oï8Ú¥óe(•6RÄ^õ œ&,búeÇjÉÚï³íH¥#•© IÙ+qr ua1ÇOÃâÚE PKu»à¢=¬·PÈëoe l-~¦¦^o¼l:^“Ä3×Å”I¼ fÀÊu£†Ö +ÓN6aZl«¼±‚ŠotÍqkñtæKêØ4µÄ¯s·>A´#Ö±Î$H3(­î¤Š¸?ÉvR…A³’%ÈÙšùŒö,ë RjÂÃJ<=ÛÛ+ñv HŠB¹;;Þ÷Ž$…&~÷¶u´ïŸlŠ×qWû¥†¿¦†Æ `Ù¨½W@¢ˆ¥>òív _•jà†u4©ñ´{š_7Ýxže†ežm<–z°CsψŸÊj–™Úw^êyéÈK¯ Ï¥ìPMÆøM ÷+Ç1ˆ¹#ΖNŠ@åœx=EHA°’.ÝbŠ`/ð?öË ÉrÜ¢{Ÿâ_À0  ¸öæ^Úáïa¨ÊÕC9„O*$ý Æ^Mwuýê7ÙÉÌ„4Å8ŽØOz|ßHl‘ÕîÏó±ïŠµ¤ñT“žXöÄ2Ô¸ã½2…9!”,ãSîRÍÝšÈÀTÇSb:ÕŽôí|2éˆo/{X@¸›cZã1ñÜ”ð‰¤úÄ¿\1‡®8ë —¶Úwx±â¸Üš#7vÇûŠãR+sâš#îÔØŽÐTðñ½v#±4J=’®¡ñˆ9)hmq·'&7æÌž¸êcÕ2ÞËø˜3åñd›,èOL6ÌųñIKÛé²{3‰ r!·<œ5CJÙ±ð3#þb°54ÚqÖ®2ä46Ã:é +h±?~/í,ï@Ú)¸í¦Ð4´Ý®îÊ +(ôøîž‹^WãÆ€Tð“Ñ ±ìˆeÆ¿ˆZÆ»RzbÙËHã}übGŒ;b|Mį4°I† +û÷ç‚ÄU€Y½T[1+!g»bbF®õqïL7ÊíiO&Å;Ú £§~9áñž»óµÙ§[ýhÏ]œÀ6Ú9Õ@Ë’jµO×H{Íz.s ”ÁÛË3SDjfU0S¸Ä§/Žôl²eH)sœœà¤PÜ(^©4”AÈ‹‡¥¥–¡¦§;Ü©µó&}“D*¸@s§k¥@5! +v9Sýÿn¸ä††€¹šhsû÷@Âç]qçqmïpF ìLɘz`ÚÓ9àk¦à\€P¼ûí$ïñ£k'iß]BrrSbAÛ¤dñ¼$±I,IÇÄÓI|D¼7Å\»¦¨ ‰Ð98WÔ˜‹€°Ž/eb"`?ÇYÊ Ykÿ¼æZ¶?eçš»¸ãÅŽw¼ø;¢AÖ2ž7îž«3‚€Ju3øô8̇[38)”êH¼T<A£ôÑ qmS#¨¥yeq–÷ö´ºþé) s 0cd`÷,ꈧÛx¢]Ý홋we,¨1‰±•ñ†;§Z’WÊwäÄÙL{£m¨»““€Jz<Ôzç„+q¨…Æ¥€ ÿØÖÛ;Ô + ’7x–$®PE_Á½'¤#–±Lxx{u…ùéÒ¸)Ô8g Ä£™veß™h9AKîL;ëÞ¡®JN …¸ÆymœJ·1~Oχçó!Cõî¢ÛâálÁ¹ ‚ OˆeÖY(yã½·­ÝPü>^o¡1Håï#®¨Yãwâl÷ÝæˆüéÏBPY¾¿Lj_ýúúoö³þò×ßìÇþË~Öë_ûçN l_­}Áwbð-m¢$¿ÿ¦%ýcû­õY~ýç4ëöÿþ»ý_Ú¹ñóÕ¯}}÷÷/~ÎÏﶿâû½ß¿6‰¨¾þþ_ÓŠ2nÓµšŠ¼§ b;ÎMO?mZïÚ°"1àÖØQx½û‹ÄœŸ˜FÀë¤}­öðìàØwmí^á©íú¶ý[Ö‘ÀÒóÊžWÎ &ÕÔJ®ÄxsD³ã3 0çšqxe,ÃŒšÒà +w¸Üáò—Çuß›BaöÔ½v¦“]ØbV=+œEÃœ |e‹uÅж—ªâÞäÍ µ9Ývwà‚)T7¬„‹SÂßsîÌNï&£ëépe‡+¯¹Šh…#ÝA + ’w…B¶;‹7Ó\ µ 'Ît2ùîj‰Ëûd˜|nÏAán +Ù¾ÓQ÷Çv){±Y{ó|9+°Y!y×ÚzV jÛ\K `+ +ÕöpQüOg¯ 0J KÔ ÔJ¬Sàmð”‡O‡{mU[gÉk·_•A=,ía©‡}ü +7'ã u>‹;TwÖ<µ+yڿ㘱ÛÂÐbvÐ@q–ì;ÕóïvèP¹Cå*¿FQFšl;¤@Û!ÚØÙN!Px™ìåÔ@ÉÝ¿ëµiƒ†xg¹éI…¿>1PX:`ÙËL»5Ê‘VXŽÓìÛùçnO l7')šÙnÎ,^H,h‰ªÃr<ï³D°$ÌaAµB $p°PÛ&š*CmxFà¹^öÁЪ²°š…KþäÕyí. +wfP%hqZŽ$—¸PRÏÁë…š{rÇKxE9ÐêÕò.ö¸¸ÇÅ÷ö,êeQ’Š9ã´§ +Êî~¢-æúØ·Dªé8–\hU ˜âX‚*Z½Õ@Î6pËO+Üáb‡‹;\|"mËÞRyÔmܳòž•_ì6FôÊ-Û :ûÞtsï͈pï-ÖœŒvq"BIyxq^,ŒûŽÚ:s>›ƒ$»4΂T¡¡|ÒÒËXf’¬5PåúÁmv1z£]šœ4»ëw=s6Kd·u€±BÕr<×—Î ”œG×¥Ä$ðÌ}qu>$h½^ïÑ‘2¥ãE¹$pÍ@­<Ã÷N´0©ÍÆ8þå¤P˜½ ^KÝP°¤ ùá…ÖÁNÍ?L*¨ëÃV¸5ƲÅØpMJÏ+{^ñv™4ï·a±«5ÎüÝš¸•HE\ÁæÎñ˜¼ï‚ëç"·*r¶1éXø`ê€iL3 +[F$ï úe îy̯SonÆoÞ\³PÃ<ôð2!Á©€Vt¶Ù.ö¸¸ÇÅwÐoSÏ͵‚Z·á!t[O9÷±¤ÙÅÖ"±Môì-ô_¦¥ž—ö¼ÔóÚöV^JnŠáiŸæTA·?ëˆÓ¯-¹ŽuaÚŽdŠsaƾ–¾BqV'´v q–vàÜk\€H#ݘVmˆÇs,7=ÝÃ: 2é€e,¯‰ «Ån¶@7ÐfÝRÕ>íÞÃnëtŸ~kúÇQ˜LáìuÛzëš­‡Vžî·Ó¡öf=ÛgTZE|ö¼ØO¾‡1CIìÇY}¶'…Âüð=Ôá^“‚P‡ãl™8Û›¶ê¨»˜¨Vh¢%ÌC£Ö@Õ{hdï°?)É&%ò¯4H©Ä9.^CöêY⎄8ë^WY»0"C¶}Iâ<6Î +še¸Ì¨¦=0½>¹Ì¤Z:´H…a +kûäX§˜vÀôš) …†Ž‡ïS¸–XvÀ2ÌÖp)ÐÁ™´Ôcàg<,º³¸®¸öÞ½’ÓÓ%§ÃÎWv¸2Õ¶z—cup±ÇÅ=.vÚ>É&„w½N^º€“lßçˆz׻˲vÙ¥©„ÛqâÞ6$O„ÿ¾¢]A`‚4rÃì+›èß`¿9ÿ›ýjIrㆡûœBB‚®s!ˤ²ñý«‚–³²0Ô‡aF†DWîàbwpñ6ªXœ*”‡y>EûéžÓfôÌ=sÓÃf¤®{²]o¾\Àg”Ø+ï÷ñi¥{wrsˆ–“ÛZ!Vlq3{wõ‚ã/öxq;¼WókE‹ïëñKU¬v‹ss+–,jmëÝÞÕexèBÖ:ÎuZ·Ú+‘k [5t‚®‹I“˜™ŽÒ–`™1µbAG>Å+Š"CIšãˆ‚³=Éu‰ï€¥,{À2ÜÁ}«]æ +RóÕ¹|Zs_sèŠa=ù†šKšÉ7kòü쨞 =³@p²’–š7ŒN@{x`¸åŒ åæ•ß•/'H°¥H•½™™'Ñla¿P¿œ-(ŠŽ«ä[!¼÷†ç}1.Tí_$5$*ž›†ø¼Iª™Q#à*W â$´œ24ªQŠŽ0°–@ÖËI@%]È'[(EÛAÕÔ Þ0Åñö^õ¥ZM¿¼ÌÅmþ›Ô9¸Ç/zpG¦#ˆ©ssÁ*´VöÛ¡Å-îÑâíŽ^éðʯLÐË™ìI䶇Ãmò»uí$¬‡%¬nCC¨Š¡$\ §|uC;Ë‚-0ˆÙ[pG±r‡”wHyˆt³ßÒ.Ïâ… Õ¾ëÛ‚ˆ›@â¤?NºïÌMR››‚žt¿›õhi–n3;•ßjÇv5»§ö_*ê5ö£aq©,ØÌ!âp»!Fæ««Îñ”ý¾PC´5P• åH)ÇÙ\¸Ll é˱ŒïWÑLáyµŠ¤ä]ÞŠ“ÀŠ-â +ÒdœuÓCc¬Š¹¡áª"\›àTA =ŽoÇÆçåÝG¤6×'Oçüžùp*@˜¯ö†ƒîë&rË Ób¡Í{ÉV\óZÏb¾°U6fu[å‚Ivu9ÇŒ +­R$Ž­g/1.ðá·R#–GdÌÅóàSÐföEbԌε=è%t-×å—;ļCÌünÝ7‹:ü榇ëã9Ä>ÇöJ¼¾GüwÛ:¶tµ›‰X*°•µ8ˆ¹hÍãÅùÞ":“ãÖÀ¼Âãø(Þ¡G¼ÛÜ 9”'Ð̶F<Ž9e fïêÎÐðQ¬.Òp˨fkíˆCÄÜ#æ=b!î42©ß‡Ÿ;šíŒV5túÌåýJ‡XvˆeJ¿–mbgHXöˆåGslZöšÏ‚:æ, ªÇ‹uµ€>Ñì5LnWûdxÚ'žqÜ­i «Ë±Õë÷Æ™í'[HÔ¸Ê8=ÞCÜáÅ/îðâmœÎñ|˜ éÕUí¨€]ùF œ]ùž\,ß“.•a¼Íšïé«® +ˆ WÖ¿õXi•nƒ 8UÙžÔÜd;ÇÎi*îZðȨ2´”[ ½™ÍȤỂM¼È ­ m¢¯¯³ââé¸10««Š 3äiepni¢¡Ö'ß‹:„ª©¯Çó‰x»+¸^Ñ$Š½»z&ñ{¼¸Ç‹·×ÍòÔÆ^€Ð+ë Î +…ËX ˈ7žAp"Ð6'–µw«@Íè\Ü’…8ÇÛå)¡§ãÅ\4CI© +A¥‰‰´âjߥ@ˆ9Û“šÛ|Î9ºó¢N¡¸Iw”̮ۧíîÌ e¨cb—QÂ6=Ó¸£Ífò@oM¢Ö iOÎéþ;NŠ™ÉùÓ$ECÈYñÊ;û/çÚfcŠr%¿§n¸ma.Ƭn"žö†Ë×&VH©:ÞÐ5õIÄ3M}ÆÍ^\\e œµj +œ&盈ñ0ÇnÆIƒ„Øq,öšZ=W[qHfÆ#>Š÷§é“¡ZD¸Ü V‘Ýü‰xzº=Ïæv±ß‚IªÚ£Âh8bÿ±ï2¹>±bËePIã5·N67®n¿ 7Þéð¤ DÐÝG :[­¦ äñ8æl^ÌÞêXqB ¢žõµÁŽÕÔbõÊjþ«n6ÏОÙ#¸b7”O)–=¹Ò•X¹ýlaÁÙŒ¬LXït©‹aï‹RìØ2ÐÕXÏ4]DH]=¬W'I¤¶1âiŽ¯Š ¹øü®X~ pCOÃx±Ç‹{¼x¸ï™Å¬Vlq.ŽÔ^‰×+âLÄ +Y«—Ç VIj šæñäœF9–±ìˈã½EÌDò‹m[ÌÔò„©-ƒ˜”!r × +¨©Xj¶×÷òDÜÄ4Cãí9ícÏ¤Ý W…ZÚÿª¸²§´U6¯/¨ +N*éò”>ÜÚÜ‘D­AN×ûñ‰ˆ¥â±U¬#ãL Y¯\u;zçÐú‚´:¶ª%VÇ;Ôž„”%öd{[li †VÕ_szX³:<²¹5çªP©®ë.¸¶`j5Pß¡*P2;ÞÛ!æ1ïóEÌ è_ÞIi±CñòO)†x7…2$B·JîGÌ)ñÓ#^dÀT34NŽï¸sŒ¶sJ^‰Ø­›…CKGQ§§w­ç¥Ž—N¼Ô×íVԛ濈%& R]Þ0äÆrý¸ KG,'b™"n Úœ禗‰u¨ã¹àð£ÎzpæñeÄ=1Ÿ‰ùõÉî#)1§b:Σpžõ¶AÖMéÁUC:|x<Ûmz%545ˆ›xY Ïû0A-Ík?+Ôpò‡9Z¿ýT{†r”®–AKòhoÚTƒxÓxR.N¶us•žUά2šk—x““ýJÕo‰s†škXÆ‹ÆKMA²>i¹K‹£„²Ý9¡[ÿ*ì+jƒ„;<3$ò’m³¬8`mé¼ñþ`ÅžϬøºÃs—…K‹ Uô£—Å=bªÕˆŸÎ‹Ó¾ÍB¾ gª¡ˆ ˜õér¶ÔÓ"9R´Û¢ârqôOÁT +±×,w$¶Î|Ík>Kºð ³ÃȈG'Ü­X^©ßR[ 5pbІN‘ØòðĬ¹SCДôs17ÅëÒ2 ’«ˆ ç[ji‘r®‰)|¢øLÏx¼u3·œ¿u¤ TÛGŽ¹6ìrlÝÓår©*°~öâ¸I,¦ã2¡ãéJ<Öñ ñ›ôH R-ã„Þjó(±7ãÝe]°#©¨¢®³­Úºµ¸ivg¼ÊÙzâ ÿ4-¾âÑ0#‡‚dõLí*ïã´Õž!O ÔᙃïÃt”Ë‘ýÞšíåêþ¦ô´£¼?=Û•jP9ÌÌ)=[‹bìÛ”Òj © +× “3ãgªðܹás¢#4xX|¦‹åã>l›g^ìŸUÁ9}Ô‹ï•ž€5‚™<+^ÑÒ®²º¤´¤QŸ¼#„«2øy¬7q¼Ò#VS sQPINÎ`½]5\{``”P½½D³ Í ænqZðaÅ5©£ã=‰¤\0Ð5WJæñæÝ"^[,ÙTñ´Œ¯FÇ›lf­GÝÂpÆ…ؽ4ö Æ-îšB.¤CUHO,gb¹fØã‰_6ÑÄ^¥qÉœžñ˜xfï|bF†ÒP~#V´§ÿ$Îæ ¬öõþöwËñTðëûTmWïÿböþbŸû«}Øë×ý÷4 ûÈz|4BËzšÿ˜EKö€’üùãÏßfq|‘ÁÚÃïo°4<_ÿI¶BÿûwíG䯧¿¾üñ9?þuüˆ¯7ô“øúÚ&MõõïÓ\2`.‡Zȹ|_e±ÿ=âù÷ˆ¯ÏUÙj“¦Ší†Ê ™êøžã_°»×F›D‡´ûìuÊÀM¼ù.ÑïB§¯õðMg¾;VØxó•ZJœù’êñªëh‹ÚÊÅäwý!-g²0oyèfÛô*Î JJcÿ]–Sê}3ßÖŠ£†uÛÖóJÇ+'^ù“×ïí¨«Ã¶3«ÞÁlo%±"+?¬„•wWbk¢äxoç ÓÄÏß]öî†Þ¶m—m ¨8n’ût_DNGq®Ùó‡ü÷^Û5ÔÜñîhÅÙ ŒeõaåÒi¤òôù¶ÔÔÔ>ÉÒ0D…8Φ<Öð6'Iƒ$®„w„€ftšD×Ò&G™µÚ/‘œûhËLF»6 +y±™ ¨) ÕñÂMòÎÌw.,|E(dÎ-Ž"¨ +`©‘4œ³=ã/K¸;\<áâk”ÔÔ5µg2c®¡¹‚¥ìÖö  +˜»Á±c &;’ÛÒþ0bé‰åL,¯AÔuZ™œñ—Ž¨;¬XŠ7ã-‰µZÜEº?©!4åñµ1énߟu<³y¾Ž9™‹¿y;zE¼W˼êïV25§üxz,Ì»í ˜wªÇÿ‡ÄÓ[÷­Ž;Þ[-ÓJ|Íât¶-³Îzq)O‡óUv ¦‚Öì,\'†i‹xÚÔâg‡Iýé³n© ÛšÕ³ˆ«¼ßÒâeZWÉ͂É=ëöS§È¥=lÁ+5\‹=©ãÏ=1Ÿ‰ùu©ªÝ9T‹Ö0[GÚ ³»uª‚³•ŸVâuáÜ{…tÄr"–×Ø+H ”ýôØO‡»òÓéq•÷"8×ñÖM×á±OÌÔËw'iØìísó½U‡%Ñ„o£_jhG¨Œõ;íjcEÌ4â7ÉшWÃOøðT‡ÿIú5{&»}m7ÚZAj‰t€j¤Ê#J¡‡G|uÝÜñª ¢¹ã]tn\®k ÑN kgöÌûέ<×'©ª]ÙÄŽ~Æ©@Óö±¼˜Ëb¿¡5Hâqû "be·JÉôtÀ-r`R*É"Vv;âRrD—rÓþÎ&ÎÄ33~G¬VÒª£ŠÎ†±'Æ31¾.Ù°tÄr"–׌ gà&ÞÖ]ä}¼E„¢¥Ú€µºúÝÑ#¬W&×ÕV„òżðpµãB½¼D ÏÍpÇÛQÏR)nãÙï fÏdúX¡¼©ˆZÍÝÉIã- {FTøYEä¦güÛ;ÜŽ†*ã¼ÏÖe*i”o³þv¾+ÛN’2òà´ËÚº$hXÝo¤Ú¸«oÃ{\o©ÊÓîxï´j z¼9Ì-Ä(ÐX¿7ñ"ñ›„kÙ^o¦ÎlóÍž~7ß©$vçj]²OÌIé·9!¼³2;ÜÜâ°Ÿ™Å$Nˆ^ÿE¼„XWŸ>‰–Z¶'žn«`íÚlÚ>v»ÝM64ZÔ5õª %9³íâíì—A’7E÷>E]À0 ¸öt/íðF÷d—äfNšÌhf9ž…-u++õ…þøÿaÐ #õ6ÔÆq,” +b¥ï†u‚¬ú§+EÙðS/µz鬗m›§Ö‹íN2K—Ýfƒ¿)dÃ:œ®”ÃlXÑ¿û¡CUÈùîP»j‰p¼ ’ÊFã=ð!å|7™Mµ°@¦ªûÌø°°!7Ñ’wgu^ç‚]ŃE7¢XÅzR¬#>FM9¼;çø«]tÅÛ'þP‚‹Wù«z['­^9ë•GgëÎà>6ßÜ€ÅBG,˜E¡ §ÜšPsrbÉûÖ!r0ãÕ˜­xçþÖ-4_rÀ¬Ñ|Óå ßÎB,d¶õH’ϸhÈl“\Ñè¥F/ôÒ»Þ0#<‡û¼¶LsHò“ÃÂf^Ð\3T¦àJ¢«î¸aHk8[& g;ß»ŸS[$ï” äoÊ9aZc´»5Â|Ø«‘K‚„¡!,dGˆBtwYLµ0û§ÃSî±Öa$TÀÝû¬·ZXµè=Bǃýò«÷S}~Ÿ êqÕú÷¿ùË~ûý›¿÷»¿ìñý¿O«á“x{qRØŽAR~¢¦ã$å¤ï_ÿÄñôò}üø‚áqŽ>=þâÿ®ß}úüžö¯x~ Äó÷> .?ÿËv‰Ô%W(RmùÖçâ?•Z´«x™Ey³‡!Þ­¸MOmëI±¤§`ÍVÅ3²¾Ñúj}ã–Íö2S½l~¬vÙ¿ÎVÀ2ßl†«æ —­‚W)í³l‚ÙcϺ‹´ƒªÈ>ñ+È`öUÑ V9i•G߻ޒœ‚j{þ ¯hm¦ºaHïEáOæ¯-ŠOV!ÇnxW¬­b=+Öžâ³GêâÿÆ2§"Bë#Ú:œÌ…n4á¢þLÞ)Û+G1-Ú®Ê íà÷¡†Ó]Ï +ö?Ýhá$±þ„‡kã5µÏÄž¨}?ªôÃJý@äöVÓF±žëcdåÓÝŽ˜Êj¸–`é–äa­´Óõ¹ùTÑ;œ¯cØ.ç„…Ü“ýÞ¨·“ÚÄ­ó SÑ('.æÚý$\¡2õoešc?Å’íëP‚¹t’KÿÈíë"o¶ïeì —M’‚éN¥,9AJ¸I:Xö7¥úØy̬ì±l’*a¤v17ì×Å‚ù+ÑlLl ¿Ù­«ýe[§ØP!'éÙwÔwwfùRG|Î48b¡ø ÓaÎm1÷vCPí ^ÈI(ðÃsO¯ø¡É‚P±4Šå¤X†³C܇õ…L^É)ˆõ\!‰¡–] bC«øE´•‡­:¨ @°¶Šõ¬X{ŠÏ$1‚Á1Ip) †²ÓŒéW¬éc…‚ðÏŠŠ… sHls||™0#µ™ý=¼OÔ–¸ßuÃ[÷Rñ¤ù²Tüÿxoo®%˜ïŠñÀ.ýã{€Oå£âðîŠký b=)ÖFqèeÈ¢;Uœ;¢„1çEï5O¼}"¨ ³fÚžàF1Ÿó£ï É ü¨»9…gΘ‹€Vêãû°+ú0<¦8‚aÁã™~ŽxdíÆL¯]ߟڹ™9,‰¡ŒZyµÖ0UéF ¹—ѾŽÙG.Ï0ÎRqD“žFÃìîÑ’ZºjGË¢[cÖ²‚IíáÙgÔ6Z‡À!Tª ûKöÉž Eý™|;8ÌÄ_Ëþ΃Éyø+I€YòF8™0[xpNrŤìÝÑ~ÂÝK¾sCÂ@ˆûä»NHx¬éá}{ÉeX¹OáÎ"F–.†6óX£^-/ÿ~½%ÛÉÃÛÅ[®¥p~Rq;ã!\û`ÆD)ܺõ²ø¨ŽDzëÖMD÷*„ûóÞº¾éf‹ +¥ÔÛAmÞ!·!¾— +\ÒFÍ,XA1÷„èk©f/OÄK4ÿ[ŽeR«?vÝH"`÷{Êã“ìnì?ÚÊÇD©ß õ]ögv*èB`b™BÒñ&ŒLq5(^©½ª5¬:M³]§œ-9_æÀ¿+–³PÓÇ?3ÖV±žë—Îx+$–”A$R;ÍÚ¡ )R‹é#ð¹:ÙŽÒä‰/9.Qµ5slŠ‘M»=ãMcÈ™¿Îÿ®è¬€¹öoÏatè+1ÄAVÔŸ‰ÊbEt`3¨¸Å~Xñ"HaU¬Vl¾P‹ÿÛ$«£ŽéFŠ÷©cIÌbäœmCïÕÙZ˜e¸–P=(¦€ æõÅe˜L1¤%°mP-qäˆ%ûx«z3q@‹âwÅ…óxÞ w²?³‘`AÜ+ÒLA„û±NHXrGgÆ’{ç +^rÆE€h†×Q\&*E›÷S/µz鬗£åTïWÍTt›ù²ï5Õæk¥p xÉT«ò60,TÁÿëtŸS;•%ÌŠ'è2ôÃ¥&ÛhëÅŸÜ‹×TEºŠ‡ï¤WŠ›ôœñ3¡^Î8¡+Þ âSuøÁ(Ø–«:a³0†ÿ1„¶zõ¬W¯‚ÅtRLCà—fÚؾ…fÈ +˜ëí¤63! ˜·!aï 1ìçÙ2Á&î n£%I­Tà²Ó5'äìƒ9̉9¡6‹-vwîÏw™Nf•®q\åæûó²â Þ„“‚mFÂô‡—ÌáJ–)DµQ+(F®@ÿúꌭë +mëI±>\Qè朘˜jêŸ.÷Óå¿5‡%‰³°ôïáf~¥¸qõp3[Ø …ËFŽ8XM,ŒˆI1|µ6Â@;ž¦ÛˆLà‘ÎøÜýɆe'’`K`ÝGk*Þß…\h®žkìQn£“§Ÿûë—_Õ@ ŸßA|ûþ7×o¿ó×~÷w=¾ÿñ÷)à=2ÓÊ'äó0Äÿàmõx—?¨ï_ÔdÏa_"0>~|ÁðÈ»ç¯Ç¿RþüîÛÇÞž~þöç{~~uüÏ´£xþÞGÍåñçéGÉÀ–u)Ç h‹%eË]ÅŸ[—Iùy¬ +:Þ¬v*°dÈìN ¯Ý\Ù–$P|uÂ/ÕÎD,†¤¹§và–”Aª–=Ô:Bªxw6L­Ò É„7Ê_?*ÕÈU¬gÅú¥Š©@.„¯7;èâˆÕF±žëc`ëÐOd½ÛÇmªI£XNŠå1’jæoÒ»7z©ÑK'½ôèµ²Ó–¾Ú‰Ñ{˜UÀò@N,“lÇ™›“ôšc•VF‚%¢žÕz®*h’ˆ!&ùwÞ¶1ÔªAþ6D9ìÝÛ©‡2(ç/Íß¡+#ô/«Ï8EwFÓqƒŠG:n¬1b¤_ž+ÞVÂ¥[O°dg÷]BͼâŒv‚÷RÁ£ù.ïÇÒÕ‚åjŽ¨ %×È‹!× +œ0B´Õfk^lý3nmóøåCh¯âów¤âþÃ~$7šÛPxŸSèAõaŽeRÙÌý«BÙí ÿŠaò/‘.²{6ݲeÉÏÐÃÃ÷ÆŽr˜¿X‹Dà3ÿÖ×í¤úöL1ïZã„Á]q‚6zõ¢W#ÞÍ`aZƒg/*6Å“òA²y ØnÏغãEh‡œ,,Fû͘KDtRÍøëÎ-¿sOΣG|ŸgaÍ )(¼eL%<¼¥b0£¨mè +I©BP +°mdé ÕVŠ‰ø!1˜Â 74bÆ”ûÎ1Ÿ‡šæå1Ñè}‰á žC9ƾ\2žbiËU±ô7Á1ì‘ •²œ/'±)wcGS:0G°Ö(Ž‰å#>+&J¯‡ù »|^E:°pÅ…À¨„8±a²e‹¾¬­`½ +ÖﱤJ:0≊G¢í S˜²¥cÏ(¾ºsÜM¶H,eÀ¢Q߸«õÓ}›‰>u´,}·¼êÜ—ãåD„?oáAˆ"ÅÓ=<6ߘ-ë«9ì3‹†¯óÙº/"X8¯†á©.@–¢PÛR1ƒóòÂ1}jtÛÅŸíºÝN ],•Õ¤kÛŒ˜½¶$]Né6K„Ùvž)ÜÁ4ªu·õ®>tµnd-ýJ7 -‡ Î6ƒ% 2m ¬i£W/zõ1iU¨’G§ùC/µz骗˜ç¡e10 ·mCÅ‚IHb>/ œ°¯xZªQ£—.zéÑM53 ¤Píœ÷‹º¤õ*§å¨ÖzbÄÃ_€'0Ï!ùì·u¬˜ú¦Ø(Š+NH7818âœ3EÌï +˜——ºYÁæVBCì—k‚na=º«wù•ÃJ Ó]+tóll¶±Ž«ž9gŽx‚¦õ¢âå ä= žö­bÃj´_˜gŠZŠê;iŸxö8n…HCC¬˜ïXž…†P˲œg:‚Á=žñí·ž ªb¡èÊ5H9¨x=R + x‰®Ü–\*VRYS¹²b»uI‚Z½tÕK©Íôpmž)Ù÷åðkìSEÊJìã†TáÇ1Èá=7ŽAüœ³ hÁÕŠ½C·9T[_˹¯v.?S;³{>·®B|Ô=wtÄyŠ€ŸBÏÉ w0ß®H]¿XéŒeyFL½'5$I‹½m‡OáÝnÂBΠœ—ƒe;à±… ‡9(¦å•n¢â‚`~»³(,ý~4±Ñ ±Ä—®²q@Ä{*¦g¢ô‡´ŠåªX·øçµÛ!I qŸ&´U¬WÅúŠŸü“(bø]!HuÆßÉð¯\;. ØËAÉ&I+­u<Ü ¥¸'ÍAŠ_œáÕ!¹ã9>fg(Ùs§uŒêízxLíÏäá –$¸uk.‡6Šõ¢XGk/)ê¡;zØ2ˆ¤ÈÃ*T@ãèÞ}è¥V/]õÒ£³u3=\ÕfëóÚ,q^çp©Ïjÿj §Új®ËHÞçáA¯O5ÁšÃ’û½n–¨©–Lú„¹O¯C·.KŒº¸«vd¾_y˜ê³]îHð’’FÞíjHFÀD‘Úç{^Fœu™kG’3pîrÚ ‰v»E³-Qÿ"ïC=ÆPo\Øåö»olŠ©‘÷I42(%ÌàéùE~¨CJÜãnëM«oÜÓÃÎËów¦â’À•ï˜Ï®!®ÑŒ7£6Ãå1Q°×á!´/ µ1CÄ¡†5ÔbÅt[ñrF†b%Ÿƒ ž¿æ[­s‚}œØF±Pãc‚í<Àt~ +=¦Î x‰êÆ–Š³‚z‰²øîÎ}¦ö® 6ðo¸Ìóབ#‰qxÇDã +ð]Én F+]´Ò£ç†çl“Iß •Ï…¥Ÿ ûä¯JýɳʑSîoÜ>®ð©Äd¹cªhñГèý®'¾ ¶Xí~–T3˜¢v´&'^dˆTÂÁB”sÃ{nÜq—Cr²å©6ñr8CÉÑÖM!Ÿt;ÓbG”“R QY¾uƒóYôãuÆh'ÑAJÙ»,Á­b¾*æG%¦æ„ÔgµŸlÊ—ϸ0¨S8ãý|,™€ž-Ô€ +J£+|²ÖÇÿþÛß˳¬úû÷EÀ3¿}ÿ÷úfÿøí÷ú¾Ô7{üñÏÿüßçGïŸ_•“/ÓiÔ9U‰œôÏ/žÿ¾MãùññãVw.ýøÿùgV úø.8âûO¿?üxŸ¯ž¿âýí,Þ×qyü뢾ÔOšŸWJ!‰êþìâoÓþLïfWõé;Ío‰¿pº×ݦF1]Ócd·+$Œæ»iâ#†ÞÌl +XÏêAó­ÔR´åˆÚ1[‡n7=ñöŠŽ+ÆÚMœiTûîg}:ãý¨EAÁ)þÐK­^ºê¥Ggëfrìq©f ”XNR|Z² þÀ×c¶Ž‹A¦8'6$o¬]Á*_Yì7“¢ùüCÅÚ(Ö‹b™±;¤ß;ºíãÏ\ÑÜ”a[˜Å9Ç›w›¾¥óf¡~ºmÓ:$Õ:ÈÈ縂EëæÇì œs;Æñ‰á¦@Eú6ÖV±^koÆ¿6Vœw¤¹$pÑ Ž¦¾Ç +S¨Øž?gÅ~3–ÄÜOJ·”A³•Å3nôR£—.zéO½?#°æ„†õã®ÞOÕÒmµá|‹”Ã’ +–(‡oÞæõÛv”ZÌÙ0íb4z‡ð=¤$¼»#§ +hÒÓf¥ÙÄ‚tVšUª¬óí;bâB©rVÈÁZj×àþÅØæ"ךĹO<ÛÜ8vÃûvW#%` ­YºAYº±P W¡™R>ÚŸ.‰ÂàgL”,a°m¨Ø +Y_ñK1ñëV !/©—ûäÄa8\Ÿs<(ÔÜ]ORlŒ%Z¸-CMëõ8ˆ}ÌÀ“÷BmöaK Ä©m:_æðhLóð¼z˜#J†‚À厔‹A1ê÷£R !YØ6T,HÏËÎxέC·Û9a‘âœ!¹FŠ§o6jõ¢V‡<ì@œûÞ&‡…Ä1¬t[ñ玘y9*›ö/Ç63fP;)Ø +AÎ…Ï9‚% â ^ ´`0á5žxñ<[·ÅŽžx®Q\ì6Ü;{þLÖƒ»BɼÚÇ^jôÒE/ý©÷ ÄÌ»ç›Â\kvn0×Fvn¬$…9œX‰ <Ö^®ƒËú€˜ÙAJ½±OQpN~ÎÊ Yu…¬vŬH3‚”¤Àû8¢Fy8Þ YÍKýs8ŸÇ™â<ò©3v’官¨¸0¥>ýlã +A¬>Îáñø++&dEeâbõ­ÎñqŶÚ;º B¤d:ÈÊ ¸^ñLW T2^ šÞW°í¬žd•ˆ“GfØL­P Ib¿t`Ïu×RÀèvÓ¹o¯è¤ƒ4Šå¢Xép ­Õ&[Ì>Smœ +j ø™îø¸á²e>®ï$ß©wìÆý$±–2`ñ>§i«W¯zµçà©ôžJ%˱ðôùj£V/jud¾˜¡(/Ï´™ä®àœVÏÔL#Ðl‹»ÆÕÃ#”ö…‡+Lô9môh|6޻à Ã,C6íûKnf<° òÙ/ƒ$Gnˆî}Šº€i‚@bí#̼´Ã›¹Ä'KVË!Y!–‚˜ïÕtk$õ”ÈLôìaT +Ýe“®:_ ‚(ËÖÄÛ ÄÛ{††©de¾ ñp­ìÕJ½@GjI[°º—Zé9Y²`(¯V—nðUI¨ ¢t`ï° ú¦6’É'¦–’C–á©´ÀîÒ Ç«¥knÒáàÈj&'É+-bÍK£´ˆèás[7Òzô*.ú*±Œ†QÄ¡°:ßõ‚Ô £ ÃÕÓhÁñ†ì„Èʱ”&Ì7ŸEsŽ]Š¨†Æbó-¡\N#µW~Ñ.t¥ò¿·ûÃá>‹¸³ÐHœú·ÎŒ3 ¾]ÃS]-9Jñö`ž¨Š$.ù &Çz3FÆ”7årx¤\e³® +_ˆE,¥³çr$ùþÉ1¬Š»‰1''9) ²¢*0g‡˜-yEöŽ’¥aÅâì“—d€xØ+úÄ#ª8kB寈¡ËΞ(P¢“Úùñä -o8ò††÷öùš³ [Ç’ärŒª§ÇUÖnhŒ©A/˜è Éí1÷ÿí貨%~†".Æ…¦ŠåyQ³†éÒ啨< ] +¥¡ ÷£[^>òòÖ‰¶Ùí!F]º öv Ž”Þ¾d}H¡ÎX ‹/ òRŸ£è¸!œññ»÷§µLÆ*Ä°Wô‰GJÄÙm”œç¯ÌåÒHJvܣ⡨;Qq¬ÕG«í·hâÍ"aO‰Ê«½šÑ çìÄ«…xûï˜{WÃìس¢á%ó9æ2cèçóDâ7 ’CLwž W§«z0;ô^Íåq, j#ž1ÛÃ4¦u¾P ™ûmx™TÆä÷{Ä2þ€™ç~X&â(„êÕ£nñUÞ SÐ$<'/³ª g0Þ ºèQÑï4â«¡Fp’ªÝ/= Ÿž·F +.IÖÂxA@Éï¬S7]âÔ?1Ö©ÀB.CÔJûG›©ßRÑ2ôÎuækN“K´£ó†D o8ð†­ëÁ]¤Ð?:‡=¸?ß‘Ì8Û8[ŽV9s_ Ëè³w°¯ˆeˆÉƒ‹1©®¶âáYþWTS[¯øPD‡)©—\¾\,swñÆnÏŸ§\–+Î  ŽwN9LàrÊÚ)·`&_Ê÷*ñz6AÑ;Þ±úß`H‰ËÏýò+K© éñ8…Gì—Ç¿•÷úí÷oåm¿—÷Ú¾ÿñ÷¿zkH]ò”—·Ã ç0Ä×Ïžü">?†Q…µý󂢨>ðø·~Jòñùhy¶<žýøñù>ÏßêŸx¼ Åãç2¢rÒþyÈ(q”wÇÇ2?‚ó¯G¿Jùç«”ÃW)C_%ž•PÁ»ø^ÃebxIâžâ©ÖŒÚ{ì+⫼¯hVjXéÀJ?XURt1wgË-+Y¹7Ûgcyðö:÷>a½c±w÷Ö}«&ê·Z§ØQChy{wî´áÌßË•ù6ßýMÄÕQؘ¯o¨·!ÝzoHä“‹õI½¦–÷ìR¼ßJÅÈ]bl‰ûGÁ›Æ»“ÝÞ&'sÙæ­¸¦ºq¤öÞ¯ÙoÜýj°FL­y„˜óáhfãÄÚÝFÁš0Ÿµõ†xxÆ·ë,]C(â bîj˜[^>òrOÃÍÔ|¼ã'o‡ò¼Ã´!¥^~ò~r‰Ó[»8íx0YºŠŠÿ&ÎJÉ—•»‰Á 1ˆyI Sn–³ã$Š7LK‹«¼'Úõ¨vV}¸h¼:¬µ  ÏÆêf2md$((kÖkîØ$ð†Â3VGëûïð1Ôw´â3GCcŒ¼×3Uó4aU ç´“nÏY´LÖ¼¼¡mÃŒµÿÞžÆ3³-Ú6Š¦Ô hìBû½[b>óÖQCó9š/äø]µ_ãsV¯õkI-]C䓵î£ Õ|ûš0¶Äx$Æ­—ÆSóͱGcQ/N)bþ¤]?Á5D‘Œb"c*¨ þÑ&‰36Äøò&Û_¿üš‚CHÇ ]„°?þ­¼Ùo¿+ïû½¼Ùöý¿ +KN<àn™ÌÅ5ÚiÐs‹Åׂžü">?¦Q-qÛ?/—¡FÂãßú1ÉÇç£ûËög?~|¾Ïó·ú'/hgñø¹ÌÓöç¿’)z©®\,\;G–!ìWZŽ%E…ö†‹`ÄÝÕ­ÎÙyr3íÔü'!ô‰‡¿ŸŸØã·±üÌòkâ%’ƒœH›ñ×ÎQKLGbÚ:­ªé³ƒªxtæ×é”\ˆÐWÅ0q_cÄúåUì<¡æÁ“šëÌSB_ëTíÀŽ5+¾Ê{³ PÀ‘p²s•Pµˆ«±ñ’6\¦=‹9$#¡ÌÁeFM +†r —€•ˆ[ÓÊ;%VJeʃû6ÊÜó˜‡6]ŠÒs³e6®x/I_ÃËrõñjZø˾]Ã(ä8æþŒ¹%æ#1_›ñˆ¯•.7lP}x=Ÿ0–æ4LÑŸ°DlðÔ€¢Š JÖÍë­Š±!Æ1n#éá] ô‰&‰GÒ™b:Ó6¢ct¹ïlëèXØêð©{ãÍöé@ªÇçz•stžSß&–!¶hÅÙAÈ·ÛÄ{p>J¼àŒíUŠýýjIŽ$·¡{Ÿ¢.`Xûs/íðfîa¦4ža: +Ef$SAÚÞtKꬪ×OïSrdl Æ$Îù«x»hïM;Áúê¢OóÛà½S‰`V—¾~×™^«„ï´‘<¸öä;­Iܵ`ªÝwD9)E7Š9*àÞÅìŒÝ çÞ[º¬‡~\Ü4àT@3ëh +¿ Ö¡]ÞZR{\¹£˜jm'Š†ÆU-<®Ýú¯Ö¯Í{ í×+:¾0ÆnœɬÇî"IÁVŸ,ÜÒâ•3^yuÔÛ°>ˆøû7û_âe¨À‰¶j; +nüôèlðÞ©¿l +*u³5,hõS¼ X[Àz¬?{tX†m´7÷³‰ý6‘yöˆIŸe<"ŠO2–Ú*­ïoÄÙ>!&p¦À‰›þ3Ø'Fú6ˆõ„X_#Ù‘Á8EÍ}A Õ'3ö­bUÕgüé|žÚ(ˆJØãí"â¯WtìxhÕ}XI ´H¨ãùhˆáP\;f~|…N¼º” ×¢¹Ï²LÀ…CŽç8[£ìáÚf!Lj9,šëyñŽ>‘Á“¯ˆ˜KÊ©??ÖÙKUÇŽ)Ê»«*îò{¯È 9áP v¶â€¤}E¬“Y@œ¢t¾ªàwh¯b S#CI¥‡tP ûo!(œú i%ì·7ØSÕ®F/¦IÙ¢ž6Oí½õ´Ø öà÷h“­xqV a”M¾ 7ž~¾5ž8-Ô%ïã’ ЂÂ3âi'€šÃÒ¾bá©ãÓŸ¦w¢‚ÙÈÓ>fó +”M4¶6Œ¸?2FbãÓÈpàŒ½XµánÈÝluv*o$aÁRg‘?tgEPƒ˜NˆéÕW;ÖØ°¨H,X}6,ªÀ¢}ŸXqÙ)*Ä3|⢂ã"\ŸË¦ÆïÜj‹UÏXµÇíÌ‹;€:bàjMÎ #~Çïñˆ>¥FÍ]Üd5 9pè F)@ºdbl7=7œF 1ˆ—l–®à5Ÿiª˜äÁZ´þ4º)ˆîØ4ŠÇ\.ÝA¤Ú¯Z°…¡‘¡xtt« â88ÇÉ÷*»]5Ü›ûÄ›¤™£°h.mÙë ‹Øz·œî E¯óÂX°úB*=íR‹—Îx©ÇïÄX³Tß ›ó r}æé­9Ív+½^Âff—åkoéØ%·;8v«{3õ÷æpuè÷õ»ñ¶›*„r­g©Òâ•3^y ò»¡=Ô'(ê‘‹¹¯Ög6*½G\PéŸÚ:i‘ˆCÄ‹éMAÅ£3ûƒßÑC{ËocÉÂðÐ|’EKs=~wk;l ¦ôtÝ™‰Ø$.=E,²/+È•‡yugÞ~c3@ä <¬©¢HÏÔiË ±¼T±YjP}Æy'E0”ìy`GP·ÇScâ$*(§¾G,Ó#8Qñ­wF<Âñ‡æSŠQ¿«-tu +nü´O4x©ÁK'¼ôÞЃkWó(â™Ô¸yu•_Œªð¼*ÑÖ°žë àAõ¹Œýñ©-Z=£ÕÚ³EŒàý`jäÑ4BL—?_% X¤ÏñŠ`(š6šs‚ŠøÃsnª†{Ž8¾Ë]´÷j$Ýiiõ`”‡1WÃ*Ò+ïÓÆÑXÆ}*=[…òqpÈy§&ìT-BÃИsM¶ ƒ9‘†Áíhè¹ß'–ñ ¡Dêx’O4xïtøêðMnIj ÔTéØÿøÓŸÕ ¡}ÿ\R­wùëç¿ÔwúË_©oúk}§×¯ûçé‡À,‡ÔØq×- ‚ù›?ÞõoŽ?¿h8¾HÀéõÛ êû¤Å÷ßÇÿPêÅüöSðôýð×Wÿ~—ß¾9Þÿûé–…ï¯+7\^ÿ»Æ‚ùkæ/ +ÎZÚ_ œòúɳFå¬àß7ìC7Xç*â·€—<êªf•ôðœ$mÙ“CxÓÕ<m°‡À^…úAf_Cæ£n—I#.^ÝSð2PPÁÝN<Ïí¢$û¬ÝQ#ëÊaì‡rB¹Æ&y/(†Ù}>(j’{dc+ÖTGWÆÀÊèR#þÚY©uƒ1’Ã‚î ²y·7Lt‡¡®ú¡7p'ú19ÜJ·Â5†ÓÃ`'ÊkϧZÕ{€‡{o?ŽG‡»õ^Ëu …Ëb=IHVHdÝ„›c ‡vÎHbF÷ypÛõßÝv›×Wë>…ç`1W øÉpsJ¥ÓÓïý_®½ìXUàÝ$^£öîvc‚XJpdÔÞ›µa»a $ûà 7p‡fŇc«#èç6æ-ß5Ö Wìèl)c·2 ²;RÆ6fì½E£¹ ;8ë“Á¨¸ +÷a9Hªì¾¯¼ÃbD÷…`=¸´G 98¥nN,´'6»56$Ý'‰÷cx·‰)9Ig± ¢}¼ùfƒֲ˳ímSOu¶\M ­@Aúɦ>Vb0 ,Ýz¶Î¹?tþ>×4´Ýü!UÀàæè†~Þ$r͸PÃëf7àeÜbÌ®@©…òª?.b¢k¿CpC++ žƒôØátë·ß{[hCïÍRÀp㽃€zmawH€-·×µù¾èøE¨Ÿ¤ `©¼ßÓ˜=Ia¬è„RÐÙƒf¶"`I +šÊV&èPõ+{€%‡ê½]°£§6à»7­F°j¸*.{ÃsÝCìU ÏÖÇ™1,¹€cÚhQ ÕO ¯©ß "ò¾è<w&`’÷Ýቢ3”m!»µFu{ï4w ,ÀR¬ G¥l5¬Ù x7&†÷Ä{#³ËFfrm›iÉVO¬àÃ}lª‰1˜Yw­i XÏ€µøœk#âýPs¬~Šä(&ÖcXA²¬½ƒføéæphI߯¶%Þ*×*»žB9¬Ènô~Íìe#5箥í… $ÞÇθ8X¨?,x'9Hb`Äggæ\w0ÐÌ›Tßje’Ãî;ì Ø +,›@Ên§EðI·CpcÝR®¾KQÉYðÐ’í2L-`:¦k kXO€uðNÎÀV 8É6©¶•;lX!k 3ísl`3{Ïp#‡á‘ùNç‘9rnñÈðÂÑ ¢‹’ø‰¢#€V6 + ª–†ôtQ¿ìzpÈ…Òƒovˆ” dÏŸ—Ũ‚»Ç X>åWÿà¸8åì¢ ·Uh"hpŸå0ïÝ.ƒ #¹º‰íì_ì—M²¹ „÷>E_À0$°öæ^ÚáÍÜ?¬×#‰å(4YQä rìô~º«?A‰ÌÄ]1\ÁÞŒ +42D‘É®0–-AJ®ç®˜j•tA‚DNeøA*5©œIåÕ-Ù®±ºC5°ª0Üúšã§n¾Í!ÁÊœ–[EB'kO$Àeº Å|·é Û•t ’ ãr=ÝéQì,nêw˜÷>jeÄ f^P¬7]VÑ8¹FŒÀq‹$feHz­ÜaÇÏi¶]çÏ1”ßJÜÇy9EP–jzNNó]2ŒM FtÊä/ànC›¬ +7*”lãµ£ s‰»¸žûF†(29.Ù¯ A"'‹ïnZƒóIiØO²%'’%ÝÆv·;Ú3ñzäkÄI1rº!çfF,4]+O +ÍbÖj=ŬØï9ZžÄÍ /T¤DðzwÐqefö4¼Ø±1„Ð`] Ø$(¤È“s¢‚}Ö¢z–;ÅÅú®µO×%qÜë¼Ü«6D,Àr]Í—t1,¶‹™¾máž¹Ÿ0öj=þð)ÔTõzá*àT§3púNàãBž¥Ñmà+ýŽ¬ Çy™-Û6M’³3jJbKc%ÍžðHK ÀA¯]bNW$»É¥òÈyA ôxÉ6i ©·k3€Ÿ™G_GÃ}&\6Pʳ;ûHûE“n(°•wï´t$`d^"Óí _²46œ¥9ÝG°C rIã0x¬C0Xœ|dü;„BÊ»,\Î ckºRÃÊVZÓºpÛ•,¥çxÔ.'œ„ ¹‰m +{¦ßVØ©Â¥.½zÒ-Ft&û ¶[»³—ËtJ赆™.¦E²Fûd„PÔTÂ@S +XNÀòê0…h@‘=Ûý œjàtN÷¤Û³iŸ¤K’{k®h»²dÏÉn¯›S}õ¶9¨«a-ÅÌ™ðû?æNRTÿùî„SœNÀ©gÂdå¦$–Ñ°Ä ù- MRcËÇ ÿõ—¿fÕüþ¹D0”¯ŸÿVö·¿ÿVžû{yØë÷üû$7,ŸŒüžŠäÓ0Šßðpè…CúõÍñç×0Ž/_¼¡@à¡•÷ßÇ¿²|ÆŸ¨÷‹¿¾úñ”?¾9žÿ~u=‡÷×eÎœ_ÿü¯-o§/&)·×úðë#ã5ñ{Ãî˜QµÅ³V%ðîù}ÄÏŠ5%xÅ +À)B`uEa·G|íŸx{Ä®ŒCY<=:ÀÔßåu B9=Ú›é4Ý"ˆ!j±áÖlÞ=}åSÁ1´õû0ÿë÷™š?ã²q™â [. æEÝp ?œïVþ !Yžžã.¶R¸cÆ}Š[¹i0iÓ#:‰{<¢oÆ>12:Ä+θdHNn¿u=žæß` Jq6íЭÛíÜàT®EñÊûŠ]x·ä@H!Ê>ŠH@]âñóíâõô«\zš¥&­Ô´r¦•í¹§õð~èiJ©£½/´q qöÆ ô᣽çv{_$çrÀvÎ-skHDˆ–Ú1øáÖY‚¬ÜºŽz]bòÆ‘“¸í}=W, ªŽ"ªöÞyö´÷gè~3æl@b³]mh»ÌÀ±ÃÙ–™±„šÂNY‡‰ÈÓñͽ›ïlªþ…´ž†%%mÌ·—w²Ø,E†ÛÝýƒvcñ‡è¶÷Ÿ¼Ý=búu„ 1h›¸[¿mâ>E¸gØMÛÝç’Mo{°º9©£].“œKƒi§Æ2ÄË»Ñ×ñz9w8›Pòf¼XÎIˆ1;>\õáÎùöôág>!áx’×à—ô‰íº«U´¤‡¢¨—®ïHús,ç !™WÕ´á#œ•Ñ%þ9a®‰ùL̯o.@™sëÜèå½¢½Ëê.[yÅ¡¿}ì!˜[Õ$N4iÞ‡ø8çŠ {3¾ËÛôߧ¥GÀ‚q úC(ÄÊí*üL¯T¼râ•WÓ#¶+îlˆÐÛ¸ÕÙ²¥ßn5L'Þ®¢í|œžAÑk¿v®ÛÓ®3c¤ 3ˆ‘×ÒÛ9 ²Eçô—Éãæ+H€è¦ÜðLKRé<¾§­7_Öxü6íÕÒŒRkãii‚©Üäxp•rÝ-âŠËa{·E¨«ˆòî·êí»¹2z^±»SŒÓ¯¹Š—*^:ñÒ/Þ®–8´{Ä2fC°äjxH˜s2§<;5F©¡t4‰›t4  ¿qÓºx]ZoÑ-+Kh¶;Œ¯F[IÝal®t‚™»hc‚bd}@`~²-æ Rº¤âôæ0PÂ){÷ЊĖ «K|wå¦Ó2ˆQëºXÄÐöZ6-^FèBw¬AÚUÐÝPCHÙœœx»õ¹V‰0öÿÕqžf…²äö¡ÖݦX.‡šÑN‘–3ólûß&.!T^´E¬•!²´ý·3+ÿ=w9°O¬D£—m *B0Çؾ,RMœÎÄé;­0Eô48gv`c°’Ëh=b.ÅG¬wVÊ™µ§* æ¨ö¬ËH`XpŸ…c,PIû.üñ¤”Û«²ïÕ öÚ4ªjmÚ;-·´|¦åï£åä¹|ã– ñ† ±[W'¯—ÂdÌìö¤˜¹qFÙ6º9÷Ê6CPáà¼hhG=íSÚ™÷iäz÷|§vßü~UH¹hCœ +ÿ9ÿö?á篓¿ËÛ×øÃ~ÿã‡?÷§?ìñóÏNûQ!¿{|Ņiø)öœFM戔äã“ãï·idð ó×Ü"|ßÒ¯_“ýWûõÕWŸŸÓþˆçÚYþ:Ñ'ßn<¶Ûƒµš-þœ% ÍÕ.*ïí÷¶žPÕªFÄõ2qíΘb>óÈŒýNÔ”1PÄjîY ´¼yÑWú]åª5õ%¦îh_²úiuÐcT©DBXm´JPêÍ£š¢Þ«²›Ù{Æèß³ÔÛ³er‚ýÝÈÑl×ë¬T ¤%Û¼NÕêa,'Â…/$#·N L +øl_«¢ï#í!öoq ZÄz2æìOb e¼ ± õe,-±œ‰åš(FŒø QdóJ9Ð"&ZÅ‹%Ø£ŽUú•r¡{€d»;œ'Îø¸l‹bîôèÞ}F{uçB50Hâ0œ×*>{Uöí¬‘4Ž¸9Ö0­§ +Äý1M¹/í™U`¨;ëˆ!+ˆ•~ß&¾½=8h¡¼Qß!E¯”ùöd›9c†š,hÏ ¿2ã¦'ÜEœÅ3C#~çÅ–ϼøø:‹g*Âó8Úæ,"U ,e “e(¹†>± ±ûbÜ,Ý ðÈÒqÌ'`Þ1ówsR’ì½3nxGÂ9.lÉòíV<3îÜ'J-61ÊÛ Ž×Û„‰õëåp…ï×˱ +ÏUú®¶N½Ìþ$ÖÐ#Ö+@œŽWjÆÓ.iX^9ñÊÐ|‹ç\ŠÎÐqußÂÙnWÞ·#æL LQb|wˆÏˆÏŽ6Bü…£«ÒOå‰ü1Õ ¨©â¢CÜ®ˆ’¡J˜Ói_s³ã2*>à}:Ä‘o–R¿µOË·!=„jÀªõî|9ÃV¹Ÿ£‘1E3^QÃûµ/°i˜Ì³t<³KìtË­²TRy9Ú㕻ܜ2ZèÁw´Ê1µ+èû©1ìÁ·w4¨$w§òT0ÂÚ%VÅýÉÌÀÙdŸ.AUA%"ž—Ì-ñXÎ…Äê:¶¨bÉ.¡Þàk?˜—± +FR.‘¹]]»Np¼TÞs†l„ò’5Í2”\w²a-P%íT,…ÀÄv²ˆí¢ŽÌU‘Ã:¼¢*Ì$ +]mÁpfdHÝG7txlpñ„‹ž“ù5gØ—ð2‚à” õMZb9KøÌ#þ¢Ã»M¸\ò>ÞÐ&¼­Xñ:ƇkÔáŸï»6ã[KfI bAp]îj°î|ÇêD\‹ý•Xp#Ÿ¨ˆrèÅ—ŽÏ1uë +¤$·ùyªØÏ'81Ô*aÞý«Šá„¾[œ,k¤ãǵsôvZ,PR•î¡4È;r(IC,'b ¦JNjøêÎ}ƒGX\~þÅå—ϸüèÈ·‰“Aàgd}\!I$ß{ñ¢„K¼ëd†% ¦`ßDÿâDtqp©þ]=nPõûéñAœ+PušÇß¿ýOªÖç×Ù€ìùõþ°ßÿøáÏýé{üüóŸ“»¿Á/wGÿI§iðû4j:ôMI>>9þ~›ÆñAÊøøõŽìî{ˆûùïñ{r*ï_õK$ÿzùóã÷'½vüç;ÚiGûù#¹#†Ó=¤·O¾!½û•«À”‚µ¹&ÇÉ-"¬ÁS8Öb½ Ö.ŽŠÖ€ã#î¨lÑå­¨cMÈê.¡L j)aq_‘_ÞHRÙƒ9Öð¯ÑÜ]%¦‡³—Ë¥=@‡¥sÞÐÕ²'‡¶«Ú2®&Å “WwʺNÄ=Y×—±"´”Ù®6Ò'ØP²öÕukøÙÕ] |*â¯(€,“;ñqOv¼@œÔÚ%s à÷(–Z †qw{…>·âAÆv„³zÞ}_•x ­$!¬ýÙ‹µ´ËÎB „µýnÏ6…­ê¤ä „ÖqëúSã°ê,XÎPAprJŒÛTBõŽa«Ý¾7{QÍ°æ€Þ,¦„¦O¸õ· +˜uHx2I¤‘Œ¿àÒ.]áÒãu´ ]o ¬`€vŽ„ûègævW¯–ý©%,E ‰êÙŠ6aÐ0Œæõe­`+êxÃgÀIÊ. Ž½þpptŸ-äžÛ3´›èkñ6H”#E¬uÕËùõR c|pë¹°˜äøèêMGŸ.Ÿç âüèÉf©¸ǵ¸M`8:ֲ᭕¨^®æiÉÅÀQ;í(ZK1lWJ=cÕ+V}|g{ØÏ̪'\¥¨R.¦ÝÃz­RëÒzÙmh·+Ø¢+C ¤ÉÕa¬/$H(·Ã´;°KnkŠ>9ÉBG[OR\¹†“sAŽÉ —ºÉ‚“¢Ç¿0ýêòË l2['¼tÂK¼Ôæ׊VÞˆß$þI¡«-–ÈŠBaG[)‘ú焽÷‡/t·ÉghÑ­òn›´ðÒ”bír²¡ýÌóÍö¹6± +L)àø³éßIäÓšË ±\˱rñ§ùˆfƤ'Ä^“ÉüõøÏßþîu9~_Lñãû?ù‡ýãŸ?ùçþìöøù_ÿý¿ÖšÙ>ÝR]Ùð­ûÉFMÇYJÊ?þrüþÁÆñeýñË; ›üüóøºw|}×_^yùç×_Ÿôõ·ãù|Ǚϯ%‡ÿ¾ä¿¦FȪ–W‡m\½³q«;¾‰4?¹qí¿ñÇ«üÿÂÛÎM+ìÖ—¢O.å¹ßdÖÀ,Íf¶áž¿EüÊ‹üLËG{}‚øäEˆ{¼è·à ±ö ÞïÞ¶C¬nê%}´€‰:¾"îñˆˆ=˜’ð–v/Æ@+ÝÒ.ŠÀ&Nüöq‡ ~[Y¾ÿ¨,¯Bî˜Ýíèø]Õû–ž­áˆ½jAR-{„³b”|«má·º~+Ô\"~¿ðÒ/]ñÒã¥Æ^›'šqCoçhŠ4”ð]‚Ÿ‚¥Û`_ÜFfÆêO1\ë‰aǃËPÚ×xþÁN- /rqòKÄÖ®hùŒ8_疆ǖ>xÁÙWwVEßԈǑÕ:ÛŠ>Qv*jž§Þž)æ2û,2iÕÊw<í®v_4ˆšR ÜϽƒõ䡺˜•kV('â>wµ»ß,r ìMxÙ)VÀ˜C~g¸ï»Þ ñfþ‹Ša§\°A(ûÒpÉ-éæu¸‰XψõŠX[ˆ±ÚMÄï:€ÖÄËp,UADÚW׸­ã>Ÿˆ½˜€¹´›p·*ž!º6R£p|êÏo@ŠÅ"Ä¿ª˜Îx銗¯ÛåH —©ðt/ˆx? “¿²FxÇWÄ=íbäÃEp£„F*L7ÝmŸ†C®ªa[ÃÑãj±"¤’/Q‹ø]1­¦p%PÄ]õ†Ü"d¶Ù|Ó^µ÷ÊÒâu‘|Ó”AØ¢-w7+¼va S‚@“Ô=x=Ú:µïÓì{Ü*˜íraÇ®ðð4›n{×s¯Ä­”évÁ©Ég›Žxàn+UCÏ]°ó YÛ×ÝæsìK3…»mAŽ5áñk-Í^†›hßlÞÇ܇ÃÎ;ÈÕFú„7d¡O Iäq›â@ë+hvÆÜlÌй…EcϺ>K‹KZª8—b¬vÛÑ,¼ßÊ4pS <âÓ ïˆâä¸!â|Bœ/ˆs§( +RØ~ôaÊÀ©íçÄq§ÇY ÖXÅUôyqÈ1£· æzªŠy—M§È)¢wH•ij깑ê6#éÞÃnÁáU H8B|—á§hÇ•Ë c®('ÛGdzI„x„"îÆŦBˆùSÿµ‘’Sèß5Ñ·6bØ.5ììWKr,¹ Üûº€a`í#̼´Ã›¹„Q¯çyªmAUM*ˆ˜Y½ªK©T"? phªãý‡£AkºZ¯âM3.ø5ËøÒzæeÜqqÊÚ.ÐÞm+yEç–^Ú†m)Ê:¥i¼!â(ìñ]25,ñß{.UEÆ£¥ÃZ—ë w[Ë«ƒ!öKÄrF,ψå +ñ©ßÔñ£ŠxX •š ð×^q›ãϼb&ÇÒ;HkcóˆÍDüª .‚î­¡QîÜ +•ˆ†0Æøèã|ê‰ÄU¾€X­Ô¡ h³D¾'ŽožÚŽïuˆœc|­Ã±°ñêÕyÂK'¼ô„—>® ¡#UJclǯô*,Þ0´gû½ÓϾ°ßÙ¥%®¶lüøl{`hÊuä{X0yÆñžˆXðzmƒX˜ «¥ªØ04LÁzO«Ä +Žï ϯ‚Ù¹¥:Þc ÄÍ ]žôx¦éêp~ïQ§*׊g´ãí¸RÄÌmÄf@‰O¬É»qB<žv‡q¼êJ·¯î3EL-@-8Ö4ï~â¥3^zÆK_Öµ“Nn_\ªaTPmµGЋüæˆÙZÏÒELEl ÓJü*ÃŽv«_¦ÜÆsÚR5¼ŒuyÆ :t׬GÌàvâµ± µ´õLâwV¾u긒Ûiº-ç NàhiÓÙ¯MIAÖħîpñîð^cgeèH«ÛäTŽ¨¤:~UŸ Ù&¥0#+¤a20ö,‰G,gÄòŒX®7·—9¶/ÃF•ET§éH—`½]o·´J0»Î¸iJ ^zÂK×ü¢+'JØ3-Pûj~'*‚MÑÄ'Žo"¾Ãñ­›Ë×ÛÍ@±-ößçT¾sw_¤rk —ëøe'þ¢ —kïCÁ¦é±¡Wx4Òôò6äØz×kŽowµëË{³SèXnlº?Ûå×*N;Áè•öFL ¿Ž»·Ï3÷B6áŽ7ŽnQH·°‰<<ö+Aµl‚½GpàuÔm1”ØP•L­àì¨æjÒ;H%I4ðÖG¡>¬¢-=»ÛeØš´Õϲ53š™Ä´›BLr­†-Nú³Z=ØC ñª¥ü|mw 8¿6V¾¾¶mü=Ög—ôâö 96‰u4Ò"¼_jöYu_S}îqœ'³ '—·ñ8!OˆÇŽEÎeªxL××Ûr7À»Z:FI½âU§Xìl‚‘w#»ºyüάï?OKï—Ђ Ô´ÕA\¯SÇ“Ù ~uo6 NŒ)ÚY ~¦†©uKÿWãŒx<#ßØÙ„¾ xþìxgÒ !X4Ì ùÒ+=c¥/å;;â¢Ägh·44qO'džˆÍÁY¯ í®z/´+'¬ò„U>®´[[¡°_û>o¸…7åWAÄ*ñÛtôGæ~BÜ ;ã_ù«Úãÿ…¡[ûñÿ¿ÄËþö÷_⽿ÆË>~ýÇ¿ÿ'èýøÝŧŸÙŸløñÞÈØñû?¼=È8þÕ€}üöÖ{ xüyü˜ñM~þo<î¿=þøûo/úùã[<>pæâñ÷àˆõãŸçßeüÈm8?ò”¹˜3ñ k?rô3Ä3|hê8`à‡k®äwRêßñÇTünï)!÷! 雯ÖîD5PT*¢!ã9ú)Ú }>*6I»ï&¥•-B_1;¶éíÃ8ÄfüJc0lV#(ØT83³Ý¸å®U.Í ¨·å%g¢Œ`4K½a¿ZÆ: ³gŠØ± ø RÕ7ž9^UFÇGbÐдBlVxAµÉ÷¡½¥‡íXÊÕÚñd!W;Ñ¥§ŠØ°£…*$UÅ˽çZ¥‚æÁ±!ÅD Ü黊å=´ùÑ…©¡­6µ©ÁU˜Ò™±¡"Ø\u9ǃ=ž´">@¢R¯Q#Ø:˜ÒêÒ3S¿c€v±Bˆc b©*Ÿö–r¼_0©Ñ¨”®T³.ñ/ñÒ3^ú¸pµ™h ‹€$–ÜfÁê@Ê^Iºah½Zs!]`™¡MWÄ›hÉ{ýšÂ輺ðLõ‡˜ÚV‡Å«xÓk`=õÞÍ +¥P'(E»á R1]îf3õ[ÉÍýr+¥wPIy³¶sø/µQÉ;A?>^¦?T+ë1†Ä¨ÎÅkìåøe‹Æƒ¶ºñLÕp¥‹«èhñL”ˆ­²ÞÆ`7´´o&_V†¡šÚ~ô +Ƨ½e_ŽŒ?-øÿ9n1V#~o†–âk]*Yp(‚ )‚­ ¯?6â(—¢cµŸð¾Ì*€.•’£! ¢*ÉloÊõ»ßÔnñU¯G vÕåóa-tu‚qu^ɇVÌ}9ÅEÃ0¯â½Ä=´¹ âÓ‘ulBÐãI£"ü6‚páBÁÏ0­¶áI1ÇΠ=¹ÍÔÀÊ0T3ínéfÁ¯¶ÕûóU¼i…ˆkÃÔ{7ä÷(îhi žd¿ÓèUÓN¹½Bñ&© öë; \s \CcóxS>4ö£XƒaÚÒ¦§Ü»#£q¥£c –¼ï×ÒŽ•A£¯NºÞwZZ½•Á.àÞ—®Œ?h‹µ2 ŒŸX錕ž±Ò÷Q+m„5¤f6Ýzßœ›µêºGŸ•r8’ ÑWçÄ$×=ö³ ¶H9i«KÚL›Ð@œ;ñ~šà1@»,§x®(̬È22h:2~§7‰÷ä+4@0õ´Í2C0>í¹=LjÁ“·ãUe M°Sýöèí*«wÑÔ–VhÈIëQÒ´|<ƨSy¤# ã ñfÌCÀÜÿÃ~µ$9nÃÐ}Ná !@€Ö9Â!ˤ²™ûWjwOä”aR%ÊE&Yµí–ägðá}ÊÀ¬²¦…z†$*y•¼“¼uVË )°2%Y‡¬9IĈážÜ‡6–`‚"ñÆÍÇÉ…>U­$ãb4@ÆíŸ~®ž•)ß?– +Ùèãóoþ¬_~ýæýîϺ}ÿíÏÄ©\”üÑ®óæ·ì‡!_d³´ýNåï7†÷Ylï<’!Ý>o@PÀéóïö+%å¯Oýrý¼üþúóA_o¶¯¸ß°Åýµˆëí÷‡v[ý'o9À¶Ÿ[À£ÙÁ“ü¸£q’²;Iy8IéÙ3O¯[Þ~†xÔnï~Gg`¹Ïê9÷œrÂ9B<á¶$o¸ KsÆe¸<".oó§¬PªÕ‹ç{tºZ,o"6 Wú“aÛ³š³RÜIÝš"}¸M–¶]Í4Ë»ÈpÎöÝ‚(µ…lšêÅJÀz­UŒ^ÁJÙ\ŀͯË„‡qó'gBH3-Ä`cHN‹÷1┹eª5dÄ„ó-^e¸t¦‘6]ŠÂë!ÎPr”z®é=Bw 6²•ön½‡HQT»dÄ}fŽ¸`•0®Í§m’ü¿oðY¼´$^)!dŠÐ|ˆ·Z +ñ¬ ˜¹½w²G,ˆå˜´õ ~áZA¯Š‘¤XnÄÞ•*—¶CwÏør‡^Ï>r†œ$ˆm÷³9‚xwþ!Ëqy@\zxlëÕr|t¡ÝU *¡ÝýàpÙ£-hË­ÁáÑ–¨´SæD:Á$]mwƒÁ¦€šËB‘>Tm™ùV¨EƒùΨh’ +áB>'ù#K´Ñ­jm bz@L]ª†@ŒÏͨj[QJ™#ŸûÂK{¼ôˆ—vx/׈ +–9RµÉÐrõ‚dü˜Ód‡XKb#P$ijD7Ÿç=Ì_ ù«à8£pSƒÿkíH¸³M”,¨„1lëƱBA)…¬˜/«q­€IÛé}šºõ Î+6©Ô–Šaq¸'ú„ÎTbãÀÃn [ÏÒ½. KB(·ŽH‰gË>KÑ—!y”X£{ +*(KØ2æKilš#uÒú¨kƒp¹ZF)oB`µhÑŽêîåªk`ئñ É©T^EvW26±HÈîgr„ »sçÛÕã™!'?ÑâÎùö –by@,]ˆ“—‹zyt,Y0ãñWvhËÚÒƒÖõ×^ª½2[Ȇù¢ÃZlð€µh0ßqú@‡ÇŒ0À*‹8ÆZhYˆ1 ê?Ðvo[;íôm[˜v¼Z$ Ýâèt³=•{QÀ[º0i—¿H9¨¹­¹Ý™÷ê)I bq÷–]ž{—Û4®Jõ¶ s+Ztf¼^½° D¼’TdÌÜ6ä²G\—Û¡Åë±ç2éÕ4>:àp¼8«¼+ýž'CØ-ŽR÷)ÖMÈA’Ô¸®‘ß[\èu¸ YËZ¶F×Þ“-h?Û®„öÂÛª–Pxg47‚únÄÒÐ3â¾¢F@Ñ(°O¹p„0X¸a4ÞáíJ!ZÑjï\º³ÒÀPÄ»¥ëfD;;ôLøEv@Ê„—¼Ã3Ö¦Íõ [ÌŠÅâšqÅÖËÀ’œâ1b$#6ãÈ•V2ŽŠ)æ<#bI +˜°=ãSc¿s= # ?Þ:QóbnØÎP‘BÏ Ãì½zº¬4àQëv8F„#þðÕ€%äí¢‰{»Ü$"#cC$z'Üß®Èó‚ œÛ™r*wsœzáh‡îšAòÐÞl~ÑÓ2ÎæÉ +T¥½lÝé¡){ñ*S.Ga„T=]‹x‡÷\@s +'‹n2´[à!«—³a »yœÄÌíùžŠë ×3á çŒ`ŠC嘭µ‚P`Ç;îÜ£Â]¦ü"gÈ)’ˆ)[cŠ|ã /íñÒ#^º5|y¤T‰Mc¾ÖÉš@©F½sB›c%P ƒÄ„€Í¯Ì¥ö ½ƒKHã!KG‡ç‡a\i! +KÞ(œ/G<0M‡ÚJˆ}Æ©ÔUŒc¹´&¨ ,µiu²G,ˆåÖ°:ô‚p´Ðiˆxµ ÏU¡¼ºÑ @þ_Y'þHF /ïÜ»>Ç{Wý¿æŸùf¼^¯ò§Ë3æA-ŽÓÚjùrÁ4Á¦ÜJ½xlVyÀ*·6ÈÖHƒG ˜Ý%'`䈻ÍUr…D¥Å€^Õm íšjÄ50Ô¶Þv;Äåz‹…K˜Æëí™ù +%°dQf¸ne‡µ<`-·÷­ž!5ÐÚû™™íîÜCMèCÏ!S¾<õtDà$y®ÉªàB¶’û:P’ªëdÞµ¤$ç¯Z‹¿'¼m¤[lŠ–%tâù›hŽy§Á +q½³ðlv!#Fo›»F†yÜQ>„l(À\[³ ó®·i¬©Ôvö=‰x¤HâñdÙÁ‘B®v¹’Ë¿‚Û5íøÛ)e=€û("û“Òåñw$…ªF3ž±C¡ˆÆ?–Nöxå¯Üº%øLÙäêò õr 9ÛIߘ|ÏŒw#aYªY$°d‘< ÷‹“êë~Q-_îdz:(&Q:»„g CÁ#Om"îžñ¥‚f(ÚÛ„çí­JÌáù¯gÈ›Ía·nBÄËñxksµh; +wÎ8ŠÂ{¥èsX+2qÈã g\²S£ÉãÞhù”Ç»Éw"¾Ÿî¿C+ +ïZ¯?#­ŽüI* -œj{ÆÝˆÛ ××â…“”A„ƒ¸6L†â ãpRpŒQA:Êà¦aœ ï Áň£\¸œ â¿åbyë Â~Ñ:‚– 4§»W©ºCŒ +©úË?~ú¹Òýca ÄÏ¿ù³~ùõ›?ö»?ëöý·?ÿ±ÇE?´RA¹Ö‡aÈ×0,©#äTþ~ãñàcÛ;ç+ÒíóEÝþñwû•þ%_Ÿúmøyùýõ烾Þl_q¿a?Šûk‘ Îï{ô¸™è¾ú‘b¤óÝ1åù®èaêix¹–çx'²ü­,flv"UàÊÁd§,PðÃ?ŸžOƒ¶Þ¥•ð5wi—áÒ›¸‹âBfëPAÐEA$Z¶ATØÁ¥\z€KÍéú`²æ·=Õ\,»Ü~ÄêEüaË©‰£éª×s×[l"|wϹZ–H†iî¸"°Ô² ¹£‰`GÄHÞzìEÍM“˜fѶÒR­M…n){F…±-«xg1~ +ø~Û‘ ï …–`y,ôÂõ}ËvʆՀ¬‰µì±–G¬åzо`ƒwSát±O Ý7ƒš¼¥®À†­®UJÏËÄn×:#oÏ®¼̬t8:Û§`ÛZèÂF5Š¼b2*¸ ×jš‡1-é¹?ÌÆ$ù•”/V„¡éÑ5W,àíl ˜1¢Ã¸ö†@f +¤i¸»X!ƒœ›Â00ÛœKº’ýnÑ…º„UHÂÏãÂ0ÀGuì…Š¡DÂ0u‚‰-C]6ñ’–‚´0[´É ¹ vžÒ£Ã=›¯ôHv:TŒ&L‡'|ý¾­V|HSY)õ2(ÖEäדCeº8¢…ªƒƒMø>°çjeöokb¨öZÊ$ÞÙ¨`æÎÖ §ºšDûqÇs6`¿Ø/ƒäHvˆî}Š¾€a@`í#ü#xi‡7ÿþfI3úU&+šTÞÌh¤®Š&‘ù jÛ±¤ZÁŸ¿æ3œF9)uYCG¬GìXo6yݽþmºáMèÝ)x¹8¤Röq )º(~ª•³Z¹ª•×N•¹’”óìÁ$±º$% +±¬Û'8tSEÇuÇÔÚЫÁ@ÞD†uj ðxUCp÷€Û‚{ñB0Õl jb9(Ë‹EÓ½eó©¬N—ÉKKp÷tgÆ/[)ØdÈuz-çÚk¾+·1Ù·NµªÏœ&Û(±É žjÑ]ù5×îÌÝ‚ˆÀã¤Û+#CNàÑ¡6Þm`ËþN‚»µ¶`9 –‹`é,T/Kì°"EnUn@–"û)•ÎRé*•e™ ;å.V¸ñØj1VOJËـ½kås"ìÍ3rý©D<Æ·CϞݘ½Ö0I³†ß³ÄÝN‹Ä‡TÊä™»œA3E—Ä—:!ç².œbZmBQ¼SÁÂZ—-OœQ­–0ûl1âDÙˆfeƒä‘^XpÉŽ³àX1ÅêŽA.öN–³`¹ +–Ö€Ñí¦à'Gd@ËÑ® :$†N¸›kpù §H=‰Õ‹Xí‹P8ŠÝ»³]h5 +¥ç“=ñMg8ô ï»á  ¤Qš}¥C÷²µ‘·oÙBä­:Ùxrœä¾ÓÂ[y—Í ©F“]°Ø¶+ +Ò:á,ÛðÜ}ß\¸ÙjËØA*󶲷s¾Qöž³¡¯Ùât°œä],Ê„ 0…é°ÞAqL—1H‡Ï½#ø”¡`9 –‹`é|¤ƒŸíßd¦5ÎRnZbv zºµõêY¯^õêwêe¯pÆ!œ :,îpØõ +Òð +#ñ¡~&ù&$Y²á°ât4ã‚ßuc¾Ë:õMH%YÆŠ¾Á®ÝUûÿP¸¶7.¶w&;Rlòú¦ô|ÇNÄЉè=Äðnä*P¶üm‘ûŽw%¤ +d­öíÆ…ççåÀPHuÙ,\¶A¸04vÈ›nÈc=ü‚Ǭ:BÃèkÀûö .©D=±`ü²!x aE½ÎÕ/<9Ð.G&ŸóE0Ÿ‡¡¶U¿‘=O`t»9Ý'ÓÕ“`½ÖŽéÁ…› ¼L@H¦:–|‹Qz1 úâ„;Ývh㎜ËE°ôL7 hf{=ÝÞlx&ö®Ôpј<ÊÝAäp׿M©9kynƒ“o;׬Ƿ}1 6P3Ù"$gHÉ¿gÉzø1¾'ˆt²o‰eËÍtÑCÁMzÌ °†X3£Çú ñ÷9#¼>³Zµ¼[u‚RÐ BïñNœÞ©÷óˆ¬Ë&;%™£}çÍÓ¹1ŽíFå˜!{iÐÍ;Àp™nŸBhÈ ”%‡aþ= îëŠP0 +¤œ©•|ÌWÁüh$ÄÐ…3¤´O¹m7aIÐr4áA×åÐ #Íe |r(L‘Æ‹íšm¸ltÅI«žµêU«¶´ž¤s´Ÿ-õ{àCM3ŸíÜÁ¸c9᫶êw&ŸLæ›kêÊd+ nVŠP}†úØ,ìµL  '£Î0;HÅt>Ý%£L¼¤çE¼b:HR`¡Ù 7î¶8Ê‚Ñ¢…³Û¶¦à¾ ÇÇA æû¸‰éO¤^I§Ç½1éePÌM4[#%°käܯÙvsäô‹¢N—Òän ¾‚n©ß•;=D<赟bé,–®b©%v$¡ä»ÕD}SÆÉ9Ð’3¤äÁÑ6»7×,Zõ¥ÜÈΊ˜¬ˆ‚Á.ˆd’%&ôQ=1²…±œ&#Ù û²sýUx22Œ † +¼‰ƒ}; îE²Žîü–ëgòäƒmh¹Õ“"ãór[R° + M³¡‚kB$Lå—!gÙâ:@%BÅ@²’ˆãó6ž’oÒƒ! ¥}ÒL°¶1GwEºíÞég濉BÞYpÂTk+–Y¸J¿j³ý;òRP+Átô¯äú´„¾}»}ÃÂÕ .A/¹pÈ@Ø>9;W.*³‡õ$X/‚õÑáaFPýt„ר8 F?ûÏßþ^¤>¿- +E?¿ÿG}Õ?þùG}ëŸõU?ÿõß_úÓHVUp×ë,êO?gáÇð9Ù××õAÔ¿¸²îO#X5Búñ÷ñJŸ߭ÚíÇÇ?¿þñžŸÿà?å—ÿ·Ï¯ëx¸<þýKlª}4”šKôßعÙó»_ˆA³•çŠ×»lëZ“r vx/õ­È+®2L8y¶#c³8O²bÉTß”Bÿ~yBΊåªXjB·›Š?ž6®Âk¶=6n·|ØÎ µ,±|\S7n ¼bmE/Qª Ïà7ͽ2<ÿ]zÃü(ìå/[+ivš ô/›ogÄ{ÇÌ(Gx9>1›!Fµ"”„Ù ;Åø{× +¡’E,¹Z2¸rþÖ=ëK†W"%ÙŹTŸ­Çæ>äÀŽõT¥p¾_Š;oÍ Ç†v1AÆðz4ã¡×Eͳœ$ꊻ~ê¿©ö3FŸÏW¡H5ÌÇ&À¬³ÕŽt3¤œC–\oã„3(Yx]¬§x«R–T€”w‚_O n³Ï¡¡Š0Ñô“hœb!œíŠa1¼ÓÂÕÑ&Î{LöHÕ8|Ǩ½Ds_„ƒX™}¿,¸dJ\É_3î.¸Ù3–äU¨EyöS/õÒU/=^"åXdG¨>!mE€@H ƒùÎñ°œËE±t(RP‰:ù¤¸sÆ=Šû.Þ:Ž +nIÁX ¨…Ší¶)ì©âsuèI±^ëIqÜt6nŽ¸3'æ'1{9>(^­›Ù +°êl’ÙtÁ‘Âù®—Äv3eHÞwõ6#¢o¾¯ÈÝÌ¿5Ôúš.T\Ê¥é9+–«byÜrDÏŒ_±;µ=¼Ìy´Ïå)™¡d2ø®ÖÉÛvp;GN¸ÙÇÓ)¸8dÓÙ¾ÙTÀ +¶û­[ñüKc7†`Ïà9Eù;dãFªÝíö$¨§Æ.ù‹%yóÄèƇ§'ÆIl× ŠMœ"3,¿‡óìh¸«7\´^° «Ì–ج=[=ëÕ«^mÍv$DJ@γc!ÝÞµvðÀiƒú:Š·:Ý$ïVm: Q€g§¶èL‰ -.Šõ¤X/ŠµCñne¼ScœŒw»S4e,Z¢Ù.WÆ,§èj»ëƒ† ä¤U.Z¥í‚ZÂÂ%ÀÝ“g»#· =•öj$8a[ñ–¼Š´Ö–-â[6E›8#3h6ÚG±$²aAˆ+BNÄr!–q¬‰ +dÖVðÀÞÛ3ãozoòWV U±Và²[Èm¨åÂüAE¼WÔ¨låj¥@F N¡“«už=±Üçj¿†s…b¬³³ù¬â¾ê;[ZRD|—·IÛ§áøÛNÃÕ¿[KÐÖ²_!w»„5gÜåkßÌ8Ô¨¾¯¨áC~tDé|Sm~OŒÇ_‘CWÓ%N:év5 ³®EŠ>ßw›B’éåý Ü·pñ¹‘ÀR²Mª°ŸT¢ãhÅâCVÀ°ÊFŠ( L„ÆIÝ3nŸ Ž‹”ù¡1P•@Klxµâ£YK» +/4_õ§õc¡üæq„‘~Oѹq=ÑWzbWc0ÎA^QœÄIçt5.%‡ÅrPUºuÊ ä Û¨‚ 3…3^˜i§¾FµB­8;™Ñ2~•÷@¿+ú0ã¡ß¹ÚœØ#Ì@´jÓѺÕð’x”r‚šr«Cô¶àÙ³­þÝ)!W»9Û¯'Ä}wFÜ*3_·¦7tç[;‘{füÍQ3ÔŒaëYïúäT‘‚ësUbÁ¸§-Hœõø‘Áu4góäD,béØfò¥ãtÌW 1é‰8›»‡Ó<þý·¿k\ÊóëL`üõåßý½þñÛïþ¶ø{=þøç.à à9?[®³àTž³¨éP7ù¿??ñ6û5Šã3wÚd°|(ûùÿñK²èÇWýåõÇËŸÿx£??¡¯÷æÿÚócŸÿæÿ:/Š˜Ùa¬h]Q’ÿåkµ_/x `¡"³g9t'ñ3¢ÍóÖêx½Íã„Þ€$ôãõˆ!«¡»ÑñU}d¨Š¯3Áûök⻼³5옢´Àzu9±Ê…Uz¢øÉX0šì‚êåL@ŒA¿\Ñ…I«7â`Ý–,Ä䖆ܶ´îÏEò +›ðz¢àâ³pÃ%z·® Û7Þv»ãä‚ÝÕîN8l=î„»\ æ~¦dÆ8C˜rûÙÃF‚L]5صŽjÔÙ7´—ô݆˜Ô\óä+cè]džrVÂÿ$æ31_‰¹Eó•˜[ĹÚMâ¯'U(`°sKºDÚ©öPM® =-ßVp»öôÌ÷›Ú³Õ¡AÆ€†ºQ‰P²:™øªˆ>‡ˆáú¬©­áuf\]¹ÚíÔxI;°º#zuçPë¥Üql$NöÉcîM ›—aËix»\.¾s%O?çð6q¸wÉ5!¡K,¸w$ +šR;;ºÛåô½Û®Sõ| ¼í´yx&Æ+1>nmžœˆåB,ŽÍKÞ1EÚÄ›7ß+7&Ëu''Hªá%ºž»H´cÆÃz<ŸxùÂËñ†Š00µvA/®Â¥›1^<áâ;Æëò5ÎÇ»aas SmGÝ2æìá̸‘©qö¥#mv½¼MÚ7»Í*<–}vÎKˆq à9Õ§+澉 ó££NŸñØ"žIw]möΡ¸ ç0—taD âP+g@’nÝ›ÎVýàФûx1ï?%ªXò ÍîÅêø&ïüúîóÕéYwâ}«¿{jhàjKª!‘ç\i¥Æ2jØo¾îÁ¢áµñS¿r&–+±<ú=ý +~ÎêõŒýÚPjßG|&æ+1?9—«ÝTÅ×A»tUXjß Ë̘K,D{¸—ô„l)¢›öµ"ÎóíSD¨aU¿7àÏ ÎÕ«š¶«Ú2ƶŸSE¯þ3·X:2³éÅgd8›kXkû@zË&ÆHæ ‘OÜ>è^ÒâmÚ؆½Jžâ¾ã(&f'Γ) ¥ÀÕÖÜ:¯Fº1#ƒ¶+ñ>ì©A*xFDí*Ñik=ÁÜ·t¡„ÕƒÃl¶ F.—Ÿ$qÔ­glœ’kdÅ7ËÚì`>ækbQU»;ÝÙ†–3s¤†åfë´Ê³#îÄÛu…´âö›‚x[ÒͪWÍ<·_£GßFQ¬­¼Œ~wSÄÈDq ¾}hÌ?ŒþË~$¹qóPxŸSô‚@‚ëÁGÈ2©l|ÿª-͌ٱ ²Kl™?Û3–zÞ@ï} pºŽ‡ƒaZ"GqåŠN{®¨s-UŠÓAqÚÚlP Z‚Ãi3RC rZyÊÍC#KÎm~ѵâ>Wøé¶Þ¹AYÜt¾tã¬ÀZ\Åc6odº­ÅlÂ9ß®#¶EX©Ål`oJ¶¿~ù5#°Ü¿-¢zûö7{Öo¿³Ç~·gmßÿøûóvÛ +ß?ºh?¢žƒºÏ¡àþëqÐ_¼aÿÊ~,Æíã Šû¾ÿ½ÿŠðó»Pì÷—ßÿýñ Ï/øö§üÃi÷‡=y¶?ëOQí·ä ·ƒ¡ìc˜?ñí“L7ÖºTñiç=¹s‹±¬OñWI­XŽŠek’‹žÞmu;Jâ­UŸÏ¸;?Û3îkU—\Ô^™•×ñ1—™6]1MG E(œÉQ|v¦ý~‰g† +±:¥:ˆuv°.¬HE¼±Nh.T²W#ŒNO×_ëw$mÆ<øJÄQóí<®wÃJËf×W Ü^¶îž¸@óÕ»å:°}Gäñê ÙË–šØ94âY½Íùö©õ[#C@m#û4Ž!‰ëáíäáyñ|-Í DzfcJµ'íz#Cô1¥«8+„½m›03 i»ãR­8§–âjòÜsÿtoœý/ÇvFÌ£˜Ð^™ãûȲËÿŽÆ07ò8x\FÔŠû¨ÇŸ¯@A¼¼ãFæp„Ìårr˜jkÝr™Œ!ÊJw%(!¸ä~:%^Ÿc[Ndôfü©Wj½rÔ+ÛóT•¿…!Ñ°èéDÓf¢õQ¯XA¤x‰6UJ,5cÓ»½^xèÝjêŠïŸì㎳«3ùÛ6ãUQ=âÙ^¿ŠŽ|Ö7_Ÿ(Ú9-Ò»Zfï⬈§sº=WQŸü›ïÕGÑ ñ.;”!ÏU õ®ÛåeÌ… D¯â¦+Œåæ+¤ y•>¶ñÆÒ‘¾©Ö›ŽzÓÖX¸c_ô„ß\‚ñºx6Ù|WS»Kb†“¾“Õ_#3.Áâ}eüÊ-$D@=µ³¹Á8“ç†q—Å8òÝ‹X1_Yăœ°V.¬3W‰ +¥$lz¶;.ŸmfK0önË=(róbën‰Ç[í‰T)NÅik·„›qy_îö©}†»¬> 9¢ÐÛÙÓÂ~îîóUå7¶pñún°ìø÷Bµ×RðÌk¸L*ÅrP,Û¿mãX#d.²NïŠIVlŽhZ¦˜%f¨¢ ›ñ¸ch?ßô­ÁÖÄOŠƒìÝ9] ?ƒŠƒK±¥Ã«1J­™.Ëqþåbÿ+¥U½z³í*8·Þ +¤¨í4“Z«µÊÖH³ª¦»BÝÙ +äB®â ¡2 +¦E–mëR‚‚{]ÌWÄ\DŠ»ÃYòElÀd,ßXi]zÝ’PH¹¸È0È ƒÔî¸P2zjφî•s].n¹d ì^ñ´àwÄ&Æf ‰xö_Ž½’  ìÚ÷îú3n¨6ËoìºnÈ +°/âù@ÿª=iTkÆŠ{fÜE:¾‡Ú“š}1ËÆ;ÚZùðCŽí‹¥ÒŒJô½«§½«Ç“ó½÷ÔãDcHìòÙvkªí›¯« º×ÚµGïö¨}â]M@A±™½½$ÙAg/*6ž¤ÒtÃ+÷å@7pÎ0èBM +©M;/ñúØ|ÈÀÈmã³Xé½ñ‡^7X¿y´ó_[¼êS,Ñe‡p:!.¿†$FˆYøñ"±— î‰1çÁ™LhpEDª§£âô¾ˆ`@b§4F©=–rÞgA€œÖ¡ ö¿ÛŠ§± CNÞŒ¯Iâ>’ðmŒöÊÜ&‰a½ÜnD¨½Â5Ä|™&!¦àÔÆ°ñ¬f.ŠÙS<}™ABAÊ« %Z4„«ÕŒ. )$yæ 3V…¨ÞYTAZg>\ivd€jEÌáaK³CÛ§É_V±ŒÈWŸ#g´Ë`ÚÞÑ9?¯ðpWJ¸óµc¹x†z8BæÒ¾‹¦Q¼ƒ»¿uóå„ kˆùÄrJv•«n¨…3XL\?—l¸¦î%WN*öP¢ŽµT)NÅikÃ0Bbr#<íãvqôÀ_ë!±` e\#ŒäåÄ6à”;̶oãüÙš957#¼s‰Iœéÿö)öOºb(‘*æ½9BÉí“îÅ®÷e„Ù;’ÎN¸™Á¯ÁûZ‰Æj"ShoÜDÇÑj'DI=ÿ^àˆ.½®# +b›z¦!KAŠÔ>@_â´±­±\Ïi;fVc%@n—ÇD8!‚{ÒMˆûˆ…ƒsÖMYÐÁ°ââº;º¢'*ž„30Ñîã$FC?[J25Û_¿üšàM†}_ö»*ݾÿÍöÛïßì¹ßíaÛ÷?þ®Ÿ’©Ð{•2#¦!ŸÓ(aÿEØ–ÿë‹‚÷aì_Ù[1no@PÜóöþ÷þkJ ÏïÚËõãå÷<èó ¾ý¹¿¡žÅýß6kÎÛŸ÷Ù÷ö! Ú)åçë §'ž?>Ë|ø,³ã>:¸/6>KÌ%{Š¿6œjÅtT|p_| 8žÔû¬¤4åøXíO‘ßT[MÒQûó¦ÐaSž©È…7üjõ‘ÚPëý¹ >õʽ>2Y¥Þ ë‘Îz¡©¶Ë ¾ZKÎŒY›nˆµÞxÔ·–~ìàCdùTœ*ÅnÖs%nÆC÷²=Š‡QË&d©ìŒwˆÎ×5‚BÏ?aJ¬1åKëLyf„>ëºF ¶/v±(z¢ì +j´hP·(yw䌗s‚".=| NµàtœZ‚‡ÒCPèäÚx¾ *HÁ¶)^ãÿkSP4vMqÖWWXR¸†˜/×vÅHê@ð”GF,€œe¬4î±¥óæ;™Z.1†ö7OAM+EpÀ¸ÐˆC´ÎÀvD ;4b¥7ôÆzÝxˆ€Ú0Ü=ßËa¸»ã‚ëˆÉæKöºéÇFÞ'óÍJGñý}gWÚÜë:@Ÿ„Új3ÞOУçáO½±Özãö6L[ÛÕj.”‹1tÆ‘A9y(1›#"BþûÕ’\É÷s +]`0ÀÚGðf9³ñý#%ÙrU„ðÈr‘ +ÒÝ›nIO¯”J%òƒ5PÄÉ#:ñöxD9!.Ä¥1×rüȦ†#¨q¼dó!7Û%™T9â÷.ÖÒ®„ Oö÷–°£ÍPBOG{¥„ +¢àaâ®pÃx+@\Ú£œÑ–+ÚrÞ§›(V™mf£øõA$bÑæ\-Ú6«fþÕ"Ëv” +Ün1‘Ìà3Þ>‹}AŸBMÄݾ0{V°*°r‹ðV•—µ€¡Íæv¤7$WýL‰9j¨,Úa 炸«B¾Pƒ%É{ð+œ@«†Sb½ñÃf D-~Ή¿0'X +j” z/[œ8Dš)Y‡5t£N¯!ï’!âöÛÈq`x=Ëi6âaŠÈP3…Mo¢}Gƒß¾²ó[!©Lì’#³Ø®$‰Ð.&V*ü­]çé± aÀï°­yW¡²Êô®>Žß½ºÎ†ñ¶aWH˜gkxX¼àšÚ[³»ýÎ/<…4ìë3÷yDŒ¸ºoRP!Vó6¢½Q …wº¸nøêâ® ®ñ‹— H­•vÉl™öh•¬ +ɨ=:åŒW®x¥Éï]¼áÅ)Xí#5\õÛ“/ôKj4»Ê86‚lù[[ûSýúµ1OVĬì<½§ ElPDrsËu6‰`Ë]—ârA\z[-5Hë³+å"WcwµÕ´ ¦ö$4$˜`È‹Yð^õABV™n cë™j#ø=a•V¹`•·–¸fŸo”õa–p1±.¼±‰U†jØîšAQ¨¶½áQý9ˆØüå×úí ¶ùÕa«yáh½ì|c®=+ërâv‘,g´åŠ¶¼µŠä n%°R[¾»ŠnýÊ„p¶÷Žâ–”K¤„¹ÝÈÁª¹'ØFãG’Ï5ä²Q'#o:•E éíkÓéˆ*Fn¶âÀ”ä¯bn]Ÿñò/¿u÷ÞGn† ESËÍ~. ¿ªÝT@KšÝrF"F<¾›M§W½_7‘ì&› øds€?¬ôëêË^ϦW߶F +p‰"n~¿£ø$‹5¼ž"$P-‘†GDÜP´5IÄ;a•V¹`•?±†eG¡J8ÝV´ß$^!j0ßæ ØÍ ”(o F ¢Í‹¬x‡·X¶IlÕ³Ó꼶ž1ôìÚ$)0Ièhƒq—áÝLjž>1F¶ò'•ÙqÂK'¼tÁKM~… +$Â0->Ñ–3ÚrE[ZhOªîä÷ãr¾Ö¯ÿÌ­îû¤éŒÒ®1Ôl3s-ÝÆÍdþj™ž³Í{çyÃ~Gö²ýø­4²†Õä붛s ì£ý3,[¬ÛdðfhwRm6¨I"Sö„õÑô!k›íƒZ¨ú«Ä»Œˆ +\·©ŒÙŸƒ°t[µi>¿D¡vÓmõÎG¬Åg¥Eú]qöd†BÔr²E.Nƒ%iUóEÐlÒ>¸î6ß~ <ÚfwÝAѶ½Þ26Ëî"ꕤÀ´K}*  #´Ãû㳉¶_KFÀD‘v‡%Û@Ž)yó­!âõÚƒ$‹úäbþÀFP•i´’Õ£-GhWTÃÏ-4m ±PáÙhGº™{ oë÷+Ä׶ӃøEÛÙ«?¤ +…©å½Oúà í¹&\ÚJXâÒöê¼l 5[k_k‘}hã” qÝÉH€²Fü®æ è3¥(—\˜ªþýA|ÂïÏ–÷_éO>>vžý"þs9sVä=ÿI…¢+éþ3Î/* (œç";i3·=±ÞF¬!Çõ +ˆßÖª®Çì²|”•—h{ÙèòRyŸ´_+áÓ4š´»Ù +Tqe·(îŽý6Å=5å…=P‚„¹6¯Q«!“EǶ`î³E>¶bÅN.ßäѾ…„|ÔŠDY¼ZNÔc¤°9Œšˆ#“­‚ +òâCò÷V5÷ÚP¿TÝ~[Åa(–ŒPP£C»+…/i½5[&P˜Ú®»†-d†Š9ª9wMw2·Èj!Úa¶pFÜwd1¿Ræ–v±]!¬±‰émÓ&¿å„¸\—~½1@­Qëg»ã ÕÖÅ=RÄX´VË7º™œðʯ¼5Ý ÛœÃJ6fTÝÝx5DìßÉl %kC*´†|;çõ­VÛ^þÀf€‘ýŽ:¸<â”wšB’°Ì.iwá†` ²…uý.Ö‰ÆÀêUK[Ý·6[lPµ]Î:ͬ'Ü"VjmŠ{÷ÐÔ¤8ºoV™k+ëjg/Ò‚ÁeÌí7o”È% ¸OÄ匸\—â“°»¥ýTa V#ŽGXðmŸE¼R„aØÏñ{UD†_)b7Ì ï¸}"+X©í7ã¾Zùª¥)Ç>ñywÝY7½º'‚’¤íÅkì8d ÜÃӎ̨5šq'õv¢¯Õ;rw*Ô¬í¦¶L.  sã¦?´ñ”ßí2ƒ 4×0—oßÜt?óZ \:4ü0årLžrºÚ Ì@ÓÛW§afÐ’vZd>Ac¯‡˜•|ÕÙôÅ1ðòÔ€%ÖñzK2w t¼d¿¤ ólUœð>jk¹ξºAhY d)Úq}í¬9á• ^鹸Z}mÔé‹n G˜›Z´6îâmúÃÓ¿]NjáiXokX›÷i8ö`NjxLûÚ×’¿ª!¾™óÑ¢7xÜ(•÷ëlµR{×=LŽKT1–¶³É±\K›ã:ÎìˆsÔ%îºÄää8šOÊ»x›¿J%HÕzÚ±åŠF··‚”òôŽ6Ò+`¦ÉÞ0´õ @¯*ßØÓz#Þíâ2`2žËï0´ŒPj‰Ôp—ÙÉ×&YAt§~&ÙÕI÷Tv:£8*;xp\È뙆6®ž RNA¡\ÓÐÔk;4"~l ɤn4<©¸Uh«?*>ã&†$Œ9Òð´w™ •` V[H‡ÆÃiAþ$­A`Ìñߧó‚@¸FºýÓº/­í =‰ñªAîè;3y 5dÊ8ñÈ‘ ÕŽ•±H6 ëð:ü&ö£ k姫u¸¯| }sÝÍc )f ¢³'Ñ@ŠYÕ‡†µD7â¹)—!SÇÁ­Ó)«€wžöÑukxz§TG¬Q癳4ä„X.ˆå­#›]Ö¾ºu86ÿ)íÏÕ‚c¿]$˜AÿO~$IrÛPtïSÔ  @€kAGðÒotÿ£ºFSQ(2#™äh1ÒtWUöoÌÇÿ”i§&0-¿/ˆkl +˜²x­sÅ‚[Eq +h=KÊ …ƒ`{Ó¹ò°®â±ò£?)§þâ­ƒîŒÙÖ‹ +Ar[Š×K­^:ê¥Fo×cjã;ÉÙ$¼Cé´#ÞŸëÎï¤êwGg¾Üêå£^þ<ߣڑŒø –T¢P;ÂïÌpÖ +?M_ÔŒ!Už6Âû[nj0T \#†8dwCòñjTnkÎ×€K éô„oWÌÕwNKDî3ÑhB‡¥V +ß gÚ+7Ü6¡»×XÙÄr@¯¤>Ç»õÚÂñn ”ÁŒú‘°Lˆq­€úióÞŸº™@5jµ{LqQ1ù“Lƒ¥kšâ;3‘9\:)&ªMüþ ÈáëÈ=é{«øt·…¬Ã•¥=Ü8bpÂ#Ž(ârP\FfLLUofY5·_F¸â”8:‡Û8® lÈ7cÄaã¸QÌÅüèoœ$â(ƒW›¯$‰)mN)717(ø¥ï¹’zÃ]äÐäêu‘¢M›”dMb ·†‚ÌQßíײò^ÙàGQ’×:Š ¸”þ‰q­‰§¦B ølIň€¨Ÿ5Ž(­ârT\ß´q¬.2ç0ÑfmÜLGø«ÆÑ|kc6ÃÖñŠóÝŒØ2®;Y³‡Z +cx±RNÕ?«A)/ypæìï :£Ì­`> +æs‚Ç("N‰ +,!/È=\ XÂÈÂgõÞ¬ö)’“…L'ñ A|Æý^‡{¨<ÊV/ +Ùr1v÷ùVRíµÒ¨•ƒZéªõ>¤ð,šC³ ˸“}­@–pOSsƒŠGjnÈz¹øÂiäŠé¥1æˆx¾þi‰%çëNbaD,XÛmÝ~ç‘· GçÑã¼ßm6Ì”»†žï;C4«8<߆Zrv¿ûú<;àp¼R)Á-·$g„‚!º/Ö‚þ¤œBîùà ¥Õ[ŽzË9ûŽ@el_®ª©Ík¹vÆ¥Q\ŠËÈŒ)A¬û`û^g‘d‚\óhÆÆM›­x·uÓlxÛÞ—ñIJ ŸmîðhøÞ-6`å>N.S®Tðö0›‡ìOÞ©ÎìwÇÃÌ;B$íÚ:ŠkD5T¼ÞYÄFà¨vwÅM±AöAw7o0+F6o¬æb°Ü¥æXHo'ˆ‰ÌŽˆ1û$ +žuIò׌{µZ騕Ÿ05~ õî{sj˜ù§%šïŠ¥ìbÁŒ^¥\ظQŒ‰Ÿ’ÿûú?V{}_íëû¿úÃþõ˯þÜßüaßþý¿¿@•Z~NCýT´|˜†¤üšFMþ,`ÿï_T| ãùã× ž@7Äó'¿þÿü5ŵßõ·×oýýǃ~ÿ‚¿ž-™Åëï>#ÖÇÿ–ÅåT_l˜sYß}~ßÖ§Ð@ñzå/ÄLÁ3z)ŽÎøXLRþ²óçñ®s#Ô +U“¾W|©\ULPª…3ÆÓ3~·tÇËq„­âËñIƒœ#73,Õ‘—Fq9(.#3Vó\Ô¾âuJ +ýªaíGñ2®ÄPùër¼³<½—¨Û28Èö·n¡ªS(J#^¤rÎÃÖm±­ g\3pÉ‘‡Ï:¸ã†KG‚_‹NlÖí9iµÊQ«<¾µç¶Ÿ,þiåZ£ú“^§ã'ÿ.r:JV`Ãp¾wäÃXÇÅ\@4¬¶fû}(ҧˉqÍÃBþª $ÛD‚ሊ“Ï8ÕPñb± [fÛhëý)ÚºÓM×Mµ1µ!K@A½›,Ïê ý+5Àˆ%í»û©a5èå%÷ÈÙRƒL»§3®²¿Š›äCFP¦~>”Vo9ê-ïÊCz{šMu/B"ŠÜ»˜Ø L1òîŠw"XÖ €g)nŠdPñ«¬~FÛêò|V2ÕÀÂÍxëbd¼×NŒýOI hiN^©×Ç«¸×ñÌ3m«†S¨ÈagÌ¿0¨ÑK½ôè„dqëòN'†U Éý†[†ÙrÞëÆ`ࢶIF(VîÏWZ½rÔ+½ùÎd¡ +©„¼ ‡…2dJy#ÅNÂI)T¼Vs© ÃT[1#Ð)8Ëåæ»Wô÷D ¼Øt% (ÒÍWçT÷æ ¤aŸM³·jg"»ª„ ·à|ÑS ¸òÿJ£WzåÑOƒ$pM< ªý +Þ)Y+Ëw÷ÅÔ†+ ^‘yüöìßr]Ünݘ‹Ã½³ Îi´'ØüÖ`¹;צzÂß™¢l;Ý·7CeÝ…Ú«sÔ(!fÌvVÃy_(ÑN›¶]_pÍ`\z›&­^9ê•Ç°†´†ô+þY è¡i +jµÒQ+=¾‘w$û«‘Ë°çéVŸ"÷¡õ줓ûv¸\näòA.?ú¡»ÍšB¢î‘¹ˆm…’m"–´Ô}ÚAH€2ß}±5z¯‘¹ÈÈ +6« +Ž˜wý´Š‡ˆ,vÄS¨†·â}™="rí3Yi—£âòèx¸™ü ‹_ÿºQYpÉQNœðeÁÕ/ŸšB¿Ç¿W™ŒÃvûÓ¾£M|»}¹TÐEÄš¥á`f˜KF„Bª5€ßÆƃŠGl±Ë­3ßäOÊ1ö¬·u’20†K·ÞuÄÆ@Zú¦X'&œ,Íbb¹˜84T»ÛÂÇ¥±ð§¥sÎ9"÷=,˜ýÝ[cTow¾#j?Íw§ËèÉî’4ܶõàÕ%ª¹%q"´œ§·õDiô–ƒÞòð + $Ä%O`µÓ;gáΤTwé W›+Ýî“Ôr%(5̳?Õ÷Åí ·W_äŠ%ðn“ƒzGòl ‚cBû?÷U“ä¸ÍC÷9…/$Xçs„,“Êfî_õAv&#¥ S.S]Ä·˜ž¶%±Ÿá‡÷c`µ^ž)'ÆöR{ŠÜb—K¶¼ãÿËV÷Pëj½ âÎÄ(ٚסÊ×IÃÔp†~R»º\L]´J€:ï"Ù—´B'¾zÏff_(*ÃŒù¾K…ºhÜó´Ì-ç´"Ჭׄ¸)Têôî’ÃIñ=“Î5‹¸ y–ÄéÃ$VLmUAºy|Z#F[wŠ/¼X•Òô DÉ´Ckv¹O”ª‚™Òô‡ñaAÓàV ñ VȱËpƳ®y:kmÜ$´;9‰÷aUÏå—AJ¯_'hÉoAÆße@8¶¶õÌü*cRüýÌÚš…A}9#öûøêX6UwɃŽõânb;Ä¥ûÙå¯_~íVúã}nPTïïóÃ~ûý›ŸûÝ»}ÿãïÿºP»o1{š’~˜ÿøî ·”Iþóß®¬÷al¯ +P¹j{ÀÁ–í/?þß>&cûñ®?Vþ¹ýñû?ýxA÷³·ö³xüŽ[¸ýùŸœR¤mÌ#`­Ë/µó„î_åÀ3vúPΘpSˆ¡­_öÔR¿ˆS&¢&U—©úÞKë#î.OH]*£ ¯·ld k°l VÒ²•˜<Þœ¿3Ùk…ø$¾ 5œ¬S72ŠõÔÁ8àvç.¥Y6.°Jxw'Z1™?Ý[`Å?§{:³ŽÍâÌt_˜…·*×ÒáMo‹³C³€B…™®V 5€T y•Py¬¹éì×¼õ@r23n˜ZŠÕ"½žç á!ï€ÝIT¸^§8ûXe Z‚H³Útíò†63Ò4Ð ÂÅůI½Šéۜաp}– 8S•äbЛ6…·o‹í‹é&)9\ñj5˜8Õ"YbLÔÀÁ–lbÔ VVÇÓ]á+Œs•›˜Io©¨ÌA×ý ˜÷€ù˜ß|†/+Z +ÆF¸~UŸ—s3@BÎ’²V· _\$Þ”ˆØ‰ˆË…N<ÍÜ yÄ>É63Ð +–¡Š}VÍðm„‡L@iŸàâtH5á® Õ¢ª¶ ìzÖÑ ±—+R ³˜ð&qã=£áÔUÄ¡ìNãî)¸¡©U¨i¸ëq«þ0=.ȬÀÊí\\PÁwÒ"^…ìcÀ§'<|nÂ!`•¿ש&Q ¦È¹éÒ˜OV ©°Ì²16ЬÔ:§Ib`¹6‰MŽŽ–kÂXåâê35;0h±ì2v0ëQX$q­Ð%سG,zÏ#ô)àýleX€e8œ®nV#aXÏ#¶@FΉ<.ŒJ·a‚üL¦-›Ó¡HÔ-犹²ëÓŨ-¨ºŽWóÄsêÄÆ!r™ÄmcD’ì ï7Žv€é˜nc &ë€e\1ב`ó§{«#À§³Ùð™ ¿¬jA¯XÕ38U\o%SÕL×q¤ë"® +˜J%¬‰D^pˆ@µ\Ìá7W.t9õWK”,×[82ÊL÷6¡w¾ 5Ô^B2ð  S9ë4°þÜŠW+E {—±OÁ¾M‚8F*CdhKfœÂ`\.î»PC(´d±…t ]àZ¡YRîz€©+‹BžC‚ÓDRLU|°6øÙ*¶¥[MÕÒøC)Е@W‰4­S« Ü +¨àÕ•a÷LƒŒ#·=EeðH“èæÔz"ëUi–©¹\„¢ ÏÙÂɬÀÊíÄ‚!‚"ê—É×GKæòEZ2É—V O7²sTy[5Gðò¾f}t•xP:H´`+æï gîd×T²Oozû•€?ìµgQ…t-']áuGÛ\-ˆŽ 2†RôÂ9SΪùÕ‹Åa‡öT`™à÷ƒ]‘ Ùo8Ó°ÁjŠJÙ°·aCã=T>BåÛ€»YŸ„ûø>Ÿg2W\ä–#@V +Òî¬ÛÁ­;¸õ·ÞFTàb~fjhÛI4L ËÄ®”¦ü´šŠE¡æ¢ƒåjk\+`›…ìË°ÜÞ2‹3‚›)>_¸ëe>À^1IDÓ,)ƒÐ—.ÝgæÊ@õêŠùæÊ…œ)£ë=>\ΦR·‚Êï2€7ê"Q}5æ¿&ú<=Ó·©«O‡»‡+;¸r€+»á¾ª˜Ò(RÞõ̘Q `ãDVáUS¯VÞ™ûæ ®7 î]¸Cþž··ûtóô ²– 0c‡úutølë`Yb‚q©×MvôT|Œ€vE¼Ø‚gJš ú܆Wt52…âcþ¢%û,3l¬‚™$ Ó$È-.øp‡l™]#Uh8|:¦{ +nÈ„ c¿¸ZÎœ®Q¢0V°·ÀÐ&Qá(»g„áE™H—U +õ<êÐ;´ÂÃ@Æ{À|Ì_ x£D.sk +Ò-¢ÄÛOUb–þVNãÄÜt¦€º? Ö=Ôz„Zo¯¥wš©áÏ/Ž “À’y—èA2_i¨­‚½°œÍ4^ge©½\Zò|íÝâ q¹³€‚eJj@-ª¹?½êt@|¾X3ã‹€µ¦í¯E·Ãïÿo“ý{øçÝÝ퇃öâñÀ~ß}F^ìþ<Èe‡Ne“ŸêŸÝ?ðõús®ŒÄíÉïÁÊW#žXŸŠÏ¸J„¸:Ù¶ÇGˆO»è3ÄÅìMÄ÷'‚WGlWÏx’-‘ÖMé¿të>•{õ­;Áˆe8LF>cjâÕ¼_ŵùkuøCFx´2åTŒP¨M#F\ §ð†\}¾ùÜ þî~VbùÒÅ´—«³ öm1}íý‰oOM÷…6˜Õ:œ¯ì˱Œæ{tã3Úð·L,˜JÌ~¥6œRß07O;'2ð2ù,™özÚ9•×áoï eˆ˜÷ˆùˆ˜Gˆçj„_--ÉÆ‘±ó×’¤I®-Ô‡k<îó´®’%­çÓß-M +r†4麠’Fº€kÃXw×émÍÀQ_x‡÷“´NÊÎéyæ»)Y)Y”,WîÝ\Xò̶{ ê'2Ù:ÜU¿J-Ѷq%pÔc'^Cͬ¼H9×ä2Ùá•^9¥ +¦yô!UËD×ÁT-=íôDŠÆØ\8˜ñŠÇhžN°bn~µdIìܺ7¡’$ÿr1W´’H#ò4MÒÊ—¦s³ýÿèŒrNÉþG~µ$IŽÛнOQ0L€H®çs/íðfîa¨äé¦&)*DeíEªR™ýêõÃû¬£ÝT ¨—³Ïõ^s³X#Y"óÓˆgù/Ûk¤çi¡=Z=¢Õ3´GEŒàõ±y„¿1–ófÈÜ\~àn;¯Ol”(€©ë÷–"¦é×üw´¹.50Aû¨£Ýk=Ù£ž·éÑÊ­œ¡=:ÚÈŽs4|Óz–Üp„–q­}™ ÇMLQR# †+Y* ž¸5næ\â7Íò™«»éÙ yËsÅäÈbˆÑk?3®nZj =J¿¹—æ¾ÆÎHh=­zþûÚ!v]5(ŒUÃØ¥yj还?Ü*ïèw[~G[®?CKæ -ZAK +iAt+9AՈ̒‡x¡Î Y“ÛnVSÂ7ÈÖ­ÑêÚ¹›"Z +o-§Õ(-G’5È*çNÆ=Z>¢å3´GEŒðûN +ôaEÜk9ܶ' ººVA1Ñ0%:÷`éÑÊ­|’_Éy,‘—¹:IbO¦§ÏÄÁ-Ð8R-5Ðá[½ˆ÷ûÏò[ÅÖ¦òaIɲ.L2cMa6†õˆ:âë8m‹Ó»¸sc㘃8W´æž#ù"d‰rq\´‰_Ö¹ ô´e Ç…Äû¥^ñˆÎ \Ä7×'!`Ò‡5<Õ‡³½šºðBÍR·'Ï|x47Nù½¹5H,çÒÓüNr5I +ˆ‘v†¤büJ Ä\ˆ1PrH6U$|:9&ixã·µXüæ`kqs5uÑõˆA´#=B:¼rÀ+Š`ÍÖÞÛ㊘Ø.›!Î-È:ª¦_ïâ°ÕËŠ¨§ˆÇáçmïðøý©íë±^¹¸!†=5¶Œ“H[ƒìIyº¹ÏîêºÚšë4Dj6k–I­ÐzîÓø½ã›•HœZQÏÕfdÜU¬R&¨Ü\ÿý•{¬|ÄÊÖôíÌþPª5ž¨£ µí“>ªß›þP¬TJåÍцZÏŽÆ5Y"×H‰œÄ€J Œ‹µ<%ã›±$¿¹ZƧ=b¿\-ç4ÒÅqÉá<8oÚñì¿ýnŸû‡}Ø×ÿüÏ_\3QÛ=kÖöîl´í³€SýùEÃŒí+Æo¢¶7 TÜín?¦$üó»Ðì3öÇ÷¿ÿïƒþü‚¿—¿8ÐþwãÚ~¼€Beû\I j©ÍsÐÁ{qÐ{ëö»³´’_#ž²¼fyÑv¥yHÓe¬é%Ú·7W­5ز§ÓKijÀ<ÄÛú¢šé”cé˱œqÜyê âÝ·½@šËÃOÓpƒTK ¤aó‡Lê)b²? µA7•Ä¸Mø9%ÜZd¼Vr’¢SÂp³z\ Å’Bšsik®ƒfeä“Š¸ã Ö‹8ù¶"¿Ü¶g8¿Bd•OÝ4^ðâ¬?äÜ"õŠ5=î—]Ø__”A¤jœDÞF—Jœc´Që¶öýa¦²¡%ôÚäÕöû´?„ÙnÜZÇÉövÍêKn{¼ÚáÕ^Q$‘3%Üà¶ó¶A%ìþù:)2Ø/wW¬—Ül iqñ#)¨GLGÄôu©íÜMãLø4ÇÓ.κojN®­É¯B¥ì]Ü‚N äU‡‹?^H­6¸õw1´›R}¼äLå·€fïàæ!î ‚;Ä|@Ì_—íÕ\½ú°X‘ÜÁâ^Û‚Šàjõ¬4×Ð&M‹Iü +6@k<ŸSƒthå€VÐ"dÌÚÝ,–vƒE[‘êÒ;éЦ¶_Cœü¾~yi¾DÜ­¤AÄû{A¹œÜ­™.[Ù/³Þ¢•® M¯3—¥ÐÓëm¦«%¶BÉ5ÆÞ474ÈqzÆ…ï9D¬ý),&†ä¡.Ý›ÜfÖìi÷bZ<ß‚ãi×ø%õZðUåžæÄZ?'6´IÄióÑÞLµšÁ~…jg¹6/Ö~"½·ÿ’_¹‘Ü<Þç}0ERÔ:G˜#dùÙÌýŸåÎxTƒfK…’ ÙŒív»ðšóøÞGGq½q}þuÓ,Ú…‘ÔsÄOÅR+–³bi)>»¢'}ßx8$»‰‚Ã:ÏOzÍÓñ!1hˆÓï¢t†¬4Ú>¾¹y}ŒrÀ¸b* ÌËnº}ú¸ûÊxÇú¸šÇênž€Š¿y+ÎX!¡´XíFßÕZ¹ÒÊ'­üS«Ûu6[Lí^§ë´K|»Š‘=²\Ñ»Œ"r3ºQbzÍÙÇÓgi¶¨£Ùö +—û„™!ZÄ­f[ Ñ<à© kÅxVŒ&¢Ü6†€ÜÆànpŸ~Εã=4ÑåS´÷éÌm;•EŸÞÁdLÞ‰±âáIJPDg·Åzã $ÇÙÐ3jãÐúMýÖX“x +¡çˆ‹1]mb œ£ê¸N7xWûA*ÅrR,ŽŒÈ Ba/ƒú—kÅ|V̆Çn\fu8¢òp÷ÆMw…m]æäfÄ‚[¶;åB ¹=ãe\qðpì$Û’SÎþŒ$J Ö>* ±R-E²}ìÇß¿ýnÄ,Ÿ¯sÆ—¿Ù³þøó›=ö»=ëñý¯~VóÛs)áiÒs%ÍHöïç%>GqüË>ÆtüAGó>¿ÒTÿxÕÞ^þ}ûóûôãúx6ÿò÷üÞ&Mùñ¿S"à"ùiB´1¬]§ljQ÷PK9%ŽŽÚÓþ8qƒLW<.íIŠ²çˆ%gl˜˜'+®ôÞ¹Á(gSk¿Í|©‹pÅ}<Ì!©z¼š#¶j *9•ÔP»È v·RØS;…]û¼ë7ræèäoÅ®öصž±TŠå¤Xº£@‘ä%ÚÿŽsÄ!RÕ%ž¯X([ó½³q•V®´òI+7“Œ£¢ÒÌÝ[WÌPÚ)…vÉ^…¬¡•½½Óm8¡K«› X‚ÃdãR¬žm—sýÙj†T<#ü´.ׂù,˜ ëV£sÀÏQ½Ž•ÐV¼–a2,+íxXF1)¢WÆkºg™ ë•Þ;èkœéË`ò¦SÉèq,z9Ô´©øšq°ß:!¼$ê`† žâª6:÷ÔÆM\h áVòŠ3¦ ’ÂLœyÀíæà”!Ç}Ž!‚hªÚ‘‡Ð^^ Ì â>LIZ È6îÝKmÛµì6ÅŠ,ISù2:»›e…л‡V˲ˆrt³áòt秙¢±ºæü»áõ–ÁÐLšüÛéâþ½ÛqbP/ƒ—œ1erf¼$G…¬îqUï+µWµºJÑÞá-܈¨„r%”OB¹)”S²Ec'̪EëÔê-Z­W*½rÒ+=õf°ÃE¼ø]¬Þ‘ªèFïzKƱØáæzwEÅI¬•gGoíaªÓI1=z<¬Ñ/‹gŒ¢ze1§ûrâ+‚ú`¹¢+°žÅõŒ»ºã XÚæÙ Þ·;>9¡ý–gû¸Ò‹•^<éÅG“'C*èB嵕³;õ>·çuC BÚƒ'˜Œ€Z|‡,O‰Ö§Öu’õœhkÖœ‚!±‹ŸŠ¹VÌgÅÜR‹^TüñNÙ·ÎÞ-\@ׇ´Ûåé¾Au¶ôÅÉ(9²Ý8$`&'~‡áäU?¸e¡P4ÎΆ‘ÇE,Œ€÷) *l…ìðŠŠ9 F+"z-1;"ö³0ÚÅéÙaµéîeÉìÀäŒìåJ/Ÿôò£M:¢z¹P©íDuGí)¤Ò+'½Ò“dÙVÈ…õQ«60ɶrÄ~·f(K.Þxõòxµ}öG¬QÅK–q"ÈY÷úé€P¥“ õØòr[Ìž¯Ú¡AâìÚŠé@Ù¹f§ÃPJ³w¦­˜'%HLçŠZ±TŠå¤XzBDôf¼X'÷'a™=ß«~ðÔ†døRq”â F\#0£a° £â¼"} ˆÆâØ+s)bN2IíT¬#H'M¿ÃL" ù’ø¹² qbÏŒŽôH/yobHa(Çéä§'×u7Íž ·7'ÍbñUæØ‹vö†<ßlË~]‰ë«8LÈ# ¨Z…xòw~{.0tΛã¬LÕÈ“qUm—c¬c‹/™crQbÌV£²Ê#&Ä/7oLÂ;ÈaÐ3ISÖVpÇÉp²‘xñld@MhÔ±áø¨1×87cSF0hiH¶x]×µx]wÜÏÚI™é Šä7ë‹Y„¤Ìœaò&sS>·žÕ9¦ +15ˆiBŽ…”âÀèyÄÏd…%E +ŒŽäw61k~‰9¯¾<_èjÉ„Î0XÐQpä"K0¸´SÙ;ÂÝIâ;„Ôgm Ùr$„Á†¼CL5bjÓe;Ó¨š…qh‡nDÍ*Õ˜¨g½2=Ù0¢ŒD´ç:ˆ¨ªg%ò€©LšãÔ}¦û±ØXДy5lÈŠªŒÀkB뼊¼¹=`õô«ÈŽc"e] SüÚòëC,&W#È¢²!s0!æxf_s*ÞÁ¡ ­SÆ‚ãù¿¯=+¿Ö*Ë/fRÓ‰ƒ¶Üƨ¬Ë„ævã]Ž±FŒ-b¼¨>¸¤ŒäHQ×—^Ìɤ`ÏUtu†±BŒ b¬æUMn¨-½@Ê4M_Ž1{=Ž! r:mY1’ÞPá Þ0‰ÂV!þ0kç6k˜"[w;0AÎ'ó8"žÆãágC)žÇ3š5›…CʶÅëj¼®Åë*¼ggD0 t°Õ]a~½–ñ“t|Éb›w8µà5Q—=x—ßPã -ÞÐP·ÊúDÑïìï¥)G=. SÖ–\^PRkœZ]3¨›á@Ic#•å–¬5!æã{m˜„w0¿š,¤2Û³:îF.ê#Ÿ‰œñ}Î.ÇT#¦1]4Çq<³õ·Y»JGR´Ùf9=„:##¾¨ žÔ:ŽÈÄq›6)N¥Ä`Ñ%E¢F6j±6i“_ç41AÕ0„ɉ¡†öš0™ ã†r +ÞaC)²ËãÛ¸¾šÖ†Ñš¬"ÄÊ e”ñÍTÜ5vbÌI1¨Ás1¢V ¬cƒ»q³CpÌŸ'ÇÏå0(3”äâ9>sŽ1‘±èH‘ûÒï†:ôÕiqq팸Æüb&%Î]êaŠ³w=¡ÆZ¼¡;ÉYº +±k»â#Î2û£j6—þΩfN[µE¯Ì½Ë<ç! zµ]ÝMžÎ?fe]™üñÊ»BÄ`MHäœ:-&Ä<0ÓUU7Y'Æ:ó¤ ñhºø‹ÙiS5ôÆeßOGä3Tˆ!ñÇðáÝbÍýÅ¡ë/š¼¹þŽŸõâÕ;~ì#?«{üù¡c„l.÷¬s)7É myd+»‚üww"(›30%O²LÙõþW¾’¬ß^åe° ï7Úž`y¶,¨Sñæí«nñâû»Ÿ~¾}ÿýë?u/Þ¾rÝË×|ñÏòøîß]õI¼µ†@™²É¼ÛûOâoA“œÛd埋̎’X€©ŒÆ2zçy×æçÛÅÝÃâåÍÂnžûiñâþžùèæÂ50K³…²Õåg{Yì”O,:ù»y®½¹_üuùí·yÙ}Y­Á-?¯–··ÝçUZþºZ{þã—_øpùÓçîýÇÇm oñòã?Vnù/¹b—}Xýí曂l§×ÆÞð—°×–g=~ïÒ®n~Y¬“#Ë6¸îæýbIåª(¹ïø‹–«(ùŽ«b l©\¹þ榤;æÛz‰s%&1²%Ûå›Ç  + û£5ïyâs[¿kÈî˜ÑÉqEÈ<•­óõöõa®ËK9Ã__°'ííA]””Âv‡{@üŸ¸4  âÌDè³úéÅw’”T¢R”9¹!E~ B¿å`ù_w+;üŸÕ:-“#>¥íÆÞßÊå‡/]u«{üøßò‰ìsÁ°†ŒçœyW&ŒY*ËK„Ę̀ÍÒøÍ–¿ek˜Ãõ¾eà˜¤IHÊd©ë¤×#d–¨H·?¥ú7¸¹]ªVÊ™íÃÊáöú^¿î°;µ•$ +¢@}˜,6Fj꽄ûq ïÅ:m$<5M=M’pÿDSÿJ=ëÕ¹$Œ¤¢U@Lö]ÁÚ®¸oÞâ×|ÅЦ«BqÑx&A"ÔÝz_x›Cæšß—Þþä]òHTôsìUùcGAÔÄÇ‚ö·-ï|*1qÃE—ü¦Xú˜'ž­ ɇžÈݬƒqùáÃjËÇÕ:J=äå—W;2µçg¼et¿t®û¦‘"níä;"0žˆj)⛫ Ï¡O pÓ3HØõ!ECŒOüYú4î‚ä6ŠÜɲhÊýa8ð†E¶ .âÒ¼?X!¼ Š‡Ÿä½+8ÂCÑo'’\ ´K$"Ï™wœ@'í +@ऎ‰åÊ;šr?0§%ÍÉýA¼dJ/®êÀ;Ì zЮà¡GÆ:¢Y"Ñ`¢*¢]"n†bÑ,‘–­«ˆvÉÝÂI{+’øç~Qr·çw Þëru¿‰¿[pƒêµ£¿Ý†ß-ÐØ,ÞÇÉs,l)v4t²Mu¬|¾IL .[þ¹oceiŸ ×wçû6\î‹åî¸üÊê&\hÆmŠ÷Ò[“ +½›r?qÍ¥Ž™ãzž¶ „dÈjÂKð…ëí‰ÈÒ;!)Éo—Ï8]©ÊþÁ!W3RÑ.‘ˆÀ»Ú¡ƒ%’I6“ëˆf‰D#ÞyÑ.驆Ö×Í’Šj»ˆvI¡$±W+¦õ§L4,[»»[ß-8µ´¿ÙÄòƒMJ,“ì°„Fu¨l$ßdb°zÈÔ¡|Sb;‡\ ½T±Â!yìxveƒëè^ÊÄB{¡VaP¾W2¾ol”l¿ ²ÈíŒe)!UB¶Y!\Ï,É\UìË6JV-1-Ã.1 ä~æ‚Œû€:þ®Ì@1Wë›p!†-%»»ßÄ÷įµ»ßÄ÷´ên½§Ìî~Í„àoä\üëjIv‡aûœ"'HYéSs„Ù¦}ÿÍ"%’©·y6;AÄúYL-rù¥ÿ’£@÷µp ô\¥j:Š´ÕeÐb¬¡þËQd˜.¨ë~çEÜù„0D¤w3ÝIÿPœ‘2D ìd•§Q<³¸±©××_Ÿp„s6ÞP@ÞF ëÛúžÙ)<­.³ÑC­Œ Ë!ö/dÅêøè;MŠ$Rn,\uÁr›k\KŸj-PÎßž¯û!Èáç4"RÜá"PpøX( JØÈá;^Ó¯>˜x7á{…)ÍÑ\ú¥„áT“¬/µ¡yŒåãJƒ#‡AíxôêZ Ž"ýŠÓ³ÑùÈQŠl ÊÈ´ºM–£ˆ‰`‘Þù¡ð°á²GDŠ;싈6må7B[êZ³2ço8ÂwãIËÂíæ>Zé™èà¦éÑ?¹%?÷…`S}´Å?¿$ž–ÙÊruS] 6¶ïo "v@lCwˆ)8D®²ønTlhrý}AÙsX8ÂOS0¶Góè3úeòL3O×%wµOY"è@¸eÔϾ—¤Èp{íù ‘á× ˆ wH)w×ÀkîŒär¯8·3ôÏS—ì'¤ZXHåJ~[¬9ýE#‘|”b-ï¼ý‡qÝú¼}÷{øµeÜ,|yéõõ^˜a#U³fW¯´`wd¨‚y'|Ð\Ź+e˜3º¿á‡bÖÇ‘â¾ò""åLÄ e—æ¾S®¯ÄóÄÏ.w,ZØÒҖӸ⯄ïó6š î. 2N«Ëm÷•kkf‰Ç÷ÌÛí  ­gu¼(»nvÖŒîK~8îg^D¤ìJ™x\v?Q®í¬Aîb0,xf5ÛÖpgxÐîåç?œïëß×?¯¿ïô~ð‡"1Á%«ãÿñ•,D©ÂÛ¾÷ȱÇèsÄÜä®n ûöAð6ÊIï^„•…ÜWˆì‘¹½} n£¯º< +NŒmï\egöÊì)°m SRWkx±½ÏPÿ°nyÂÙ]vÃÖ Ô½ÊâG%±Åq*x—KŸ;-‘qrK@ÓÕ50lûáhp}ì0€ÇA²¥7·ÿ(Ã/H½Š6C†Ä@¨~ò¨aC"álPozÉ¢Âà W¼ û¤j ”Â6U7Êî’v¡Iìàx¿}2¾ß¿ÞG“_Iï î¯üékéýƒáýþ©êêb(ÃGL›ܦö(Ñb‹]k¦ Ð]ÔÕz°TI‡y¹aÖ•ì½Î8RÖ]ØÃY +¨âÇÓœa·Õwÿhy´¸â)[g©pxYO˜ïDÉ©%vxÖîu|FOºŸƒu^öXšâf#CÌ`¦y@*ʶ:‘Bã¼9ÐUt ]AMö’(¤…Ï´k/§»€^‚l¨¿¿š_ÿç—AÎ'Ç.[uAu Ù¢Jci4i@‘”]øxà\ºB^jå©ÅÉÄã©ýœ.îñŒãà‹“YÀKý4.U7îñRG5»÷¼ÔSîŽð®® à »¾2z~A¥÷S_rA ¡ýÆt‘ŒŠ¸Q³™{µ°G3Ì­cX8ÀŪ£-ìá ãmÕ~v€3<÷Éé·?:ÀYxw·„y'O’óÞ\–ŽšÀY”ÄŒÎ\§úG‘a”Ÿµå¾¦#GqÓh}–ža °D8—:-'?Ž„BšÂÜ”²¤FEü\B[FÑT©Hcž;Ž9¯Hùîe7±jªœ@`™à¥¨;ˆW:’Ç3Œ76—Η*J8‹{¼T瓉É㥊Rñbóx©"8`÷x©¢”–ÞU‘nˆKxÙ7&Û]8 /~¨ÂÓeͬ ‡Ä-Ô3½½IdH£ßM‘.)D — b,Ñh¤H·‡NP£ì&ÒìV\,+«-möÆ `A0c7ÿzz½cˆ×aOÇ Œ±?5RÄë4,8ã^ŽÛqY—ËH¥¡U'•?m¸°‡3. èÆ^TþL÷ø€•»h@;Àà ð©hnl±ªp½Úb‚%ÀûÑ»™X<à ÀhëD@ùøµ¸ÑEª‘"Ö¿?8íë"EM§ Éêþƒj®{übi†A\·‘¼ÍÆŸ_†tõÊe½/‹ýkëø™ÚÖEÚú‚‰Ä}Ý^#å»÷ÝN‹ûÒø#E¬ ݆RÖÆ(DÀÄpcœŸ>†zGï2–Ok¤ˆoÉç-R¨Ù´(‡"PÌÍ#"…º…i(¢ì²<"Rü¾kÀÙ +ÏðPtå*|_ð°8òN( IÄ@ä†wÂ,íÓǾ®»7¸ôg¿jŒ©;­#ˆK_p¸_ZR£n ³*pMÍx`ˆW™Xt¡çªÂ Ù[ék Â*_)Ò§9í°‹>ê6Eút‡K°¯Ó¨…„p8t2­i£vÙJ–CL‰Ö¥SŠÔÜ*]·RG¡,Ñ=šËG ˆéæ†{/[g).Ý.Šåp»ñ€½æ<\ÜãE­É…ÜKõ~ë´òi îÚm½ÚJí£X4¢E¬³{@ Ø.™˜‘¢zuŒïëß×?¯¿ïô~ð‡7#¹%c’7ôÛÑþçº\’¶u :÷*î +\üS\F*KÈÔ¼ýO^wC&Uª’øâ@ +h40Lÿû¾ú¾pÞøê ßÞJý„ÿI™ÅAF£cA÷_#ÅÃF.üï}Üec‚Y¨ 5x€˜ao<Ã=b +=IÄRÌiMx÷!ÅöŽsDH±ù4Â]bÊçuÍ ’Å/C—üûõyÁmÐnï g…ß¡0ßÑ#še¨vÔßWç‘æõ0¢Ð‰z®`D 4âJ½„MÖ‚p„+\1ά°§åÄ®tSy°nF+à„iÛ4R#Ž8^²0¼•*â›G–npô+Z‹ç¶Þ<∣li ®ÖîGÜìì‚ Q8àŸ×%ÉáûòâÆ©C-Ùÿ³òÁ<ŠëbD·A[$ÞŽ”‰©M•¡íÄ£tšï†>ûÕI`éÞ°Èœ °íšó:Eh†!=P¬smßî¦úÄ=o=_Š»|à­çë<½yëy®?'îùÓô'îyt½}TØê¹v×Û/u=ÊfÇ<ª¦oeì¨gÕóƒw=‹¾ÅÄ…¿ÝQ#ÚÐHeGŒh¦µÞAϪåKÒ&ÄÛ}Œ(JÆZìšÖðF8«»2u€aO£#Ñ×SÁ¤¨‡íú*ø8MN+КíÀØwŽ´fû¬Ú'¨›ßˆk¶7¼d—Ív‡ïÙ^XîÕf»ã5Û^”•‘Ïh¿q„q>ƒN`ÔËFû¡-¨—F¤nõìç…®å®}Ððv({*S^!âÑ"èꮓtÊG‚j…鑦:;ç{&Â¥EÏ“ZSV?EãYëá¼N%Øz¸µ|Âg|¨NÜóŒ/Øåâž·Îs¸¸ç­‡›{ö€Ÿ>q‡«ƒ¯œq€Óyxû¥nÃ=«Î.5ÀˆÚ±£V7Óõ°z8¾£Fð~Èo„чó]Q (µdsÛÓêâDߌ’R#Z&}pÖ%ü¹X\&½¢çÐ[åªfÒ®±¼†zÖÿûà5˜Áq`ÎnsÙá¨ì©B§ÈÚX>°¦ò‚óAû¦"î` å>ACÿ5U#­©\Ð(ÅVÉ¿lJOIPäåÂ{ÑAÒ͆;u„¢Ã9A1—qGÓ‰_8?¢¶ÏÒ‰7´)dzéÄ)+~MUÍeVü jÚ’×®ƒÀ" +Ç4\ÔÃlº‚qt°§­gËpá€[ÏŽÜ]Üó|î"Ïtâž·ž­>?ð§iOÜóêÚ‰C­ížµ_êYžÝ1èÚ<±€ªckvQ£ëÔ°Ÿ¨‡…Þ¯±£FW-¹–õ0¢¤)kœµ\a¬lxiªž*;âÛI£‰ª¥^N›.¸§uœô# ã]Yçl—o¤ÑVØTÙ¡“Gü°F+ç 3ÊÞƒã8{°…9 ™G—÷\Î`½q ÖÊüutäå“/HÒÒÕl¸:žF¹%S«Ëœ²ÃV™CwfyeGÓ,7tÛX D€e—×d—^vi¸ö¶ÊèЩøí÷¢ó«…[_ÖSGf#ëÓ{Úº’+Ü {ܺrbòž¸ç­+¹^íxàOWž¸çÕ•Ý„ÿù5æýý5´!pÀÕÌ;q´˜à‰{\ýYƉFZËî˜.;àêÐäŸ-âZwayP×u·hòÏ?K—­i0mÛ=¸Üoí²œM39âˆcC‰ A²¼uäe€é¨0̚ů¹9 îh õˆ#Œ!ŽÛaÚ–4mr\£³án°Õ©²É#Ž^Àk`<ó÷°ÉépM΂-ÜÔ‡§Éå€T%ÙØt0mn†kØÝÓèvÜ(›ýFVM˜ð?h´Ìí:Z[ëÀ-ð‰8x¾\}ȵiñÈóòYžì!Áš±6Ä Ø`J BŠudO)Ö“¬CĔӕŽ)Ÿ×¿¯^ÿûË ÿ`˜˜ JÕá‘ZÅGúÎ!!ê»ÁÈfñ{üÁι0R7oæDi?Ðï*—`Û$*Ï…©dOߦu ›}{“8¸xGCàS–Ô¶d'Ø£¡p׺ÏÛ%ðh´Ç¾eUÁÅ [6jÇ#ãð¬)D°5a¸óæ³_÷Êá“È\¨ÆüÇ]§ÞZ³¸¡MÛ0fd11‹ Ê*ç˜Gx#ô«gb”Um‰YlÔK‰×‰Yd é¥{æ‘Ef¼gɉYdìSx÷G *™Ã»?²È4­·Žyd‘Iá:,2À301‹veÕÀÄ,2Ø–GI²c\[X+MzªCîûZ¢FZžˆ)Z£V»<S Ø«y"¦È»RñH‘[Ã?é#E“#\!&héìÝmG¶ +NÊÛÕ#GîNòQ:3ò-ú¡j# 4GË’¶\ej²–æ¯â¯H•w ßp‘ÿ—Œßñu“ FX1ÛwH¶Ø›öê-Õð¨VµÊmÿ–8V“háà!Æ&Zžµ94ðå ù¶„‡fQGö{Ú¹…=—2=Íó9þ^äX}óÞä\‚¨²:¿Jý·Ëø.m¶§ˆ9DÌrðñª¦õ3‰˜äFU&‡1‰άuWr$"(Ò4“L ËX‰YT(|Áš³ÈT ?ßÏ,SÃÒ[`b|Óžù‘ejØ瘘ejXZxæG|ßžù‘ejØG8æGÖ­†%<Ï#Ë©áFI¦†TÙõnk:1´ßÒBZ•¼”prŠíxृ &öÄ/,ÓÝ?òÒÀγÙñÀC-°f$÷|‘—&J•SšxI`m­,y-¹#S .uMĹã^ØRðGmš–·nÁ¡'ó(Î ÝÒÿàÎZ5g½ÉÏ n ó»¨'e ä…‹/êQYî‰^ì»Å+kØ¡IXz3¿}`³†¾çÛnkxèc +ÄoÝÖðàf §dͤ#àf ›jN±ÞÎpó|-LÈϽõÛº3†+IÒê4ãRÌ©ªo[®|ÛB—bN½N«ŽíÔ]Š \†¹ßõôH!žªžˆ)$ptcz"¤˜¶q sDH1eKÕÕý#…DײãˆbªÖ°8"¤˜¦IRHà‡ëÏGŠéÙ š"¤˜šQlRLËr÷'SŽ’m fHÇ2‹çXœŽÙoé‡ú‰^:Ö©å;xè6%êÆŽqLSÁ/yéX¢SÝñÀKÇ +úðÄøÀÖé +¸°}<âp4²;‰ÇiD1㱆 ˜ù<SÃ~ÑuÈãyôóBÃQ"Ø«4ì x§wëã‚©–÷¤¬Z… „‡o—ۃʪñãý'°Zpébç»Ù +ëa™µ‰g¸¤>ß›Yë“w*&Sž¾ÍDÅd‹cÀÇCÀSå÷üYµM›W[KÇš‡¥ÜŒÚd‹BL"o›ëàWç ÎÛ§¹Û[[VݵÞïµÕ¥ØÖZîÊûí¬.Ã*WJ1ÃöÕ«,„ ·Ã ’S=y÷1£sTr:÷yV$£#:ñÙªûŒìdüO Û¡ÝáÉ +"=-ìì¼²,>EAħ‰S°oîð´ñHOC±þÕëž<æÃŽ ‰Çf„øûàc:¬<öÑG»‡C«°Ù°¿"<æ +Ü”cï’\®ã=ðQCáU›¹ ~² Þ×€TA™ö°Nù(!–\þ˜¹$\GÌ&RI¸Níþ ¹$\ç¬~\®SNÒ\r»ÎáOšK¶ë<@®€oðlD+Âñ®n¶ײƒ¯þ艗ï\ÞGO¼|çH÷O¼|§øý3/ß)ûyþ>xO±Ûg\Æý‡ik\a<ÅnŽ:ëDÕuûΆ¿hàìÏUGøÎf9·ÕCÍ9Ov“³ÜjÕåPêI,G7«Ù­£g×14¼%‚$SØ´#¦7£|:z–Ù-z4ñ}ú/sÇT᧱‚ÙîôcJ`_ãºUð ðÌ°Düæp¼ †´Êó鸆ÓxAÌh•ÁþÄ_×=£YEÌhJ¶´‡vÏhV3¯ù^ëѬâ÷럯ÿ}ý÷]¾üÁÃ7ȃ£êq¼æÄûþ‹¥‡ÄTZ¦·z¿œ.™FuâÑÉ0JÛÿš)v!N¤bzâ¡ã×ÏËôÄ߉p©€@}­V È$0ÌtRE Ö¯ˆï:‡?D®ˆ/{0íuH%nëôÉ%qÌŒåšKâã_—¿k.‰__ï\ùwøwü(A#ÌvîIöZ ^æ} µi¤|T‡¡"Ë×µU‡1-]ØaVë0Ô©óú­&jÇiwmÕa¨èÑËj†ŠWC÷pfdË$ai"LP]2ŽCÅq Ùiÿ2 µ²×pWZab!b9|Â…vö—§MW¾ºøÀ U .ÈNÖ;?¬Î%yêŠ4¼Y¨0­!Óº”ñCåR´„<õ¶‡>*]ñ’e^‡íÎwÞ>óбn°zè×¼-ãqî`‚ ¡Áx™‡>ãÄ@‚»tö$:@äRèM§ZÂu¬uôƒ,[åŽ+OŸH¦…®»âd3œ‘z¡g9FõÈÔFc½:ÿU¦Þ$O½­XJn ã7×Ân)Ú†)nwôÛ{Ë:É.űµÅÄÊTéèê°NÂIöQC=ŠÉN‡Öi?ìt$ñy^¦Nz,—#mÍuç©£±ìÙZ†•;Úýáö¹ü韜Í^>ñÛ:÷º;Ɖ^Á÷•ÍÜÆ—2Næ§Gu*"À´Z‡eœ~ö¨Ë8KÛµ †Úô ÕagÅyü¨ÃÁpxÀÎbŒL¨l³¡ihyr·Ê4y´Í˜† ÝÖ ëí™*Ë<1Y2NÆ]E›¡ëÙÞé(ÓJô Oˆ=Ù媙‡—»ù®v'zã•èû’[LÞ>ãð6EhzMk‘ç7 ãQáT—vG¢!£Qäcoa¨ð°³rªØh%ý[`šì2åDCZ÷ÂãcEÖ7:²`<éкezQ†‡=…+&ü÷káˆçs-©sh8-ß–é(¾&¼½Ó ÇÒ,°Iü&Z‰m)ë;‰FÃ…«¿7¥£²Æ³ìýœX £î^H°¬ñhVë0ÝëÐaøÈNS†ÛÌÝÁo¤ÓnÝù¦½VæË—;ÞÈ\ûèŽSÆQg7OtxcÍtÃÃþMv<¬±ø»%~[ã^wçemÐ5=Ö—²Æs–­:,k\˜{ÕaYc=çV†Êx:5Á²F†“Gu*\¶ìßM°¬‘ÛyÈþ2 •ÍÍ>æmŽ†zÇb̶§ ÒiäqÊ–™AÆaS4ø“™iÌ&i¼lòÀ·¡1IÏ<ô¦†¢ù(ƒe^6Yx¨`lÎÌ+C*“ÁàÎÛ'‡>•T±×j‘!W†œðkÎPUf—xeH«°eîÌ+CÎÙ¾OÚþ!ßÑUFyeÈUe±~™Wˆ¬]ëÑj‹iüï× +N¹äßÎÙ°·/͘¦%2âuÂ8Š÷~µÉ-_ÅIÉg:Åƽ/C<žøÃúú‰ƒ¿ü¨CåC›êpø`íkËNSærínÎxØ`=šéÎSççê¦;>ÈϽuçÃmE2FHgÚºáa„cøº9~aµ§Kü6ÂGO¼Œîº}PW²ÁÒË£)ç#(øX«È÷ŽMóºpJà¬Ñ·I0Ö>6°K–b¢£ð6Eä{³9H3@<{Û@ÜÞ¾Îýrä}k”µ»ÿüÕ°»Þíø—аµÚÖþAc©";¬²UƒÃÒZ©[5˜–S4`<ªÁag GÀ[u8ÜìØ?ëlxYo{Œ #;æ^ g·½U‡ÃÄ +¿ß©6½],.ecŒ#ê°Œ¬Õ-:‹-„Ž­Vj¬Ìì¬ûW µª ÕaÚÑæV–¥5$4r)ái›Ö4Ë\X8©Î05Ãåj41Ä›qO´†k¦eüA›¶ÂÕ6.S;î.=j µ†ÇPËô‚µPyæ•ÖÖÔõ¡´’ù߯¾þ÷õßwù>ð‡! ¦s`õušì_¦†CÁ¢`D'5µóO\c›ËLÈDÓUþãŒ)Àµ]íœz/wß½Y^mrYò–ÄÆèÕ/ÊS¿–èˆ>Âè?îÑkãïÌq~#e]óΛö¼ðCEÏû÷ÁGƒrQ1L6Åù\=Z`0˜'Ëœw—Z 8ׂvØïNµ óû‡]TE¤’èæÞÆ7ÞþR>ü(Ùñä‡Y·ÜMm%ì\,ø%:OK(w ‰ +û-FäC£„©„¶os Up£àúrÂ+ b]6+HpîN¤ô–îD*!ÁÃÝ4—€è8Uz"R ‰+ç+šKH ×/_¯\BbÂ#‘JHp6½œH%l/¶´¯X.‘Óœ\ã…ƒkÄ`¨õŠë°šnrÂå4 òžðˆO§•g\ñ‰9bë‰×ØX¯ËôÄkl<«=}æ¡ÓPƒï15®©‘¡âgÝS_Â!ð!=í!›Íx„+œöšutûÄ+\¡Ïa[‘\3®™ò„ŸýttÒˆlµq”2$dvÉßΑò‚Ñ1•ì2Α’ŸñD^Š‘Ò`æ®qpË¿ú=Sn–¹‹öt`%»ŒÄCÁ1šbªUîz@l5lpœKÍ@¶>GZïÕe„ŽrcOqÚÑAšXMurVšC.l¬’YGÚ…èyÙŒaºã[„³MSÆQ1à÷qÄf:üÿ8+σ._uœ2v®1)ÞÞ¿az.VgÞ´l<æÑŽ¼†%¿VXrâ# œCxߧ[.!D¨ÝTâèÌáû܇ ÖyÍ+ÂöË°æý¨Û—[¶´ÊŸoÔü9[ +¸çCŠâ`3è挩§Ùa:zYt,ç1-º£åÑ;6O;¶EÍ(>ª ³JhYô‚‰BU .~ÚÚ”–§Kß¼\ú`;Ô–\‚0Y.ÇY§K_<㨠<£X1¦\»8'—]²Ü%è!E&}Pïsÿ–"½Î©y"¤H° Ïò"b +‰=º<RHà¾õ@„ vö7ø-E‚]ü#b†ôºUÿ)!ƒŒ¤¡· É5ÛG„Éu ßS$×Ö)m"¤€e,~EcŠä:ð–âäz!Åä:¡îã,T;>·^ë·éuç¼W<ð¦Øõ¬;y“ì\»‹qœæêžy“ì³øçÞ$ûÀ_ñÈ#mÍ6ß<¦d;qØV Üéj’x“lÞVܦjV7òˆ73ä¸lf…"Ž0¶ 2€E5hDsÌð æjl’°Ýl¼¶¦ÉÆ6Ö¢þŒè×C’Šw‡™ìEb½_ù¤í…!Òc,=ê9'ãA³ØµQPG’Å^$¯-¶ÅtÈ´:Ö,v‚̳¬T¨€›É.X|ïPä§ÕÆ^eÕKnÛ%Èr_(æ´Ûsï Ùî’(Ùµ_Óv» ùnLåüêÓvo^¶ûʬb)Óv/œúyØ¡ÊVq¾áŒWÊbMP‘zú„¯ÇçãÇãïg~&ü‡ýÇ)©éD ¸¸¸¦`ÅbßÃmNª–Ty& TÛ°¤â¨˜ú›¢Á;®ÇÖ¤ÙÖ b1Ê85zZ\îfšë*DU‘U2Íå£rÈÞ Rþpq*…ÜHaê³nV¥]"âæ"¯u•|ëw)ܼ֙—ËZó\æÍ«µ¹..{W·xÕÁ„ŽRMîÏ7ž=›8Á阞q´HèÃp ‹Í/ðŒóX¸‹½é&x^-MÁ—´×8­P^ Åÿªû ülg +OõÐú^µ±%»—ùט0kãÀç5K£KPmìØilj)ã®+ƒ®=¿¯Öfit,Zx”úŠ˜Bñú8@#bŠJc‚ýü†LOL! +[¢¦k–F—›÷›éÓº&3à’b÷a…l3Ï0fÓl^Ö<Î0.q¥ÝîAÀ§™Æë^9ÛüOG‹S›2ÏvÕë=Ï8º»)‘e¬¢HL-XÇqRŽ;çf8>`_ڿꚇ1åc1/¯_‡O󴟇a·ó|ÊB8ŽúyÖøÍЬgØÂû17ÃqÜ£:•h1?_gž_µŽÓÄÎç,†ãVdÎg1&€ÙJŽ7dMKªtÜ—Ýji°~™çVV0°&ÊKÕõ°‰s¹®õ°©4§¼¢žU±¸°§%Û  +\ò̓¶ãž—ŒKú.îÀ«"fl>ènj6ÎU¦Z™£ßqájjÊÉŸWÓºx\MM5aíéîi6?[ ,˜t,ðòžÌôèò^BÎæWî¨SÈ7/!¿*ë2cyµ2˜½R¦o^L&¬MTðýþñdÝ·úMs6°²ÿüùøýù×ã—ÏüüøDàùùñÛƒÍÞó_<îùýéŒB>Ÿ‹ºÜl‹Øvèî·¢›“žßúuLÀþ3G‰Ý£O~n{Z¹köû߃œ0ð!øã†ø§0~]ÖÌ“fþ?™ôÇ:qé[ endstream endobj 298 0 obj <>stream + + + + + application/pdf + + + RBPassUp + + + + + Adobe Illustrator CS3 + 2008-07-03T09:32:55-04:00 + 2008-07-03T10:03:55-04:00 + 2008-07-03T10:03:55-04:00 + + + + 188 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAC8AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FUj85yXo0ZYbJrlLi5urWD1bRJHkSN509Zz6YYqqxciTt4V3yGTk5OkA47NUAefu2+157L/j64Mm 2qILq1dXC/WUpqp9b0lSnH0reP6xHVxxjb0+rftUerzdqPAH8zY+X07X75bHz3ak/wAf3HOv6UT6 1ausnH6zHTVj63pKlOPpW6fWI6uOMben1b9p9Xmo8AfzNj5fRt85bHz3ZL5n81+drHVrm20nSfrN taJGy8rW6la6JT1H9KWLjBHxFV+JieQ2BrTLJzkDsHD0+mwygDOVE+Y2945oGfzp54F3evp1rHqV rbPDbuosbuIozRQmSUgNK5Ky3HxQgM4VD0pUx8SV7No0mGhxHhJs/VHvO3yHPluiTrvn5tNS5vbF GBuXj+rWtreRzUtreSdJTSbl6clzEsfEr8SmnxcsPFKrph4ODiqJ6dTGtzVcuYBv3+5Bf4y/NJCY ptDiEklEjkS0vGjjbmFLvxZiy1VxQU2KtXjg8Sfc2flNNzE/tj+PwQir/wA1fmCmtyWkenCPTvrf pxXaWN1M31dJuJd+LU+JUfoOhUjqMTOd1TCGmwcF8XqrlxAb0vvfNvnRNF0dktUj17UZbqtl9UmK lLdHMY4tIsiK8gjBd+NFbkQtKYTOVDvRDTYeOW/ojW9jr8Pft5dURo3mLz5qd/arJYQ2FnPNKZhN a3XqQQRCvB3kaFGkcsArKCvUitCAYzkTyY5cGCETRMiAOo3P27faoax5n83x3l16GnSNBay3I0+S OzvnDPF6EcZmVHjMsbrcTfs05JyTlxDFlOXcyxafEQLluav1R8+Xcdh896tOfJ2teZNUe+OsWi2k UBjjtR9XuLd5DQ+pIRMSOLbFVWpXoxrksciebj6vDjhXAbvnuD9zJcscN2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KofUb+20+xnvblisFuhd6CrGnRVHdmOyjudsVS7yvfavdW93Hq6ol9bXJR0jpRVl ijuUjqCQxiWcRlh9rjXviqYWFtpkSyyafFBGtxK8s7wKgEkpYiR3KfafkPiJ3rgAplKcpVZukThY uxV2KqMljZSXUV5JbxvdwBlguGRTIiv9oI5HJQ3emCgyE5AVexVsLF2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxVI7kHVdfS0pXT9IKXF0ez3hAeCI7biJSJT/AJRjPjiqX6zcXVv5jm0yyLRX mv28It5k/wB1/V2kW7ud+jRQyRBexfgD1wqj/KFpBp1jd6RBGI4NNvJooUUUAjmIuo1H+qlwF+jA qe4q7FXYq7FWPwea7q5eU2egahc28VxPa/WkewVGe2maCQqJLpJOPONuqg4qwm6816npn5kXL6nf y21hb3sqXVq7N9Vj0caZHJDc8KFeTX7cPU61JT2wqnP5Z300l7rNnPL+kJ42SeXV7fUrjU7KQzSz UhjE54W0sQX44ohQArU9MCs9xV2KuxV2KuxV2KuxV2KuxV2KpONW1e5vL2LT7K2mt7OYW5mmuniL v6aSNxVIJhRfU4/a6g4quL+a3NRDYQDsnqzTfTy9OH7uOKuP+LabfUK/89sKpX5o1nzH5f0abU5L qxuTFx9O0FrNE0pJ3VWFxKQeNWJ4NQAmlBiqeaLpqabpscBkEsp5S3VzQL6s0hLyykDpyYk07Dbo MCsds3kudf03zM7MI9SeXTrGFqhVsWia4jloejzSWwetK8WVTuuFU5sP3PmTVoFPwTRWl4R39SQS W7f8JapgVN8VdirsVdiqReTP+OPcf9tPVv8Aup3OKp7irsVdirsVdirsVdirsVdirsVdiqldXMFr azXU7BIIEaWVz0VEBZj9AGKoHy1bXEGh2oukMd3OGuruM/sT3LtPKnyWSQgYqmeKuxVIrRRrGszX 0g56dp5ktLJGHwyT7pczUI347wr/AM9OzDFUptJXvtMtPKfMmWL1LXVXFeQsbNzDVq9Gu1CAf5LO yn4cKp35pVY9FNyAFTT5be8YjbjFbTJJLxp/xUrDArd3SLzRp0h+Fbi1urcmuzSBoZY1p7IkpH04 qm+KuxV2KuxVIvJn/HHuP+2nq3/dTucVT3FXYq7FXYq7FXYq7FXYq7FXYq7FUn80Az2dvpgFf0pc x2sgPQw7zXKn/Wt4pF+nFU4xV2KpT5hvLhYYtOsXKalqTGG3kWhMKAVmuKH/AH0m4rsXKqftYqil Gm6LpFKrbadp8G5NSEiiXqTuTRRirH/K0N1ba/qFxfx+jea/DFqIhKqHj9E+gYCV/wB8wtAG3I5s xGxxVkmoWUV9p9zZS/3V1E8MlOvGRSp/A4qkP1ya50Xy1q81GlSe1e5UUP7y6ia0Ye3GS53+WFWT YFdirsVdiqReTP8Ajj3H/bT1b/up3OKp7irsVdirsVdirsVdirsVdirsVdiqTVF35sp1TSrT5gy3 r/cGSO3+58VTnFVskiRRvJIeMaAs7HoABUnFXkup/W9R0tdU1S8ubhrya0sYrJRAiyskIvpreOkV R6twpt6V3KrzLU2KG9S8s3baDZWmn31/b67aXL289kLy6ubR57GN76MmC7kmJimMUfFQ2yyAVxVk er63qdhb6T5lvFtrvSYJYzNqNmXik+p34EVTbycwI1keKRyJiaJsuKWcYFYlcgw+Vtehpxm0i5ub uPrTmkn6SgpTsBIg/wA6YVZaCCKjcHocCuxV2KuxVIvJn/HHuP8Atp6t/wB1O5xVPcVdirsVdirs VdirsVdirsVdirsVSfyuTPZ3Gpk1/SlzJdRkdDDtDbMP9a3ijb6cVTjFUi89XsNn5P1eaY8Y2tnh 5eBnHoqf+CcYqkWn6dHc69oOlXJrcaJbSa1qluKMgvr52WIn5SG5dR2ouFUXcPFbfmZDMVIhnsFt pGr8AuZ3keJuNPtNHZuhav8AIvfFUVZ6VDqXlTU/Lc+yR/WtLKsOXCFq/V9j1pbyRnAq/wDL/Vp9 S8rWZutr+0UWl6pJLCWIAVYn9p04ufniVRFvHGvmPVbRxWG9tre5MbdGc+pby0/55xRA4qq+VZWk 8t6Z6hLTR28cU5JqfViURygnxDqRiqa4q7FXYqkXkz/jj3H/AG09W/7qdziqe4q7FXYq7FXYq7FX Yq7FXYq7FUs8y3NxBod0bVzHdzhbW0kH7E9y6wRP8lkkBOKo61toLW1htYFCQQIsUSDoqIAqj6AM VVcVYx5/WC4sNOsLiRY7S5v4Zb1mOwtrHlfy8u/Fha8DT+bFVHyNbzyX+uatdxtFfX00Czwt1RRA s8SHtyjiulianUpXvhVTNxpF/DrMMuo29nfajftHp4klT1Y57Jo7aAhCQWpc2/qKnetO+Ko3y5qI uNVmlKGD9J20d09uTXhd2zG1vY67bxcYUOBUFog/RHnbVNPNVttSb6xAp7SOGnrUdWlb6yN+iwgY VTrUqw+YdHuK1SYXVjx/ypUW5DfQLMj6cCt+XaxpqNmw+K1v7ireP1lvri/ctyBiqbYq7FXYqkXk z/jj3H/bT1b/ALqdziqe4q7FXYq7FXYq7FXYq7FXYq7FUn1Kl15g0qypVLYS6hN3AMa+hErD/Kad nX3T2xVOMVdirzzzE02t/mjpuhxkPYWNhNNqQHQerNC5VvEssSJx/klY4Vb8t22kXuiaz5s1ayiv raWe9uLFbiJHIs4JZShCupoz/FuOq8fDFDI9O8q2sPlBNEMUdtNLZrBcywooIm4UMopSrLISw98C WOWeoPDruj6jIht01N2NxEOkVxIBa3tvQ/8AL2luw9+ZwoTXznazx39hqFpHzuqOkKJ9uSe2Bu4E r2DRxTw/89cUpjrt1bzaLZ6tbuGhhntLyK4ANBA0qCV9xWn1eR6+2BVXTw0PmXV4B/dzRWl4f+Mk gkt2/wCFtUxVN8VdirsVSLyZ/wAce4/7aerf91O5xVPcVdirsVdirsVdirsVdirSqFrSu5J3JPX5 4q3iqT6LW51TV9SJJRplsbc0oDFZghvpFxLMK+wxVOMVdirzCHWZNP03zd5xgUNf3SxQWCNQlpXU y2VRvTlBd24cD+U+GFCdeYZYbPTtL8kaKA17P9WtVDKXhgtYfjdrjiV2kht3VUDBn3pQAsFKZMmo eXDJdy3VxqekOOd761Zbi3enxzR8RVom6tGq/B1QcfhAVjvmmEvHcLp7LMRc22r6OY2+FnvQ1qvp sNmC3TLcMQafEMKGU65Mt/5XOpWQMpjjh1OzWlC5gK3KJtuPUCcD7HAlB6ZbQ3mjax5djcegUkFj IPsmyv0Z4GWgpwQs8S07JhVVsL763qWg6m6iI6ppkvMCpBkb0J407/ZX1SMVZHgV2KuxVIvJn/HH uP8Atp6t/wB1O5xVPcVdirsVdirsVW+mta715cup60p4/hiq7FXYq7FUNql/Fp+m3d/KC0dpDJO6 jqRGpYgfOmKqWhWElho9pazHlcpGGupAa853+OZ9/wCeRmb6cVR2KpV5ollXRLiGFuFxelLKBx1R 7pxAJB4+n6nP5DFXlcl613o+n/o6MA3Wqm8swwBiEtxeyW+mhgDvGLK1cOte64UMzu4bm1826Rou jlHngt7rVNQuLwNJzdylukrshSsr8pFHZVqAtABilPm1PzBbryu9HEyf9q+4WZh4kpOtp9ylj7YF YP5oFugtrzQpq6TeSTaZdQcSpsbq/ASImJwrQcrsQs4cDiwFAObYUMv8iX8d35fjWNWRLd2jijb9 mBwJrVa96W0seApS7S/9xlzYMaqljPLoF3UdIGYSac7lR8RCmJB7ynCqpb/6Na2QKlV0nW5YXiJp xjumlgtwPYR3sRHt9+KsuwK7FXYqkXkz/jj3H/bT1b/up3OKp7irsVdirsVdirsVdirsVdiqT+Yv 9IfTdMAB+u3cbzd6Q2v+ksSO6s0SRn/XxVOMVdirD/P2qi1jeRXKNpVncX4dRulzMhtLME7U5tLL T3XCFY75G8v/ALvyXBJGEW2tZdZmipQKy20VhYh0oKN9XlZt/wBtWPXFWZeX4o7rXNc1oHn6sqab bv29GwDBwPldSzg/LAq3T7nzDqNsdUt7+2trK6dms4Z7ZpQLevGFw6zQH96B6m/TlTtiqB8x+WNV 1q0uIbq1tEuZYWtzqlrdzWk3ptvQr6E4Kg7hXZgDuN8KvL/If5r6tpDXOlXFhBqN4gWH1obox281 1CzR8UPouA7K0MCAVWqj4utFDLV8w65NreoaT5j0EaQNWtoZX4XQlA9O5W1a7hkWNkaSIXFuSCVK 8K+FVU0TULibTfMZuKLqNlFb6ndxqNlvbPkhCgn7D/o+ORK/suDirP8AAl2KuxVjPly9e00CeRLW a8kbVdVRILcKXJOp3J6u0aKNurMBgJpnjhxHmB70ws/MSTXKW15Y3WmTzbQC6WMpIaE8Vlgkni5U FeJevtkRPdsngoWCJDy/UQCm2TaHYq7FXYq7FXYq7FXYqk9tW7803c+5i0y3S0iPQCW5InnB8f3a W5HhviqcYq7FXlf5gXiXVuLJx6n+KNbt9FijrRvqdqxilavb07n1JPeo8cKE/tdfjtrrzn5hkp9S 0n09Ot4x8PP6hAZ2A92nu2jHywJdp1peWvkTRtEkkYavrKJHeSioYSXIa51CXrVSA0pU/wA5Ud8K pnrMdjd30GkTrEmj6dCL/VI5AqwCNOS2sbA0XhzjaQ+HpiuxwKln6P0uaxfUB5X0aDSiGeOa+ZbZ jB2kkT6q4jD9eLNWn2qGoBV5tqel6z/iq+802+lxWUK8L2z0+5QzJc28yJp9/S3KwkrQxv8AvClO RIA5sSoVPOUV/Jb6RFLfieC3v5bTTtRgLQrHFfWpljUs7ys0bRXEZUM3SJgSa7Ks30rUbS91XQPM dyVgtfNunvp15Z7hP0gEEqiviY4Jo99/hUDFLL/KsrS+W9MaRuUy20Uc5/4tjUJIPodSMCppirsV Y/5ThSfQbyGSvpy6jrCPxZkajalcg0ZSGU+4NcSExNG2HflXdSvqf6NnuLu5azsFEqSOJbJQrxNb SQsQxbmrH0yHIAUn9oUxsJ3p3PaUQI8QAFy/zut3+nbr5PUcyXSuxV2KuxV2KoXVdV0/SdNudT1K dbaws42muZ3+yiIKk7VJ+Q3OKoiKWOaJJYzyjkUOjeKsKg4quZgoLMQFAqSegGKpP5UHqaQuoMP3 mqSPfsT9rhcNyhVv8pIPTT/Y4qnGKoPWdQGnaTeX/EObaF5UjJpzZVJVB7s1FGKvPdUhs9P1/RVn YXEflWzZ51UV5zPbyXM0hJ6OHtYGr1/ee+FCGNjM3k3R9BlIe41+/kudUlVjWaF7qhuFPUsWlhk+ QPvirOYbmGXV9S1q5dY9P0mJ7OCUn4RxpLeS1HbkqR+xjbxwJeaa958ig1n9CTmG31G9uYrvUYrx uUazzQia2t5oYyLiRLa2jj5JGvxyU5Mq15lDJIZH5x6pc6q+svGwkRtR028t7OORDs0LRqIIAp6S OkjjpzxVA+eZ9T1OHTdYg1HT0sfXl0u8NmxvI0tL+ErM00/KEFVaONyoRTt9quKsaErXdl5g8v38 fq6hb2D3kUBBipd6PMWnjhcqtUmklk9Nh/ukhf2GAVTDyJcrr/5VQUl9KXSdZEdvOQFaF3uAvqFa 0Bh+tMwr/KMVeieQdRkvNIulnQRXlrfXUd7EDUJPJKbiRAfBDPxB70rgKWSYq7FWBrZ6jP5bSawW Rp7LXNWuOVusT3CL9dvY+UKTlYmb95Qhv2eXH4uOQyA1s5WklEEiXIit7rmOdb/juSXyL62lT6ZI Q/rXC+lJBeWVxYyN9aMAd0uHd7aX0xCvFBQ8RxXqBlGPanZaypiXl3SEuV9OY5/rerZlOjdirsVd irsVYd+a3k7WfN3lG50bS7uC3kmDh4boP6M3KNkQSPHVl9N3Eq0VvjRailcVTOPy9qE+madFdapc Wd3bW0cVyNOdUheRVAYqJUkalele2KoHSBc3XlbXLO9u5bn0ptQtFuZXCy+khZFq6RtQhf2gh+Rw q5fOM6KFWCwVVFFUXN0AAOw/0LGkN/40uv8AfNj/ANJV1/2RY0toa98yC+NtHfPZ2thDcRXN1Ik1 xK/G2b1kCq1rEv8AeolSW6VxpXnkHmy3m+tarKT69299q96sivxit45ovqsUh48TyTSY4j4hyafC 2Ksl0q9RY9PvrMG5uLeHhpqyIyACKMWGnwOxC09drx5nPUDY/YxV35o+YB5V8uaR5X05vX1TU3pz k4bxw0luLmfkQpV5WDShtmUvUjchSxP8tNDex0JtcvHmjl1IFzNdHU4GMMjlluJ9QjjNqxeqV5RM jIq1PXFDNdOutTstQEcLLY3juEf1UWOCeSSgt/rMUPKJlnpwju7fj8VEdKjhiqO822dvrvlq81i1 iaK/sU/3J6ZJt64tHW4eyuAh3b4P3bg7cqqSjnkpYjd6okWk/wCKhAbvUdHH1yVXWs0q2jrp2sQy LvQSW3pTKp/bPLfrihS/L/SI7z9PaPpeqyQwazp6X9iIfReGRqyWs87F4pHpJdI0gKkGh9hiqcyX PmzQfN91a3d4YLbWY4rqOZZYyhu0RopFaQaawLGG3QgBBQLuTUYqmv6b1r/q7/8AJaP/ALxONKjN I1bVpdTt45dS9WNnAaP1UbkPCg02D/k4vzxVG+Xb8WGgT3DwySwrq2qicwqZGRDqdz8fBQWYA0rx Fe/bIyNNmOHEavdJPKFxapqn1KTW7TVrSRRwt1u5r65kuUkWSO4e3lEhtSvBmbi3ENQ/DQZTDnzt 2WqiTGxExPuERXdY+r76ehZe6p2KuxV2KuxV2KuxVimiU/QXmKrKo+vanVnYKo+Nt2ZiAB7nChiX +i/8t1j/ANJtr/1Uwq7/AEX/AJbrH/pNtf8AqpiqXa7Dc3loNL0pra/1HUmFvFaw3UDn02/vnfg7 MiJFy5PTbbqSAVU50n8sdLsDb6HcOdSvb1YrjWrmWoC2tuxYRUU7+tK5jXn1TnvVcFqzZ/8Acj5m RNza6IvqOexvLhCqL84rdmJH/FqntgS+d9c1L/lZH5jTiCcx2V7L+i7GdWKhNLty7XU5PFaJJEkz FWIr6kfYMCUPbFlvTbLPokmr30Ea8YJ0jsEtXiWnwrBILX1I6L8LRqOQ+y9DXFWNXsdldWLwI0Sx gSG3VecVtHzcRiaJSTLDbSSH6veW5P7piGotOZVT3Rry9mjF9BG9xqUECfW7STiJNQsDyChwSqC8 t3DRvU05Bg3FXUqqwvWJb3R5bDUHRZ/Lt5apa37rcLGr+mn6PnueThWRzDNG0kTDl+5qR+7NVWJ+ SdQv9C836WtreW1tGEvrFlWa3MSQTlLtRVjxUC7SZBX6MVeq3+t3N/b/AFe81PT5oeSuFa5sdmU1 VgQ1QQfDFUB/ov8Ay3WP/Sba/wDVTCqYeX/q/wCmrPjeWjn1BRI7q3dj8lWQsfoGBWV+TP8Ajj3H /bT1b/up3OBKG1PztFGrHRbKbXFiKGafTzDcRL+8pLEeEnP1RGCVHGlaVPXK5ZO7dzMejJ+siH9a x+jkmnl3VLrVdIhv7m0ksJZmk/0SZXSRFWRlQOrqjBuKgnangSN8lE2GnPjEJmIPF5plkml2KuxV 2KuxV2KsV0N+Gh+YX5cON9qR58uFKOxry9SDjTx9Rf8AWHXCrFv0t/2sv+n7/veYod+lv+1l/wBP 3/e8xVVs9S06K4kuZ9RuTNKoif0b7ThWNTXgJLm+u7hASan05VxVMrPW9PiWaS01LTtIjmAM1xdX o1K/cLsqkGVlUrVuP72Qf5OKpL5/8yXuh/l3q82niSyivi1uutap+5uZri+b0vVjgRY3HpK3KrhO KJ8KMBil5v8AlPp+lIWvHg+BEjt9Lspkdy5m/eNPcW8Y9SUIiIsUaj98VL0UKzqoet3Vyscj/pCd f0hRWCahrrafeFT4W9mvoRBuwVvi25b4qkepkmWadWeWjIZGnQNcAuhVI7qJKrK/plkSRCVuYeUd WkWNiqq+UdRuJJmt7YltTsZWn0+N5FYyc1Dz2bSniGW5gUOknR5Eeb7NKqsukm01E/SsSiXy5rYM OsQSAqsMj1jMzofsVb91cKehoxpxclS8d/MXyvq3lSafW7W4uprXQJkuZIhJLI5tJJg9o1frETke u8quV+IEM37QOKGdR60skayJqVUcBlP16mxFR11zFW/0t/2sv+n7/veYqmGg6l6msWifXvU5SAcP rnqV9uH6Xua/8im+WKsk8ox+poV3HyZOepauvNDRhXUrkVU9jgLIGilWl+R9e0e4sZdP1qOWK1jh tZYZ7OJGe1SSMuvqw8DyWNGCF1alTvvyymOMjq7DJrIZARKPOz9R579D9vJmmXOudirsVdirsVSz V9Yn06aGmnz3dq0cslxcwenSH0ylOauyV5B2Pw1Pw9PCMpU3YsQmDuAdufVfoWv6Zrunrf6bI0tq zFA7RvHVl605heQHTktR74xkCLCM2CWOXDLmkuhvw0PzC/LhxvtSPPlwpR2NeXqQcaePqL/rDrk2 pi36W/7WX/T9/wB7zFDv0t/2sv8Ap+/73mKu/S3/AGsv+n7/AL3mKu/S3/ay/wCn7/veYq8r/MS9 1Tzj5z07yfpU7XIs+M107TySRrJPRQxre3yERxt8RQ1Cu1Rtil6L5Z0S10zTQonlEXpCVrqBOFy8 V3J6cENsnLlHPeKlAeVYYQiCjEvihkWlLDHZFolv4LV2LyPpEMZsbetFVI0KF7rYDnKscis1SaL8 IVSPVbaG2eG49S1msbyKUW88IpYzwsC02yljHHX4p4eRC09eIgpIuKsZSdtJ8yQhZpIbNlP1a5mA MkAjdpE9YLsXs7iKRJPiq8YKIOJ3KvUrS8Rkn1KG09eyvF4eZNFC+pLBcFQryrER+8DJ9tQP3icX TlX4wlL7xXgWzpcwXWmzRtb6Pqs7Frea3uFAbT72ValfU4r6M4ruACC20qrH9KmutLhk0i4lnsBp z+ha29zeOkgtgB6P29WtQwVfg5onBippihG/pb/tZf8AT9/3vMVTDQdS9TWLRPr3qcpAOH1z1K+3 D9L3Nf8AkU3yxVk3kz/jj3H/AG09W/7qdzgSnuKuxV2KuxV2KuxVI/M/lWDzALZLq8ngtbcszW0R jMUzkrw9ZJFkSRU4misKb5CcOJydPqTiugCT9nuRmi2Wp2cM8V9dreD1QbRkiWHhCI0URlV22dWP 04Ygjm15pxkQYiu/ruk2gcv0L5g4Ehvr+pcSDxIPqNSjc4afP1F/1h1ybUx/nqf+/pv+kp/+83ih 3PU/9/Tf9JT/APebxV3PU/8Af03/AElP/wB5vFUv13Wr7SdOe6aS4llYrDa26XE8jS3Ep4RRKsOs TSHk5A+FGoN6bYqxH8u/L0VuL691CZrmS9eS71m9PKR3jkPGTjRnJkmVvRiCsSfVkAJaLFWXQzz3 pa7vPU43MjzvBFTnS4P1dY4Wqoaa5C/VIHBAWBGkDLzrirIrf1pnktpmu73UIwPU0zR5/q1np4AA jgMyvbBmUU5BmLHr6YWgClItQtNQtLyW3uRcxJqJ9SWG4jSXlNGK+tEbP0/UcUqGi4XC05Okij4F DzrzHHf6fHFPb3QnSxKzwlCJWQxqOFzbSKoSWNRbqXov2E+HgFliiVejeUtZgu9IttShY2YtlRLX U7cG4iitnUPHb3sIYO9uvI+k/wCwn2njcPVVMG1G0kluVszEt7LV7o6fd2V1p1wWpVpbS5ngKsx3 fgqt/wAWNiqGRLqL+4UWif74s3W1hBJ6iGDWUjHuQuKr+ep/7+m/6Sn/AO83iqN0Vr86ra+pLKyc xyDXDOKe6nVrmv8AyLb5Yqn/AJM/449x/wBtPVv+6nc4Ep7irsVdirsVdirsVSDz1bfW/LN1aC1F 807wKbY8t0+sRh5PgDt+6U8/ssNt1YbGGTk5Wjlw5Abqr3+B+/khfy/SeKy1O3me6keC+aPnelPW P7iE7iNUUUrQkV5mr1PLI4uRZ64gyiRW8enLmfx5cujtBUvonmFBWrX+pAUVnO8jdFQMx+SgnLnC Y5+i5f8Ai7/pB1H/ALJsNod+i5f+Lv8ApB1H/smxtXfouX/i7/pB1H/smxtWPaxbpNcNHHKTcRrJ DEocW5QyLxmlkWQ+vGEjDfE8Ua9QZOLFWVRNvBPFbfUYIl9M8GJi+B5JJR6Vtwr8SE8iLb1Nyxe6 kAoOQVMrb/RIucUoLxK7xXECg8QFFvPdwRnqW2s7FP5Ry+ME4qjGghtYvqdwY4Ui4pcQSTztZWrS /FFaC3hZPr1zJUyScjUk8q0KjFUHqcVvFbunpwWkT0LsttcaTbyMKMK2l6FtnkDAEOtzHIKfC4xV jHmKwuLhA91eW9lMh9ZDITHeK4Cn139T6u0nEopEtusrtRQzy0BxVg3lvzFfeSPMMcWqTwy+X751 t/0lp817BBHLKzOpMafVpVUtyYruq/FQfZCqva5oL+4RRLPdSou6CS11OQD5F7dj9OKqX6Ll/wCL v+kHUf8Asmw2rv0XL/xd/wBIOo/9k2NqjtD0+SPVrVz6tFcH4rS+jH0tJAiD6SMCsh8mf8ce4/7a erf91O5wJT3FXYq7FXYq7FXYqk3mnQYtX0uaFbW2uLp1RF+tAhWjWaOV4zIgZ0DekNwDRgDQ0yE4 2HI02Y45A2QPL3EKPkzRbvR9PubS5hiiZrhpU9B5njYPGnIqJ5JnUc+S05b05UFaYMcaDLV5hkkC D06159wCE0NOeh+YU48+V9qQ4cedauwpx9OflXw9Nv8AVPTLXFYt+if+1b/04/8AejxQ79E/9q3/ AKcf+9HirjpNB/xzf+nD/vR4quuIbiCBGaJoYICDELiJhBHKakSqLtNLtI3SlVYwycew7FV1IQkJ jDs0zSiB7eR3eVmUpKtlPJ6ck9xMCBLesAkcZorLu2KrDex2tst0gjaRKy25jQmCV7YLFHLClFJs 7IPwt16zykMoqQzKtK/1GJ15sNSRJmlkEi84gSfXSOdqxxNU1vb07BvgSrBVRVUihTT4o70M5mNG uL+K0ubB/ibkwF7OrRTxLsFF58LdTJXFUGtzpQmdNN1AcWbnLBdXVtBDG5HULYX1pBVhvVImqepx VL9c0jTtS0y5GoX9rqrTKUNrd6lbXAU/F/vKJ2aSGuw5fWif5lcbYqkf5X3Iu7G+0Ke3Fze6DN6A Y20UszWr/FbPL6emXjcuPwsXetVO2Ks2/RP/AGrf+nH/AL0eKu/RP/at/wCnH/vR4qmGg6b6esWj /UfT4yA8/qfp09+f6Itqf8jV+eKsm8mf8ce4/wC2nq3/AHU7nAlPcVdirsVdirsVdiqSedW4eWL5 +V2nBUbnYHjcLxkU8lPOL4V6v8a/DXcZDJ9Lk6T+9HL48v0/DzQnkDUm1HSLidtWXWCLkr9aSP0k A9KNgqjnL15cz8XwsxWi8eIGM2Getx8EwOHg25fP3e77VPQ056H5hTjz5X2pDhx51q7CnH05+VfD 02/1T0y1w2Lfon/tW/8ATj/3o8UO/RP/AGrf+nH/AL0eKu/RP/at/wCnH/vR4qqQWNxbSrLbWTwS j7MkVm0bCvcMmhhh9BxV1xE0ILXahY7393K14ssAuQtf3MzXTzahdKCfhgiiRW+yfhbFVt9dyWYa Qh5b8enLBDIi/WHmNY7e4uoRRIYomf8A0W1+0zfEaMHKqsSh1qY3EFrZKHFTcH96vxJbjaVpHUxF ISarLIvp8maX+8esKrK7W7uGRZprhpdOf91Ldy3919WhdtgJZbbUb/r/AMWKinpzBIBVRfqXdsir P5qI0xmZoYbq3u9Pgbq1F1J3MrDuD6rV9xiqJF60U0UNrdyCeZedsunauupSNxq1TBqHpl14g19O p8N98VeQaxFBof5q6XqSRRGz1z1NLuYVt6x+or8YmjiuLe8kiPqBF9Jo2ePdAfT4EqvS/wBE/wDa t/6cf+9Hirv0T/2rf+nH/vR4qmGg6b6esWj/AFH0+MgPP6n6dPfn+iLan/I1fnirJvJn/HHuP+2n q3/dTucCU9xV2KuxV2KuxV2Ksd8/C4fy3JDbw3Usk09svOxWN5oqTo/qhJPtcePQAn5faFeX6XL0 VeJZI5HnyO3JV8n3l3dabMbqS4kkiuHQNd2ZsZSOKtvHsGryrzAAP0YcZNbsdVARkKrl0lxILQ1V tD8xK3Hi19qYPOnGhdvtckmFPmjf6p6ZY4zFf0fY/wAtj/wNt/3h8UO/R9j/AC2P/A23/eHxV36P sf5bH/gbb/vD4q46fYEUK2NP9S2/7w+Kq1lby2rvJawO8b7SGzWaAOo3C+vYaRDJQH+WTFWM+ctT s9OtXjlPoLGjs6pGIWVZF4yiOCd3me5nHJGluKM67cRG0j4qx3yXf6hqV3e6gLUCyTg8s37yihGK wJHI0Nyiel8XGSUVLGR6+oaqqz24TS5JoZP0UlhqrgC3F7MlxBKrGhZjftayFiDy9S1YtU/ExPw4 qjSlvb+k+qaJEWmYRpJ6UltNC7MBC8GoGa5t1LtTiBPGQehZqAqo67N3a281lqkcbRXEgdoNWgiW K4cnbjqFoEgjkJ+x6sfMt0/mxV51+aukHUbN0IlMkTKyvcj/AEiGZEoFuVPIPIsS/bBIlRFflSJ2 ZVkmkJZ32l2d60VlG9zDHK0bJbAqzqCVI/RDdD7nFUX+j7H+Wx/4G2/7w+Ko/QLKzTWbRkFpyEgI 9NbcN9HHS7dvukX54qyjyZ/xx7j/ALaerf8AdTucCU9xV2KuxV2KuxV2KuxV2KsU0Sn6C8xVZVH1 7U6s7BVHxtuzMQAPc4UMS/0X/lusf+k21/6qYVd/ov8Ay3WP/Sba/wDVTFXf6L/y3WP/AEm2v/VT FXf6L/y3WP8A0m2v/VTFVsnocaLNaXROwhSWG7r7mGIXDMB/xjb5Yq8e806pHrGrfVY1VbGN6IKx xQt2YARJCvDYglETk3w05eopVejeTLN7awgW39G5uVf1WaKH154SqhOMapDfrBFxCoCtqoalEYoF YhU3ht0gmmtLVr6C/RfWTTyk7xGHl8fopHb20kYqSX9W1kjYnZXbbFUdosmnXsM1vbc7tZefrabb XX1K9jPSQmzR4bK4Wu7MFSv2XRm5DFVey9OCGaPTgC0Ipe/VIBR42+Guo6KwhdWKijNAvJqVFFPE KpPrgSSxT0Io/QMTNbwxOZomt0PNvqk6qfVgiYc1Xh6tuwrwaI8cVU9Ht4Le09EzW9vGGZ4RPLFb c0lPqB0WR/iQljRkd1PZ264VRv8Aov8Ay3WP/Sba/wDVTFUw8v8A1f8ATVnxvLRz6gokd1bux+Sr IWP0DArK/Jn/ABx7j/tp6t/3U7nAlPcVdirsVdirsVdirsVdirFdDfhofmF+XDjfakefLhSjsa8v Ug408fUX/WHXCrFv0t/2sv8Ap+/73mKHfpb/ALWX/T9/3vMVd+lv+1l/0/f97zFXfpb/ALWX/T9/ 3vMVSTzVqU0unSKkgvVoV4PK90vJhUCn1zUY12Hd43AqUJYDFWHeTdD1DWfMETpavcNHzKx8kkZg ooZJi7Rq0ah+IjLhST8QpRJSr2jTvy2t2gEmotElw4PJI7ezuCAezzXVvKzkf5CxoBsqAYLShNU8 lavZ8/q073mlrWaGGOKH1recGokSMCL4ePwn6q8L0pxBYlioSlLqKeRJJ1jneU+lLFc2xvnkWMen 8aARtfLCRTkAtzD0kUgtiqNuFtWtbe54qbZGKWzvcGax5E8a2epJyubF6jiA/FK/AB3xVSvIbkXE 1s8ExuJCZ5IZIik83p0PqyQwlUlmi/5abGUyj4ao1AMVQ1vLHp7PAlwlpU1MS3KwMCOvNPrOhuW3 3LwFvFjiqt+lv+1l/wBP3/e8xVMNB1L1NYtE+vepykA4fXPUr7cP0vc1/wCRTfLFWTeTP+OPcf8A bT1b/up3OBKe4q7FXYq7FXYq7FWOP+YflSO0nvJbmeG1gn+rGaWzvI1klHOq25eJfX4+i5YxcgAK nbFWQQTw3EEc8DrLDKoeKRCGVlYVVlI6gjFWMaG/DQ/ML8uHG+1I8+XClHY15epBxp4+ov8ArDrh Vi36W/7WX/T9/wB7zFDv0t/2sv8Ap+/73mKu/S3/AGsv+n7/AL3mKubWKKT+ka0FafX/AOuuYqxv WbHU/MWprYWqyX00sbcWE0kojjBC7NJLeRKGf7T/AFh0HH7AkChlXrflDyhpXljS47OzjBuGVfrd 2QTJM46lixZuNSeK1oMCU8xV2KpBrXlg3Ms9xZmItdcDd2NyvK3mePZZAyfvIZgoCiVK0oPhagoq xOaK80yUm5N1ZmdvSnDsis/IFF5XMvPTrrkKKvrrHMQBVi22FChcw29uht7tY7W1YiT6k0cNmnqA Efu7fUFnsXYblntrhK1+nFVqaoijimogINlC3qqAB/kpraoP9ioHtirf6W/7WX/T9/3vMVTDQdS9 TWLRPr3qcpAOH1z1K+3D9L3Nf+RTfLFWTeTP+OPcf9tPVv8Aup3OBKAh/MC3l84Hy+LRvq/1uTTU 1D1B8V9DZrfyRelSvAQP9vl9oUp3xVlmKuxV2KuxV2KvL5fyy8xrcJeafLBZrZTtLp2jTXt3e2iG a3u7a4kE0sayRGRbxW9NE4gx/wCUaFWW2HkuC20LR9J/SF6i6TZQWKyW0724kEEax83VD1PHAqYa Xoljpely2aPKIpWlmuJZZ3aUtMS0jmaocHfqCKYqgvqXlj/q5zf9xS6/6r4Vd9S8sf8AVzm/7il1 /wBV8Vd9S8sf9XOb/uKXX/VfFXfUvLH/AFc5v+4pdf8AVfFUTpv+GNNR1s7iBGlPKaV5/VlkYbBp JZGeRyBtVmOBUZ+l9J/5bYP+Rqf1xVBS+YLJdatbZbyD6tLbXEkp9RPtxyQKm9dtpHxVG/pfSf8A ltg/5Gp/XFXfpfSf+W2D/kan9cVWyanossbRyXds8bijI0kZBB7EE4qlQ0vyWhJtpYrEN9tbG6ez Vj4sttJErH3IrhVd9S8sf9XOb/uKXX/VfFXfUvLH/Vzm/wC4pdf9V8VVrW28vR3Mbw6hLJKGHpo2 o3EoLHYD03mZW+RGBVFPJVhHLK8F9qMCzTy3LQxXcqRiSeVppOKA0ALuTTFXR+SNFj8zt5iUy/Wj I1wLbkPq4ungW1a5CUr6jQIIz8VKdq74qyDFXYq7FXYqt5Sca8RyrSle1aVr8t8VXYq7FUn85Wtx eeUNctLaMy3Nxp91FBEu7M7wsqqPck4qqf4U8rf9Wex/6Rof+acVd/hTyt/1Z7H/AKRof+acVd/h Tyt/1Z7H/pGh/wCacVd/hTyt/wBWex/6Rof+acVd/hTyt/1Z7H/pGh/5pxVKvMNh5V0eGzlbQtPk W6u4bVy8UMYRZSeUlfTYHgoLEGmw65Gc6b8GHxCR3AlB6ze/l/pcLT/oO3vbeO3iu5Z7O1tpUWG4 lEULVJXl6hJK8a1Cn6RLIAzxaOczWwNkb943PyR9lYeTr3UpbK30K1eOK3huhei3tTA6XHL0whBL 1PAndenzFSJ2WqeExjZ7yK67Jl/hTyt/1Z7H/pGh/wCack1O/wAKeVv+rPY/9I0P/NOKu/wp5W/6 s9j/ANI0P/NOKu/wp5W/6s9j/wBI0P8AzTirv8KeVv8Aqz2P/SND/wA04qlfmHynpH1K2fTtItku 4tQ02ZXhgjV1SK/gkkYMqgjjGrE+2KsoxV2KuxV2KuxV2KuxV2KuxVjH5j2eoXflkxWkUlxGLyxk 1G1hBaSaxju4nu4kVd25QBqqPtCo74qu/Liz1Oz8nWNvqKPFOr3BihlqJI7Z7mRrWNgd1KW7RrxP SlMVZLirsVdirsVY/wCb/Kh8xwWcRvDaiymN1FRA4M6oVhZgWWqoWJK/tdMrnDicrS6nwiTV2K+H VQj8rarKFmu72D65NqCX2oFYWdJY7ei28KVePgFVFbfl8dTg4D1ZnUxGwBrhob9/M/jojfLPle00 Bb5LaRnhupzLDG3+6YuICwLufgQ8uPgDTtkoQEWrUak5avoPn5p1k3HdirsVdirsVYZ+bUNxL5SQ WsN3cXSajpsscdlHcSycY72J5iyW4YlBCrk8hx+mmKszBqK+OKuxV2KuxV2KuxV2KpEPOFi3nNvK S2tw2oR2a6hJcARfV1t3Yxqxb1OdTIpXjwr3+zviqXWn5l6Pc6Br+uizvI7Dy5LcwX5cQcmks6/W BCFmYP6dOtQG/ZqcVQEn5zeWYtNv72W0vo304WL3Vk0cPriPU6fVJFAl4MHLAUDcl7gYqyHy35w0 rX7PULmBZbX9FXU1jqMV0FRoZ7cAyKzKzxkKGB5KxGKo3TNf0XU7K3vrC8intbtedrKGoJF5BOSh qEgsQB8x44qiDf2KiZmuIgtt/vQS60j2r8e/w7eOKrpLu1jRJJJo0SQVR2YAMApbYk7/AAivyxVy Xdq7SokyM8G06hgShIr8YB+HbxxVB3XmPQrX6j699Cv6Tl+r6fRg3rSUJ4pxrWgU1PQd8VRpubcT egZUExpSLkOW4JHw9ein7sVWJqFhIXCXMTmNxFJxdTxkY0CGh2YnamKpHceeNOi8323lsRM7T2Uu oSagHj+rxxQyiAhjy5VMjcemKq/nbzdYeUfLV7r18jTQ2ac/QjZFkkNacU9RlBOKqsHmONr6S1ur WayWC1gu5rucxLbqbhmUQ8ufL1FKb1WnviqvbeYdEubu9tIL2KS406RIb1A393LIAVjY9ORqNq1x VIfNH5i2ug3kFsdMu736zNY29vcwGH0Hk1GV4olVjJzJHpljROmKsn+v2PpiT6xF6ZQyh+a0Ma0B etfsio3xVLNU83aPYNfwJIbzUtOtDfzabbFWnMO/GgYogL8TxDMK4qmUF9bylULCK59NZZLV2X1Y 1YftqpalOnhiqpFc20xpDKkhCq5CMG+FxVW27NTbFVTFXYq7FXYq84i0D8wbLz75j8yWlhps66qt ja2JnvJQYrW05eryRYPtS8yQA1FNK1puqxofl3+aC/lfdeSkttLSXUDcvqN/9cmLSSXV367FB9XH ECIshryrt71Vdd/lH5sSzn0iG2sb7S59fttYlmubuVbmWxgAZdPmkMMjv6TDgjlvseGFWR6V+XGv ab+V/mTy0klq+o6w2ozWNtyd7S0+u19OBJJE9R1iJqHZK17YFQOkfk09vrMeoXFtp0T6boVvpujN Chb0tQiZpDdlWQfEjBOL/aJBNBXCrHbb8kPNcei6RDJHam79eM+Y4/rz1vFigkjjkaY2rKvCWZpA vpM1TyMhejKqy/zN+U0es6l5djW2sU0fy/pd1aQQyK0g+sSwpDbAROJA8UPEtR26064FYtZ/kt5w h0QO0lomoGLSrS90+OaT0r6CwuGuLxriYxgmS6dyd1Pw7MdzQqnWiflBqthr3li9uBp9xbaZPqt/ qCEMypcajKrxx2yFBVIV5BCStGq1O2Kr9a/KnWbm688a5p4srbzLrZji8vXpLc7aFYBBMxfgTFJM ryVZKmhHhQBUit/yM195it7DphtjrUOplIHljpa2NoYba2WkYIrIF5MDUip6mmFUH5f/ACL876dc aNdXn6Kvk0mO2tW0mZmezuIHluri7aRWgoHSe5SSKi9V9lwKyH8xvyu86eaPM19dxTWMukzjTIrV Ll5BJFb20/r3kaKsbBTM6qxcGpAC/IqhPNP5Q+bNX8063qECWEdtq1/azwXDSszRx2luYQZ7WSCW G4R/Wm5RsdyV+IAYqvh/JO/uZIo9TtNLNrL5nn1y/wDSDc2s/j9C3HwLUGqAp0Cg/EeRGKqOsfk1 5hl813Wo2NlpZ0Z9Rs5rfTHlkiQ21hYSW9usirE68FmmLMgrVdvDFUu1X/nH/wAzxWsWnaLcWDWa 6Na6Tcz3DSRyyk3/ANbvSAkbhFfiAu5ovw03rgVOvNP5QeYdXn85SRwaWD5juNNS2cl0dLS09L1w WEZ4cuD7DlUmu1BhVBxfkx5vltNTlvZLCTVWtNXtba45yEXc2qzBkmuf3fwR28KoqR/FuPACqrK/ yr/La88malrruLcWN6lhb2Ihd3lMdhbelyl5qtCzs7dT17AAYFeiYq7FXYq7FX//2Q== + + + + + + uuid:DAD009446E4ADD119EEFF96D7801BC77 + uuid:dbaaada4-048d-4642-b37f-5659c12203ae + + uuid:D9D009446E4ADD119EEFF96D7801BC77 + uuid:23547E781A4ADD119EEFF96D7801BC77 + + + + Document + + + 1 + False + False + + 12.250000 + 20.000000 + Picas + + + + + Minion-Italic + Minion + Italic + Type 1 + 001.001 + False + MinioIta; Minion + + + Minion-BoldItalic + Minion + Bold Italic + Type 1 + 001.001 + False + MinioBolIta; Minion + + + Minion-Regular + Minion + Regular + Type 1 + 001.001 + False + MinioReg; Minion + + + + + + Black + Red 2 + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Lime + CMYK + PROCESS + 33.000000 + 0.000000 + 72.999992 + 0.000000 + + + Night Blue + CMYK + PROCESS + 100.000000 + 50.000000 + 0.000000 + 0.000000 + + + Pigeon + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 30.000002 + + + Red + SPOT + 100.000000 + CMYK + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + Red 2 + SPOT + 100.000000 + CMYK + 9.000000 + 82.000000 + 60.000004 + 14.999999 + + + + + + + + + + endstream endobj 295 0 obj <>stream + + + + + application/pdf + + + RBPassUp + + + + + Adobe Illustrator CS3 + 2008-07-03T08:34:59-04:00 + 2008-07-03T10:05:07-04:00 + 2008-07-03T10:05:07-04:00 + + + + 156 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAACcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYqwj8w7rVy8UGi/pGPU7eKS5hltorlrYsikrC/poYZGlYAUkNFWtKMRypyk9LdloYw5z4eE7bk X7+8V5fck+lwebzr6RB9TGnC7t5NNa4a54/VFkkF210z0qzrbrwjl3HqfCo/ZgBK+rfkli8O/TxU bque3DXz5ju5pjqHnDzpbtczDT1itIr2SChsryV4rSN2iN07Bo45BuknGM/EhND8LFZGcg1Q0uE0 L34b+qPPu+8b9fhYXR/OP5g3EGmvLp8ctvftHK999TulWONlEssfpoXaoWQLHIaKSp+11IGSfczy 6XADKpbx6cQ9w/aOfuX3nmD8x4FsbgadHPeNZxy3EcdreCKNrgtJJEVWZleSJLem4ryYAU5bpnPu RDBpzY4qHF3x6deXI39nkvTzb+YogQS6RGk4a4MrC0u2QrbQwt6aBWb4pJZJODMQrKm1WNMPHOuS DpdPe0ttusepP3Cr96lJ5s/MhLOOWXTFS5j+t+tDFY3ciu0KQpCgIdm+OWZyrbBgnVRyYDjn3Mhp tPdcW238Uet39gHz6o3zL5p83Wet3FrotvHqIsLKKa4s1tpmZ5ZPVdh6qOVQhIBwXcsXAAbqJSnK 6DXp9NilAGZ4eKXOx5dPjv7uiO0XWPOUyahPqUFukFnbK0AjtLtGnnZDJ8IYvLwQcVKiIuSSNiOO GMpb21ZcWEcIiTZPfHYfd9tJE/m3z5FdJP8AoqRmkht/Wg+oXxDFYBO6JxmeKJzJOY+ZB+z8RPED Icc+5yRpcBFcXU/xR767rPK/u5pv+nvOv+D/ANK/VYP0r6nL6p9Uvv7nj9j0f96PU5bcuHH/AGPx ZLilw31aPAw+Lw2eHvuPP38q/HkzLLnXsTn/ADK0WEXiNa3bXdnqUukiyRYmmmmhtReyPEBJxMYt zzqzA7UpWgKqdx+YtDfS7PVTfQxaffxxzWdxK6xLIkqCRCvMr1U1xVEWOqaZfhzY3kF2I6CQwSJJ xr0rxJpWmKonFXYq7FXYq7FXYq7FVk8EFxBJBPGs0EymOWKQBkdGFGVlOxBGxBxSCQbHN0EEFvCk EEawwxqFjijUKqqNgFUbAYgLKRJs81+KHYq7FVCKwsYbqe7it4o7q54/WbhUVZJOA4rzcDk3EbCu CmRnIgAnYK+Fi7FXYq7FWHy/ljpEst/M9/ffWL7UH1VJw1ur288tr9SkEBWEfA9t+7Ifl4/a3xVk droulWumWmmQ2sf1GxijgtYGUOqRxIEQDlXoopiqV6ZbW9v521hIIkhQ6ZppKxqFFfrF+K0GKshB BFQaj2xV5h5o/NDzdouqXMH6AjWwSZ4bW7uWmiEwUkVU+mVNaVFD0w0hJI/zz80lmR9GsuS719eY Ag9Kfu96DrjS2mvlvz5qvmWTUYdVv7Ly/ZVjVZYbxUvI2UB6wrPEYyr9GLe9MVT2Ly3dXjM9v5u1 ltORCZLwTWYRgRUNDItsVYLRg24ocUoW70HWzJcWGl+Y9c+tQwxyQX149stlIZdkVZltiXatAQMi ZdG2OMUJE7X8WR6U00drZWd1fSfpu3ikQRXMij61IqDnJxVYzLErNsyoMQe/mxlHmRfDbd55qNlG qyabe3lyrGO4jsYPV4soB50LAiN6/AT1phYMAfzx55g1nUL/AE7Qr+609qxCG+9ZI4vTd2JWOOJw ho1CeZ2GPDvbM5PSI0Pf1Q9n+cHmjVbiO0Fnp2nrMwCXct3JEiFWLVZzE68W4gdN6++GmtP5/Mmv aoYLa61vRNJtGlrcXOn6n/pYRa7RrPbmM19+2Ko620GO+eRdL89aleXCBS8cd3YyBV5faIS2anft vilMP8E3/wD1Nmt/8jLP/slwKyO0ga3tYYGle4aJFQzykGRyoA5uVCrybqaAYqq4q7FXYq7FXYqk Vn/ynOr/APbM0z/qIv8AFU9AAFAKD2xVKNfk8plY4deexFKyQpfGHbsXQS/rGKsY8xn8ql0W5Ytp 1Y03/R5s/rdDt+798KHjurtoaajcNov1n6rwj/3s9P1edD/vvanhhVMxF+YNtbCziGrw2lqoEsKf WVX4+icRRfjruKb1xVnHlCw/MK1+ryXFxbyw3HpH6tqz3LG24P8ADGiEUjnKPsvywKy5GsLiaN45 I5ryLlBZX7lHubec0kkt7iTfgWPFfTG9KjI7E22EzjGjYB3dp2sLqF87mC4sJK/o+8kkUQq85i9R XhqW5cCCtW3BNKY3dhJhwgGwb6frSuznbSNNvNO1a/jGnz3os7K7mlpdSKD/AKQ9w8nFSSo6qPnj EEMs04S3Aom77vglfmDzB+WWmzI6abZ3qAPFBDZQWkqmReNWlXkPg3XgR4PkmhiHmrzF5M1PTRFp +myWt8rGV5Y4LeIcygQpEYyW4Ch261wqgdE0Lz5HMh0yC/s2n4hbyNLiKN4zWnqSRjcDr4YqzNfI 35oi64HzGf3ic1BvbvbiQDtw/wAoYFZ35L03X9O0b6vrd4t9d+qzpcJJJNWNlWgLygN9qv0YEp9i rsVdirsVdiqRWf8AynOre2mab+Nxff0xVO0VhUsaknoOgHamKvAvzVk8xw63BJ5ia3jDRBbdrcyr bMoPxqpmO7itTT2whDBpb+xUEfWomLRshIkXqBVSd+tMKsq8g655Ej1EDVpI3urqSBOVy1ubONAy yMzGQ8lb93xr7kYq9jt9UikhW8tyZluib2Mni4kMzFLKMENuvD94Bv0BXAqWalBqcsyu91M2nWZW 5gWydvrFzLET6iysWIcSceNt3JFO1crkDz6OVilACq9UtiTyA7/erW95psiRQW4Wzub+MXDxuVjm 5saxXLBW/vA3FJ5DU8hxGSBDXkjL+tGO19EP5kGv3WnyfoxobOScxXM7yl4mjkDehKYileLc9zX6 ck0vMNe0rznBcT2+o/W763spZ5XuP380FRQO6u4A/boxwqx2w1DQ1vLcXl0ptUdVnMckfqcCQZWT kacuPSvfFXqfl7zl+UN20GntbWlsIo1Bu79LKMsqEAFpPUNZD9qTbffAr0fRfMXljUOUGj6haXQj qDFbTxSBANlHGNm4hgpZfauBKacEd0lG5UEKw8Gp/QYqvAAAAFANgBirsVdirsVdirsVSKz/AOU5 1f8A7Zmmf9RF/iqe4qh7mxgulAuIo5SjVj5oGAH04qwPzb+V15qWpi80e8SzjdV9eGWS8C81XhWN LeeBFqo323O+G0PP/NHlG88tx8r7XrM3a8GFot3dR3DrxKh1WfUIahT7jFUmsvNmo2FzBLDqnq/V wBFFNeerEOKmNBwbWCtE5My7bHfFWZ2n5waT6EC3qv8AWVHGf6rNYRxnei8A1+5HCMclqTSXfvir MtPeC8jttQEItZp4vgZ/T5xJPSoqs0p4CT05Vo1Ny3hgplxGqvZRMN6mkyW2mXBkfm0rzXsjSgpM VuZVVhJyDKYpAnWnf9o5HhIGzb4kZSuQ2r+Hbpt+1FnXLZ/MNxoMleRVpGJkTi0c92EZePrFtlQ1 +AdenieLekHCRjE+l0lur+XdG1QQvMsluIld3kspGt1JcGR1YRSrUjnGignrt4ZJpYj5p8mSWULX Wl3ss8MSAyRPdzzSM1aO6k31uoj7778MKsJg8wXlseVvqkkVTUlL5lPw9K01gb8SR+GKsvsPzk8x WsMcK3NhIsaJCHm9GR29MleTF9XqWPc98FK9Y8lebrHzBpUL/XbSfUxGHvLe2kiYoSepjjmuSg+b nAlkWKuxV2KuxV2KpFZ/8pzq/wD2zNM/6iL/ABVPcVaPKq0IpX4q+FO304q8+85fmzpGn2cf6C1G wvLx3PIie0njVFrWq/XLVqttx3wq8euNeuLpw1xqzyuNgzX5Y0r76ycKF1jFq+oKzad9Yu1UH1Xt p3l4GnLqmrtTZmO/9cVeneVvLNjp9h9avJWuL50InSWdp41r3SOW5k4ldxXn14UwKn0urJDLHavd w2zz/uoAHRUJKmoj/fjZQzUoNgieGAkBnGEiCQNhzSzWLnUr25bTVL2ummJmuL6GqFjKHIS3kS4C gxtLR6jpQdOsJWTXRvxGMI8exlew/WPuTd206G3l1CR1SW3R19cyqGWNfXcc5DOTQN8R3+Xjk6cc yJFdEp1Tz/5Qt7eeSDVLa4kQl0jivbZnc8qKFLXiDYen3/ZJ8MLF5Xqfm/Ub67lnOqGGNwEWCO89 KMIBx48E1gLuux28cVa07Ttf1CMzWC3V5EDxaWCaSRarQsCyauRUA1P+t74VZ/5D/L/VpZ49T1gT pDbuBHZSyXAkaRJUq0iteXUTx8VaoP8AZgV6jY2VtBxa3tUtlKBWHBRIdgRVlJ6bg174EozFXYq7 FXYq7FUis/8AlOdX/wC2Zpn/AFEX+Kp4vKnxEE77gU2rt3OKsa/MC+1S38tXT6UQZFPC8ccKxQMh Lvze/wBI9IgEHmLgMvUDuFXgH6R0j/q52/8A3Fk/8bPFVS11Dy+LmI3Gowm35j1lTWI42KFquA/+ MZOJI78W+RxV7dY2ul6ZbrbWTKkUfwqWuDI54k0LySXxd9mIqxr9G2FCH1zUWtdIu7m3vIoJo42d JZpvgDbGppfdTQfTkZmg36aAlkAIJB7lmjRWj2aXsvNZbpxdejcTAvDI0YRlSt7VQq1FOoqflggO qc8yDwgio7bdf1o+/wBTsrWzluJ72G1gSP8AeXFxcKIY6mtWrfIAuw2r9OTcd5Fr3nBL27ZJfMFj OkYMYmsb+G0hlUszElE83Wxbd23dK4EpRFd6ZNKkMWoQySyMEjjTVEZmYkABQPOdSScVet+TPJmn RwfW7/StQs7+KNeP16/lnhuCQTI0MH6V1OMCg25vVetT2VZ9a20CIFigEMbBiPTARaNQdEbdqAb4 qroSEjARgDsQSCV2/aNTX8cVX4q7FXYq7FXYq7FWPwGMeddYMjcE/RmmVblx/wCPm/71GKp+pJqe QZTulPCnjXfFWJfmJZPdaaJP07BokNkDPcSzS3kFVIKislpqGlUBP+/HK1xV4p/ir/v4f+53/wCP pilHaJ56h0/UorubWhcxJXnCdZgbkCpGwufN9zF98ZxQ9as9Ytb21iurW+SaCZeUcsd0roR7Ml+y n6DhQlvmn61NYLcWU3q3dm4ljtzPySUfZkRlN/Q1QmlR8sryRJGzl6TJESqW0Zde5MoNZtp55reO 8Bnt+Anj9fdOY5LX/Tu48MmCC0SxyABPI8kD5lR7vS5RFNdSXUYLW0dpfyW7lyOK19PVrLmorUq0 qg+xwsHmmpXeu6Wsbanf3VispIia51SSEMV68efnNa0r2wK7QvOb2+q27r5mtbfk3Bri+1Nbu3jV ti8kLeb7nkB7RsfAYq9as/zI8lTxW9sfNmizXTiNGSG8tg0rsACsSi6dlYtWnxN1G56lVlql2dqO hVWoVA3A49Ca9amvTp9+Kr8VdirsVdirsVdirsVSOzp/jfVhT4v0Zpu/anr31NvvxVPMVSPzbcXc GmSSw6tBo8cfx3F5cQ+uixUKsCBLCRVnWjA7fTirwXWvOOsane/WJ9flDKBEv1S9NnGVUni3pW+s wpU+JWvjhQlsmu39TTX7ynb/AHL3Hj/23MVehfl5qtjd2176DXEkwWATz3OpyXgZ+LcmVJNQuTH4 0rv03pirLFcrX95vyrHJ6vxCu60AufbFUmu7qTSdSm1mWX17OVYYJQszJ6EKc2klYC6PqUPYCvh7 1y2NuZirJAYxtLc+89B5fOmQW9zCYopRdhkuKIHErUQEkCtLncBRXbLHEIpK/NGiTarY/utUubO8 hciKWC8uogV41IMdvqFurE8QKsdsUPK9Vk8zaRLHFqeqahazSrzVJNXuASK0qP8Ac70qMVdp/m/W tMuDPb65M8hBULdX5u0Ck8iRHcazKgO3WlfvxV6V5Y/N7QZLKIa1qEFvPGAsjmaH96R8XMCO4mCD kehJ8MVemWt1BdQRzwuHjkVXUgg7OoYdPY4Er45I5EDxsHQ9GBqD2xVdirsVdirsVdiqRWf/ACnO r/8AbM0z/qIv8VT3FXYq8u/N26torOC4ubOZZXURWuqrfC3gDBuTL9XF5acyyqab7V9qYQh5OdTN WDahuRUD651/7nGFVKPV3inWWLUPjjIZOV2CKqe4bVyD8jir17yxq/6U0K1uri9Se6IZZZYmqpkD GsVEuZFFAwUkNTvgVMTKsqt8ezLRg0n2jy8DP2GKpTcXEnl27065tpydFmmKTcmZ+FzOVk5kvOzt SRwpWlN69MqPpruc6H74Sv8AvANvcOnyZLVA3996yOfhpIRUMa/8tHZwctcFJ9e0K31WIpPPLHcR owt7pbmZFWoqC0cd3GHoxrua4q8q8zRXOi6tLp0up+uIqGOf6y8QdGAPMI+rBx/shhVAQ65JDJFc Jf8AxxtzFbutCp22OrkH7sVei+W/zq+qwLbal6d3I05L3K3FlCqI7L+wbuYmm52PfptgpXsyOror oeSMAVYdCDuDgS3irsVdirsVYtd+dp9MvFs9U0qb17meSOwSzeG4kliWRlSQw81lAKAMxCkDuRlR yUdw5sdIJi4yFAb3Yr48kZZ/8pzq/wD2zNM/6iL/AC1wk9xVplDKVPQ9e36sVWSpIXQqaqpHJOlf ete3hirw/wDMjy15utdZ1DVq/wC4qaUMk3r3KUDkfD6cd4v2SQNkHjTChgT32prV/XIXj8P7+/8A bf8A3swqjfLeuXFhr1nd3Uv7pG4yuJbxyBJGV5cXuJVNK8qccVewC7Z44ruJyiPR1arGokq1aFq9 DTAq5WdZ+LSMWjryTk3bciofxxVLPJD3DafcacxM8em3k0ch5lSFlLTqxHqV3Vi1KnKsWwI7nO12 8oz6SiP1foZEsk4EV0kpBlLUl3pzLcgOJem7b9KZa4LA/wA1bqJ9LsWilK3zyPVTJciqcAxb91NE v2qbHpirzVL/AFP06icrxoQfWvq7in/LXhVGwXOtyNHGsxYyMqIDPfCpc0Uf72D2xV9LeUrXVLTy 1p1rqlPr8EKxTAGtOHwqKl5SfhA3LEnIpTbFXYq7FXYqxC78r6LBqOotY63NpevajG89xN60UkpS VykbcJg5ESOwRAnGmwBrvlRgL50XPjqZmMeKAlCPkenu6plZ/wDKc6v/ANszTP8AqIv8tcBPcVdi qDv9SsrS2mnu39O1jR2mkoxoF2bZQW+7FXz55zh8qLqYfy3L61jKoJh4zJ6RAFfim+JuRqfbJIYw 541IPJR17bEcRiqeeTrTXVvBqOm231uGAejdJzSP7dPhq5r1oagYq9Vnbk7mRyXLDlQEVJ2bp4NX Aqldajp9hFFcXMhEJYRk0fq5pCdgT9pqfrwSkBzbMeKUzUeaF8paTqVlamxNv6kccxSyn5KvrKW9 ZjxB+ChenxZDHEgU36vJHJITHMjcd1bfFO5UnlCwoaJtKIgOhkTb4j9H35Y4jz38w9Zt7mzGlxX1 Z7SZZJtP9Jt24EBvVIAHBWOwO/L2wqwFayEhhVT3+W5/ViqN0/Trm8vktbdPUuJgFSOoHIkdKkgY q+j/ACZp8NnokKx2P6MY8vXsfVM/CQMQf3hJrXrttkUp7irsVdirsVeU/mU8d9qs8lpeIQum8YEt LiL1ppPVuLeSNkJYugLcCFowLMVqylcxc3P4O87PBjEAj+LqDttE/t7uV87ZzZ/8pzq//bM0z/qI v8ynRp7iqjcesEkeGPnKsbeluAS3Zd9tz3xV4t+ZEHna/m/SOpaVLBZQERwW8bR3JQsFLCsA5sGI rUjbphCHn1xb6iWBOn3ZBP8AyzT7+A/u8Kr9Is7ea+A1JLq0th8Rc2d1Jz3AMdEjqOS1+LFXsdik Q0629GFlsDEv1dGWRTTiAteac/s9j+vAqsrT2r+sAVOxRipFfi2O6ewxVIdMt2u9bu7m8Vlvbb4Y LXi59KKZiARIqBX9b0+XT4emVR3kb5hzs3pxAR+mXM95Hl0q682YRiKS8V+BeRZfWikKuOQ+Ehac KfEykV7Za4KU+dLy40HRbi9tBI9zKaW7RwPIzS+ow58BHJx4LU0IocVeJumoynk9ldmR6lm+qz71 FRt6eFVzRXzs3+gXYLCoH1ac/wDMvFXr35T+UJ7Kxl1u9smS7uAn1DmxVmilX4wy1+Hlt9tajAVe lWyhIVVJDwNEUcaUZSeR3FdyO+BKJVVUUAoKk/STU4q3irsVdirFvNXk6fWZ2lgntkAg4C2ubSG4 UyBndTzkDlFZn/eALU8RxZTU5VPHbm6bVDGKIPPoSPx5fpRln/ynOr/9szTP+oi/y1wk9xVBa06R 6Tdu8AuUWJi1u3Kjim6ngsjb+ynFXgGtS6Dc2bQ2PlGDTpi6MtxFFdSsqr+zxm0t1IJ33FcKGPS6 coBA07t1+p+3/bHwqy3yL5c1d0kntpn0y0dlJCW0RMrIfiVlfToGACnrgV6F6HN5XMfwKxLExnsf +MP+ViqS+YLeG+t5NIEZN7JA0tsixsA0sXFlbkIeK/Ey7NleSiK6uXpeKEhk/hBF+4pvY2t0lvbR XSMbkwR/WV4Vq+1VqIKbnuBk43W7j5K4jw8r2VpbpdPh+vvyQRgc5EgZyqrShCpbMx/2IrhYPI9e sLN79p7P1dRmuavNNNpxiZWrSlDpUnL51wqljaZxaosfh34/6F2ND/1Z8VegeS/L+oWlpbalZ+UL Oe7Ks8eoPcC2m48nRv3YsI+NVBWnHpv3rgV6vZQzo8TtCEKw8AoO3OoMm/prT4vv8MCUyUsVBYUa nxAGoB+e2Kt4q7FXYq7FXl35pTGz16K6+snTBNYGH68E9VpuLSP9XiHwcZF+2h57yen8P7Qxs3P4 O67OHFAiuL1cu7lv7unLle7NLP8A5TnV/wDtmaZ/1EX+ZLpU9xVh/wCZ2lanqHlm4trBTN6siSXd sEjfnDEpJHFre7LHmEIUJyJG3hhCvCZNF1ChroN4QOhOkXAp/wByPFCyLRr2ORPW8vXckUZDPC2k 3K8lHVSw0QMK+OKva7PS41tIYrW1MUUUSekhhdOKKKgcGtgRQClDiq3U7TlY3AQPC7RsRcJCzNGa E8wn1X4qb7DBLk2YvrG178kF5UtI7i1TUbi09CW+VJZnERcyKF4RuaWy05xqDsB9+Qx8r727Vmp8 F3GOw8u8fNOPRlYgiIqIR8KmL7ILVP8Ax7eOWOK8l8yprN/emNrLU9VtIKtbzT6LcxEeoAHAQ6K5 H2AOvbFUnGg3zcSdAvfhFG/3EXPT/uB42r0n8vvJEAWG51XyxboyKbi1v5RwnWQENEDbixtChUqf tCo7jpir1NI2SkYjXkw9Zj/PIoXd/goDyINeu3TAlEKhMYEtGavIg0IBrUAbD7PbFV+KuxV2KuxV 2KsB80W3n2LzXPqeiQO1otnBBGIWtnEpWSR39VLj0iOPKgCP713IFExLisO000sBxCMzvxE9fLut P7aNJPO+sJIodG0vTKqwqD/pF/2OXurT5WDVpXY0NQR0+eKpbrj6Y2m3S6hZm8smjKXkH1WW6Lwk lSogSKYzb/sBTtv0xV4Jq3lXTP0lcHS9BkksC9bdpfL4gfid6GMeULrjxOw/ett1OKoWPykXdUXy +AWIALaMFFTtuzeSwB8zil7DpNjfpp8Ud9YQwTxAJ6cCGZOKiikN+i7br4CMAYWKzzEgh0a4l9OS 1VEAlmgtechUsAw4mxoeSnie1Mhk+lyNKLyAUD79m9F094tNihOnpbRxl1gijiLr6QYiM8jYHdko T/mMMOSNRK5k2Zd99/VdrOnymwkkjkubIRnm01lZxzTlV3KiJ9LueVf8lK+GSaHkNz5aaW4llbQ3 maR2YzSaJ8bkmvJv+dMb4j1O5wJRGlaJa2VyZrnybb6pGV4i3u9GuFjB5A8gbbyhbvWgp9qlD0rQ hV7n5c0fTbLT4be10ay0qJaSS2tnH6cSTsql/TBgt+Q5VHPiCadOwVTWKNVCh1Hq/bY0qOR2J5BV Fe3jiqrirsVdirsVdirsVdiqRWf/ACnOr/8AbM0z/qIv8VT3FWPedtUuNI0aW/g0221GP+6vYrhr kEwyUSgS0tNQllqSAV9OlNyaDFXz3+j9H/6ttv4f8cpP/GMxVE6Zo3l+61G3tZ7GKKOZwhePR4Xc FthRZPKEKdaV5OAMVe1W1lFY28VntKYF9L1GhiUtx+GtIdPSP/gFAwoS/wAyzfU9JecWSXEBZEuo jCORhkPBvTBsRyc8qAZDIaDk6SAlOro9PePuCK0nTYtO0y3sxWVYI1i9V4QGYDYA/wCg4YihTXmy cczKqtbrbR22kXUyWlvOY1o8NyhjjYE/EGKabO1eNaKIzU7d8k1PFDYaMzErpdsATso0pKD238mH AlUttJ0iaeOL9GREOwBEejo70rvxX/Bq8j7VxV9D6Raxw6Ta2kMkssaRgSzzQJBK6rT4WiS2hi6N 0WNfl1xVNUeUzCopG6kjrsQdtuApUHu30d8VVcVdirsVdirsVdirsVSKz/5TnV/+2Zpn/URf4qna lyW5AAA/DQ12p32FMVYd+Z92kXla9R7QXbzsltCjwvMq8xzLgLBc9ONa8GFQMIV4QdMACj9H9af8 eW//AHRsKF9jpUh1G39KzaJ/Uj4Sx2nFkbkPjDfogUp1rir2xEjKxq0a0VOJYxjkzIoHJj9W6nqf c9sCpd5kit10a4eW3UyQxc4VaIA+soJiZR9WO5cgL75DJycjS34gA68/d1VtHt5F020WZGmmSKMS lo6uz8RyJ5W1fHqK4Y8gwz1xyrlZVruwtLmCWG/s4Z7dTzdJbdGiPAE1YNbEU2rkmp4k+lqjuv1D 4QTwIsxuNqf9KfCqKtoLmzuI7i0tGt7mFg0E8NoUkUjoyMujgg/LFXvHkSbU5PK9tcaiZo7mpDB0 YSSBWKqzLJb2z7qF39Pp02wJZGr3D8lb4HKjhxJ40Pfkyfa67YFRGKuxV2KuxV2KuxV2KpDaKp89 asSASumaaVPh+/vxtiqehVWtABU1NO5xVKPNmhQazo09rJbwXUgR2torpEeITFSqv8cc/FlqaEIe vQ4q8G1/yLdaIsLXcNlM0taRWqRTulACPVRNIJStf2sKEjjsrm2nWS3tzBKh5RyJaFXBHdWGkA98 KvS/LOvW17DbWn1e9mnK8JriS0kCc1XlvJ9VRBuKVoK7bYqnl3bRXMIjuLZZQQCY3iB+yxYGhhpU UFMBALKMzE2DRS6xeTTY1g1NzcahfThmjt15i3Ej8AaNDzSJQvxHtlYNc+bk5ICZ9AqMRzO119nE nNxFbzx+k8MckUweNo/TVg6U4sGBgowfce++WOI8683eSXW4ub+DT9PtNOhrHbQwxRrJIgdirmP9 GzVfcA8T2xVi/wCjmRQV06vEdDZVNf8AuD4VZ95K81y2t3EdXl1i9eJWSz0+K1kuIOHABaKLG2cE UP2dqYFev26s0SzyM4CAGOOm9Bt9korBjuMCUXEwZerVq32xQ/aPbbbwxVfirsVdirsVdirsVSKz /wCU51f/ALZmmf8AURf4qnuKpbr2rjS7NZvqd3fF3CejYRetKBQnkVqPh+GhPvir5n12SHU9Yub2 e3jkkuX5u7oGIHQAk12C0ySEsksNPXY2sdd6ERp4keHTbFXof5W6ZHb6bdyI8Ci4ZWEMRAkUxkrR lC7Fq1HiMVZnMyOAaKsleiCmzKOvwfRgVItaSO18xaRdAq0lyWtZ3FOBjaMTDfhXnyXvt1yqe0gX OwerDOJ6VL48k/RArI0aBnP91HRWJqTxqOO/vlrgoXzJ5Ts9e0n6vcRxt6KmSOUohb1CaUVijd1H L2xV4m2mWUcsqGKCSjFAyKpU7kclPHcbbe2FUTYJFYXaXVogt54RWO4iUJIp+yaMoBG1QfbFXtfk b8xLzWY/TvbB3nPMG4giP1cGOrohZmYhhU7fLBSs9s5a8+QLSBghrQsBQdem1a4EorFXYq7FXYq7 FXYqkVn/AMpzq/8A2zNM/wCoi/xVPcVWuqlSSeOxHPoQPniryL8xPIOgabpt7rFr9aMruphjgEf1 aISdfUCoCqbUWh68cKHlsiKAuzEbGpofHbCqtpGvX+i3Bns2DAg1icsYzVacmVWXcV2xV6/YvPda Za3lxHHHJLHG86IKMOa+p8IJNKDbc4FUr+xguEihkILrXjMCvKNmHHkrH7LKp69sBFs4ZDE7f2+9 C6DeSrez2fqrPa2scZs9QVubOVbhIry1p6qsu4GQhLeujkZ8YERLlI3Y+0UO5kAmeUyxRmgUH0d6 K3FWDU33JrtTLHEYJ+YOiaJHDHcae9pa3dpEI5rJDFGZIw5COsSDk0xLHkenEDCrAC5GzU5P1C9d zv8AqxVNPLl95htrgHS3un9CRZ5LaAyGNgKBuaIRWv2Tir6J8tait9aesLK8s2YfEt7EInND4VPj t7ZFKbry35U67U8MVbxV2KuxV2KuxVIrP/lOdX/7Zmmf9RF/iqe4q4gEUPTFXi/5sWI0srHB5olI unJu9Hu7uJyEkJdGWKWe0URJwIWtd6UwhDzCWRCrj6/EIxuprZcu3/aw7YVbsrmK2u45pLi2nSI+ oYn+pSI1f2WX9ICo+nFXttrcTtYIeIgVgo9EsgdBxPwFVldQoBpsSMCqxUQyNLIilG2oOJRqKCP9 2b16nFUg0307PzRe6bzDQ3CR30aoykRgErL/ALsAXk3xfea5VHaRDm5Rx4Yz6g8Pv6hlapLZNG5M bNHIwjFQRUADf94PhPfLXCS3zbo1ve6He3cNtaSaq8LNG0cUcjINhxIaWMhlSpX46Bt+mKvDKxkp /p0Vfh5HlZV9/wDpYYVV7LUbuzbna6sLeRhR2iltFZh1oSuoAnfFXr/5R6yt/wDWJL7X57zUIVNL CW7hcGMENzSFLi5O32SWYYCr1VHRwSjBgNiQa74Et4q7FXYq7FXYqkVn/wApzq//AGzNM/6iL/FU 9xVocqtUilfhp4U7/TiqSea9IubzSbv6hHbfX5EIEt1G0lEpQhCjwsrU+yQ4od8VfP2ote2Fwba/ kktbhQC8FxcNG4DjkCUfWAfiGSQlr6kaml/1HxL9c71rSn6YxVnXkDzFZSwT2VzqbSX7sCizXiSB xQgCNWv7l6gVJ7YFZv8AWWMbK0nJQPstJ9Faev8Aa3GKpd5ks0TTnurKQPfWzwO5ikpJLCjh3iUr cKWFKilaZXkG1hy9JMcXDL6TfPlZHNNbTUFurdLyOZprSRSI51k5KWqK0YXHGuxGx65MGxbjzgYG jsUfI3okrLcIwZh6sUMhVlBrySjTihHTCweNefUg0vzHPHaTzQWU/GSEzXdCWajNwpqVsvFSaCiA DphVj36Ro3+99OtSLzfb/t8YqyTyT5kkstetnTUYB9akW3me4uRIipIwVmIOrS0PgeJPtgV9EW5l KKXUIaHktKGoNK7FtqYEquKuxV2KuxV2KpFZ/wDKc6v/ANszTP8AqIv8VT3FXYqtcV4ihIJFSDSl N99xttirwn80l0vRdZisrXUJ/rTx+tcyX+s2yVDNSMRpc6rp8w48GBqhHSh2OG1phB1YEkjUbcV6 n9NafX/xIcbWkw8va7exazarZ39lJczusERn1WxnXlKQgb0016RmO/7KlvAY2tPZIlujBF9Ynhad UUTOkyhTJT4ioN2xALCo3xQrqB0WZRRQFPrpWg/6O/bFUn8rTEQQxabMqaJC91EYpbhJJWlFwSjx sLviEFGp/Gtcqx+XJztXzPH/AHh4eWw5d3eyKSsieoZgFBB5LMoqzE/CT9Z6kJUb5a4LEPzC1by9 b2VnBqk4EkztLGYNRsrKb4V4fbutStSyeIVm3xV5O2rMzlv0jbCvhrVhv/4cGNppWt9UmaZI4NQh aV2Coia1YFixPwhQPMPU42tPoLyRpXnDTbZIdavILm1MZdVIuZLtZXKnjJNPcXIZVHIUU/I0wKyn FXYq7FXYq7FUis/+U51f/tmaZ/1EX+Kp7irsVULyee3t5p4rd7xo0LR2kPprLIw/ZVpXijqe3JgP fFXzvqut39hqM9pf6tLY3cTfvbS41cxSxlviAZD5yQrsf5RiqF/xV/38P/c7/wDH0xSyj8vPMtnJ rTrc+YI5WkiaOG0bVfWklc/F+7U+ZdWWq8Kn90DTo3XFD0hbyPmC9weAI5KLmhI70P140+7ChD31 0XsblBMzl4nHBLijt8J2U/X9ie2CXJsxGpD3pd5Lu0Xyzp3p3kcjxoRKsctAsiuQyuDe0LV+0e53 75DF9IcjXCs0mRS38kyepJKEpRXlWRUQg14gBLsUP2t+/wBGWOI8+/MrVFtBZ3A1KS1aQuhf9Jm2 iotCBw/xDpKljy6jkaDem2BQwf8AxV/38P8A3O//AB9MUu/xV/38P/c7/wDH0xV7/wCU9Rur3QrG 6vaevdxJKsymIRyh15KYhHdX604UPwzMD1qcUJ1irsVSTztb3Fx5XvoLe9n0+aQIFvLSG5uZk/eL XjFZtHcHkPhPpsCAa1FMVeV6iPzhGnwDSoLu31YWtuNEj9S5mtSwuLoXj3zXbzOHe39B41uHJUni p5BsKs08kxedpNNvgty9rbi6jOmvrdvPc3Jh+qQ+uGVpraQD636vAsTt0HHjgVkOjaTqcGqX2pal eQ3Vzcw29qBb2z2sapbNNIDSSa4LFjcncNTbFU6xV2KtFQSCa/CaihI7U3p164qkmpeTNI1G9kvb i41NJpePJbbVtTtYhxUKOMNvcRRLsN+Kip3O+KoX/lXegf8ALXrX/cd1n/srxVVtfImiWtxHcR3O rNJGaqJdZ1aZCf8AKjkunRvkRiqMvY7a3ubGH9+312doOX1mccaQSzcqct/7qn04qjP0db8i3Oar Vr+/mpv4DntiqFsPLmnWELQ27XIR5JJjyurhvilcu3V/FsERTZkyGZs91fJFiwgClQ01CKGs0pNK 16lvbrha0DqXlfTdRREuJr9BGeSm21G/tTUinxNbzxFvkcVS/wD5V3oH/LXrX/cd1n/srxV3/Ku9 A/5a9a/7jus/9leKshtbWK2ghgjaRkgjWJDLJJK5VQAC7yM7u227OSx7nFVXFXYq7FXYq7FXYqw3 yv5ftNU0dL+9u9SkuZprnmyanqES/DcyIoVI50RQFUCgGEqmv+DNH/5aNT/7i2p/9lOBXf4M0f8A 5aNT/wC4tqf/AGU4q7/Bmj/8tGp/9xbU/wDspxV3+DNH/wCWjU/+4tqf/ZTirv8ABmj/APLRqf8A 3FtT/wCynFUFJ5Z8qvq0OnSXOptqCRNeQI2p6qaIp9FnV/X4A/veNK1ofDBxb0z8M8PF0ukU3lPQ FmSBrzUVmlDNHEdY1IMwSnIqv1mpC8hX54bY8Jq+iEOleSxbR3Z1m6FrNJ6EM/6cv/TeWpX01b61 QtUEUG+DiHe2eBO64TfuR3+DNH/5aNT/AO4tqf8A2U4Wp3+DNH/5aNT/AO4tqf8A2U4q7/Bmj/8A LRqf/cW1P/spxV3+DNH/AOWjU/8AuLan/wBlOKpV5s8t2WneVtZ1Czu9Tju7Oxubi3kOqai4WSKF nRuL3DK1GHQimKsyxV2KuxV2KuxVQv7iW2sbi4hhNxLDG8kcC1q7KpIUUDHfpsD8jiqUeS/NQ8ya VNdPbGyvLS6msr2yYyFopYW2r6scEnxxski8o1PFhUYqn2KuxV2KpB5k0vVdR1HSktpriCwhaeW/ a2nNuXpFxiiYoQ5DO1dulPllcwSQ5WnyRhGVgGW1WL97FdM0T8xbmN/0nJd2ctze2Mtw0V4rcYYo WkufSUOVjV5j6fBR4dQK5WIz6udkzacfTRqMv4et7fZuq6PoXnL9OaJf6nbzeha2FrY3oW7UzNOn KWS4kkWQGSP1AodKnl4MBhEZWCWOXNh4JxiRZkSNtq5Vy51yPRk9hDdS6tqetT28haIGy023oFcw w/FIy8yq1nm6EkAqqGtMsA3JcKZAhGAPmfef1D7yx3QfKeu2t9pE8sRSzuZP0hrtpI6FotRSKRea cGZWWV5FJoeqA9zlccZBDl5tVCUZAcx6YnvjY+79LP8AL3VuxV2KuxVD6jNew2M8tjbrd3iIzW9s 0norI4HwqZCH4AnvxPyxVK/J+vajrmlSXt9ZQ2TLczQQi3uGuopUgb0/WSR4bZuLOrAfBuBUbHFU 8xV2KuxV2KoLUNGsNQlgmuRL6tsJRA8U00JX14zE5/dOm/FjxJ3U7rQ74qu0vSbDS7X6tZRlIyzS SM7vLI7t9p5JZWeSRj/MzE4qi8VdirsVdirsVdirsVdirsVdirsVdiqC1HRtP1CWCW6WQyWwlEJj mlip68Zif+7ZKngxoT9nqKHFVawsbPT7G3sLKJYLO1jSG3hX7KRxqFVR8gMVV8VSe8826LaeZ9O8 syyn9L6nDNcW8CitIoB8TOa7V34+ND4YqmJvrIRmQ3EQjVebPzWgUGnKteldq4quW7tWkWNZozIw DKgYEkMCQQK9wpI+WKqa6ppjQrOt3CYGf01lEiFC5/YDVpy9sVVBd2peNBMheZecShhV168lFdx7 jFXC6tS7xiZC8dfUTkKrxAJqK7UDD78VWrf2LJC63MRS4PG3YOpEh8ENfi+jFVGz1vSb27vbS0uo 57jTnEV9Ghr6Tsofix6V4kEjt3xVWOoWC27XJuYhbJTnOXXgOQBFWrTfkPvxVs3lp09ZCTwIXktT 6leFN/26fD44qkvkrzlZea9IGp20ElojyzxwwTshkdLeUwtKAjMOJdCAQcVR2k65DqFs88kEtiFu J7aNLoxq0n1d2VpE4O4KNwLDvTqMVQvm7zfpnlfQG129jlubFHhQ/VQjufrDrHGVDOnIF3UbHvXp XFVK/wDOlpY+YNE0Gewu/wBI67HJLbIvoMsSwBWn9ZvV+H0g4rx5A/s8jiqWXP5r+XbXzDcaJdW1 5C9rf22lzXpSJrcXV6nqWyckkZ/3i9+Hw/tUxVuf81vL9v5kl0G4tbyKaDULbSZLspE1uLu9j9S2 TkkjP+8Xvw+H9qmKsmuNb0m31S30qa6jTUbuN5re1J+No4qc3p2UcgKnFVZdQsGCFbmIiUhY6Op5 MQGAXfclSDirmv7FBKWuIlEBCzEuoCFtgG3+En3xVXxV5Pc/lx5wvPNmi+a7treTUVvrttXs2uSb ePT54WtYobci3V2IgYFqkDlVurbFUh/5UV5lj0fRLYzW121rczxX1n6v1ZP0c0lxJbRJL6FwT6cl 0Xf4N/hpQorYqidQ/IrUGk1C40620yCae+0yO0jJlCppNlAsNxCHKyOjT/EGoSWT4WPbFWEa55Tn 0e70/wAua+gv7iZru412zsGWMvBqt7GyyabFOE9S5HpcJBGDxj2Brir1ry5+Wuo2n5jah5i1WK3u LaO4aTQZxM3O3t2tlt0gS3ESBfTXkKmVloTxQElsCpQ/5N6lF5f1GS2t7Ea/qmtnUL4KzKs2mG7S Y6eZihZVaOJOS04luta1wqlWnfkN5lj1SdL26s30+9uba+9aJ3DWBjv5L24t7KMxiglZo1D1XYEk dFxVk2n/AJaa5a+TfO+nGDTRq/ma61Ca0dAwjCXTEQes/AHjGvEhAppTvWmBUj83fkl5gm0y00by v+jrXSoNIltZIp+Y5alOIoJbxgqNzdraMoJG+Ja1GKqF7+SPmb9NjWrGPTY7uLUbC6t19WUKkGl2 ZjhA/dN8clyeZNPsgCo3GFWQ/lT+WfmDyba6haX6WGomW0iW01ElvrQkaFfrFoz+mrfVhcKzr8X7 VeNa4FYzP+RXmWfytoOmumnfXNG0vVI+YkkCvqGpEhGJEe8cfqO52pWgowxVl/mnyL5luvJ/lHy7 p0FnNDotxp02pJJcSQo8OnBaQxn0ZC3MqPiYDp032VUZ9B/NCfzzH5qk07SWltdLuNP0+3+uz8Ip bi49QSv/AKPV+MSqrceNTWlKiiqVaN+VnnGHzpH5r1BbKaV9bub+709rmWWD6tPCkNvLEjxcFubT gSrUqQxHIbYq7TPyn81y+b01/UEsbG5HmKTXJb+C4lnna0MPox2AjMMaceI+Ny237IxVNPPX5a65 rvmfW9WtoNNkS78vnSNOa6DGRLmR5C0rUQ8aBl+Kp2HHjucVSaD8jLyz8wxvZw2S6Va2Vn+jZPUZ Db6jaoQ1w8SxFpneUI/Myr9kcg/FVwqgbX8kfMw8t2Fk9vZR6vJNBLqupPdtcc3to2jV5YZLX0bi OQTzViZeVWqZGNaKvduCcOHEcKceNNqdKUwK/wD/2Q== + + + + + + uuid:23547E781A4ADD119EEFF96D7801BC77 + uuid:d1fde563-235e-8e47-a158-ac3cc76aa98f + + uuid:0742cf20-2206-9d4e-9e3d-e542f631a88a + uuid:B7D572641149DD119EEFF96D7801BC77 + + + + Document + + + 1 + False + False + + 12.250000 + 20.000000 + Picas + + + + + Minion-Italic + Minion + Italic + Type 1 + 001.001 + False + MinioIta; Minion + + + Minion-BoldItalic + Minion + Bold Italic + Type 1 + 001.001 + False + MinioBolIta; Minion + + + Minion-Regular + Minion + Regular + Type 1 + 001.001 + False + MinioReg; Minion + + + + + + Black + Red 2 + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Lime + CMYK + PROCESS + 33.000000 + 0.000000 + 72.999992 + 0.000000 + + + Night Blue + CMYK + PROCESS + 100.000000 + 50.000000 + 0.000000 + 0.000000 + + + Pigeon + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 30.000002 + + + Red + SPOT + 100.000000 + CMYK + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + Red 2 + SPOT + 100.000000 + CMYK + 9.000000 + 82.000000 + 60.000004 + 14.999999 + + + + + + + + + + endstream endobj 292 0 obj <>stream + + + + + application/pdf + + + RBPassUp + + + + + Adobe Illustrator CS3 + 2008-07-02T23:27:46-04:00 + 2008-07-03T00:02:28-04:00 + 2008-07-03T00:02:28-04:00 + + + + 256 + 112 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAcAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7FH5G856W0v+GZ9O0dZJ rhpPTVGMkT3PqW6sWtWK+lE7rSpHT5ijw5Dls7c6zDOvEEp8vu3/AIupR1z5d/MC80nTo76/tJ9S sbwag0qu8McjQspghPpwj90wL89q/Z3O+ExkRu1Rz4IylwgiMo18+Z58+VM5y51qXXfmTQLSVoLj ULdLhNjbCRWmr4CJSXJ9gMVUf8ReoaWemX93QVY+h9WA/wCkxrav+xriqnFqnmj1JGn0NBbhgIhD eI9wy0BJaN0iiXckUEp6Yqq/p+aOhutIv7dD+3wiuP8AhbWSd+/8uKu/xVoikfWJZLNT0e8gntU/ 4OdI17+OKomy13RL5+FlqFtdP/LDNHIe56KT4HFUbirsVdirsVdirsVdirsVdiqF1SxhvtPuLSaG O4jmQqYZv7tj1AfZtq9djgkLDPHMxkCDTA9K8ofmRpGlwWWlanYWiRo6tAEQxchbRIjgi2ViWnWR mLf5J+L4lNIhMDYuzyarT5JEyjI/2n+l3V9qax+VNfbzhpGvXU1vIbSwitb6XkfVklVJ/UKqsKDi 0kykfGo2PwV48ZcB4gWk6mHhSgAd5WPs8/L9rMctde7FXEgAkmgG5JxVLm8w6NXjFci6cVDJaK1y y0/mWASFfpyPGG7wJ9RXv2+9D3et6wBC1hoVzdI8gErSSwW/GKhJdVd+ZaoACMq9eoxBtjOAj1B/ HyX/AKfnjobrSL+3jP8AuzhFcf8AC2ss7/8AC5Jrd/ivQlP+kTvZDs97DNaKdq7NcJEp+/FUXY6v pN+WFjewXZX7QglSSlPHiT44qi8VdirsVS/Xdah0mxNwyNPcyH07Kyj/AL24nIJSGMeLU3J2UVZq KCcVSTTdb8wavL9TuTB5dv8AhWTTnBubvjX4nikcRQED+ZElXxNdsKonUfIWgatHGut/WdVaJ/VR ri4lULIFKh1ihMMKMFYiqoMCoS6W88p2kUOmSRX0LkpZ6NJGsVxK/HZIZoFC0AFSZIj4s4G+FU60 LXF1O34zwNYapCqG/wBMlYNJA7DpyX4ZEJB4yL8LU26EAKmeKoe/1Cy0+1a5vJRFCtBUgkliaKqK oLMzHZVUEk9MVYufNfmtmP1jQX0e1Z39G9n53x9NWPFnt7IMY+SUYh5Fp0rhVWTR9P8AM9uXvdYi 1e2B4yQWiW6wD/JrSadD/wA9sVV7H8vPKmnSSy6bbS2M8yqss1tc3MbuELFOZWT4+Jc05VwKq3q6 tpFtJdtrcTWkYBkOqRRjetAqzW5tgvKtPijc1+7FULp3m/VXMsuraDc2GnDj9X1CItcpJWvIvAEj uogKDd4QPGndVkVpe2d7brc2c8dzbvXhNC6yI1DQ0ZSQcVVsVdirsVdirsVdirsVWyzRQxtLM6xx oKu7kKoHuTiSkAk0Ev8A8Q6a9RaNJfHt9UjeZCfD1VHpKf8AWcZDjHTdt8CXX0+/b7OaW2uqeYNY urmzjRdC+quVmSbjcXrRsT6ciIpNuiuFJV+Uo6qQGU0m0lZN+X+lNM97HPM2pyENLdXbfXFkZRQc 4J+USrt0hEZ8CMBAPNnHJKPIkLLPzi8F/LZahbp+j7Y+jJr1rX6iswbiIZA+8Tdmozoh+FnDGmGm FsqxV2KpHrfmpNPm+r2llPqlzFRr2O1HL6tGykrJNSrb7URFZyNwpAOJTGr3Q505fMltFd3DadLa SCsLwRJetxBP2J514da7ejtkal7m28Y5Ay9+32D9brbyBoFpMt1Z/WLS/RGjS7t5nioHKs37hKWx qUXYxU26YQKYTnxdAPc1qGp6/opSPlFrby1FtaAfV756d/gDwv1ALFYkXucTIBY45SBI5BN9I1e2 1O3MkQaGeMhLuzlAWaCWgJjlUE0O+xBKsPiUlSDhYMCj1uN/OKeaJIJXB1STyhBbVQiOIHn9aoXo C88Z6bmMrtthVPvN6Wet6rZeU7mEi3uVN1c3teJQRk8IIHU80nlCueS0IRXoa0oAUmJq+iYeWNZm up9R0e8Yy6hosqQTXVAFuI5Iw8UwC9CRVZBQDmrU2pihh/lnXYW80WPmOWCUL51WeBVlKN9SXT39 O2WodggnBpIErWUqMKph5xvkl164uYEb655MshqycCoe5e45hrVDUbNDAysrbcpI2/ZGKsrm16yj 8vNrqh5LQWv1tEWnqOpTmqKCQObdAK9cCsP1HUI4joPny9DNzdbZ7EkMtpa3g/eNxJoJrdkDTyDc Isi9MEQerOZjtTNdZ1WDStNmvpUeX0xSK3iAMs0rHjHDECVBeRyFUE9ThYMYOi6d51tpbm/UWjqG t2gtx6V/bScfszXFFmR15BgqcV93QgmIB6tplACgLPef0D8fBHaT5yWfySPMNzbyPNEssclrAFaS e4hla3VIF5UP1iRR6QLbhlrkmpLJbR5bSDz+WW71KO19eCyrWD6q6+oIIOWyzmu01KsxofgPERBo WW2QEpAQH7WUWuu2c+gJrbhoLU231qVJKc4lCc3SQKWAeOhVhXYjJNTE5B6mmS/mFa2zWmp20Es8 mmLSN5IIQfrFpd8aB7j92QGbaJ1AG3PmBfVnIxoAM20+9ivrC2vYQViuokmjDU5BZFDCvEsK0PY4 WCvirsVdirsVdirGte8wztrdt5X0xzBqF7G0kuosoaO3jFTxUGoa5dQzRowpRWc1C8WVQF3ov+F7 WXVCp12xs0Msi37evqKLGv8Ax73MtfVJpRY5CCSf7zoMHAGzxp1V7Ml0XW7HV7X17bnHIlBc2ky+ ncQSEV9OaM7ow+49RUb4WtinnPVGGtSzWokSfynY/pq4MTBWuY5GdTZghqsrR28hZW2D+i3bFUR5 q1WPWbPRdBs5bm0/xYjPFqFu4jeC3hiFy/xI4blItEHGo3P0qquk+bNLH5dSa61h6Npp1pN9a0uF YxQ2qsrxRJy4lZOFYqn4lZT3xVT8kzy6bey+V7h2mlW0i1a3mVg0McV07I9tFVi3CGWNvTAHFYyq 9t1UedebWNYv9B05nthYhPruomnxh6hktCCeToylJHP2G2oT0jIHo2YzEbnfyUvKTxaZfXvlOjSS adHFeRXrEM08F28gUzMTze4VomEjH7XwuTV6CTWl2kWk+qazrWvaLO+mTw3JsEtHAazuvRVWe5nh RiC0xf4JVIfgqdiVKDaTEg0Uwt/Plu3lrWtbuLGaP9AmdLuBGjk9ZreFZi1q/JRIjhwIywUt/KMA NplExNFB6c8/lq4s5b5m1FvMc6C4uFZZJILqf4qB2ILWQZuEYqTGSqjkG+F2tNyI8gg9R1T67qN5 5msYbhJvK1y2nmyjIWW+XmEnVlDhZU+M/V1c/wB6CdsG4O/JIAIoD1Jkv5W+VliiiDX4SKRJ0pf3 YpNHHHGsu0n95SIfF1rXxyTWk2iRavealPFqGmalCLvXf0nDeS/CIYYo5RFHyEhKqRZqjL9mk1Oj YCO5nGQrf4O/Rt4bF7iPTtTiu7jTriQhHkWQT69dcmiJEgPKy48jv+7U1XB6mYOO+tX9n7Udqv5f 6JZaclvYxajKLmaK1RYru4f6tHPeRTyzR8pP3XBoQ/NNwRkjbXCr3Rlj5T07VJLrVb+G7t7u5vJ3 aF5pY/ghuIFj+FXpwddNiYduLN2Y4Bayrox/WhqNvpXl2C00zUnludVfXrywjYmSOBLr12gkUygf C1zHxjHwVXtTEeaZAcxy2VNHsrx7HX7rUdH1J2tL2+1bS7CVm4TLdxT25t0iEjK3IB3KdAZAw3OE sY1e/JFanDc6XrOgRRJd3tr5YtraOVS5k+svqUn1BJPjf4poPTLln/ZdgD8WAFkYk7gbbr9Wuhe+ f4jZWt3z0Z4LLVmtSY/Xh1KCX02kKOheK1bi9W3UsxX3d7Rtw+bWpeXm0O88v2eiWd5cadbXiXt2 PUknU+nHBpiI5d+ipP8AWafzRFutcLFj8cnmdNOtIE0TV1ij18ayYUFP9DkZbv6sy+qAfTkueIT7 PKM+GGlBI5JjrSajD5dhS0sNQa51HWbjVZtOJZpBFZzPd+iI/UKqlz6CJwB4lpCf2siD3s5AHeI2 2/HzV1t9Vur/AFjTbrTL9NP1nVLedXQmOKGKGZ4phySRSscyacsrcftevv8Aawm+iI11Z1pOmWul 6bbadac/q1qgih9WR5XCL0BdyzGnbfFii8VdirsVdiqldXMVrazXM1RFAjSSEAk8UBY0A3OwxSBe weSxXOtR+XEtDZahcaxDe2uvPeLBM07LLA9+8DsoLCUC3ew4n9ho1/apjYUxIZT521X19UstMt1u pJNMex1q7t7aN3aaE3ggSPgoq4WjystNiinBvaRVHvd5k9LV9euItLka01jy1HDeXF0vOIzBqzQ2 TOtPUt5OBMw3pUUFTsm78kgCv6XREL5P0fXqa60+oQfpZI7p7Z5PSKpILR/RePiSopYoGQn9qT+b Y2wIQOj+RLHU47TWprnVbK4We5ubO1aVrc2yXFw8hjETLWOqMEYeG3TEE9WUwL2WW/l2KOZtKt11 FLNr7TbLk6yemY9ItlufrLMVCET+ktvI/wBl+Krg3ZDgrrdfaqal5KttA0e6v9MudVuNRhsHsLMR yNPL+9ggtYzxReXwNAktR9k82yTWk6X91YDRpoLO/wCPlFL2DUJEgl9O+WOaG0kCvsszzcmuFWpJ kSnvgsJ4TdUmuo6PcPY655gtTqUOrai15YWkUayB4RcvBYJcLFxEgWP6otwrDorM3fAL6plXRDzW E6+SYVs31LTtT80Np1o8QSQSWcixRwzOsdFaILBbsXJ8PDDtyW5E315ou1tbXWLLTb6G2vbMa5PZ Ld2aq6wW40lpJ68QoCRymARcjs6lKYPcmtzxXf6UInl+STzTHoL/AKVXRrLTbawtL4iQBZtPlgvB Ms/H06zBkRm/aMRHbYsbNV0R2neTLQa9LAt1qqQ6ZHaMZ5XYJdym9l1Al3KcZuDmhp0DEd8DIEAb c9/l+LZxhYOxV2KuxV2KoL9Fx/pn9KmaUyi2+qrblh6KqX9RnVaV5saAmvQDGk8RquiNxQlE3lu3 lvWu2urkM17FftGHXgWhgECQ0Kn91t6nGtee9e2CgyEz3pX5O0KJLu88yma/W61d5jNaXlYwsYnb 0KwuiurRxKFWp2BOItZgXsyvCxdiqEfTUfV4dTM0vOG3ktltwV9EiZ43ZytOXP8AdAA8qUrtimzV IvFDsVdirsVdirsVQesaaNT0u509riW1W6jMTzwcPUVW2bj6iyLuNt1xITGRBsN2OnC0mvZvXkna +n+sMJeFI6RJEI4+Cp8AEQPxVNSd8aUyJ+CRaLo6XfmW+8y/WrtHWa4sYrWRESIwxiGFxR4hKV9e 2aRGV6HkTuDgBKZAbUkVpo665qRcX+p2r6oNWuZrj6uICLaQxWMUAM9txWkcSSorfHVamqnBuebZ 6Y7g77ft+ReigACg6ZJpdirsVdiqTxeW1TSrbTjf3TiC6S8e5b0fWmdLn61xkIiCcWfY8FU0798F Blxm7+H2V9ycYWKA1HSTe3VncC8ntmszK0aQ+lwZ5YjEHcSRyVMYclKUFeoI2xpIkRfmraZYR6fp tpYRyPLHaQxwJLLxLsIlCBn4hV5Gm9ABiBSykSbPMonFDsVdirsVdirsVdirsVdirsVQ+pS3sWnX UtjCLi+SJ2tYGIUPKFJRSSVABag64DdbM8YBkBI0L3Ycmp/m6zRBtKsI1dWDsaMUcIhBZRcj4Szn 7LMfgP8AMDlV5O5zzj0n86X4/wA38Wldr50/M6fzNNoZ0qxjliCSspqzrAzR83NLjg3ESfzCvYbE ZEZJ3VN0tJphjE+KX7d/6Kb32rfmpHNcx2mi2kqCe7W0mLoF9BOH1NnBuVYs/wAfPYfs9N8mZT6B ohi0pAuR5C/f/F/D7qQsWofnGbm0eXTbRI2AS7RRGYl5OtXUG59Qsq8qfFQ+FcjeS+TM49JRqR8v xw0iNS1T8xUOlWrRWtq9+LaO6uo0DMk8sjNcRwo00vxQQLyqysrUZqj7OGRnsxx49P6jueG6Hl0v Ycz8Vmpav+biXF7HZaJaSQpcyrZz84/jtSSsTENcrSQUDGq0Nf2SN2Rn0CceLS0DKZ5b+/r/AA8l KLXvzKsfL93NrFlbxXcMaQ2crelWW5lmjgiL+nOU+MtybZFBIHbBxTA3ScOnlkAgTXXnsKJPT9av Jrv5h2emard6ta2VoYfTg0tY15+rPPP6CMWNzQLupowX7XbiakymAbYjDp5SiIGR7/IAX/N/Xy80 LLqf50S2soGlWVvcoOcRj9N1d4pIzwJe62SZPUFaVHsfiwXk7mYx6MH6pEf2/wBHpsq+Ydc/MtNR az0uwt0Y3UbWCH02ae0iLi5d2M1FUH0eoU/HQGuMpTvZGDDpuG5E8t/I9Onv7+SOXUfzOXTkmfTb OW8a4hV7VKJxg9D1Jn5G5ZSTMfSXfanKjA7Sudcmvw9NxVxSqjv53t/D3b/Zsg9L1L8259YtP0jp dta6eJJI7wL6JUxGSMpKCLqSQOEDilKCvRq/CAZ3yZ5MelEDwyJl05+e30/jy65dW/N2OO6ro1pM /qA2dXjX920crOHpcdUl9NVoN1rU1+LHin3KcWkJHqPn9n9Hut13qH5vIsBt9OspX9FZJV4rGvrO 7r6TcrpzSOPg549TsG7FJydyxhpN7lLn+P4fgybQbnzFM+orrVrFbiK7kXTnhIKyWlf3Tt+8kPPr yqF7bdcsiT1cPNHGOHgN7b+/5Jtkmh2KuxV2KuxV2KuxV2KrXljQqHcKXPFASBU+ArjaQCUJqGt6 Tp6lry7jh49UJq/Sv2BVuntkTMDm2QwznyCW6d540C/vHtopWjEcfqGebjHGRUCgLMDX4vDIjLEl tyaPJEWUZN5n0CEuJL6L92KvxPKm9P2a9zhOSPewGmyHolF5+ZPlyAfuDLdE/wC+0Kj6fU4fqyBz Rb4dn5DzoLNO/MSxvbhIxbNDG0ixtLI6gKHDHkf+B8cAzApyaCURdp3P5k0CBisuoQKwAYr6ik0I qOle2WGce9xo6fIeUShZfPHlWP7WoKa/ypI//EVODxY97MaPKeilcee/L0JlHqSSeiKvxjPZgtBy 49zgOaLKOiyGvNAy/mfoCr8ENy7eHFAPvL4PHDaOzsneFNPzNsHjeRLKXijKu7KCeQJ9/wCXB447 k/ydLvbj/Mm1bUYLRrMxpM0Smd5AAol4nkfh6Ly8cRn35Kezzwk2yRtf0JTRtRtVPgZox/xtlvGO 9w/An/NPyRkcscqB43DoejKQQabdRkrayCOay4u7W2VXuZkgR2CI0jBAXb7Kgkjc9hgJATGJPIWg U80eXnlnjXUIP9HSGSWQyKIwtwHMX7wngSwjY0B6b9xg4x3th0+Sh6Tvf2c27nzJoNtJBHNfwqbh 5Y4zzBXlbo0kvJhsvBUPItSh2648Y71jp5m6B2/TyR1vc21zCs1tKk8LVCyxsHU8SVNGWo2IphBt qlEg0diqYULTJGJFjLASMCypUciqkBiB4DkK/PFNdUDd+YdEtJDFcXkSyjlWIHm44gk1VakbDImY HVshgnLcBuw1zTb2yN7HKEtgxQyS0QVH+tiJgi1nhlGXCeaHu/N3lq1/vdQhPtGTKfpEYbAckR1Z x0uSXKJV9N1/SdSkMdlP6xCcyeLKOPIr+0B3GGMweTDJgnAeoI55Yo6c3VK9ORA/XkrawCUK2s6Q rcWvrdW8DKgOwr4+GR4x3s/Bn3H5KE3mfy9CoZ9Qh4klQVYNUjc/Zr44Dkj3sxpsh/hKFfzz5UTr fqf9VJG6/JTg8WPezGiy933LD578vVjEcskvqmkfGNhWrFa/Fx7jB40U/ksiXP8AmjoIB4W90xHS qxgH/hz+rI+OG0dmz7w6D8zdKlk4C0nB4s1Tw/ZUt4+2PjhT2dIdQsuPzNs44lkWxkbmzKoLqv2Q p32P82Pj+SY9nEnmrSeRtSlcyy60zTc/UjcQ8eBLO7cQJNqtITicJ70DWxGwj9v7EFdfle1xMZW1 Q8iqg1gqTxULWvqe2A4PNnHtGhXD9v7FL/lU/wD2tf8Akh/18x/L+bL+U/6P2/sRUv5a+obg/pGn r1/3T0q4f/fm/THwPNgO0Kr08vP9iF/5VP8A9rX/AJIf9fMfy/mz/lP+j9v7FaL8r/TheP8ASdeb K1fQ6cQw/wB+f5WPgebE9pWfp+39i24/K31pOf6T4/Cq09Cv2VC/789sfA80x7Sr+H7f2Kf/ACqf /ta/8kP+vmP5fzT/ACn/AEft/Yipfy19Q3B/SNPXr/unpVw/+/N+mPgebAdoVXp5ef7EL/yqf/ta /wDJD/r5j+X82f8AKf8AR+39itF+V/pwvH+k682Vq+h04hh/vz/Kx8DzYntKz9P2/sW3H5W+tJz/ AEnx+FVp6FfsqF/357Y+B5pj2lX8P2/sU/8AlU//AGtf+SH/AF8x/L+af5T/AKP2/sZvp1n9Ts47 bn6np1+OlK1Yt0qfHL4ihTrck+I2oa3oOl63aC01KH17cFyEqRu8Twk7f5MrU8DuNxglEHmyw5pY zcdj+2/0JNH+WXk2OzksxZu1rLKJpImnmZeQWRQBV/hA9dzRabmvWmR8KLkHtDMTd7+4eX6gpv8A lV5IdIkaykKRIkar9YnoRExZCw5/ERUirdtsHgxZDtLN3/YGR6VpdlpWnw2FkhjtYARGpZnIqSx3 Yk9TlkYgCg4eTIZyMjzKvOJjDIIWCTFSI3YclDU2JG1RXCWMavdhR8h68ZGl/TZEjwrbM4RgfRWl EqG6fCK+Pfqcx/CPe7L87jquDrfxQ9v+V9zDLzOoIfhdaemf2lK/ze+DwD3spdogjk3L+WNzJCkf 19AUZmr6Z/aCj+b/ACcfAPeo7RAPJR/5VTc/9XFP+RZ/5qx8A97L+Ux/NRtv+Xd5AbfjqAAioHoj DkA5f+b3w+Ae9rlrwb9KDb8q7tjVtSQk9SY2P/G2DwD3tn8pD+aqW/5X3MMvM6gh+F1p6Z/aUr/N 74+Ae9jLtEEcm5fyxuZIUj+voCjM1fTP7QUfzf5OPgHvUdogHko/8qpuf+rin/Is/wDNWPgHvZfy mP5qLh/Le4jNsfryH0KV/dnejl/5vfD4B72s9oA3tzQn/Kqbn/q4p/yLP/NWDwD3tn8pj+aq2/5X 3MMvM6gh+F1p6Z/aUr/N74+Ae9jLtEEcm5fyxuZIUj+voCjM1fTP7QUfzf5OPgHvUdogHkz/ADJd U7FXYq7FXYq7FXYq7FWnkRBV2CjxJpikC1CTUdPi/vbqFO/xSKP1nBxBkMcjyBUDr+hBWb9IWxCG jUlQ0PhsfbBxjvZeBP8Amn5KT+aPLyOqNqEAZqUBcftCoJ8B7nB4ke9kNNk/mlt/M/l1DQ6lbE9d pVb9ROPiR70DTZP5pTGKaKaMSRMHjboymoNDTJgtRBGxXYodirsVdirsVdirsVdirsVdirsVdirs VdirTMqirEKOlTtitIZtW0pKc72Ba9KyoP45HiHe2DFPuK1dZ0diQt9bsR1AlQ9BXx8MeMd6+DPu PyUpfMWgxAF9QtwGJAIkU7ilehPjjxx72Q0+Q/wlMck0pdqfmHRdMDfXLuON1oDEDykqRUfAtW/D IymBzbseCc+QY3dfmlpSNS2tJpgP2mKxj6PtHKjnDlx7NkeZAULr8x7tDciKyjBgrx5OzV+MJvQL 45E5yzj2eNrPNI7r8yPM01PTeG2p19KMGv8AyMMmQOaTkx7PxjnZQo85a8lnPdT6jKBE8ZLdgCH/ AGVHsO2ATkeqZ6fFHpslWp/mRcfWOH6ZuEHpxmiGVeqK37IHjkjxtcDgHQfJLJfO8E1fV1OaSta8 zM3Xr1GRMJNozYRyr5I6+8xaVz1EtcEkVqSrn/dyj+XHgKI54ADdKP8AEmi/8tH/AAkn/NODw5Nn 5rH3/ejbPzDo5s5yLjpJF+w/8sn+Th4CxOogTzUNX8yaWkjmObnKIYyiFXFW9JSBXj3x8Mo/MwAO ++6Rf4xuP+WZP+COT8INH52Xc+kPJty115bs52UKX9SoHTaVh/DMiA2dXmNyKdZJrSLzRb+bplhH l26gtWVX9YzqGDMzRqvVWpxQyP8A6wUHYnITEujk6aWIX4gJ/B/YgfKGn+e7a/upvMNzBLb3IMvo wyNIFmIjSico04xhYyQoO3LfkSSIwEr3bdVPAYgYwbH3b+fP8bMry1wXYq7FUruvNPl+2f05L6Np KE8Iz6hHEFjXhypsO+QOSI6t8dNkPRJbv8ytHhiDxW88pZmVahFB40JNeRP7XhkDnDkR7PmTuQk1 1+at63+8lhHH7yu0nfwUR9sgc57nIj2bHqVsv5naihs/VW2gW5IFeLk/bKkCreAxGWRYy0eON2Sx +X83tTcnjqUMVeyRoaf8EGwcc2Yw6f8AFqdr+ZWoXFzR9YJ+CVqLxUVEbHoqjpTBc2RhgralK989 XBtIi2syjk8imkrrUUTY0I8cHrZR8EHkPklknm2OQUk1RnHg0rnr8zkeGTaMmIdyOttb05304tdK xNKEkn/dzYeEsTlhvR/FJR+m9J/5ak+/I8BbfzEO9E6drWlG52uUP7uXv/xW2EQLGWeBHNfd61pY s4CblB+8l7/5MePAUDPAHmyvzv8AmcfU1Cx024MP1N0h+GtZWYOS3NRQKabUbp86C+UieXJ1+LFC As7yeaap5vvhd/3MZPpxEk8u8SnxyHhBuGskNqCWX/mO+u4RHQQ0YNyjLA7AinXpvko4wGGTVSkK 5Iy/vbwHU6TybVp8bf7/AE98NBrMzXNJPr99/wAtEv8Awbf1w0GPiS7yj7K7u3sLlXmkZTJFUMxI +zJ4nGgkSJ6oXVf97P8AnlD/AMmlwsCg8UJ5f9dU+n/k+mBmeSR4WCYaf/vDcf8AGWH/AIjJgLKK nqv+9n/PKH/k0uFBQeKH1X5B/wCUSsP+ev8AyefLI8nHyfUyDCweeeYPzk0nQfNGo6RqMCRWmlxr Nc3puEDkPHEVVIWVd/VuYkqzhfi5VoGoqt0H87fLmsaqbSCCQQSyWMFlOHicu+oBmj9RQ9E+FeWz MR0bi5CFV6LirTMqKWYhVUVZjsAB3OKgPDvPX5rzXU8sGnzEWqSGH6spaNmUV5NIab7jp0zGJMj3 B2kIwxD+dP7mJ6Z5wka7p9VA/dy/tntEx8MHhNh1hO1ILXNavZ4YJY5JIFMko9NHYDZY/CmSjANO TNImwaSj9J6l/wAtc3/Ix/65LhHcw8WfefmnFrdXMx0r1pnlpQjmxb/d7+OCl4iRuWPZJrRmlf72 f88pv+TTYpCpqH+8Nv8A8ZZv+Ix4AmSX4WKeWHXS/o/5PvgZjkkeFgjNK/3s/wCeU3/JpsUhU1D/ AHht/wDjLN/xGPAEyeg2/kDTDYXFwp1WWGltO8xjsq8JUJiNDdV+ISfRlnA0eP5I+6/Jn6xL6hi1 RTxRacdP/YQL/wAtftjwL43kg5/yct4JbeKRdVD3UhihHDTzVxG8pH+9e3wxtjwL4vkmc/5SGU3J MGpj6zWvw6ftVw//AC1/5ODgT43kgv8AlSI/33qn/Aaf/wBleHhR4vk3L+VEGm2E8k0eqCHlGzvw sCRSqjYXfcyY8CjNXRVuvyZ+sS+oYtUU8UWnHT/2EC/8tftjwL43ko/8qRH++9U/4DT/APsrx4V8 XyRs/wCUhlNyTBqY+s1r8On7VcP/AMtf+Tg4E+N5IL/lSI/33qn/AAGn/wDZXh4UeL5IiD8nPRhk iEOpn1GRqldP24Bh/wAtf+Xg4FGbyQ+rflJBFDPqFxHqiQ28POUhLBqJDGKmn1vwWuHgXxvJ3/Kk R/vvVP8AgNP/AOyvHhXxfJ615Rggh8tacLcyGCWETx+qFWQLP+9AcKWWo50NCcIFNUjZtN8KFjQQ OWLRqxb7RKg16dfuGKtLb26tyWJFbY1CgGoHEfcu2KqmKpV5rKf4a1NHMiia2kh5QhTIDMpjBQM0 a1Bbuw+eNWkGjbxMflOszRP6mpM11czWqMYLKrTQ+r6lSb7/AIoffI8Dac1pja/kvc283qU1Bvhd aejYD7aFf+W7tXHgXxvJTl/KV7iU6eBqIntlFw/7mxpwuCUX/j98bdsHApzX0W/8qPuf+1j/AMib D/suw8KPF8ldfyte1utOt3XUTL8XpL6Nj8XpsZW3+u7bNg4GXjeSh/yo+5/7WP8AyJsP+y7DwsfF 8la1/Je5t5vUpqDfC609GwH20K/8t3auPAnxvJdP+TV1NBHEV1AemztX0rDfmFH/AC3f5GDgU5r6 If8A5Ufc/wDax/5E2H/Zdh4UeL5I2D8orqE2p4agfq1P91WPxUkL/wDLbt9qmDgZDN5IL/lR9z/2 sf8AkTYf9l2HhY+L5K1r+S9zbzepTUG+F1p6NgPtoV/5bu1ceBPjeSzUvykeLTmmuf0hFb2Ylnlk 9GxaicVLGgvSdgnbBwKc3kzjzEnniBvMSaBpTXEIi01NIgkOnxRSFZKXgt2PJk4wEcPrKMA61UFa K02lnYrTfr3xVg35jr+YLS23+EYp2kSJ3aVRpzRJL6iKtPrZWVXMTSfEtVptSrVVVnK8uI5U5U3p 0rirsVY156/xobTTk8rWtpdSNfQ/pOO8cIn1QEl6VR/2uPIgFgK8QT0VRvk9/Mb+V9MbzLEIde9B BqSK0bD1gKMQYvg360XYYqnGKuxV2KuxVj3ny2803Pl54fLEiR6m00QIlSKSJ4S4E0cnrfCqslas FZvBTiqv5O/xF/h+3/xDzGq85vVEvoep6frP6PP6t+55elxrw2xVOI444o1jjUJGgCoigBVUCgAA 6AYquxV2KuxV2KrZIo5UKSIHQ9VYAg036HFWCaW/5hCTy6lxpcn1U3eoS6vLPJp0dzAjTH6oziAS xPyhlcP6AVi3VhvyVZ7irDNNt/zBfzzPc3ciw+XFe5jETQ23KaFUiNqVljd5vhkebZgNqk0qBirM 8VYN5uP5jxeZYZfL9mL7SjDbiTnJaRGFzcgTmEyI0nI29eXKq0+yOWFWc4FdirsVdirsVdirsVWy RxyxtHIoeNwVdGAKspFCCD1BxVdirsVdirsVdirsVdirsVdirFfzIXzbLolta+VjJFqN1fW0Ut1F w/c25krM786/DwHE0BO+KvL31r/nJu60+0Euhxw3dmY3HpmCMXDwpHL/AKSVujVZWSSMogUfFvxp irJ/MmsfnPp/mS7k8u6CupWd41pEhu5k+rwhIVMzxRiaNgWknIYk0/d961wqkNz+YX506pc3Okaf pNtDqFjbWr6raQRSC5Ek0QknWKeadIECk8B9o71UsQ3FVH6dq/59r5eFre6NH9e06W0jjnQq0l2k DytLJIxud/USGIMBQnm3yCqa3Ou/nidF0q4h0OzXWPXvf0nZfCYTFCeNqOZuSyerXlyUtvTalQQq J8u+YfzkuG1Ftd8u2Vmltp0k1msEhkaa+4q0MYrL9liXVlIWhA+LfZVJbPzZ/wA5EPqq2915UsEs lnijkuFIo0P1j05pF/01iP3ZDqCvj17qoTT/ADB/zkONT1G6/wAMwpBeSRvBa3UqSJBH6SoEj4XK 0IkNZK/aFSONKEqnGna5+bt2PL0+uaLLYyfX5W1S10v0OLWq2iiJJDNNLQNdSHkQw+FfpIVjzX35 5PeadLDaamlvA95PqiSCy/eLLclrWCFeXxKkCrGxJBBYsK8QMKEw0e7/AD9sPLOkK9sNQ1aW6mN8 16kDFYDHEkQcRzW/FfVeR9izbDoNsUou881/n3HqupwQeV7GSwtVdbC5BJNzIrCNH4m6Tgjn95Q7 hfh6gnAr1WH1DEhlp6vEc6Cg5U3oKt+vFV2KuxV2KuxV2KuxV2KuxV2Kv//Z + + + + + + uuid:1C547E781A4ADD119EEFF96D7801BC77 + uuid:c81f585c-6684-f14a-ae05-056a473a74d0 + + uuid:BAD572641149DD119EEFF96D7801BC77 + uuid:B7D572641149DD119EEFF96D7801BC77 + + + + Document + + + 1 + False + False + + 39.000000 + 16.500000 + Picas + + + + + Minion-Italic + Minion + Italic + Type 1 + 001.001 + False + MinioIta; Minion + + + Minion-BoldItalic + Minion + Bold Italic + Type 1 + 001.001 + False + MinioBolIta; Minion + + + Minion-Regular + Minion + Regular + Type 1 + 001.001 + False + MinioReg; Minion + + + + + + Black + Red 2 + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Lime + CMYK + PROCESS + 33.000000 + 0.000000 + 72.999992 + 0.000000 + + + Night Blue + CMYK + PROCESS + 100.000000 + 50.000000 + 0.000000 + 0.000000 + + + Pigeon + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 30.000002 + + + Red + SPOT + 100.000000 + CMYK + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + Red 2 + SPOT + 100.000000 + CMYK + 9.000000 + 82.000000 + 60.000004 + 14.999999 + + + + + + + + + + endstream endobj 314 0 obj <> endobj 316 0 obj <> endobj 300 0 obj <> endobj 302 0 obj <> endobj 304 0 obj <> endobj 306 0 obj <> endobj 308 0 obj <> endobj 310 0 obj <> endobj 312 0 obj <> endobj 313 0 obj <> endobj 398 0 obj <>stream +H‰|•}TS÷Ço„nG…ë]I®æ¦sݺ£UkµSW‚¥ÃQ^ +ΊB€@$„„÷Iä=/!ð¢€! ‚”V¥Âjµø2±žºÓÊ:Êz:ÝvúÄÝý±Û­=;;;÷œ{Ϲ/¿ûý~žïóüXHà*„Åbq£’"ÄEo<,É‘Èr^ŽIÓ¢”B©Däø¢dùÖjž]EÇÒ ëKžÌ£ëÄT»Dk 2d|öPÿ‹šý²ÜB¹$#S)xIô Á+»vmÝä?o„§ÉRÅ‚øB…R|R!ˆÊÉä¹2¹P)NÛ,„K¥‚8ÿW +AœX!–«˜»ß +H¡@)¦‰O +åÙYúÿ[ AXÌl@—äU‰`!XÈ› 1,$> aÌ"«Ä‚|Ͳ­ŠXu' >àq  Aì@vuP@ÐÑ /8xµv¼£P>žíõŠ†0|¹úÇà`ß¼ßâºDÍŸxï>o%b<²•_„/]·>ÿ3oR=œÕÅwdþÖüI·³ñE]ö=}“NE#Ü(ú+æR®Û§çâK0ç;K4t4´67bKœšQD¼ž³’²»E¾|û–tóƨƒ[ÞQš>²P^ œß×NøÜ,½ÏÁOø„>{QoøÁÚ•º_é¹úlÔ'e·Ÿ]±ŒdÂÉJI¾SÊOèRÉ×*ºï¶Q7à; fÃb3·Ùr ¼²·È­VÁùð>µ+.~Ô'ñÕQ9o%fó ¤9út2= ŒdKs×/ÙAΦ¢èLZFô°]fm¶™ÂwÛÞ¶ÅÚ…®Ã¹¨wÕ„ámÆ^µ±ÄRìä–v©=Ê÷T“ŠZö'Ç–xð<õÓŸ6²ñD}öíÿ²þÔxÙÍî½Íz£šË¹lRù¶O•©C‡ ¸Œ/ú +% +”j-©«3Û)|Âh/uÿµª1 _,>­®W4aJEC)¹cÇñ”dê×o¥ÒÈÞž3iCg.;ûø®ž±©/VÏ.z ÝSì*o'½—¯Rt$l""©P!ÃR3óË*É +½­wÌ|§gŽê™ëqtZ0³¥³ÁBÚ:Né,Tu–|ƒ¶ãLj¦`ùn­DcêÐ.bÖâÓ¾W|G|êX¸xë.ª†} ¢C†êŽrRûSyÑn*Ç4T«ë(|zÇ?•FžVTÜŒÖóùç®™§¨W怄gxó'‡ŽóñOi.Ac‰4~"—¯ÕU“Y +Ç= Õñ·z“wuO ÛH›¹@Lqn2ÜvLV«!Ý/é,àðpJ€Àø´À& +™*ïÅÏoßôÿ&£†â**jËÉèYÇPcN¼°‰·Ó#ô ¾;diç_<ç™èõ0( ¶¡Jìå½dïCï•YŠ~|Ž8o¹í¼Äw\r t[1£ÅÖÐFÚ»«*Û(]²œF +sTYò|&LS”iÈ2­ÃEqÄš»ðå$Ëk`#`¾ÕF$'%å‹ÈÄ™óMµ†º&jeö^[áMfŒì3FšÊ¾¸™Gœóþ»ŸÙþòŸißÂÜ[)Ž¦lRítn²·k6µ4šI½“¦†/tBã X/ãkˆ¾‡ÞÙyª¤UÉ2¿‹X…/ÿ,茥jXD&ï?CµÉP{·§ÇH6Õ–gTRø£8Z,¶«\$ÓîÄ“hâHnŠTìÌ™ö ªûÓ(ŽË¤êSý5Äøk[˜SâËþ;¡Ì/¬¨ +´[9Uâ,ò•Œiû-­í»Ñnt7ŒVa5®ñ.^—¼]z41)6–/ËUæÉ2±v?¬ž xØYã©ŽRRûsyÑΧ¬óW0>&¢“SècF}°»š\† æK\ãX³ÝåÂð‹¶èÞƒíéØÛÝùƒ¤Ûk½?Kq–Ÿâ …µ°æCX{žÃ—!¢¨c.;!ÐØ}:ù‡Ån²³Z%ò;O¤KçŒs†Ýåüì˜x1쪾mÏå÷¡ +ýÂ.jË% •º’\*·ä@r|#Ý:‡^µœJ'…ÿa:Òc"›¦Z*ƒÞ¥IÐ$”%p9nÍv5!°B ^C\¹îòœ§®_=·òo)áÚfá±RE +?2-b+ÆÛwf`|x æˆzz]<ÍÊ*Ãjôúš +R’3~¶Î.º,T£ÉXg"û${)N„I\ðM-ã·@:Óº¢Èè2úueé( ½»<^¯IàBH_ƒ§u¡í°Îw ;0g§µÞLš¬§*[(|®¥Ò\k6˜ &c›Ãdmî©hÇ:5rs>™•ô›íG™‰Ðq“ùÕ˜I?”CršÁ ‡çCï>¸·„OÀ'°“˜>>œàâK;2ºûyk_ŸK©¶ññEƒÖRÝiÅð «¹ÕÖÁ;#t&‰Og¤ò¦èR³yѳò±<þ´´¥@Å;™W¤”‰í#~ykYc¦¸¢HQ§ÀÒêoÈFÉÇ>_¢8tSrþ…”ñÐfÄŽ€ž'ªÐ4¦¬%sˆìfò7ûïüé¿ÛnÁ#´ŒÍù+Ôÿ|šùšûu—÷@Ï‹÷ƒ’ü|— Cyÿ ¾ +÷ Œ ÷pø] ̆4« endstream endobj 311 0 obj <> endobj 397 0 obj <>stream +H‰„”XÓÇÇ¿¿!ëÖtåÛXÂY.u¬Óvì¶çjõ¡?P)Jå§" A@"|“ð›@HB!ü + D~"Tt`ukh×ù¡Ó®­Uçtc½/û®c¡îÙþÛî¹»?>w÷¹{½ï}ÇÀ6ø` ƒ³?1⽘¨7ò¢ümû¥éBAÆú@0TÀÕ|hH7üýîêeü ky¥¾€Ô/Žlúž¯ÿú<Õ;¢…Xp"[ÊÛ’±•·=,,ô§ëý›¼ðLÑq>/V!‘òó$¼ýù"qHœ.ågþŒÇ  +y1ë«$¼¾„/–y£ÏÎÀHxé<©8=“Ÿ—.Î割þW&Ì[ر1 ÁÞÆ"°H, +;ˆEc‡°X,‹ÇŽ`G1/+æƒùb›096ÈfüÍç°Ïœoá†ð óx1þ˜™ÎüÐ/Ãï1›³ºMÎÐP¾“©´´š„G3é¥o“pö}Uõ‡>ƹÔ½è‹ÒÛ8¯P‚.èm—PÈCð ‚¡aô¶D:d@~Ô?9ô–7éz³7ºEä ÷!oxë=^sCôz¯½Moìûu3”ušA±–}ÑÚƶ3Ž¡¶‘"S@BvYe< ã™h +ÁÿúpaîQàWño9’"ËÍ +Š ³—àÃýg®Ì;®øØWiÆÖ={`tô¾Cû>`)ýØèi]—F¶ÊîòGqÃÄi„­q*¥Ÿ×ؤúyn:-”oVÆ“B®2[TW]% @L}W¤^Ü\š[ßkøuûÊÔPÏ$ +ÐÍôáNæï©Mí+¶)³‡kèk™jÐwÐÌ*éL•SY#àÖµqÅ›Shc@ “ž¥Zqö#ÕlŠŒúÅY¥Üpí^$„hl‚sTí ­À¶|îâ$$ìd;^”w¢P4õ-žFè@L'Â;ŸVêÈ’†$„zùɆµ“Ÿ’£b“iFpà/‡ä­“ý-ö  gÆ'Î^fÕ3ó‘‚3ÐVYa‡Õ|i°²Eô—äf—²Ò3ÓóJA±Ö52`úÔ} öÍô»Ý6!4X[õ6À6©¦Ñ·£Œ³ (æ–/z‚Øœè¨ÃŠ,IÎ]j¬oÖàC7zë“/Gs§EŽ…Ǥ‡ÒÏ͈†n[Ÿ> ¢•ˆÅiC¾ç/zì¬F“Mo½ª¬ø´4‡l^“ŒJ•£íýg—ªï¾ÿˆ¸OÜd,ÒŸ'Ç‚9ÞÙ}Þe¦:-_‰'ûh~TeSµ‚¾Gó$þ˜E•pNuº<µ°½VÙ!YrAA=,ÒÙKzû¦ê·Çe÷º×­£r~—(%.P;ïpÄE +jsw),;¶R|u`ÐíèieYÛz;°kkŒ°¥ª£ßh!í‚Œ]ïì}?¨XV,—ä±j˜_Sxw£ÎNõ{’“»¡bÒÏS_qLóè×réJ&’ ªÃ ®€únÓ¸uªiÔÔ<<êÜ×uÀ™ÈŠuuª;@Ç€mf²©{•û£Í‹(ü³•¥ªyb… V¥áåeI5 ¼Þâ1BbűܱÔv“õgg¶¹%Õ9<&{+iG°÷8íwð/;rÍ%@#«T{ãE{Swü„UÍìü +ŸjnXóÝäظu1ΧWÌj…WL>V©IQ&p\†©äctp§úÑĹ œ5…™˜I‡)ã”qeqÜE—iªû‹¦aîtb!Î%ÐW•›âµ&uÖâ e±´Ü^·3=ã©óªÍ[|ºX1OŒ¢WlœoÀ"nN{Ðsè¥KÀU‘›BBâÜ!ºOPê%=ße¸ןC>ÿ¿ä£ŽeÇ3ò/¡ú¹|Ï‘_ý¬ÿ²¿¡µkX0‰­­-’Øú`””QoœõGÛPßmbeQ<Ž±³]צ'¤¡ôË¡ôÆ]yEÍ­*xŸJà¨b¥T.+âªÓ„ª@ÁÕKÝ枦>#W@¿{⻪>¬-ßO²¤~HmÅ;ýˆÔÄFACµÙ|™ëD/ãÄ`¹£»ÆfZoŒ]˜b]í½}-p)ùò$Â*uv[Ò$CkÞðE±T G¼?96á;ûwu{yj‰$Ì¡·“ d‚2‘»äj¶ý®ãOÜæaûPÏ kÈÕj0ss•Ö MåfÙ`66Y Vƒ¥®¥ÂÌjÑž´¨èÐ$XÃlþ >eÑ JûjÑçó×>¿ê‹|Tœ{÷îÞ$]F¡°=­÷Tài·ÓÝߣµ´]‹ÅjÑ7ëšY:¾3¤$çI`rZe†<0iR:–4qÂ(fåŠóE¹¦¡¼ Y«S–³J´JEi`®î£Â!ÀÞµþ#®1½W½JbþŸÍÞ¿Ù„^àȤG“¥@]Õ9n†¡Öo{=8ýóÚ¨1„GïÁ÷2E£ +_d GðÝ'Ùm`â‹…±S½¬šÛû)š¸q=rÆk½JJLD13èçÃ1‡ÉLæZIœ¤ƒð± áy@S®7TBCe¥Ud'e…0¿Ö)õ€ñi¾†ã4ŸhnuÏxÿ+¨-±ã‚l¡¢•œïUÃ4ôý6—ÃÙÞÍíwu··³©ªÌkÕãZ½¡ÆZ;ÛÜ]òîÜÌŒc4+ Jfñ+råP(<’›ÙvÕ,å/ï“ûG‰Ó†8QÙâ2!H ë² + qýé´þ„EœVYq⺲DVAR\×"e ‚qŽÿy{~ap}u€t€lŸ½¨¡«Ã£¸Šª–œ‹š3ûûû +kh§i«Ž¥‘™—‰ž…sÚÈy´²¨¬ð¯|šùšû{—÷FÏ—÷ƒ’ü|— Cyÿ ¬ +Ù ÷zø  Ñy=Ü endstream endobj 309 0 obj <> endobj 396 0 obj <>stream +H‰|[HSqÇÏqîRêDçll´s’t^{H„2s`^Ód`¤M=êt:=›–)©sV^ò^Šó6'™š%¨£,Œ´ ôÅŠL(±ž|ûûKµ½ôÐïáûð»|¾ßŽyz`8Ž&ª” ÉŠM¹FWžAUiÕ´{B²2œ•x¢¨ýÇ—;÷8†õ,øÀ_(ö{|âïÞaâu5´¦¨Ø@žÊ!£cc£ÂÜzšŒ+ÐåQdfÞ@•éÉÄò|]¡£Õª ‚$ã´Z2Ã}¥'3(=EW»º=©& ´º€*SÓ¥¤®ð$ÌU¾˜æ`˜ã»^Â8X¦Ål¸ïÂ7Ha(>ø*xqÀ›OÙ¬3*Ç5%•tq¡Mÿ2“ìçI|z˜˜,âp=D„"¿íYQ$"¡G‘ûÓ…©£àe¤„0P,ƒ‚!XJ¤ „-cìÌÈòu¨-ðØU±ówôî=s‘ôð> endobj 395 0 obj <>stream +H‰|”}TS÷Ço„nçŒ3×Û’\½7gÎ3wlÕv¶§º:-J"¯Q&HH ‰$$!ð^Þ ä Þ +QZµ¾uzÄÚÕu²²®³;=þâîþØEwvzöG<¿sîýÝç~?ßçy~ (t Ä`08QüÈ÷㣷ÇHs¤Šœ7"rQ”F — +W_n âŒàÆPÃ×Pq”yShÑóx3ÙëÖáz`Ü0± ¹Î^=h8¤P¨¤Y o›ð¼7÷ìÙõúj|‹wP¤Èó +Ôñ5/*G¨P)*F,ÚÁã”Ëyñ«_©yñbµX¥¥Ÿ¾“ªyžF%‰ÏT2ž"ó‡2Aôb@?…¶@o@¿„" Hè(ô ÅBÇ¡(J‚øÐZ…@9ŒFÊšWÖ …°C…Ƈþ n€¿aª˜;6ÂbŠºAs9Hè’çdXyt2-ƒI–‚¦¢eN8¤‡éÈ/§¦ÿÝ̳¨ò¸‘c’Á@OŸR›ÓšjZ|—8ž@ç…¶~ez(–õ´©L\ÉQVÁ5ÁDÌ̦$0µÉ™u`| ”NÈÙÁ@RkA8º\ý*ð2?}Ôì¿B.œ›üðw%b"²…hC—n¹žLü;­Îî$¼’“ŽÃ8åf¢‹FÙCS“QKAœ(êkz+50qÐ%0<‡™ÛÌ-–F¤Ñê¬oÇ/Ϊ#ÞãÇn!åÌ.!†.ßû½|Çö¨#;«±ßt’ã@ +³»n2xwa +†€µÏ Ì$[4Y¿—¼Üø+Ó*pPÎtŸ[qŽdYÃÕ©ižѨN3ðwʺ´’·Á3€ÖE Ç2H§Õ”÷èuZpaŒ¿à•š”k°¨œãÉ2"_žcÊÄs™™Öì´˜9«š½ø˜è(II(ÖÍô;*dÝÛžÔçøcú• Ôä¯ G[m=:[‘³ÐÇ)îÔj>ÔN«oWx‘¿zïß\â‚×(¤‚ÊÆD“M²{ÿ‡sð§ë·ßb²Òª9¬gvmp÷Å{°¬EƒÆò5Yº +ÜXïð4’è¤À= ¬ëŸ•áèba­®AÝ„4jÔæbüí·ÓÒSÉßÏ  Ü}gECgg†}½„¿;p±i`êß÷úKݸïÉøÕ9’Š¯cj¡\ V ’¼’r¼ÌÔÞpÜïž'»ç»½NÄáì0;ñö¶*£“¬ÎVm©ÈGXNÃðÕ4c¬Û\±T>?Oˆ'Ì^hª³Ö7‘+`ÿ'+Ü鬑CÄÊeÄÁ8ÁÖ\jíœ.Ùþ¯ ºéf1GO¹8^¾E@ºAØùéž6Äbontà¬)ªr:øt¢JçÓ±U‚0)x½”`7¦Vz¯Ouu7†ÚÅ©[Ó¢ÓIÔ’:‚u˜üÅ:$Û¦ÒrÓ’óãQž¹Qÿù™<faèu½QjÜoDܹ]„§Æê²RÉ$:>™{8~§„HSä•Ôêj :4Þ]Ø&9–’Äø*{iìk.eÌðf‰¬6]«k³455hóïLGw×Ù¾á™Ú{Hk«ÒEXë»û[‡F8,]Q‘Ž–Ïe/vÀ(lF—ѧß°Þ'ã×È¢>X«ü·¾M$ºü1p³ÎÊa!žzèT|,Ùª€=]£Ý6¼©®4«œDŸÆS&øH¡GëÇéaÞGc'”ér±/odr`xt@×'"YŸÛµ½Z@}bû:6ØIxQPö¦É+(+ÃË*¬í¥d‘O?ªèEŠ>g‹Ûé±ylƒæ±J¤£Æ?ÑÉíT¹å)Éü¸8B¡Ôä*$H ³lî\?à"çlUmÅxÅÏUúwÉœñ°¡z“ØHŠ¨SB*5:e3…fg“ß:å¸Â±,¿AgÚ£{Ž¸3‘¤®þ¼|pÜõèÉ?{álëo€1à'è2ˆhÅê™Ö«>jëCþ0ýx± ï¨Ö +WÑ“©"½ƒF§Í»z}Õ¼|õªy•/‡cù#P ÿÅ#lUâc‘’T½ŸšAkwÍÃsΪ¡L\ñ?SGºí¸…6µ‚Ì¢ö ‰%‰Ö†© 2Å€ àØ ØïnùG/·æί|É]Jüd‡àT±:ˆEì¢Â¹ξlóXµ)bd— 5&SM.Í™xv][ô;ÉF»­ÞŽôJ÷“¬<»ü ¼gu47 +`Ô 2ƒ'0aä÷tÙVueI)µ·4Á`Hä€ ½æÑ–»­·9h¿k¡sØ×ø:\ Üîª*o&ÑùærGÃê°Úm­^»ËÒ]æF: *GžÍ?¶;…¬a¶}Jÿ*`7 åà¬à 0Bcؾx¸„N‚ÏÀ»Ø¥´áD?!oËêêãö{]½½~®@­Îê‚Nº-ímܳ_|º0+ƒHI7fȸÑ×T\â’¼9_Ë=“«×(Äž)QÚRÒ˜o(,Ó«ëÕˆ¨á¶b ÿö韖HÖ^ºâÄTúû.}¿€QðVm†sÕ©’ÜPí´’W€{Å28S¯0Á¦bŒÞ¡Ö¾§? Ç1ÏdÛJà»ÌT#LAy>É(>ûô³Q?ɺü²º‚'©PŠþ$0ôÎûëãÏ‘+wÝýÜsZ¯L¦ÈQ×Fg~m.Q+ÑŠ¤|¥¨T/?MwÈœá»ê9âfué˜Oÿõ1¾€t©á÷<Ãÿ••sj–9–û-Ž9|šùšûu—÷@Ï‹÷ƒ’ü|— Cyÿ ¾ +÷ Œ ÷pø* À O endstream endobj 305 0 obj <> endobj 394 0 obj <>stream +H‰|”{LSWÇï¥ôÞ;uU©ñÖõ^uÁi)  ":–H†¨(0ñAxTäÍÚ¢ `‘G°…-B¤@yû:Á > 8Ÿdb êÔE£Ì˜ü®;ìѺìßå$¿?Îù_Î÷óýýŽ9:`8Ž;E®Ý(Û”˜–˜ž&U$d¦Ä(í'‹x λ8¢EHÿÇó…_`XMßç°c6dÎí](lt²'iüÓ3²•‰ {ÔÜWq˸>>žnö¸’[Ÿ«à²UjEªŠ J‹KWf¤+cÔŠxwŽ[—’Â…Úo©¸P…J¡ÜkÛý÷\¢Š‹áÔʘxEjŒ2™Kßý•0 ·-l®#6à [Œc^ˆaa&²éØ Áañ¼ÓažC–à JðÔñG3'âDš.þI~z4“(j å*ðØðøíU ò@,bUÈÃåÿrDn‘(¹"×n €@p×HD2VTná»›öá Á_¥GJ…ÍeÚfÚ ÓjWKÕÐd!W´•Wþ,¹93däJT>ÂW ã0ú@À/u6õ0Y•U.¡ê¼²H Š @ +ráä뾛Ϙ)ßk^!;•ÉiÒðµæáéŽîÁ’Gç"Vɼ¶²Û¶Fl ßB Eš 0Øœ ÿQì¸ø,×У5 +Á£a·eÕ¬ŽOY-íGëŽP棥™¹~Ñ3rWfjº4vC£­r“µï²äâ™”-ÁÁ +„G³µÐp´½¦K"~uûF2ÂÃúˆ­a)íf5{°:ÿpAq~aQ~I¾6_¯1PY'³­÷ñ2’®û ÐPåEüGÂh!×~"a“&ãeѤ IÝÐr¥®7ÒÃﯽ»1EéÐ a³îõƒ~Þû4ã~ÍGg:¦(J£È£¾T rDJy>w˜óx +f¾ ˜@Xæ¾â‚,iPRpÏn_ëZÐÓ`57Pè›é×´OÔK˜Õ}¸­²‰­o9UÛ#yi]½* Ë{+2ì…ÚË0Ü…[CÎSÁÍ\ºs°¦ù ’+ommáÏÀB Ð\äì‡(÷Å·|o2WÔ6KG¬‰hõÒåhyÒXÿ¡§,ˆñÞ_¦<”ÍæîUäí‘xGÝyu¥erœÁUu?g^L€ŸÝxÐZˆM•ª’'âñ@¨‹ºÅNwìYYX¼¡h’,dª~WEÁóЂº3mcÆ6 +¢‰ÿNß*•1¥$wIr‰Ë¾’ÖÏP™­'D +?ÃPÕéN÷<üøƒõ£”V“Š E‡N¡iá…EÞv[ö“÷®;úÙ¡§.üÂLù\ò<"µu ¾vüì3æBöéÄ©%)¶Ö_²l3ݨ¯0è¤úê:ý Ìhý6Ägû.»‘J£ÅÞ?܆ðE1Þ¬_ÙË-ÒH4Û¦äÅ üt와ÄV¼åÿ¤o?+Ê:ÊÖç˜ÒÛ[õ.Ú!íhÙ*ÈÊÑ/™v'2ê,¹lQú]qpÉfª•¨ý±¶ÃTG™ëÛ<—ôM§vr»‚sr™¡° +pF4®¹;{aÖI¼÷.D=ð³ßÑ q©š$‰¿|–éY˜SsŒuzª¡B¯;ÆÜÚpÇÍ’#!buÏ Äí#c—¥¨¢é»Õ?— ß—Q¢ÍcE]6ï¿]w×éý˜xDÜ Ap‰hk3·HLš:V> endobj 393 0 obj <>stream +H‰„•{TWÇ q¤mzÊ4]Élsã.§[×ÇjÝ]WZkEQ%¨øL B $!!yAä’ð’‰ $&BÁÇj­um냗«u]»zZíñœ:¶î=í»gΙ?îÜùÝû™ïçþ†L + "‘ÉdzÌžèñ±‹·eædææ,s²3S"üÙ¿ DñzðªïÎŽRÞ%‘ ž7`ò›0ë-Ïo_ ÌSlÈÈ„™‡Ä¬÷S±V¬^½|Iàþk}Z.—ÇbËDb_ÄŠÉIÍ +r…1/m‹µ>;›xKÄŠç‰xB 1úr¬L‹Ã 9i<>G˜ÅÊMÿ_•H$2q‘>FH±;„ôAE +"“œä¥äÒ ­A'ƒ£BÞ  ¬ |IeR¿›W2ï>R‚ü8Ÿ?ÿ\(;tˆF;£¸š$ñÿÙ'—†œ†k'ÑlØ7H߯jQÖc¦éþá³5+[)ùüŒ<5¦®ltÕ€HµCŠõéÑêʪ*@³«¥Gª +±ØyI{@,ûNŽ`ü¥Gjm:ÛÕhfô"•Ô(£w7ÕšAO!ÏCЮ¬t®(á¤qøEX¦ÝÓ­¿Þq8¯tut˜4[WßTmÂhýŠSðçqÈiöJÉçov݃ó'ƒïÍú0õD•6E =ÏP'— j%á¼úÓE¬{¬Ñ{ܹð ‡o2ÆÄ]‡8KR­b£NŸ(¶š +³S":² ?wÐMßì=ýH¯ëÂXfo*JÀ_ÛŒ¿µTE!–$pN7ZŒâ¼ømr˜w +í…0„.ÎÝ›ÂÆ ú/\k½éî6‡µkwŠÌ½f,n¨n0 hoS]ÉÄ°ðm1±‡Ò¹Ìèmé ?b¬<•ø÷¾=×®0i×—9ÿ*O©ÊÂ0÷4Ü>Ñ{ÍU‡ä(õDeMQfã+)Äpµ¸à¸‹‹<˜‘ +¶ìØûû…ŒÕî\GÛHO}sÈ=púôçHU„#”èâ¹gú‡‡ÁËÅjLSYçÒï†;OÁxÄVSiV`š(Ñ‘uíQâqϦç+¾Ó—ÎóÀ1Òá°6 S›Î9Ûµj3Ð$Š–I²<áa±áp3r$«‡?yɾ ;>4z\l¢,Û¢üb¤¦²¡BuÀ5Ÿ=`xw'Œd¦0×Çs"–3ðÐ+¹îî™ú§O˜¸"ôf|fØeFjô¦êzÌÒ©Hßu𠸀†€çIf‘¨$ÿÑï ¾î¤ òªT”ª|…bM&ÀãÄ1…ˆV«*ScŠƒN:U‰V‹hÔêb%CêP™[Î4ö1»}=PRëÓûÌ0è©qÕAÁC©p›Ó>Þ‡9í +‰Ô–Ô7ê}m}S#£µB`ÍÄvnÏÜËiòÖG"49~Ô ùÿo|êîRiXÎtÕí–z.Å}^‚ ¨§{Œ½ÍNf·ÅfnÇFZ¹ñK¶mMÎÈéº +Я”ƒÏSè±[,—úº}7;€¾ÔVÔU€ +:søŒýÑ¢]Ì;³L:Qç[šÁ{¹y;[=©çåÌÙEŠB†Ò$í’2ѯ•xH;)‰±ñ›Ã“Wà_½ßŸä{£½LŽ=®³Qa¬Ö5ô^ÔÅ6ŸÅaEœv÷à?͚ͥ&¦¡¢¦ÂP —£Z*;šN¸ŽÖ- &æ«ùÚµZ„Ø I–g`´ ƒÄ.—Âü€œðã©‘ ÕMt¾a¢ëÆì0H߉ ·Ç]0†Ž`eYIJ€&àÊn…Nhà û†æìË Ø§ªªsÕtøS¨¥üÇ’a,”ò2 °…›’Ö­@ŽQgüLŠ½æqB5DG¢€ltžkÎÿeϪU‰ŠÄp¾œØS²®ø.ìêTÙݭчè¨$ôNŠWÔÛt}øì ¸ u'˜xåöNP'¥XmgÚë0ýq 8QO6ã.Ê~…IÑ„9ßr¹z?Ý_H?amw•ƒÖr¹%K—f +*A~…¹ÐÑlŠK\‰?üÚ\' +ƒëï¢EèÿÃ;ta¾L-Ç”*£­äõ¥<+¸Ð}²£ÅÑ„Ô7·T›1smù±ZÐXjé21ê”æÌÔ6lÚÊ,HE|ù[ô«¦¤Ú(:²ÈξBæãïeáÊÄ—+÷(w+'ÚTÚôõc¯¾ÁíµonÛf߃°Û­* fé6]$Éfƒdvq O~z£ïŸÁP_§‹ûx +¬¤¼ÎZ ̓X«<ðycIJÈ_×ZøÜHY[Ø(nÅÌ.Œú >› > þn®¿ñlªôú õÏŠ çóÓ‰$K*ç’|Ö2m™jþ +ùÞ~(fa™Z +R$köEFd­w(,YÆBL-9ª"Æó7%Gþ)£ZÿMk¨ +äòÉvB »Ýc'r)“¹ððÕE[ÔIòÝáíº1 ªm ë‚!>ŠÙ奩A¾Zž O(NŸl×Ùþep‡;!é#˜³4+‰ø'ù· ,Ö ísž´G¯<ƒ¬É§“Ú[¨¾Px®>á;¡p(|{k×Î)Ü¿/¡ì–W‹s^6ÐÞ¯àÞ–é–—à‡ @ÕKp麽ûÿ€é¿ÒŠ^ÿÛ½äÓS0g*ùãéy\…ˆ ¢¹QËpccך‡§/wº}ÌÏ/z~¸Ï˜I_ÅÄ×á:|ÿƤ«Ymh¬6büµ gÊ)FÊ4òRÆ_¼hçqÍ R„’ô⍒ä;¼J‰±/l\ +3ÿ¥²ì_šˆã8î’›WÉç”íàNñ0"ê1²'„ÌÂØ–ù8ŸÝmkj»m7]«sºs·çÖSWÓ-e Yˆj†eR¤¦QùKÔwqû-øüŸ‡×ûó†@Y4MDûú)/òlÏdS3Ù”¬•ËC`ߢR‘nÔáµJl(®&ÆJ­¸fí÷hq%{²¬ë¿V…xôPôˆÈxQ›Câ°0"ÅY!{T†4Xƒó.ÎÔ¦ ÛoûëÕ©ÿÓnÞ=L!.gK¡tåøM'2ìõ ` ‘™¥ÉœOԱɱD÷!®O»8u»8c‰¾¶!_@Ç‚™2ÁaN²ÑÂÛM8¿?}ÓHF5ýª ®¤P“PIJ•…h}‰B^u‹ ËWóOóüº­5¬A*Ο“_Å-4éó8w{mQf-¥Ù íÜïméþƒv³ÍNpºwÉÉ$ý·Å™€zOhSw÷Žì[Ûš’£Ù¢ ƒ¿™E endstream endobj 301 0 obj <> endobj 392 0 obj <>stream +H‰|”}PgÇ7À†­žñ`Ù+Éj6=Ïž7Zµ¾tªwŽŠ/”Sª‚"Ú‚„ðHš„^^ o $€„×€" òâ»õ½Ú1ÖÃNGzG¹Þ½›ë/výã6 ×—¹»Ù™Ý™gwŸçó}yâ烰X,nØÁ;"v/KÅ2é[!2IB˜R(‹¼/—zH–'ÈOû z]¶È/ûù8ºĂ Zú€þEóîz?Ôn“¥gÉÅÉ)JÁ2ÑïooØ°z…÷¾F°5AŸ(ˆÌR(?R¤"™<]&*V +[%A„÷/… "Q‘(W1£s ±B (å„Ąò4,éÿÍ„ ,æB– È[ò6‚¬EÙÁBÞóAÂ}‘H$A‚½ˆâ‹T#c¥úûŒøfø>ös¢ëÐSlû¢ÿ(¶ »ñÿµ³ÎW†~è= 9ýižp èùŒOý +œìOŸT¹®Pã§.=áM‡ôï¬æ—úã“wlÏúÿÊTw¥žä;SY¶“t wëÒë+t*á†Ñß0Ý=Ÿ„1Ïi¢¬¶¬ÚXŽ•›¬%rè¢"ä÷,¡$ìO=| Y¹<,tÕJóm+Õ b”c4 xîw°ôž_˜ÿœOèÓÜzÓæÎÓý^ÏÕ§¡ »¦ëô´µ;Ù¬ˆQŠ3Ô˜R~DO¾“ÛðÈNÝ…ï걘ÜF®±å\7tÀÑ!™U*õª„[žÛ^8‹±«`àN’ºÅ[ÖîýíJ¹ºÂ¨¡òŽŸd£Uµ†’Z +WÿË ¯ón§6ò›cÃM‘$]ÈקÝÿNM#¹ºm³pp‰mìXmÔ›.çŸyÍG;Ô*8× ½³bàâ‡=bO1&Ý•ÆÏ”HõIäÇì!(cˆ¬Æ2®×.'9~6á=ŠN¡eDÛeÉO³PøFÇǾz¡+¼-üô®â`Ü^Ù¬®Ì¶kä?©îQ^R *îæ;±¿8?»=Ƀ×i¬•Føt%Ò§=ü™•[çh{Úͯh5f•gÝFØ À…ù¸Û“(‘©LV瓺K}9…ÔÚ þ ÿ((ÆÝÇN¨KX¹RQvœ\¿>6.†Úµ7žFVñ6Jè<5ÜÕØÂw5õ µõb¥ì£ï ›Ž¹rjÈÆg½WoPôNXA(D¡B†Å§dhòÈ\½£¹ÏòYÓÕ4Ö䬳bk]™•tÔê¬TQª|I~&Æ)e ש!©­Oxpx8Ù@àO=ùÀ&2)*[å…Ä3‚všŠjsÈüßÈn¤¤½þ}¢Ž’Ño¢øÓ²Ü\C¹{}jl4ºçÈ+xïö{Ú/tZkøÃgzš{îÌ5èŽìúœf²ùYïµëýíâœõaã¾óŠ³­Á†UZev²¾¡ ÏNébä4’%U¥fÊ3˜0A¡Ñ’š|§‹â´àëAV,„å€ùz@0sð`†ˆŒÊºx®Â`*© ¦Ûaó­iÞ`r÷¶?Åó·î.]É£çß“^¾ð¥ãïßð™}z‘°4ç%Fã–©ð?3Ø\‹ÍUå’³•.ôÌôªÕrÀD0(`Óè4> +é°ŽP¤;GÏ7À‚›ŽÄ˜¥±»ã(Üuˆ%êô®ãíj¬ïãZ¹Š•! «¿Ñã:3\LJ/<É>zT'ÖmÖa5J‰9ŒÙ£NŽ¡Q¼í}q÷4üXY†æ„úDVÒ©Áðñe)ï>À ù:uÒ ›Î‚ÏHü°à"?¹Vm7ó*å|¼êžs¸®©áTk×ð‰‡˜½ØV`ã›JšÊÛìÝ\Ž‘ 9A "oÄ° +ˆØ ø÷°ÆN”°WÁÏÔŠM L¸Éú"•(Â_¢³ÑÐl‡ÊE¶0ýºNe·¢L¼Í-›mî÷—¡pÄÛÓÉ,¥.SL¥fE&ìÛ‚³xÿ^’µ/>ÈÎ=”ÍåÐê9¤yÀ ‡ÀH hãSøÌ·Z‚Yðú¸wA•,ååV© ð©OÀŠ^´t‰È˜mFì¡ì2´¾¡§©’¬0ä$3È3´ =VÏ 3G&ñ|7'IlÌèhïêiW·&Pš±â9åõagj>ƒO=}Ž½ì9D|æÍv4TSûƒî¯îLÃ0«{ +Xž ?ÑÇ6FLà„17ˆéc,¸ A^ƒa›0yí­lÅðÏ'†Ÿ¸¤£P’UH%ѵ‘šHí~.´˜®6y?áN ýÉÝLÖÌ%0õ2vïN¹::›svèÉ‚³† ^†ôÏõ"»Œ<š¡Ë–RÒì]q{7—[¯¡uñö,RŌ˨ôì1‘!L2¶1ô†­ 3‰ŒÝñ»›Ì¤‘10ŸJ¦7h÷kö3HœÆÙtfåÜ„ pø%#;ÄÛ•Wb&¿p7us¤3³¤Çê^z6úCW +æN¹©W¤³]ÉNÿ)‘µ!†ü/"/—“¤=ïÁγú ¶@€/Dj‰kw\=ç¨;7ÎLÉ›Ük¥ðÃãŠ8þ΄Õt0oË©5€ñaŒ¥ô¢Hš•ªÁŠõúâ\R,í «¯»]VªÜ\Yb&Û[Ä›™füÚ¬‚¯|çÍ·B’'šíüX¥,UG‰é9‘Ú—é•õTß·ßåâm¶ñ“]mXc­ÔBšm…yU>V•g1XL“¹Òî4ÛŒM¹5XVnÉ S¾¿î0UÌ®ý”YªÏ¬ï”’z»ö&ô‚_øxࣧ'ñøÞ%Fb»ö»ø’Úä†V^›ÓÖÒâRª|ÜmÊ·ÕÙ0|Àf©vÔòþ V©þ¬a£We_{gbZ`„bkLÅrµq½l–xvmqztoeŸ°i€—~x{zsŒsdÏo³ñðâäû]”vø¹`¶Ñ÷ °÷²÷ˆŽqs]h~ˆ™«’Â÷›ê‘«³û «÷}™Ðû > endobj 400 0 obj <>stream +H‰„”{TSGÇoˆ7ÜzlÜ%^KrÛÜÔõ´Öî9]e},EQðADPÞ^ É%‘€ŠŠ +§ÚíRíÃz(®ö±®µ»Úåì\vÚu/ºg÷¿Ý3ó›?~3ó›ßç;¿²Ê a±XxXlèžÈoçŠ%¹~aTr¶8ueb#M°hßUê5^„Uÿ¸¿|} AjF^Ç×Í/G^}Éã³²N"‘ÊÄ'OQ¢M©o‰·m xge|Wœ&IIEÊ©ô¹(,7U"“JdÉTzÚ‘(8;[¹²K.ŠL—§ËŒ÷E"±\”,¢dÉié9ɲ,‘$ãEBÓ—XÈ/¼ e!árA±‘(/ä(‚CœAE¼6²ÉELÈÖë,·—·—‹½–=¼J‹ú¢>Çâí凭Â,\®q9^Éúá›.ÇãpKÈfø^& = ãÆ`ð®mòÝ~; ÄôÝ} d¼Ö|½Ø×Ø h9 Ÿ > dÂÝ™0d+ôƒkvÛ +|Á–/ƒ÷ú@è ˆKqÐûKŒ½ì§déh_öäq,,Ç£¸ðs<Ê}¤öÐô°ÎÏŽy6HnÂ7[? »HÆ®ÿï‰GèI)ÉX,ô÷#€7ýOnz†Â Œw“¤îŒû­ ¼ÑM‚Í=Jð>ô#¸*Úé¡Ö+JÖ]0ÊïÓásemåUÆ’“ü­?…h¢Æ@ßD¡ ci´«Sü%úÜŠý…á*>ü­¢]§Xæ¶û€èaÞ@–…¸‘úº¬ž’×ùÉ0[¹AuD“ÍW’G—š(_``â„[d®Ê!~eõZËÒ%Pç[ÉáIÁíŸ<¨›ó%ýjËRý”£—ïì÷ÔMUYÚ}¡c¢fLnU™˜_–­.Øm¾ex“n@¹õ4øy”56"ï²ÁÀÅ#Äfáš[Wª+]f+ù}7Øñ‡ï£™ýqIRñ apdòÆ\=#î_¬}úDUÛûâåÞF¬Ú^o©%Z{ÔG’’ ™BrE0O±Œ Ãk3íaNáÒ¼*-ºÈQªw@)Œ Â +Š0ƒA[ª#Ô5V©¶jK L¯ÓkÊNmcóņ«ãÂþ± G€Â6fk^O¾m(\Í=îéqÂãV+ÚH[‰³ÂaÇì¶Ú†:A‹YÚ&&M&ÓòvaÜ 5 +ú¸þÅçæBéýýyyO€†af¦Ju„Þ\Ûa%yont¸Æ9 %¨_'D&J´­ãb—“°WèÓu$ïÉ>Ø‹S׫ÏãÙÞ^’÷M]„Ÿmëê-'[ÊU­"C)–V’ùæÆ¢N‚{GýûÍÿ”)ÁQ¥¾Ï;ûDÿö.Ë/Ô©ÖÑq†Ì?±Tp½ »¹³«mj¶4¶ò2Ygjí«85âÔí!{÷ JyVÆù3ŠvT›5„vüôN²pÒ»·ÒpBGæÀ7² ¿hb51긹.ßÊû…Ú©šQ»kxÔ½¯ý ;‹êjÓ¶­ýõ3$—~“Q†üØl˜Áw–L³¼%½LýˆççdP:¢¤ÒÙk#yKÍ_µ.4ÝÆþê>å8ChŠJuJò„bG|ÐF&–{èw­YŽ"B§0jþÞãAob¥œ¶?¡S®ª1w'DE¯ˆév¸1K 1Óá¶3áºDU ®Ë:Õ ¼lÍü©>° +àW wY^šŽLƒÛTѪèâhþ|—}ªãÛšaþ´`¿BxLY‰j’G‚z4¦Ø*su‹ç/O’\ð‚§‚Q[4ÿtÞ0˯Õãÿ>ãÝžî«Áº+D—!+QCòΆ%hŒÊ"ï|á2©iAósÓÿK>ÚüUó òL†Pû‚\¹ëèÖÿO˜ñBî¬zˆ^7Ä:·rØà‰ç¥¨å)dhÊï¶@‘`Oߎ‡ç>î~rcäÇo‹'¦#„»à6Ý™ïu -5uq¹'}'Y ×ï…«“‹±R½Ê¤%¢¨wlÔ?C6jgÏæ5Èø`T£ ßó9ü€g‘72hnkk1·ÓT|%®ßž“ïjP“é\k“©(¥"Ÿ¯MÊVgêÄ…| Õíè¬ñØøb¸ûäó®Ó—„i0ÊhkÑ6oÞñØjqU©Ãq•ï¯ ¼’掲zb¦á³ñKSØõ›=‹7 W%Ï6iO ¹ù5 +ðì Ÿ±Aƒ/ KˆŠyþ¾ÚǺÁÊ +c5d& ÔÄhbT±ü…®ªáúOZໆ;°Á®«ƒp¸Lzi/q˜V‡­Æi­µ:+ê ¬NÚ™O䈈'Ë8®Ð)§y€"¸QêI/²fo|} ¼Ôøƒ÷ïhºŽ’Ù-I=gCÝîî¾ÎBEƒÐªwšëœµN‹ËìÂZÍéîL"1!'_N&$S•‚øIj> endobj 399 0 obj <>stream +H‰bd`ab`ddó ws òÑöÍÌËÌÏÓ JM/ÍI,É(üfü!Áò[ñw߯'?°Ê20LÙÅû=šÿ{ªà¦'„@jêó *‹2Ó3J4’5 -- t@¤‘‚cJ~RªBpeqIjn±‚g^r~QA~QbIjŠž‚‚cNŽBHW±BPjqjQPâ…Ìb…D…’¢Ä”ÔÜÄ¢l…ü4|&1002ð3022ˆ22°ýÃÀÌ Äð”á c°ŸVýw^Æß¹™¿óÔ‹®]ºxúÂ%™Y…EiK‹×ÈóÕ¯üñ`%ãú‡ßë2o™+ª[ü]ÿ»üwùÅßõ_¾Xü[ÿ·üoùâßúzò?þ±üÖ ÿíö[í·Úþßnßu¾kïÿîö]í»Zøw·ßÚò|Ý‹~lX°¿œñ{êMæïl?Nˆ^èd]ØÕß–.õlj=¸­Í°U®äû‚Eì†Û&–ú±Ý¯Ô¿*¼Ž¨ñ»î®Ú@+o0/úî"ú}’)LÃÔEìÖ` _ïÒþ¡Ï®ý[Nç·²öo5ŽÓóE:õþÌŽÞßGØøê÷~?wô»êÆïn3gÿÉ"šý{넹gm‘þαßSÏ<ÖÅ< kÙ¼ùÆÉ =M­ Í- í@Ø[?µ‰£bþÚÊ­Òg{Î/=°“ãؾeGÎJÝ÷}ö["?®¾&InÉwÖï-l3/°òÕÌú)7ëwõÂï6sÏw³}ožô§f:»ÜçJñÿ<œ¹nrÿ(ùþT ÀÀYF endstream endobj 283 0 obj <>stream +H‰¬WYoãF~ׯà¾5Cš‡xh1˜ s%»H‚Ùµ€ZiC3©Z¡òÓó:OKêkþ˜~ Ó WjÇCM'+äKFáKèT´œMc%ˆÒR5=lG•QÁŒÌŠxž• âr=S?…Ë_}íïDîQToÆŸv{vpgÉâê¹ñ`¦†àÑãÈ®¯•FáWaT B¹jVºt‘ŠðH0a\æE¥q†Ý©c Ky Z³3Öu­vôÿFM¥~ Á$Œµ¢TÞ:ö4<ï@oäèkY ¦Í O©:Šœ0C¨vÎ…¹Ý€@ö|´=!tçfІ¤Üã)ó¹E8´´ —@ƒ¯ãpêð‰Ì Ó(pz°¨A»\ÉI…H,bV¡/!-,3íƒH—O÷q[©=€íÞ÷/Eô×á5cü¢°C6Ýòïh³ÑŽ¸Úmä\èxÎs³Üð"3­Æ÷ã¾QØÔc¼GQȳö"€÷ˆ¯o—á¢$“Bωw`ùdÛ~ƒZö;N¯8£yá^û ŽC2!ŸÏ÷ÚØÀ¥:jõ; Š!Èò8oXµÓøŸyÔÌn‘\ìøEÒ£PÞå¤0G¤Ü¬5G—[àåÔSJ¥~÷á‚á²gÂEÍÓJðHò·½]r5ïyÉŽ DV¬/ßF—1Š£kµÄó2õŠçjo3Ã8ÍIÔ-òE¢Ç‘÷­‰RêË.¯ÏŽc˜}õÖ¯Ï8ßà`c¬„Ýæœu<É1Jª„k”OC5UL?(ª €&q¹î4Óf3ª8/± „^Ÿy¥‡«cj+4ŽÚs’_epÂkU™!?ÿ!ž`ÉOÑPK€ VT`ü£Ù9)lO yb”TžhZ)ºÚ8ˆ´Iäeê{6ÀÉ Gt ³ æ1q½îÈ Á±…Jh¼Ô%)¶¸{¢=¼0½GL} €Ç q>ÐDp—f¿pxÜ!¿"¯82Éì©8gìqÔËÚ7‰}âDI\\ò¾LxãÀÏ+©|¥*Nãy*ÕöÚÚp‚,„†ÿ¬Q³Þ•ÒC.™– IE§ôà¾Å6Â&è §ðÄnKâ²,ÿBí?ü)µ<2wìHü:9˜DýSzš<#Ûœ½™Ló?z%Lž4Ý1hR;&7Õ6¥g zÈbÀQ8R$à#ŸgT1S'umJ‡Û² šg–£ù1Éé~œGðjÆuŒMîÅÇî"s²ù« ÃtRy¸»Ÿö®ðR®÷üÁ:ž½cA!ö‹«2F—3÷$q‘{"’ï¶îá;¨wE%ÌÈæ(Âxé™»¹ŒÆR†àyCÒòÔ [ ,;íƒbD ?‡˜¤¡Z¹„jìÀ”ŒEùnOO˜·q؉ +hp(¡I[Žÿ´p‰¯™uƒk k~X\`@>n'"XÖ¢jE’ ^aUÀŽ—r ×È¡¯FüŠ›™Ç‡l˜Á%ëÀ UI—Ÿ¨%¦ãá ª\W——ùe>ìúÃüZæ“k‹g˜pUv0+nRò-Ýqh)X'ƒc„»ã1x/T¾¬g‰þ‚bEò¨Ã+¥Ÿ @ñk>K•ãë0Ì +/”ß­‡¬ðr÷F[Û¾önÌ¢ƒ2Í./tÆO:Ñò½ðúÂág=¿ÜýžIΞ_“——ø’ƒú6 VB80«nvót·†âZ8šPW1ê¾ «­ãÄZؤ„Š5M” ´ÃeâÍíQw/_Þ|»ê!–›ßû—ïß½Ÿ%IöêÕ«àõÛ7Ð|¾H™m¥Þw?Âhào|BÁR+˜pÍ L„¿ŒÊd|íXªá¥HìRÇ5\40Œ¤‚ª¸‚Êï9 Ê(·`DÀèèUù q(àÅ×ç…”•ðý eóicμu¥hOeP0Ò“ZMgy@ðïÆù{õÍ4záJW™Ù%Å€ZýH¾Œ Œ3h•ÆkŽ-¬ôÔÞ¹©Z#ëlüg-“7àr)›aKjÌé•9¢:hei62ÎdNÉCº‘u–ü¦E®haÔ¾ôó`#ß!N[Ñ‘ÃÞ½0È–Î4LÿÌ]oMÓæàé,ìa»Ñ¤±P»ùëuM{œ¶¹¬VȧB„Ÿd®°’{Ýv.9Uè“+a¯1˜0×Ôü>“ÕÙÔ¦5ËWg"™¦ ßi~¡òŒ ¡=§L—ˆ2 #°†4³c€p%B¾"3—ŸñƒN£Ùc3—¸¯’7«ï.†lErŽÓŠoI.GLr°'äúƒÙaî¼%É íŒ¯Ê(³Õ Æ_®F=ôÛm0­½árõSx¡­ÔªàV,ßž©Z_0ħvÍ].ŸMè©“‚ |µLž†JÈSÿ^·º†dÁ)²¬‡`j( cKhúÕ/@ñ Ɖ:¾ý Í1îËs4Öl.7Ȇùˆ3ì–ã€WšFžîôÚa²-èÁS•Å€áñ ƒ…æ¨þÐ ³£˜òè`G¡°ùÓÉúû0ãב«ÄžŸŽó8)E:N ‰tlÈë¨ÈFåÙ¾|ºE ^[×öì‹( mHà+mÈ”“ ÄC6ùÃ]†#ɽK Çíüq¨=‚óÓ÷^˼ËåNÐgÈÐ~€‚§›Ï'y—OJ.6‘;¸»wÏ è˜³ÔÂ=‹¸Óú…·ÈÓq“íΩ>8ï’nëâãAb6ïá$x;°¯?WrÉÉð¥R×zú;«’ è«,ÝÙÖ†WS©5*¬¡L€ ³ŠC”`ÍÃÈQ²Àæ’Twe?¹r7Š¯±C& -6sC;ãOÛ=“ç­üE!7CÃè½´ÆéG¨n²‹'7¤Iœ,6R5ª&CgŠ¨L–KA5M6päPMco\¾”=P¶I …”­nÅëÛ%7>ª¿} ãA? -[éÁæ "ÔóhQŽmш¢Ã’œÚ˜«¦q;Ú‰TÄ*«8`üê3”‹’ ;á¨y:Êeó”©Mï­ƒô€?zŽ^<ÆôʤØå°Yˆ±Ë=?³ãr$‹-JJˆ'Á0ÃO•™0}†cËùs¡É«¸Zd’¦pÀ”y°\\Ÿ¤ê…}öÀX$[C,‡²ê±­¡>¹Ðî'aMªðùŸøû3¾' E:%Ðì’Á¡ü9ùÀîÝ f†x—/‚uïÚÍ÷ïÎ,¤SKúé—"½O/zïºoº){ÛwVNFßÿ!ëšÈç)Oy1J[ßýÿÿÕÙîÏݸÿ`©‘E>’áΓS‘ðçãkÞáõÅCšx$ÒZê>½¼—G’üZ×,&p&'Ý3aµ2Âk㳓ç Å«¶ƒ¨,X…®½¶°°V…`¤ÄL*•‹Xå,‹…§ µ ,œQ1æ…`òµ‹X°ò.ÈBŠQ,j9>¾Ý*Ë>[T.bAŠ¼ òGí ÒÊÈctùµƒ¼÷ŠrˆBãòcyŸ”ÕQÞ{ŸÃY;À‚ +>ùÉ•‡Då P{¥c¶¨<`ðµ`ÅÀÛü¾rƒ€7, ó• ¢D¤{OÊd¦4bÀŠœ Ÿò7*aˆ+#lœiU{ˆ¡9a•E¦_[a–FìdWVóWjŸlHä!³òuâ”m’r:ˆ ‘+6•—Ø€´‘±Ñô¸ØT^Ù&*—°É'j|Ä´MpIJë²ÉØ%`7Ô",¨Ð£vÉõf•¤; _L*§lƒÃI0aÔG¦q#â‘xƒƒ”s7~ÙŠT¯Ä*q±jÅ +,¶ÓXÔvù`㘭<úÌRpÕ«Æ1[%åµT®G(‘lÅ +¤NbD8V Cã—WüÅ´ÉÏÚOŒ ä+äëÔ-aTJŒ‘0“ÊNµ_îtV™ ’ÂÙÖ/[± +±èŨñ#Ý¢çH£+¯qË6¨Ôã{L/êOW»IçÝØb:÷1oü² IJˆNé°c¶Ã4ã|ž¯SG±Bü% `‰-çký²QT,!æPŠ¥ñúôò÷µ²¥ÌBÐ öçÑØs qpèì.JÛÂQ†±§óøBáGû<¬ÊLý||ÉŠGË© ¶ÞSžt1Ë•¥®wwr,ÙN>Vu±×y‡嬗€ÆŠ™¯p» +·kp» +÷ l;ÆMcÜT㦷].¬H×qßï'â>,SÚÖ!#NÅ}<ŠCʈ9"U +"@ê!G»Pœû⸠Üw•éüñZn*Z®E쨬bjg%!Sû›?âúñWìÔýúñsµ1.cИe>xÍzcÆø!9&$¦£òNO8îj쇷¸u7x–§“þ/ÖóVâ3Ú)ô9&òµò¨{‡sLæ¥sÄMÇˉ¢žÓÍ©5£Ìš!±fÛ¼¨­ª-*ÉŒ ©Å}+ì%ÔHáVòDÔo(þQ¬½Æ=èÁ¨Á&ûpÜàˆãÅ|è'Å7ɸ…^~.jô>ÖSÔ»gšö¾ÝÇÚnæ^ç ô g^[ã[á ÷³~°*¤TV1–Õ©ÄÑå`DãÛ¡Ûª‡Ðüôêá,*V¨‡Ðõ>kÕCX¥’Š^ËA¢boç¸X§Ó7\St¥0¤®Ú¯J¬[•ØxRÁê¹6ë*:ú†Ž4¦ãÓGE!N¯›öî_¿C¬G¾ñk’íAÀݸ«/èŸ1p¶Ïˆø#ÈÅçˆ1÷ÆOc¾ÿòYlœBûã¼Ú/U¬Ø.4ò}M ÙÜa2 ¡{eáØ”EÌï°¬-°Y›r"mj+‡m>™Û•Eº[Y˜Û……õÊ%è.ë”[ÌêLUjq]Vù­Yp{(Â;G_bãõ"Z{¶Sì&2w]]„ý¬pw2ÓKÅîãí¡…\«ÿAocÜTOì·SÚ¤i¼Ë“û‡Ûáq[)LëòýÄß©—¿F?q*yì(…5·—+6á¤&<‡“šˆ´,&Hé òhgÔ„r4ý¹‘¾’¶’ö,'ìXNø¬è´ay(r_+·è‰ˆ%9CÑì¤ðUfi«Ì„©*ɯ©¤xPÑØÙð à4N5ðJŽ"în©sàD³"nÇT!Lœª¸í_ê»WC>×wÇå™Üœ¤ÄùfÂâÍÀ­;b_ae ?ƒ,ÛwþUŽÐW0¢ŸM•7÷ÉsAä'}…¼9‰ ƒSõâ‚­[V ·MãJ§å gÔEØL] ; ûÕE¸E]8¨#â÷r¢hZùµR7R•ÚX¥6žSÇ ŒºjÃÛïºö>=úùýWŒ1ðáþdà÷kõ1pcï¼c|}®8šJº»‘? ¸CÇY)ºkªÀc*EpÂ!.üÝP_¸lU°]Û5°Ý“‰¢}r™(œLÛÅ)œ¤…á$-‚¡Eiá¼2‘s8.H–•Ê‚îP´±²ˆJS49>‰ýÜÅh‡‰€‘½ê¹p«’¥#F\³¨‘ãUlzö´xCÓ·ŽI•DSÍ¿[Y1¦xxŠvÞš)VéKµ¹àFi¶j*A±ö¥‹ûÐ2%0aùÁ¦¬b”§Â"ⶉ%ñ†'Â"a+EÁ°ð—„E˜©ë}ª +a+a‘Ö os€æJïòWË·'–¯PÒ¯è]𔦽«Â=Óøö°÷L)ƒš³—ÐGÜ£DædÜžÎJçj9\ÀYáJ7eÊþ#N×î ûN6M…óÝLy"ðù+Ö¾n°VÑ!ÐÞE¥“›ccС¤ú¼Žkk¥¢¥®Ú¯J­[“Ú3ð$”jS;”ÿȯ+Ú“ˆ!w5òëŠvñäÃlßÚ1ð b´³êçAÀ×pe8™0í]û¥WMEШ’tœê CD<ñܽÄUcnz5n÷uÚaTÑØ#LjŽ~aí ¸ LyÑ„âŒ=³´°Š¡;zi‘²à¸.-Ø I9›3iµE’¦’ÃO¯,΂c…²]ï3«,L%,Â*aAH'2"y éÎñ\©óu€ßÚÜIiŠsB÷:ùv>®Ç=ÇÇxõ4âG~ð¦Ê¦Üˆ*6¤©’»÷Ó"ž”A9¯6ãå€ïŸ)ÐCŽ¦ÓyÿÀÿO}¹¥9ªÃ@x+ÙÀø³,ɲ÷tfÿ¯G\B|`HÂà§n: )¤’ê·ò„Ø¡U¢‘;³y§mHêp£ðè¤NOðä +V˜xr„}®ðÆzÇVz +[\1¼f¾ ÊÀÂe`á^`áR° GöÀ,ôÛŽ“…£¾):º°‰t¥'©Å“OáÚÚ€uÎe²¯±$5Y2)8‚Ý:[œ¨÷Uµàt…S¾_sP µõ±¨“{‹;f¹£Ëš#¿ÅÏwvy01^í”u¶x^¶:…×»(¸·5ÝX8-ô°TúŠD3if‹ˆaú«¹e-doðmyñݲ…¡H~Œ:rØæIþrkùDkSáŽZ£®Iù-ÀÇ·@*)–ÖéDø†®9è>³Š¢EàÍ3Ý*Þ¢|¿â¢ßÕ_ÁõŸÕàßCÁÙÅ2/:؆ÃIk°î–ʤC”õãq‹qZ*à«üÁˆZ€a™þ¨ÿ'aŸ,XÿMIeܲÊeå]\# )È‚×È"¾' éa¹sºÈÈ‚‘E4–Âô",´µ½0ëly.⬳!ílxu6¤å´³4bSgáúÎún#l±\>D%¦§«á__]»î´r·!=U¾~¢Ã–í•x<Úê|ÑGÅ߬Ý; (Öÿ­UZ”ï j&ºÿVq&w8›ºTv,~§‚ÃQór(¸'W½¦öHúiðÓ_±à÷ÑBkª‡‹¡œœ†¨Qø,h ,ä=XÐ#{àò¼éÛ¦Ë`Ðx;½‡Ù‰ç&?6ãÇ}Mu×m=5HMˆþé %º™v"®iŒ./7~%(®-·3Œ±Á‚p ö¹BW”÷<íª:G +H¸‚3¼à'Wðòi²Áñ1ß“Ø«¿Šëð¼‰r÷|D§u_fÎ|õpbªsåïá9õ¸@Ø<®|Qø/Æ“]Üäþ×Ük±Þ+wu9DÃ"W G.œþÛ“-"ú]¸Ð‚ˆ³n,H´Ûp2ªðÏ«.hù´.ä1ß“=0ƒ‹Á…4ÁŽ8Á—¸Eï£.£FH K_aO R¢šcìP5GçÆ?;[@:ý¥îTö³¿¨á,ÅSýA.'µŽºSŒ…kký ‡x#êX;+úºêa¼½h±'ùþ_n´¡Ÿm 'XS°/$¤¬ÿß öÏì@ûäÀšèDÓbÂ*p7È rÀä€ì“C4@&´"[wuÕ‹\x‘›½¸†„|¦¯‹n…pOõŽ=+û2ÕB®tã׫}Tö¾jpýÕÚ“û¹³SÙ˜Ê>¶eÕhuZ»S w’kÇBts6|w«k}{ÕˆRÓÃÍUM4l<5ýs_ã#Nª1P(T£²ýL,þIÜ>?DœJã+Ji=ïâÄ1ã_ðeüËÓÕÂò=ñóÅÌq¾<ÀˆZf„9Ñ|=ùs_ém_%í«icõêÙÙá×¥µò¦µÔÐÚLx ekûa3Ön­[­ÖgÁýfJœ½¡Ú¥²×Wîó$ôvå¾tëòbÜBä; ã<_añ_H×óáÕë°EùžðhlħS]Žv =é-IŠC×¹Ü)Q ºc´åQÝŒ΀>ïï“2Â.Z )ª`˜ò¥û´à -¸@ ž`Â-wNW Z¸ÇŒ/´-$G ™Ñ"6¡…’âðÂC…hlV/]„GƒÛõ [ ><¯› +÷¶>Ý_x\?ËÝ6.ÒŠ[WÏæý…G#5õ`€ØQÎ%Vñ€W[å;[± è\L°šÕƒS‚¯œÂžda5¿ŸdÁ¼OJ*y,H¨ +ò ȸB +®àŒ+0ã +|q¦\Á)WHÆp+È™ÀÓ n;QaG^³ãû¾ò#{Þñ¾¾„ ¶5¢¯’ +CòqC~Q¸VÜ…Æ”k*ùÎyî‹ÒuyE .kÞžsÕü¨òýŠÓ0Òýg4ÑÅFzþZÅ1U~(ç2« íÑ*ƒpßv@¼Õp²5ÖÓNÝK8²Ð(\\(…ë'3YD}ÒßéW²K„†"ÁØIW>u Èbù1“…_þ<edA/² ”,ü²8ƒbÐ{7­qõ +X¤’týñÝå?EÆE¸ö5p¬c®‰ÑW•¿_þCF ]ºÒaŇ˜ ÔåéÂ__´ +(a‡Âµâ¼¶toïñŸ½+Ïs¿ÞRòý­äþ§¾Ì²åu(<•Œ€e«q3§ÿÎÿõʘ78vrej¥ ³#mIŸÌý¬"WìjáÓG\¬"ÿà>íÐ,^ËÈ%†…=ç}\/€É‚¤Ë»x¥ýpŸ,Ü¢ÈøèATå:ñd å"pü0Ï«-hÿ6 dl/¶€”-(e “±…¼íc¶NûøCÈ«Nj‡˜Ñ¥©u¯ÔºS™1®´ít¡íâbá⡳:—u ¤ ˆºƒÍè|éŸ*ï›Å[Õá¹]vQïÜÅÇTùGt‘F\ƒ¤‹™¬f‡º!ÞA¸AºÚ*ç‹ßª«ay.Ð@.œYGº.„°1‡aÓ¥ ¡£ä­kD¨Z†VóÞG +°ÅÇF¼ßû“ñj§ |lÔŸÉNÊèÂgta‡èÂ,dÉlàx°Õ ožÚ!âÍRûñîÂ¥}É ôäi¿ßêRáhúî׺²&Ý7¨þ.í€ñËuôG\ó(ýIøé1—òD 1øß1è‹.6‹Waï¹ð°µ€¯Í2yJó'ÕY·fŒ¸X…ï4”ö¼vCçT‰N¦öŠ(ŒJñ®0è>ZXiRb·B(+g-ÜZØZø´pïР…æÅðC8„êعKh¤,³C+=²ó²Ìâˆ!_Â%µ¬ëJ‚¯•¿ÇÝç0K”c®üý K#no¡f-`o¹nüWtmÀG„÷Îí)7±Å¥ç‚€Å=-®«¶{«è8îîh–…å†—â´®Ó gŠxÐKdD3Vh¡v´)€ -ñõÐB"" §ˆÈª¬úúha2´ ýÉxµ£=6äˆÏ„G8E ÎÑ‚7´°ChÁ o–tØð6³eÆ"³0âÈD6˜«u7]iº›nñ£"WO¹Ùãf…i貪6¢·²[ ÑÍÜœq3Ç›ð€›oo­m]—™î6sòíÕº×~"Sá†ñOµ¿gwØRŒ¶wŠ·çWážKÝtä Xœüº'´Ì§.O‰›HXšË‚_§Í¶à Êx÷'ãÕΘò=²“öó^xñ-;Ö†èM$+¶†h(Wí9ü×øàGðS|àø#| Åx¤hFåZ DžOS¤Õ~hFûÈËÌÈCfÜUëÅÕnÌTc¦ ÕÃ…ªj¾Õ®&ŽµR•ÕokOšZýêó`¿ëWã²ûªÑÖ[ÚEc*sÑæÙEËß:Õ ó†Ú*lÏĶ6a߬…¼Ýöæ‹5 Å¦d6.²C˜Ð6ÞÕëk»ìÀRÛ1…†{‰6¢ƒ‹#ž3tà':àþmx¿ÞŸŒW;:èdžñ™ Bv‰o‹—j{`¼Üs«ðìUO—õ*éU/͆L‹>×ü­iȈOÑ°X[æôHŸ.[f™¢æ0›V¶œ*á^ѲRêÖJI—5ØO#mÙ·¦Â¬¢ïÙõÂç½4‡¦‡5¿ÏY†n±VÑ*~·J?‘Á)FºÈàå<¡½È U4vfð,ì3Ð~; dÌ/f€Çv?>ÓfŸ1ƒa‡òÓÕ6€­oñ+d5¿liM9ч߼çUù=±á¿¯ÌršYÌ3 #™M…À=…[‡Ðª~È* ‹JJŠ]94¤§Ê1UŽ¹ò÷ ~„=óG\öÕÆ_üB«(C5ßÁ*ÛîDῈ9)UϹ;Ä|s)ù‘÷«¼kQç”mÉÚØV¨ªNÞÙBáÆ|—--r6Å‘ å±%Zpü0Ï«-x-üZ˜whá‡ÐÂ-È&þ§\«íæ¥"±&Mì1š4«”g‡²šª6ج£½rRÙ\ȆsóÈb?Ž¢ÚkÕ„ŠYU ž£oη³TŸï\ت }.û2g{ä:Ú“×£lf¤:]dÆX[t7ì"†©ãëù"¾æzœ3ÔVxpm!èd¼S^ó“H~ÒFŽ¨O^xÃêX/ e×aŸàƒÍ(Â>ñ÷o%èýÉxµãƒ~lXŸÉ|ƒv¼Ì­ã!0ÒbZ)3£)ÌhS3Žq¡Mýhr?ÒˆSáº]E3 è£;Â9Î…pþg‡º̯[ŽMhûBøû•Í>2çeÍ‹šWoºciJÃjïš3;ö¶cñ)#.]üÍbò#(ï ƒM¬˜Q¸üInK²Ñÿ"N„)½Ýu"ªG^–¯]ì²®ÚVHÈ‚ ÀØÈ‚öo²° ²ðí™ä$ûŽ,üYØ… »ØÀ´VŠ¼˜øäbâoŠi.Ш\G8'µ¯¿ D÷0؆”0éø‹I—wt°\Ìo)VtcL4—UFØbJáÒ'©ÇSZEŠÓŸ¿8aqÚÑ-…³¡r’þBø‰fQZŽ .7–K³ùÉ+]È“ÿAÃYߧ ·h JEÀúà.\†æy•ÓÅÆѼèÛýŠ.LN.£ ;@¬@"äyB¯Ç’KEr9K®Ë’ë^Éu‰+9u%}ìÊD¸t^¬«ékÙ ÕÊæTöG–Ì® Ü3àlFÝ„øÁÝè4á#^é[E9u…U~árv“™å`bÜA¸DÜ "ô\ Q"®¹ƒÐ˜ ÇB8^*\ É“+\€.ËWŒX‰BNØØBc—-B@¬ÒAÑhüŽ-ø ¶à“ÙÂÄA$ÿêþõyf‡vŒ¿gö%üŒú¢ô?×ÿ®YÊȘ;Æzq̃ÛÅlGª'Å׺/Œ¸Òº3)¦´ŠtÈSÅõºÙÐ=-›Ê„Û«ãýà7‹áüP™ÖêR8I6¢xC +²‹VÞÉ~‡ç²âŸD¡ãàç (¸ +ŽPà (påß +ñ„á -O€õ¸46g3¾Í+eybszcG°c*üp‘ûZwC6¤ºýˆ#+nUñLx£å¦ ùzáÒ´é­¢¿£p‰8ºŽU&õ¸q¾žó{Ãh¸ºŽ(ï wZ5çóÜwMÐ*2c¥(E8 òÛäHÞ°ƒ…ÞÁBVƒXHDÖ †T‚ꀅ->r°°C`aÀ¾ ;,•&¶‚S8wÈåÜT¸œ\ò·Â¿'ÝT8r'ìrC•ôç]î%\*ÉÑ-ukkËJý…SΗŽ "×Ht‡˜ƒ©ºî=ÚŠAS›eþˆãb:Â? ø…ÂáHøÄVp¼zœªÚDѲE«X(ãú`a4¢}Í$Ý Ùì.D yÛÇlrå ë¤Ãæz‘'–ß&Ö§–ô¯¼ú¦%ù K¦Â`-†”CCú%ùsK¦Âí¤ßA7ÖlqáÎSsŸ›Z8×kѯ…çHÄÕ… >+¬YîVqJÕ ËùÂÑÈ-ß(æÚ/ÖÄÅT!'ÙB^ëŸ7-A-$^Ë#+ÝZ,Ï5àÐÂha2´ ýÉxµ£¥haÙF Z¬×Ut ÒS„d]JýX°.ùñ)[Ö9:ØDo Ûó-eV¦»±X¤­árݼh:qÓë–îÂ[Ýö áï7¹qá]ÝŽ|'ÞsúÛk(Å_Äûtå´0]!üd£ÈØ óöVG4~í) +lY›ä]$ +-Dñ®–»ÔG +^È¢‰1A]¼@òDpFüD +Þ¿ ä€û“ñjG +|l¨ŸIN²9R¸ )üRx™É2ÜVä¢ö*÷>¹eÅ'f¹íðy"ÜûÏ¿–ÝP}ç_Yr×Í‹Q¾CqS +íÀ4·Š©b|Õî \º—²7&4gúz«°QW7•?LºD8’¾cÄî‚5[ÌßU„BñFÝÐ-Îk۸ÒžY&éJ°ˆ‹6°0È]°@% â0–ŽÇÒ;Xø·`AXüŸýªé‘㸡wýŠ>ζ]EÖç5²/¬Ëî-c£X4v ¿>dÏLWÍÎ×j#y„°š©²úÉz|¤FXÐNXÐ\X„#¢^.,…è àŒ jRÏIí¬»YL©¥3Xwshñ‡æ¢gྠ$c[’tNIÎ#\8ØçþO?ùiàOÍE ì– +^Œt?7à™Ëu¼úzPÊý‰ï&"öÛó5œ¨ì“á5”xæ¿F2¬œ¯*âA^)í‡öK¼TÓèÇqó°$>­+@­…lʾÏãVV”£²‚YáYáw²ÂÏe‘å ¬øËý¤, aø ïñ÷ã0ËÕnÍw—àÆôñ¦AïÉl½ré\™]G–+MAžP’ + ÈLPËF5o»á¤ŸŸÒÌìY%ÅaÍ\``mföý€f&h{_óÒÌìYË$³Ž½2J_ŸÌ$Bˆ+ Þü$þ?ÆûÚÑCÆ?û¨&\×9+á–Û$gµ¥èÜ4³ÁÓªëÖ¦´ug%LÆhez•j·ÖA ¤Óh[¤•  2øBGF‘2ëÞC oµŠF?Ö Üteô¼uï!ÝF§Wi7ëÞEŽ’á*[ÒºˆEBOöb‚Z´.°ˆ"ª<¢Y÷.b…ñZÌ&èïëÞIH,ŠEÒh´bÀo0€äËú’ÆC *z>‰ADœ×½,ryëjGm=ÄŒ$|™ fã\³ ò0éMY÷b{†ìÜæQ1´RX¸hJø½zR‹™ƒüŽOÑb:ƒ&½uÊ’™RŠ±€PÕ¢qQ‹$Wh@QÊl¶î}ÄÄKס‹cå×:©MÔZ›œô¸›‘´a¯\\1£ÖO­"F)©]àÈfÕ9ªUEÇ.j•‹7«ÖQ¯^ÐñSnTô«sT+(¢Ó9Îsî>pLW¢n¦Ç„¹’¶ž¶Ò L_ñ\ÅG\âÆÓy›-Ýä° ÊaU‘Ń"Ì6£GŸ[²ä†£ÉMóäú™cõÛÜúa“q±?œÙÐdö@b7¨#4eþ’¨yŽš[Ô|êëŒõu¢^*d©oõÑV|9æ'!Ó¥˜õáë 5Z{qèñ1ŽÅ•Ô Ppu’úI>Ðx†xÈcñ©"âYhT:ÄF:p#x'x.âÐì´ÝO_f« ”aËLõ%“º‘…t@¾L^¯øËõ´K€?¿­-À¿ð¥Æ—ˆë¿BàÐŽ\ œ!bhqL¡L‡åtRZáí!ak€®Éïi‹¬ÚBÎyD\„F\ÐÖÓV[qAsq‹ ¼íru[ä]:™\n²ºäÆË“çÉ mrùœä.ÀàO~LΧÃÜônps‡›Ü`ÓwœãŽ-îóÜñ¯ñ«¾”Ê—ŠxkLÀÃX +6Au‘GW‰‘L|‰©ÉV]”FV¤ÏQõ u‘ZuQuQÏQìG*ŸJnh’»ä¦Ë“{¾V?ÜëžÓ˜#×ãÀ/ÑêKÄà ð—~¢I?ãvoÒih"Ñ4éMÏ>Ö¤w¯£Ï9__į®TÐqk ðx]*¡å‘£© ‚Òp4©‹­(ÒÈ’8ru}HHŠtTRP#)h')h˜žïIŠtLRäs$Ep#ËÃÌm™ç¶ìr[^4·ßðc¯øyÀssäzxl€Çxü:¿Ú_€/À¿MVá:–ŒÎ/¬â·êªþª.þÇ~Ù¦+Ëë`t*Nàä¢ùj2ÿ‰(ˆ”ýEÝõí/¥,r§í0Úd +ñ\p‚aÈtR.òJ.ä ¹K1ÒËrÁàJ|.[ÙÍö¼8Ê3M9ƒŸ˜M ¼ÙŠwðþéàÍ®*Í‚·×*2X(@f@ä²âª£[$÷™Ñ-‚"û±\(KTDZé‹[x[ð¿ÜÂ÷Ý‚oþ K·Ò-ä”[x´"¦£hy7Z]F›ɦ9Ø´ÌUwråª\;u§®¤Þ]kÿ*u¼ e‰%i—ZV%µôZt_wê N±_bÎðR@3Ð&{È1`šìáØ$îi±w£pòõ,¿mõ yBä.2ÿzuš¯fy Ë$ã5…†Ì2ò‡<Ƀ×ȃ„U‘çs±ò^¬u^X$ËO$ÛÁ;xï༃ÿ8A6Ñ‚7­x|? ÇÄ[%XËÄ´÷ëýh’ ž½:2™À¥Lð¥ðe™0°œ7äž%íf)E–¶ÌÒYÚ2KÙÉ’ª²¼ƒï¿´•V;¿Â•àÒÁÏ€÷VéÿôŠ7 Þl«4ÎHtA‹±%aNàŽ7£ø_ðœÆÓ)Åw?¶ OÑ…®j_ìÂG»°óváv‘—v!K»»]Øt8LTØ…HÒt.\Y…ûª)ÊáÎàgÖù£—ÞÁÿ2¸1 é 8>MŽègÉ?µâÍ‚÷Vù¹Š·‚+¤”¨àf@÷I.r x—‹…CµP†äÙ¢ 9*“Ö;òM®›½j‘kÔ"רÅ<Ò<Þx·ñðŒZ$!{§©W%û²7vð_?µzU‘ï¯^õä½â½â喝&Ð!iÕ›ßJð3oZ}Ui<ƒºç˜œ)î¶äÛ0Õ2ã¤"ùX. , c«$w¹H»n!…[Páôp Zº…l»E:¯!{æ Y.’ýfiäšd;xï༃—àúù¾…Ö“8Q渊aN\F·Hñ€9§ÄøP-2gNÑ„¨._Ôâö|r}Ìj·ÀùÊñhv ¬t‹¸Ûy¹ÈÀ4`{Ú8ƒ·öN×>xo•^ñÊŠwðŸW‡tÝÌvÁ©§8õŠ×€+xÖPË`’´ç0¦4ÉE¢:žN±e:¶ ƒ”’´ ]Ù?a|)|Õ. aP³ö\½ƒwðþ×Á=ÅØJ?ü>JKr*Éi×çÚ¯x³àêÿM­RC¾ž@]Á=þ³ª¸„Ðh8vÝhćr%ÉúƒÙaÀ¼ž=r‘wå‚ +¹ ‡\ÐW¹û•ãA!rJ.ôZg9™íZ_Í–ŸÈ¶yð3Ë@÷‰e`—{kèà¿~j~[Ó’üÜÝ'go•“­Ò xÜ‚\Á(—­¢ t— ¡»\8˜Û±]d 3ŒéC ¿ÚEþ—]è®]à|åx4Û~µ‹yÀy¼‡]ä3v™3M'ÚÍVŠlm9ì­-§“ìL'ª™N3øÁö9n Ÿ%ïàü=àÍNÎÞ—ÃOíñ!L! +f ˜K pÇÑ.’€ç4ÙETxÈ‘]8€â1tìê¼Îr– %@ +¹•\H•\ø±\X!^%ñè†~²)eî«/òDSÞÁÏ4e÷ö¿^2v¹·š²ƒÿx³=ÞÁ;x_ÿx8…}‹\(¨²É…r‘ß-¹” ?-<\ÿ9è[·j6½h¼ü÷Àß÷ŽQµ ¼úŽñï༃ÿ9ð¤*7¹ ¥R.B>F¹pÃñl†dv¤<$ 0&Œ´á©pŠùcR‹‡q\ ‚ +µ ‡ZÐe:?^³©©0‹\e¥s: –‹`¿ÙÓ¹&ØÞÁO‚ï+ÑÜûJTϽ¥D½â½â½â´â 6ðU(KÁM b£X$-ùv:CÎÇj!à¬hƒ¨n¨Åõ1wÜ‚ ·ÀÂ-ðáxs¿L×lºEÜm)^%æ¹Aiœ¸Ým¹4aSM+l:1—ê±·æÒ;ÅкVÒï®7-Á©§ºz7ʽ¿æ>Ýûd—»Õõ¤UîÞ'?VoæØZiˆ‘Kp¦É)Pb½ÁÉ)Â>:E¨‡dÓ¨‰AJ±ëo8…2¡ïv +-ÂÎ;Eø”h{¢;ƒ̦o]Z’SI¾?›fðÖ ½ýVi¼ÙVi¼ÙVi¼Áu|°á +~}‚D+»ÀÙ.Ð|új ©Ð‡ôЇt™Î×ÔêC®ÑF %: ‹`iì2v¼pC¸¡/²•e¶Tf‹Ù¶~°Ø~¸,Á¥ß_oÛ¯xï=^ÙãÍ‚7Û*ÍoŠ^åÂ%­åBÅ&¹`ÐØ“G¹ˆì‡rÁ³Gz\‹¶e^h…¼Û.¤´ Â.2 ƃ¸Û°Ö¤1 +¸UïG¥5R‘íF´¸Ç¿Zp1›p#Ü|¿+¹èÊ]ß­ëÊ=ååš®ìÿ­Šlß^SòO­xÿap⋨î¯*g¸jUinr*ëXqb* „CÓh˜ÁXÇÓ8€™ÛE5ÒèBNîv!+ɘì‚ç_¯…]àÃ.ð& ~™®YŒ”÷ìÂkìB(z2\^…ûª¬óùpgð3›ô|TrŸÙ¤ë¹7¦ÓTüÌÊû6pZ‚ŸZy;x? ÞêªÒlÅ\“©„] Z . >ÉEüßog“B·n!×ñÝ¢LlüÅ-¼p‹¼RŒÒ-rá¾áùn!{n‘«ÜBãFoíI+¢µG´öΞœÁ߶ +Ørø‚ý¶UàþÆÉt¢â/L¦ö[¥YðV{¼ÝŠ7 Þ[å‡*.`ÈnA0 ä8Cö4ÊErHª“\Ä’ŸåØ.\c7G'àäþÅ.òÍ.ÒÊ*¦£I.tþõê<_8ÍrÁ—I:Æk#åB.Rá^ã%OǺK?™,U$Û¹;÷‚{w« ŸÜ*¨f«h¾Þr¼¨|wM£|\½Y“ß&æÀf8dœŒ‚M&£ˆ§c£Ðâ¶Y“›Ä&?xáÿg¿ v$·qzï¯ð±çЊ(J”xÝA. H{X¹dd± ɻد]VÙ’»Ê–ª=ÝQE‡A•\–ý†¤È×óGTŠÅ4FsÀyç´š•‡¨ÓžÌQfE™Þ6-uÜPâN9'ÏÙ+Jó–EiJŠò ¾S•Ÿ ürUš’ªlµWÚ‰Û^žs7pß>çòJ¹6çZx?œo87].r¿ËýEj¼ApÍLÒbÃ>'Eˆ“]RN¾OvÁŠ÷Ý‚”A „a£ˆÌúÔŸL`œöar—¹…;»…MÜÂ_q âžÌRfW™Þ6-uÜPà^+`´»©uYji•ZŸ¦ÒÌÂœXHòêÓ¼RžWW×™z§é~j—R»œz»ã6ëív›6ÔWИB_d6µ¡¾Òk[¯ë~ﺩ +!Veú¢6 +-„ŒZ„Âûh(©0ѼˆFØõ HðcµBIãŽ>øÕGÔœ/–™>À¢0ÄëÓžR}ðEú`UóYåâóÇEç¤ci^¼¯º8Þàâ xÒâª"s¥å´$_¢§ä˜’W)í ^õ÷æaà%!ïï?&⽫ôˆßoÄQ5ª`q펣ZˆyDµ åe˜ïª…째a£ˆÌº]Ý&p™Z¸³Z¸ù×Ñ 0S \ÔO¦ÀCÜsU- 3 .2 )Db¿›X›%Ö­Kõ‰¥!«,±¶$±üÝÀ7›—]ý¼yQ}ó¢! @Ö¼lQój>â;Jô™ÀKB~¯ïཫìv –D-@gp.çUÃäàå‰g·0ŠwÍ"hNvÌBs¦´R ›©…ÉÔÂ,jaRµ°©ZP¦ò¶j·®ÚÛÊš´«š|­4Úúšìàü/^击¼Ê-Ú¯™tó*ç®™tåÜW&Ý€·v8Q‘C·0JkǸSÚE·0:q 'Ú°/VùÀp-$'q“øÌ-üÙ-Üüë¨8oœV³[àcÚ“ÉÊì*§—M+ï/Q‹ ¼updI†´$Ã’×plIÎàÇ•dÈJòúA%ÙÁ;xÿ³ƒ·Ú”¹Šˆ¿Bæ.a³ehé ·ä@G³Ÿ˜…Q¼/RyÆ{ ˆQDfÉ“Ȭý)^E³°ó¯‰Yø+fÁCÜ“<ɳ©Lo›–:n(P F…Á„ÝÌâffm–Ù"i´™Å‚Ì.à›M7›@Ú" +5Ýn%,iwñÞÁï¼Ñ®‚Ú+툶Ákþfí°µˆ‹'˜à%â¤ìºÆBÙr ¢ +Ý‚”ö»rÁVi&ÃN£Ý‘ ¿úˆr±8G\ø!î)• _$Ai®.·n•[ªÏ-¥¹u·ä6‚W¦ù#¯9M‡7ñº‰Qòí‰AC‰ú‰ÑÁß ¼áÃÙhÄo­z%•m¥ÆYQ€¼ÆI¤(V±LÝI.‚òûv!·i‰‰~!<ÉEØ” {I.x[.ì†\„j¹pÚ("m^—[Ÿæ’ÔÂœYHë_™ØNý.Ô¯i[>m[v­5wŠ}sÏj>ÖmR÷ +é±¾+j£ˆ>X™ÂÎfÔ(ï2“>€SdCÔ™Ñ'­ØÔ§Q¡•ym˜C´ö?ùgâ@+ÀÌ`Þ9­f€ÔpȘùßà¢?L¼wŠLvŠæ˜X—\æÑ™7 ‹†ô ¹!;ŽÙA2Eiß.I³:øyI¦•:“›+è)9¦ä˜“ïTeûàÍ–J³àÍ–J³à– +‚U„&¼AÄ{•“ +ƒÄ” ¹x&½0Aù³^¹“`_/¼bÏNB"±‘±¾¶ .± ›Ù…™wN«Ù.LjöX»À0’Û;Nv•Òü8eŽ®9=N¼$–K5Ý–Ôä¾]“6CÞÞ3¹¹‚ž’_v^[P“wÞK¥GüÞ#Þ,x³¥Ò¸ `ԨȳÏÀQ1ÛI.À‰)àtyüÏzÞ• 0Š@ƾa§ˆÑ¾° ³]ø·µ RÎ[S—\»J®«Onf¼ö–ävðw¯é¼óêâßE7ûãÜjk:oï༃ FƒØ…h‡•\E·°Š£[è2·ðòNÇ«À{Å-`S-\¦˜©.j'Sà!™—˜…eøÈ9Ò9–´†CçÜ~\E†¬"_ S‘wÞK¥GüÞ#ÞÁ{o׸<Åù faäË µ`0Ñ-œ"¢[ÈGÚu ‰I`ëNnÁèÖ19»…æL.üJ.l\ø!îÉž”Ê…¼-µ _dNË´—\¬H.§É}!ÉÅ¢ävðwßn`XÑÀ^ý–4°öÁ›-•ÞçÝNdy#j+3Zžp ]rhŒÄ„Ct“]¸ìÂk(a +“ëVÉ¥úäRš\WŸÜ;¯h`sÃʹk YêX?ðfk¼ƒ÷®r·‡S#± TäÙ¯í‚íl,#ülìy×.PÆ81KLÄLímva3»€Ì.`± HíÂlNÜy\n!I-Ì™…cÛ¡;tôaÒ±Æ>h<4éÝ¡ïå Z‘`±«Ð9·²`­Á(ïýt™• v_œ +Ú“ÄÃ+& +/¤/I­¤/IoKžÄÀ8-2ipUÒÀ£ˆP]5ÚM# ©†ÅÃÕ‚´·dGí•vDÛà.¿ò·ÃÛ‚7ñÞÁ;øŸ¼f@õCsýÂŒ¶7Ìè¦Àÿö¼–‚/žá'‹çŸÂéÆ0XÏŠˆí`•2¿ŸyøÇ#h­‡OžðñžÂã¿Ço²t¿}x‚ðøó/ŸÆË¿þç÷!ùiøýçÿ°²øþù«‘ x´…Ñ“Üðüã!Oýòùá˯?cZN‘'‰F@;üöéáïïãÿ†ßÉÃw¿y€1 ÿ•Õ?åßWC’J! +äï ÆÈýëŒ=­ ù´–¼z6ñ†Ó×éžxu¼í|u ñÂ`à´«á´~ß#W L7Èçt‹|9ß4~nM&x=Á7ýíà ÏsÙ” endstream endobj 264 0 obj <>stream + + + + + application/pdf + + + RBPassUp + + + + + Adobe Illustrator CS3 + 2008-07-02T12:00:47-04:00 + 2008-07-03T10:50:43-04:00 + 2008-07-03T10:50:43-04:00 + + + + 248 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAD4AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A61H+bWqXMs4srK3njjnW 3j9NpHdnuI5Bajh8DUM8Yjdio+0DxHfGGcl3R7MiALJG1/Kr+zcK19+ZevQ6jcWMdrYK8F3FYFp5 /TPqvLHE0hiDNKIj6nIMV2X+bCcsrrZhDs/GYiVy3F7DyJ58rUNX/N+503Ub2wmis+dqVjaf1H4J IsgjlqjBJHFTtxG3iwBOA5yDTPF2WJxEgZb/AICc+Q/PeqeYr+W3u7a1gWGIs/ozxvIJF4dEDuzR n1NnpTpStdp48hkXH1ujjijYJO/d+N/JI/8Alb2oqt5JNb2kKRRSyW6u7fG0ctuBGH5cXLRXPL4d xTcDcZDxy5P8lx2AJP8AYf0hMo/zMmn9H05dOtvrskqw/WZWX6r6POsd5Q/DJJwHAD/K603Pinya T2eBf1Gu4c7/AJvkOqHP5p6mdGvdSWxt1WG4SKCNp0aRFPqmT1olcurKsHQ8Sd6Db4h4xq2X8mx4 xGzy7vdy+aS+Y/zI1W90iGUCO2CXVz69tBNNG0kUVk88SieJkO5ofgatePIDdTGWUkOTg0EYzPXY dB/Oo7FkUPm4at5o0VI7uMRw6tf2YW2mJingSxZ43dQxVviZae/TLBO5D3lxDpeDFLb+CJ3HI8SE P5sai1snCxthdS3UkSerMIoFjSJZVDTSMsZd1bajV8UrtkfHLZ/Jkb5mq7t+7l+Pe1p35ranqutQ 6Vp8NgJLi59KKSaWQD0zFJJ0A58gYSu6ipI2GMcxJoUuTs2MIGUjLYfpH60Pqvn3Ubu50nUrK5s4 TFNeMNOaeRWVIrW45JexqQOVYlKbbN95ByE7sseijESiRLlHevOP0/PdkWofmAYzpxt44Y/rmnpq fp3DkNMrkD6tbcftzb/q232sOXl7nEhob4rvaXDt08z5JTH+amo/WLSF7W2kinltjJdwO7xiK5VG KKoHNpI2kAbiD1B49aQ8cuQezY0TZ2vb3foP4KOt/Muq6h5UWW4uIxc3Gsfoy5ktf3bQQNfegVPx Eo5j2U9fiU9d8lxEx+LVLTxhloDYQ4hfU8NqvnrzbdaHqEK2yLI1tYXV9weaRFdk4xRpIirRgWkq CT1HbrhyTosdHpRkib6yA5fFAaf5tu7zzBYtqcq28emW2pXU720kn1e6ihZIkmSMmhXaUqWr0qDv kRks79LbZ6URxnh34jEb8xe9fcj9QutTX8vrT6zqD2ms6rJbiK59Qo8c17cK4UEU2hWSnHpxWnTJ Eng57lqhGPjmo3CN7f1R+lR8v3OqaydduNTludPns7dNPuUWaRYIruFWea4iAIA5AxOpX9n5nBGz dss8Y4+ARqQJvlvXQH7WWeXL25v/AC9pd9dDjc3VpBPOtKUkkiVmFPmctibAcHPARySiOQJTDJNT sVdirsVdirsVdirsVdirsVdiqxYIErwjVampoAKkHl+s1wUkyLT21tISzxI5JBJZQSSv2evhXbGg kSI6oDWvLum6vAsVwrRskqzpNCQkgkXYGtCDttRgRkZQBbMOeWM2PcidM0qw0y0jtLKERQxKEUDc kCp+JjudyeuSjEDkxyZJTNyKqbS1IoYUpUtTiOrbMenfvjQY8R72zbW5rWJDyYO3wjdh0Y+/vjQR xHvcbe3IZTEhVm5sCooW/mPvtjS8RaNnaGlYIzQlhVV2Zup6dTjQTxnvctrbKVKwoCm6EKBxNKbe GwpjQXiPe2Le3C8REgUNzA4inOteXzr3xpHEWhaWgcOIY+amqtxFQSSag08TjQTxnvc1naMSWgjY kkklVNSwoe3cbY0F4z3rvQg/d/u1/df3Ww+Hanw+G2NI4i0trbKFCxIArc1oo2Y/tD3xoJ4j3rLq ws7q1mtJ4Ve3nB9WOlK13rUUNa7161xIBTGZiQQdwhdb0Gz1mwNjdNIkJZGZo2Ac+mwdQWYNUclB I74JRBFM8OY45cQRr29vJG0ckSPG6GN0ZQVKEUKkHqPbDTUJEbrpIYpQokRXCkMoYA0YdCK98NKC RyU7uztru2ltrhOcE44zJUgOp2IalKgjYjuNsBFpjMxNjmFYAAAAUA2AGFi7FXYq7FXYq7FWmkjV lVmAZzRATQkgVoPHYYqpvdWqSxRPMiyzsywRswDOyAswQE1YqFJNMU0hYvMGhSwRTx6hbmGdpI4Z PVQB2hr6irU7leJrTBxBkcUh0OyAg8/+Rp/U9LzDpz+k5jci7hpyUAkA8t6V7YWCQ63+aDaX5iTR jpfrFtWg0tpxPTik8VtJ65T0yQFN4FoaLUAcwWUFVPNO80T3Xm7VNAmtBbJZRxzWdwzT8rqN0jZ5 EDQJBwR5fTPCdzUfEF2xV51ceR/OlzeaAv6NkjtdN8w6hqMrSzwSH0JdXhurdmPrMwX6r6hDJWQO oQjgzclXqGp2PmGe556fqsdnBxA9F7UTHl3PMyJ91MVXeV9RuNT8s6RqVzx+sXtlb3M3AUXnLErt xG9BVsVTPFXYq7FXYq7FXYq7FXYq7FXYqh7rUbC0jnkubiOJLWMT3JZgPTiPKjsOyng1D7HBbKMS TQCSan+YvkvTop3n1e2aSCD6x6CSoXkVgSiR1IVnfjsta9PHEyDOOGZqhzNfFLn/ADh8hjn6V61y UgE4W3jaUkmo9H4AaSCm4agHc4OIL4Evt4fioyfmray1Gm6Jqt4z2Zubf/QbpOUpNFiIaPden71O SeBOPEpxVzI51+33INfzB84X808Fj5Vv6Jp/71eMMUsN+wBALTzRL6SqwNKeqeoSmNllLHECyevd zHeP1O0zW/zXOnWSDy8xVdNWOWe7ubdJ2vOK/v2UNIaUqfTZAeXWmO6CMe9cXPy+n9atYS/nLK2m TyWumRKtgY7qO5uZC0lwfTPrTLDAoSSoNI4+Sgcvi+zjupOPegee3u/W3aad+cMkmnzXN/psDxWL w3BKyyBppPSPOWJGijMo4GjJ8K/EAKNjR71MsdGh12s9O5fb+UfzKR9O5+boeNjbtBUWcjFywUc5 w9y63Eg47OQtOvE8jiAe9ZZIm6jVnbc7eS618iec1ewkuPOdyZLGKSIGO2hLH1ONSzS+oHPwdZFb 2phA80SyA3UQL9+yp/yrfUmnsZZPN+sSGyWRUJa35j1FoxR/R5Gvf1fU/wAnjgEfNM8t3UQL+z3O g/KjSYmtD+mNZYWXqfVh9dZOHq/b4tGqOtf8kjERpZZib2HqroOnd3Ktt+U3k2GCCKRL25NryNu8 t/efuy5JYxokqRxlq/F6ary71xEQFlnnK/6XP4Ll/KX8vl4f7iuQjLFFae5YDl9rZpCKGvTERARL PM3Z58/gmGl+QfJml3C3Njo9tDcry4T8A8g5VrRn5EfaI+WGgxOSRvc7pxaWFjZLItnbRWyyuZZV hRYw0hABduIFWIUb4WCEl8seWpb030uk2Ul80qXDXTW8RlM0ahUlLleXNVAAatQMVX6ZoGg6U0ja XptrYNKsaStbQxwlkhQJGrcFWoRFCqOw2GKo/FUNb6nptzcSW9vdwzXEVfVhSRWdeLmNuSg1FHUr 8xgBDOWOQFkGkr8hf8oN5d/7Zll/1DphYJ7irsVdirsVUL3ULCwgNxfXMVrbghTNO6xpVjQDkxA3 xJSIk8mF3v5zeTYRf/VGn1IWBjHrWURuLeX1DQlLiLnEoQ7EyMoJ2WpyJkG2OCRrl6vMdPuaPnfz veXOow6R5SnYQLEbV76SO1PxpU81Zzy36BTt+1Q7YklYwhtcufPbkpava/nFqEerQxvp+nwywILJ LeWSV1f4uQhuONq6sduTOlP5R1OO6InGKsE9/wCxWHkXzhPf6pcXfmyeEX0EUSPYQxQHlGsgHJXE rIqGQEelIrN3YYkeaxyAV6Rt9vvRbflho88lw+palq2pC5jWGaKe/mSNlXlQMtuYA4/eN8L1X2xM bTHMY1Vek2rRflZ+XySGRtEguHoFDXPO5pSoBX1mk4t8R+Ib4eEI8adAXyN/FNYPKfla3Vlg0axi V1KOEtohyU7lTRdwa4WskpmkUSEFEVSFCCgAoo6L8hihdiqReWLGCO61vUIlZf0hfyE8nZ6/VgLd jRieP7yJ+nag6AZXAcz5uVqJkiMT/DH7909yxxXYq7FUPqF/a6dY3F/duY7W1jaaeQKz8UQVZuKB mNAK7DATTOEDOQiOZSqfzv5XgnmglveMsD+nKoimND8YYghCGVDC4dhshBDEZE5It0dHlIBA5+78 ddu/oiLXzX5cubV7tL+JLZJltzNMTChkdQ6BDKE5h1cFCtQ3auETDGWmyA1W9X3/AHOj81+V5XZI 9Xs3ZYjO3G4iIES15PUNTivE1PbHjHep02Ufwy7uS0+b/K1EYataOju0fqJMjorLTlzdSVShdVqx HxMq9WUF4x3r+Vy/zT8vx+L7l481eV2iWZdYsjC/LhILmLifTAL0PKh4h1J8KjHjHej8tkuuGXyK suvaG3pcdRtT63Ew0mjPPmnqLx33qg5CnbfHiHejwZ/zT8kP/i7yp9VjuzrNkttNX0pmuIlVuNA1 CWHTmtfmMeMd7L8rluuGV+4r7/zP5d0+aOG91K2t5JKUWSVRQMjyKz7/AAKViajNQGlOuJmB1RDT 5JCxElFWWqaZfFxZXcN0UVGf0ZEk4rKvOMniTQOp5L4jCCCwnjlH6gQicLB5t5G00w/mFr1xz4fv L791Is6yv69xE3IF1EJjT0/hKMT8XQZj4x6y7fWZL08B/V7ugPxv9TLPIX/KDeXf+2ZZf9Q6ZkOo T3FVk9xBbxNNcSJDCn2pJGCqKmm5NBirB7r8zZNRMsPkzTJtdaC8htZ9RQL+jwrSRiUidXLN8MnG qq3H7bAoN433NwxAVxGgR03U7ryh5+8wi6h8w67HYWTSwSwWWlorJ+74OQZpVWbZ0qNx8XxdPhxI tY5Ixogb0bvcJna/lX5IhuZ7mfT/ANI3M5VmuNRd7yVSoFeMs5eQcuNW+Lfp0oMeEIGeYqjXDy+L Kkiij/u0VKgD4QBsooBt4ZJqXYq7FXYq7FXYq7FXYq7FUq8rcm0K2uG2N6ZL3j4C7la4C/R6tMhj 5N+p+sju2+QpNcm0OxV2KoHW9Jh1fSbnTJpZIYbtPTlkh4h+BPxKOautGHwmq9DglGxTZhynHISH MJBL+Wfl+a8e6lluXeR3LoWj4mGSdrlrfZKiMyyMag89yOVMrOEFyh2hkAoV+BV/L4eSpH+XmkRa da2UVzcq1ncJdxXJ9B5PUitvqkVVeJoaRxBQv7v9kHxqfDFIOumZEkDcV177PW9z5pVb/lTZNLd2 15cSvpaQw22kqJEaSOONnkPqK0IQlWmdF5cwUJ5b5Dwe/k3y7SNAgDismX4vyHdunE/5faLNHbRm WdUtXmlVQYiGa4vI71uYaNgwWWFaDpx2Ncn4QceOumCTtvXf0iY9/cUBZ/lL5ZtY/SSW5eIxCBkk MLVjDq/En0q78OLUO4670IiMAbZdp5Dvt9v61e2/Lyy0tBcaRPINQto/9EM5iCtLHZLZRerIkPq8 AqBiAaciTxOww+EByYy10p7THpPPn/O4jW9KOkflfotpDp7zyTPeWsVskx5Iyu9tLHMu5jDcQYVS i8aoBUV3wRwgMsvaM5E1VEn7bHf5370dr3kHTdZuprme8ureWZ4nrB6ChfRilhAAeJ+XJZ25Fqno KgADJSxgtWHWyxgAAGr531IPf5Jh5f8ALVloa3QtpJJTeS+vM8vp8i5AHWNI/DvWnQbUGGEBFqz6 iWSr6Jtk2h515PfQv8d6xe216yGb6xElvKyMJH+tKJXVkmen748VV4lajClRmPjriJdtqhPwIxI5 V93u7vMhlHkL/lBvLv8A2zLL/qHTMh1KJ8yeZdK8u6Y2o6k7iLkI4ooY2llllYEpFFGgJZ3psMBI DKEJS5C2K2/lPW/NrT3fnRprawM8Uum+XY3i9GOJRHJ/pJQMZnYgxurMVHxceqkAi+bYMgjRhzqj dFnkcccUaxxqEjQBURQAqqBQAAdAMk0rsVdirsVdirsVdirsVdirsVdiqD1m9ex0e+vUAL2tvLMo PSsaFh+rIyNAlsxQ4pgd5C/S7IWOm2lkG5C1hjhDePpoFr+GGIoUjJPikZd5ROFg7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXmflfStPvvPutfpC0LyWt1NcWYnq4VkuEdJY/UiR1YN0MchWhp7tjQA4 y7nU5JRwR4TzAB+XLn94tl/kL/lBvLv/AGzLL/qHTMl0ySaaq+bvOF5f3ig6V5WuWstOszyPPUEI aW7k2C1jHFIhvSrMeowA2zlAxo3zHezjCwdirsVdirsVdirsVdirsVdirsVYX55/MGXytqdpD9Xi u4bmB39EyejIJBNHGp5nkvFhIRuvXqwFSKcmThLsdHoRmiTdUf0FS85eZtRj1WXQLa3gubS7itbW ZyJHaGfUJnjT1xFJGwhaOMiooQxXcg45JG6TpNPEx8Qkggk+8RHSxzv9LK/01p4e5EhlgSzV5Lie eCaGFUj+23rSokTAdahum/TLeIOD4Mtut9xBPy5pd5X1671S51eK4MTCxu5IYGgVTH6QdglZUmnD vxUcwQhU7FcjCVkt2owiAiR1HX9VD4c770/ybiuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KsF8q6bqF n561Z5LeaG3uFuZXf0mWF2e6DRM05PCVvSPwAboOSn9nKIAiRdnqckZYI0RYrrvy326b/PYp75C/ 5Qby7/2zLL/qHTL3WIL8say+TrbUGHxavPd6oTWtVvrqS4jofARyKB7YqyrFXYq7FXYq7FXYq7FX Yq7FXYq7FUDrGiaZrNoLTUofXtw3PhzdN6FeqFTQqxBHQjIyiDzbcWaWM3E0UcAAKDYDoMk1OxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KsGTU20v8kodQQ0ltvLsckNOplFkPTA9y9AMVZXoO mJpOh6dpaU4WFrDarTpSGMRin/A4qjsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVYC/5qgTWaDSmAmvbuzu+U4DQpaarDpPqAKjCQtLcq/Gooob4iaBlWV6 j5i0/T7j6vPFeu/ENW2sL25Sh/4sghkSu3StcVYfqtvcw/ll5W0i4t5UluZNDsr2MIxaJVlgacOo BI+GJk37nAZUzx4zK6rYW9DwsHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYqx2P8vvKSSwSiydntrua/hL3Fw9Li4nS6lY8pDyVriFJeB+HmoYCoxVkWKpN 5m1LUrOKwi05oY7m/vI7US3EbzIisjuW9NJISx+Cn2xiqn9T88/9XfTP+4Zcf9l+Ku+p+ef+rvpn /cMuP+y/FXfU/PP/AFd9M/7hlx/2X4q76n55/wCrvpn/AHDLj/svxV31Pzz/ANXfTP8AuGXH/Zfi rvqfnn/q76Z/3DLj/svxV31Pzz/1d9M/7hlx/wBl+Ku+p+ef+rvpn/cMuP8AsvxV31Pzz/1d9M/7 hlx/2X4q76n55/6u+mf9wy4/7L8Vd9T88/8AV30z/uGXH/Zfirvqfnn/AKu+mf8AcMuP+y/FVNU8 5PcSWy63pRniVHkjGm3FVWQsEJ/0/vwb7sbSYmr6NXX+LrSMSXWvaRbxsyoHl0+ZFLuaKtW1Absd gMBICYwMtgLWW8nmq5mngtvMGjTTWrBLmKOwmdo2PRZFGoEqdu+IIWUJAAkUCiPqfnn/AKu+mf8A cMuP+y/Cxd9T88/9XfTP+4Zcf9l+Ku+p+ef+rvpn/cMuP+y/FXfU/PP/AFd9M/7hlx/2X4q76n55 /wCrvpn/AHDLj/svxV31Pzz/ANXfTP8AuGXH/Zfirvqfnn/q76Z/3DLj/svxV31Pzz/1d9M/7hlx /wBl+Ku+p+ef+rvpn/cMuP8AsvxVRhvvM1n5h0/T9SurK7t76K4ettaS2zo0AQjd7m5BB5+AxVke KuxV2KuxVQvpZ4rK4lt1VriOJ2hWQkIXCkqGIBIFetMVeOzfmz5gvl8uS/U9OH6UuNHtYVljlke3 vNUtIbk3gAlSsMYuWiVNiW/b3xVknkL8yNY8x6za291b20Vpd2P1hUhDmVJUs9MunYuzFWjc6qVX 4QQFU1PP4VXouKuxV2KuxV2KuxV2KuxVxFRTFXnUXkHzfBpsUNtq7QzpHWVY7y6VJJ5boyzvzYSF SYfhVirfESeNd8xxil3u2OtxGVmO3uHKqH2/2pjo/lbzdZxambvVZLq4mt5LbT2N3LwVSAI5CGib 05UA3ekhY77dMlGEhe7Vl1OKRjUaF2dh+vcfJAXPk/8AMF71JotXVUhhhSD/AEy8VRLDAql5IaMs oabkzK7Gu1TsQwMJ97ZHVaeqMep/hj39/TZMP8Ia3P5ah0W/uBerdXUcurtc3UszegpVmjhkMSk1 ZKgcUA/HD4Zqi1fmoDIZxFUPTQA389/1pz5U0O+0ixuIr+6F7dz3DSyXVKM6qiQxF/8AL9KJOXvk 4RIG7j6nNHJIGIoAcvtP2lOsm47sVdirsVdirsVdirsVYT+Y/nTW/Kotr+C1D6KsU5vZzD65a4oP q1uvG4heL1CGBk9KQdK064qwi4/N3zFBqWpG7tNLu5/L0ToLmFJlEr3GmXuoq8LNLJwiX9HrHIPi 5fEarxoVWSaJ+Y3mC680WWj3UVm0JupdPvJIY5FeSRJtWjWaENK4RANGHJG5fbb4vg+JV6TirsVd iqyeCG4hkgnjWWCVSksTgMjIwoysp2II2IOKpWfJ3lEoEOh6eUWAWgX6rDQW6mohpx/uwRUJ0xVF 22i6PaXTXdrY28F20SwNcRRIkhijACRl1AbgoAovQYqjMVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdiqDudE0a6vodQubC3nv7dGjgu5IkeaNH+0qSMCyq3cA4qhrfyl5UtvT +r6LYw+lHJDF6dtCvGOavqItFFFfkeQ6Gu+Kqtr5d8v2kttNa6ZaW81nG0NnJFBGjQxsSWSMqoKK SxqFxVMMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirzmD8yvML35099IBubd7lbplEnB/qJkadIfE+n6PA9y9O2Y/inudtLs/Hw8XFs ar/Oqr+35OtPzH1291Cw0+2g09pL6WNUujLJ6HGW1Nz6YIBJkj48W92XYVxGUk1smWghGJkTLbp1 518v2rdC/MnWNR19IJbeJbT0rplsoAHnmeIwGNYpHdI3b05udAfs1qAejHKSVzdnwhjsHexueQ58 /kmGtfmK9jd3cZW3shZQwySW1+5S5ka4QsvpJF6gIjagf6dxSuGWUhqw6DiA5mydxy29/f0SWy/O S6ntri4exhKwWrSBY5OdZ0kRH5MCVjRRIGPKgp0Y5AZy5E+ygCBZ3P2fj+xNNW/MbUdM0HSdSks4 JpL15frKQTLMvCGQR/ujEz8mfko+EtxPiKnJyykAFpxaCM5yiCdq5iuff+Agrj82by18vWupzW9m ZbmdlSOOcSBoUSN2HKMuiSD1dwz12+ya0ETmIFtkezInIYgy2Hd13+zb9rVt+Y+pajFJbzy6dZRX Edw0VwJ5ELxw3DWzLE4K/vjx5rQ9Cp77Pik9yZaCMDY4jVdPK9/LomHkHzhdz+Wpkv1W6uNH02zu TJA5kkmSW19UB+W/rVQht9ycnjnsfJp1ulAyDh2E5Ee7f7kK/wCZ1+sMUsSWF2HhS7C28rsZFd4k +qxeNwnq1Yf6u2+0fGPk2Ds6N16hvW/x3/qqvlb8wNW1rzTBYzi2tLJ4roiHdnkeL0GjCScuLNwm 5UXtWoB6GGUyLHU6GGPEZCydv0/qT/TNRuHn8y3k8hDWNwbeGF2PpxxQWySqSor9tpWYt1II8Bkw eZcXJjFQA/iF/M1+hhdr+aPmhLG2uJraxuYp47ZnnWQxBJb4zNFExcogESxfES1PfeuU+NJ2Euzs VkAyHP8A2Nb/ABtkfl/z5canc6j9Yghgs9Mt3a6ZJeUpmiVTIUT7Qi+JuLMATQEV3C2Ry24mfRCA jRJMjt7v1/j3xby/+YuuWGnW+jzwRT6nWIJNc3LMKzQi6k9eSQ8i371VVVqeoHIrQ1RykCnNz6CE pGYJEfIedbfJHXn5qXP1bWIbS2ne4i+tmGdjCDbiIOkZCqsiuplioGNQWYCp7SOY7tcezRcSSK27 9/wE18v+etTvtQ03R/0e3r1ni1C4nljD/wChcIpXCJtyMr9B4H5iUMhJApoz6OMYyne21UO/l9jI tNv7s+YdW0yZ/Vit0trq2f4eSpc+qpiPED7LW5IrvRssiTZDi5IDw4yHWx8q/Wm+Tcd2KuxV2Kux V2KuxV2KuxV2KuxV2KuxVoIgNQoB33p49f1YramLS1BUiFAUJZKKNmPUjbqcFBlxHvXLbwIQVjVS CSCFA3b7R+nvjSDIukt4JDWSNXJUqSyg/Ceo37Y0okQ0tvbqSViQFhxYhRuCa0P0nGgvEW/Qgog9 NaRU9IUHw0FBx8MaXiLRtrYoEMScFJKrxFAWrWg96nGgniPe0LO0ChRBHxBJC8VoCwoe3fGgvGe9 uK3t4iTFEkZYAMVULUKKCtPDEBBkTzcLW2HGkSDgSyUUbMepHgcaCeI97a28CEFY1UgkghQN2+0f p740gyKmljaJdzXaRhZ7hVSdxX4xHXjyHQkcqVpWm2NC7SZkgDoF/wBXt6EeklCQSOI6rQKfoptj SOIrhFEOdEUepvJsPi2pv47YaWy16MNQ3prVTyBoKg041+dNsFLZYta/l1pUGuz6iZC9rNWmn8FW IBiH4MF+FkWSsijjUMa1JrWsYRdubLXyMBHr3/jy29ye22gaHa3Qu7awt4boGQidI1V6zNyk+ICv xt1yYiA40s85CiTX6lW0023trm7uk5NcXrq88jkE0ReKIKAUVR0HzPUnCI0xlkMgB0CKwsHYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXl2ofmnrWjvaWmorYT3F9r0GmwXcXO3t2sfUtobuZFlkdneCe4eE UYcuDPxCqwxVnmp+YYtPufQaxvrg8Q3qW1tJMm/bkopXbpiqN06/ttR0+11C1Yta3kMdxAxBUmOV Q6kg7jY4qiMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVUp7mGBoVkdEM7+ lGHYKWYqW4rX7Rop2GKquKuxV2KuxV2KuxVJrXyV5NtLYWtpoOnW9qJ0uhBFaQJH9Yi/u5uKoB6i fst1GKpziqReQv8AlBvLv/bMsv8AqHTFU9xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kpb5m1KfS /LeranbqjXFjZ3FzCsgJQvDEzqGAKmlV3ocVV7PUIpbSCSeSNJnt0uJUqBRSoLNQmoUHviqIt7iC 4gjuLeRZoJlWSGaNgyOjCqsrCoIINQRiqW+Wdfi1vy/o+qkLBLq9jDfpalgWVZY0kYDuQhlUE/LF UZpuo2Wp2EF/Yyia0uUEkEoBAZT0NGAOKohHR1DIwZT0YGo/DFWGL5g1DV28o30CSW0U+t31tewx OxRobaz1KJfVICgqZYI3owpy49wMVV9auBrj+XbvTEkuILLXpY7pwjfuzZpd2kzNXoqzJxr0O3ji rJLHUbK/SV7SUSpBNLbSkAjjLC5SRdwPssCMVUb3XtKtI0klnVlkuorAGP8AeUuJnEaxtxrxPJhW vTFVO58y6NbLctJPX6pe2um3IVWJS6vWgWCM7ftfXIjUbAN7HFUyHKrVIpX4aeFO/wBOKscXz1Yf pw6NLY3cFz9dWwSR1i9NnkgmuEkDLKx4NHbN1HL7NVAYHFUZB5jEvmi58vnT7qN7a3W6/SDegbV0 chVC8JWmVixYDnEoPB6E0xVOMVWRTQyqWikWRQSpKkMKqxVht4MpB98bSQRzSXyF/wAoN5d/7Zll /wBQ6YoT3FXYq7FXYq7FXYq7FXYqluia3Fqv1/04mi+oXk1i/Ig8mhpVhTseWKplirHPzBa8XyxI bNpFn+tWADQkh+JvoQ/2d6cK19sQqeW9/Z3FzdW0MqvPZMqXUY6ozoJFB+aMDiqXL5ls11fVrG64 WsGkQW1xNeyyKsfG59XryoFC+j1J74qt1/zZpuj2OuTtWe50LTTq11aKCrGArOY6ORwq5tJB12pv 1FVVLV9S069vdV8s6inpWR0r6xeXZkCKIblpoHXcfDxWInlXHkkAk0OaCm0Nm1x9UiuI00Y6CbFL supUH1OYkr0KiPflWmN7Lwm6rdd5bj1Owm0HSIJBd6Fb6GFe+jQGKS4hMEcTK4rTnHzYLXG7UxIN FZo3lZ9M1Tyqti/1jSNE0G60oXTMpZi76f6BIWleaWjklRT7xipFKWgeV73S5PKcEd8lxaaTYXdv cOrcfWaT0PTdUFeQXgd67V98bXhISzSbNdBTyxFqOsWVqmj/AKQ/SKPdRoG9blw2bjy4ct+lMKFP S/zM8kWdnp0GmalYWtq15cm+tLm9t1uY43eWQyejGZmYPK3IUI2I7GuViRPRyJYoRsGV7bVuCpaR +Y+hWtpBDpdtcLFJql3PexLFcXb+jdzzXLzJ9WguA3qSy1WMEHsNt8Ny7lOPGL9V+nah17kJqGu6 RaxWUUFprdtz8wfpJBd2EsRuHmleQwwl0hHxl/gR/j8d8Il3sDgP8Pq2vbp71fTb9LxL6G28u63f ga4NTk5pa2ginSWNxGPUnBbgQDuBXuQN8HH3MvAr6jVx4gpatqevxwapPb+WJ7ZtQ1rT7q5fVpbf 0heI1lbWscKxN8QZ7eGjB2UPX4vBsnkgQjGjLcEdD8rT/wAseWvNeo2k7efpxcTmd3gsrOZ47QxO QwWSOMr6gX7HGRmUqNwWLMZtKcJ5D8tJfvfiK5Ny99+lCzXt4yi79N4vUWNpiij05GTgoC8aClAK BUx03Q9N02SSW1R/WmjhilmmllnkZLZPTiDSTNIx4ivfcksasSSqraneGysJroWs14Ylr9WtlV5X FaEIrMgJ70rgJoM8cOKQFgeZYD+Xawf4n1MwaSumQAXCwj07qNyv1gEpRnltDwJo/Agq2wHHKMX1 Hanaa+/DjcuI7d3d/pmVeQv+UG8u/wDbMsv+odMyHUJ7irsVdirsVdiqFutUsbW7s7OeXhc6g7x2 acWPN442lYVAIFEQnemKpf5b8wfpKwM92YoJn1LUtPt4wePqfULy4gQKGNWcxWvNgPc9MVS2586G SG0ltYAofXjoswkYnaOWSJ5F4levCoBwqumktfKlvJLaH62dY1yJbgO4/dyahMkTgUB+wNwuBVT/ ABhP6OpyJY+s2n61aaOI0c1ZLqW1jac/C1PSF2XI8F6itQqhNR83XMMmu204s45NP1GCCwjubn6l 6tr9UtbmWYyOTy9N5pd1FKLTqDUSutmzEIE+o0GJ675w0C2t/Nd9pmuxzS6xNaT2M+mi5ueKQRww SVkto5FFTEw+EmtR44bphGJJoblW1zzRZatJ5nspNN1iawu7O2S4WCwNvc28ZEgDuLqSJyH34j0+ x27mJsb9G2MYzAiNpdSTsj9TvfMFzNrd5L5Wgso73S4rbUrnW7+FbRLOE3LD1ooRL8IFxKZPjHw9 SMST0WMIijI9dwOdfcs1a585C81ZtTn0G19HSvV1G19O8vaWSmUmQgfVC3Ihxx5dveuGj15I44ge kESvnfRBaymo2DQR33nGGKS+sktbPSbLT/Sie3kLcKRXE92q1C8eZqafdkTQ+5sx8cwaG49V9fms 8v8Al39K3Og293rersdQ8vC7VY5rOCGK3LQA2qxQWkXJT6w+Jmr8NDkuANfjzqr63537+acaR5B8 qX9tpM9hrWozaDd2gurXS2vbqKOeF1Vo5VjV4XjRROCyBQKleQqBg4e7kylm4geIXMm+JCad5c/K /ULvy+lv5bhuLPXLS5uoGuy0gRLf0qK0EhlRuXrV67Uw8A+TGWombs/Vz+CroWmfl2tx5YGmaBFJ HqJvTbXk4HrIbcNy9Wof1t6hebfCOmAQA+CZaiRvpxc68lfRNWvzZeTysnpi917U7W6VAFWSGG31 MxowHgbaM/7HJFpRzR6n5dh0SyMyyNqPmO+aVl5EfV76W+vUTem6qyKe22KttpXmmG3t1ZnnkbzF JduTIJeGnvPIyD4yeKrGV+FenbFbLf6B8w6lb3Ed3K0TQeYY7+2MrH4rK3mjkVV4V2KqQoP04VTG Dy9cXdzrkesM81jPq1pqGlJ6rHglnBZSRgCvwAXlq78Oh6/tYFZAqBSxFauampJ7AbV6dO2Kt4q7 FVO5FybeQWzolwQfSeVS6Bu3JVZCR9OApjV78nl+jeXBfeeryaHVIlhttQnvBaxI6sJIbpTMDG0c YZ258WmEjfC3GnEimPGNy5u6y5+HAAY84gX7xt1+yhvvzZv5C/5Qby7/ANsyy/6h0zJdInuKuxVp WDKGHRhUdtjiqlZ3lpe2sV3aTJcW06h4Zo2DIynoVI2OKrNM1Ox1OxivrGUTWs1fTlAK14sVOzAH qpxVhB81aKLby/rXmyU2F3Be6h9WlK+jBGqvPaI8/qfZVoioU92IwE0zhj4gTY2/GyGl8yeWrq40 Q+W9L1HUkstUu9Qh+qwNDBJdXMF4sw9e89GJizXcklFfbrsBTBxXyZnDV8Ro1fvt0F95uljCaZ5Y 0/S4ZNVkJfUZ3u5Rdu7PLciCNEUDlWjLP8qDfHiPcvhxHOX8N7d/cghoV6Y55E83QWwn1xItRS00 1YkN+8iq6xm5N5KsvIr6bh+IOPDXJPi8X12ajQ/QuP5c6deRamBdya7cw61aLItzdXtI4vVtjdrL H6ogab6szUdYx2+QeG+ajKI1wWDVHztUvdL8taFYeYLjQbNILzTNWsLEtLb2zJCLlrOWRLX4GIje O+PLlvzLHr8RIG7Cc7AFAV9vvT3zNDHFp3mSWyJ1q9kktDNpM8YuYomHpgKsQWu8Z59T44ODvZeO QBw+kx6jmfejvMvlH67p2vNpbi31fWrSK1Mzuyxj0OfpGqBmWnqtUgZJpW615RuNXuvM0VxciLTd f0WDSE4EtJE6m9E0nAjh9i8TjvvxNaUFVUR5k8qw6la61LbUXVNU0qTSkkkYiIKRKY+QAYj45jUg HbFUmuvKay+d/L9zciGaK1014pIGQOD9X+Co5DpzuVI27ZGW5DfiJjCR90fmb/QzOCztLdIo7eCO GOCMQwJGqqEiFAEQADio4jYbZJoYj5Z8p6tpM/k2O49ORNC8uz6TfTxNVPrLHTgvAMFdlb6pIQeP belcVT7QPLmn6NpWnafEomOmQ/V7a5lVTKENOVGAFOXEVp1piq7RvLmlaTYWdnbRB0sPU+qyyhWk T1mLPxagpXlTbtiqZMiMVLKCUNUJFaGhFR9BIxVDX2mWN9JaSXUXqPYzi6tTyZeEwRow3wkV+GRh Q7YqisVdirsVdirsVdiqG1IakbGYaY0K39P9Ha5V2h5V/bCFWpTwOA3WzPHw8Q4r4fLmxHyl5P1j TPNup63qYglm1CNwbm3ldh8UivwaKWPmtKfDxkoFFCOhyqECJElz9VqoTxRhG/T3j9IP6E68hf8A KDeXf+2ZZf8AUOmXOtT3FUNqUUkunXUUY5SSQyKi+JKkAYqxTRF1XRbTys2pSCw0XTvL8sWtNPJH HDFeJ9RWD1CzUqqrOAenXxGKsS8ta5qKx+VbDy6FvZdPsLm3Iu5JrG0u2f0v3tuzRu1wkAjYsUQ9 fhJ3okhlHHIgyA2CN8p+XfMU2kaJZ3+p6rFpl2Lgm10+JdNW24sz0upmL3Z5sSEaNkr4ZETutm2W Dh4rkLjXx9yI8reWtIguvLmp6DZPKj32oR6tql1FC14ywpcRKJ5lBYqJ0AT4vDCBQa8kxI2AB7mT 2XHzSNL1Yg2h0PWdR4wg+p6pszfaRu1E48w/q9DT7O/XCwSxYfNrWtvy+tCRfMsrv8bA/o36xLwr Q7w+nx26UwqjtP8AJpeK+i1Fyqya4dZtTAwqRHIksQfkp6tH8QH34qnel6Na6bLqEsDOzaldNezh yCBI0ccRCUC0XjEOtcCqv6K02tzW1ib65KlxdBkBEk0aoiSOD1ZVhQA/5I8MVSzQ9KvbTzD5kvJ0 C2+o3NvLaMCCWWOziiYkDcfGhG+Kp7irsVdiqVKGl81yFm+GysU9NadTeTPzJPt9UXIfxfBv5Yvf L7h/x5Ncm0OxVIfOvmOTy/oyX0SpJM1zbwpA4JMokkAkRKMvx+lyZeu46HIZJ8ItytJg8WfCe4/j 5sK/5Wl5iVgv1ezkA4/vVDiORJVmX6wreqwWC3nhCPISQ9duGU+MXYfybj75fituXMg7Dp5pnffm hc6bYWclxYRzXE9pJevWb6qHjExjhEETCZ3eVBz4122BO+S8ahyaodnCcjR2BrlfTe+XJo/mlc/p BrOLTra75XEVrFcQXtIOckAm+KSSFBQ0f06Cr8dl6VfG8l/k0cNmRG1/Tvzrv919yG/5WvrIKsdD ikMsFtNHbJdNzT6wgdecjRAfF60KBeGzHckHYeOe5n/JsP5/U9O74+RPuVm/Nmc6fJeQ6OJPTihl aM3QVv3mnPqEmxj5BY1RUDFfiJ28CfG8mA7MHFRl39P6XD39fsRUf5nLPpuo30NkkaWVi97H61wD yYTvFEjeksgj5qgb4mHWgqAWD41hiezqlGJPOVcvK+v4+5vS/wAxtS1LVYNPg0eNTJcJbSSveUpz t2uvVVBCZDGYVqjMq8q08cMcpJqkZNBGETIy6X9PnVc+d8+dIa6/NKdNXjtYbS0Ns88lsry3TJzI nMUciyCJ03WN24Lyr0DcgVMTm3Zx7NBhZJur5eV9/wCr5bst8ra4+u6Baau1uLUXitIkIkWaiciE JdQBUqASO3Ttl0JWLcHU4fDmYXdfBNck0OxVIvIX/KDeXf8AtmWX/UOmKpzcXENtby3E7iOGFGkl c9FVRVifkBirAtf806o3nSys/LZbU5rvSJSttHKVggaeaFoby65AoqLGG47F2rRVoScSkd9bKcHl K2bzhpdv5tkPmXVrqwvLuO7uFSO2tvqUtrFwgtUUJVvrnL1GPIFailRxjw97bLMdxHaJN1zTHy3c iUeUm0Sx9Py/NYXTu7qXaD+5MKeq3Jl51fau9PbCIgMcmaUySTz5p35OfW38t2ba2GGqH1PrAcAN /etxrQAfYpha0fpmmWOmWgs7GL0bdXkkCcmb4ppGlkNWLHd3JxVZo+lW2l2kltbqVjkubq7YFuX7 y8uZLmQ1IHV5jt26YqjcVdirsVdirsVdirsVdiqU6Pxk1TW7ivJvrUcCv24RW0R4j/Vkkk+muQjz Lfl2jAeV/af0Um2TaHYq7FXYq7FULp+l2WnpMlojItxNJcy8neQmWU8narlqVPYbYBEBnPJKdX0F IrCwdiqF1PS7LU7NrO9RpLdmR2RXeMkxsHX4oyrbMoPXAYg7FnjySgbjzRWFg7FXYq7FXYqkXkL/ AJQby7/2zLL/AKh0xVin5haprsHmRtL0+Ge/XV9HmgSxgcH0wstbm6MZJoUhbihK/E5VO5xJoJjG yBytb5f8u6Pot/a6Tpemenc3ugXN1Nd3K1v3nLwIRM5Lbt6m61otABQCmAAHdslKUQYXcb+HvZh5 Q0trPyzoMV5brHqNjptvayFgpkjPpRiWMMK7F4l5AGhoPDC1IvQdGtdE0az0m0Z3trKNYYnlILlV 6cioUV+QxVH4q7FXYq7FXYq7FXYq7FXYq7FWO6l5pu7FNdkexSSPRrdLlGWcn1Q3MtG/7ukThIw3 H4tmWtK5WZ1fk5ePTCXBv9Zrl+3f7OSXaf5vtIdI1Z9PsLiW7s7h3FrcGKNp5bu9liVUeNph/fI0 a8t9h23yImKNNs9KTOPERRHMXtUQfLpunnlrzAuvWct9DD6dl6pS0kLMWkUKpYsjKnBlcsjLvup3 ycJcW7jajB4R4Sd+v4+1N8m0OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KsS0PVG0n8p9P1RYxK1hoMN 0sRPEMYbMScSd6V44qxjyzf3HmbVNZ1IJLBqWt6VOdDk9UrHFYK4t4KUrvJMjTq/ZXx4Rds/EPDw 9Lt6Rottc2ujWFrdP6l1BbxRTyFixaRECseR3NSOuLBGYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUA3 l7QGa6dtMtGa+FL5jBGTOK1/enj8e/8ANkeEdzb4+Tb1Hblvy9zUflzy9ErpHpdoiyMkkirBEAzx sXRmAXcq7FgexJOPCO5TnyH+I/NGwwQwoUhjWNCzOVQBQXkYu7UHdmYsT3OSaySea/FDsVdirsVd irsVdirsVdirsVdiqQHz55T52iDUFY31xLaWpWOVlaaC4S0kBZUIQC4lSLk1FLMoB3GKp/irDtMk hj/KCzknuHtYI/L8Ty3MShpI0WyBZ1U9SAOmAhlCQBBIsdyeaLpOmw29heRKJbmOxitI7wgK7QKA wBA+EVPxUGEIkQTYFJrih2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV58v5VTm4t5ZtWRhHqF5ezqlqV9SG71SDVvRBMzcWSa2CepvVGPwhqMFWXaj5X8s6nc fWdS0iyvbjiE9a5t4pX4jovJ1Y0FcVQ/mGfR9O0RNPuLF57C8A02LTrRAOSSRsvpIoaMKvpqRsRT FVCLzPJFEkUfl7VVjjUKi+lDsFFAP77Cq7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/F lx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2N K7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof +q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/ 8iof+q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1 L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NK7/F lx/1L+q/8iof+q2NK7/Flx/1L+q/8iof+q2NKq2PmqK51OHTptOvbGe4SSSBrqNFRhFx5gFHfccx gVO8VdirsVdiqld3KWtrNcurOkEbSMkal3IQFiFUbk7bDFXnWq/mj5Uv20OQW2oyLLPYXGnNFHCF lvL6BZLayJklWkrQ3Su1aIB1fbFWReXPzF0LzBqUdjYRXKma2F3BcSoqRuPRtbh4x8ZcOkeoQlgV A3IBJVqKsoxV2KuxV2KuxV2KuxV2KuNabde2KvOovMv5lQ6bFO+nrPI8frzepZzq8ZmujEkXpxOz ERR1duKs/EDbflmOJz7nbHT6cyq6/wA4dBfXvO3d9yY6P5j863EWpy6hpsdv9St5BBCLe7DyXKAB SDR+cUhqQIg7Add+sozlvYasunwgxEZXZ748v1++ksm81eeYNWMkWiyMDb2xuVNndsZWSD1pIomE rQxN6kpQHfoalqKDHjlfJuGmwmNGXU/xR76vlZ5Wj7q+82an5WgSdZbHV7+8hjtp7GC7jFvFzRjJ Mkg5gABlb1Aqn5b4SZGPm1RhihlNbxjE8zHf3fsTbyZHrLW9/e6xHNb3t1cmtpJLJJHGsSLGfRDs wWN5FeRePUMO1Mnjvq0aswsCFEAc6+/zqgyLLHEdirsVdirsVdirsVdirHPM3nzRfLuo2ljfK7SX NvcXbOkluoigtFDSOyzSxSPs2ywo7bHbFWLT/mp5Tm1lLy7tdSs7rQ4bj65DJFD+5aa1lu1ilCSu TJJb2DunCo6BiCyjFWQab+ZWi3+r2mlLa3cF1dO8D+qsXCC4je7j9CVkkf4mbTJ6FOS7D4viWqrL MVdirsVUrqD6xazQCRovVRk9VOPNeQI5LzDLUdqgj2xVgqfkv5cSLT401DUFGlizeyIkg+C50+OO G3u6GHiZlhhWM1HAr1XfFU38ufl1oXl/Uo76wluWMNsLSC3ldXjQeja27yD4A5d49PhDEsRsSACz VVZRirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSDzV5M07zQkdtq1xO+ mJvJpieisMkgrxkdzGZwy124SKPEHFWPr+S3lhpbqW5vdQupb+Nk1CSWWLlO5tp7NJXKRJR4re8k RONB9kkEqCFUz038tdFsNXtNVW6u57q1d539VouE9xI93J68qpGnxK2pz0CcV3Hw/CtFWWYq7FUm uPOXlq31o6JNeqmqKYVa2KSVBuDSGrBeI5nZTXrtiqcllBAJALGgHiaVxV2KoaDUrKe/urCKTld2 axtcx8WHETBjH8RHE14Hodu+KonFVk08MELzTyLFDGpaSRyFVVG5LE7ADFUHruvaVoOlzarqsxgs Lfj60yxyS8ebBF+GJXb7TAdMVR+KuxVLdS8yaJpmoWWn39yLe51BZntQ6v6bLbJ6kpaUL6acE3+N hiqYSSRxRvLK4SNAWd2ICqoFSST0AxVBaJrmna3YLf6c7yWkh/dSyRSwhxQEOglVCyMCCrDYjocV a1vX9I0O0S71W4FtbySpAkhVmrLIaIlEDGrHYe+2KqT+adBXUb3TWuv9O063F3ewBJC0cBHIOaLT cdKdaHwOKpfH+ZXkaWwN/Hq8T2okhhLqshPO6HK3+ELypKPsGlG7YqnFjrekX2lJq1peRS6Y6NIt 2GAj4qSGJY048SpDV6d8VRuKuxVL7HXtKvtU1DS7aZnvtKMQv4jHInAzqXjozqqvyUV+EnFVbUdU sdOSF7uQxrPNHbQ0R3LSynii0QMdz36Yqh9B8x6Lr9jHfaTdC5tpAWU8WjfiJHiq0cgR1BeJwKrv TbFW9H8waVrH1k6dK08drI0Mk4jkWJnVirelKyqkoVlKkoSARiqY4q7FXYqhr/U9N0+JJtQu4bOK SRYY5J5FiVpHNEQFyAWY9B3xVE4qpXV1a2lvJc3UyW9tCpeWeVgiIo6szMQAB74q3bXNtdW0V1ay pPbTossE8TB0dHHJXRlqGVgagjFVTFXYq8m1n8vvOl95r1/V1t7Zk1aa3hg/3JXduq2UFs9sfUig iAd+Uzyrvt0B3NSrFrj8vvM+o69pHlO8u+F9YWE895rUV3dyAzSzwxJcqJBQXP1WBv3a0C8hvTFD J7f8sPOtzpF9Dq2pMdV1TUrV7+9gv7lQbGC9eeT0kRIvTYwv6aqeX+sAAApUNX/KjznLdX66dfC2 sDdmfTIhqF5yWC201re0gfkGIDXTCR/ib4a091UN5d/KHz7ZeaLZ9T1P615ct2t3jRdRu/X52kds iO6tEQa/V3oEdftEVC/CVUPqH5M+e76edp72G4tr5vUvLe5vrt1Al1cXbxRqUccVs4I05Hckt23x VUj/ACm/Mm4u+eqXljc287Wa3ii5uPjit9SN5IvFoio/dRRRIFoFUcfFiqyjzl5B806trGv6zpl8 ba9bToLPy4DdXCRxT/vRdTPGtUR2jlCRsAaH4qA74FY5d/lN5+LlLG9SC1WOBFjl1G4lNTfx3VwU KQQ+nVPVRlA4sONFWmxtChqn5OefNX07RLXVJ7C6exSZ79nuLj95PeapDd3BU+mWp9WhMYB6A0Hj ilNvM3lbzJbaf5zDv6n+JY49J8uWUcs07xllaNTyVIhFGIwrlW5cSG+Oh3VQ11+U3ncLqsNhqSQI tteWejSLdXEZaC5hghto5FQD0ltfTkkPHlzdq9zVVkvmXyNqiaZ5Y0ry7DHcWOjanDqd59eu5fVl NvykUeo6TszPO4ck9KbDAqUTeV/zSebzfdpa6Ul95ntobVJRdzcbdILN4F4j0Kt++lZ9z098KpPb fk/5utLG108RWl1FFqVhey3n12e3uWtNOtPTtrP1I4SU+rzk+m6U+HenKuKsiu/yz1x/ym0ryYJr W4u7ae1a/cl4IZIY7sTzopRCxLJVeTLV9ydzgVKZvyj81HTrWCO9IN9f3k/mGIX9ytbV2m+owwSO k3FYFlHJQoJbflVVYFVth+V/5hi6tbi+1FZLttSS51O5N/PJFLbQTyPGn1YwpWsUxC/vOSsF+Ljs qq/Xfyo86X+ueZtZtr+O1vL43rabJFdXCep61lFaWqSqiqI/QCOxI5cmp+yMVVLX8ufzHt7a2rfW 73UGsS6i7C8ugrW8Vn9Xs4SDGQ3F0R2DDxNRyIxVf5B8h3v5eeXdfvdWjgnupra1gtzZPcTvJ6Vp HAY+PBWrJdcmHH+au2Kpfo/5N+abDQZPqt61rq0Gi2dppQF3cBEv2ErahM6KWjV3E3pxuAeP2qA7 4qpr+Tfnj9KS3qambe3a8huLewj1C7EUEKTXF00MdFHRjbxbUrR22JGKsli/LbXLny15K0HVbxng 0djJ5ikhvLlWuKW8iBFdfTZ1eaQE8qUUUB8QrHUs/wA9b++lMwutKW7+rRLJFNaPBAraiTMyxcmI EViigftMdyatxwqhdP0X84tYuNAtPM9hdyada6nZXc7ST2lPSSee7ka4WN/3hjZYI1XoqjYEtiqr e2P59XV4LuKa8swBcveWsclmYnlh+tvCluGLcI3X6rEpJ+IlmYfDXFU2tdG/NZvIPm/TdUe4v9Xv IIbDSGme2+JHtI4J5kMbDj+9aRzz327nFUDp9h+aFnDo1hqFxeaHolhHI+rapHJYlEe1njjT0/Ue kVp9Wi5IrRv9puSk0bFURotr+b82geW557m6mu725tn1KMmKNYrGFVRjNIxSRJJgxmPFH6cGFeqr 2DAr/9k= + + + + + + uuid:B7D572641149DD119EEFF96D7801BC77 + uuid:b46d8aee-c25e-b541-956c-22fa803ac69c + + uuid:d81eb84f-0775-844f-8950-327b309a2838 + uuid:BD14D8DC7C16DD11BCFFD65EC7B1D34C + + + + Document + + + 1 + False + False + + 23.000000 + 24.000000 + Picas + + + + + Minion-Italic + Minion + Italic + Type 1 + 001.001 + False + MinioIta; Minion + + + Minion-BoldItalic + Minion + Bold Italic + Type 1 + 001.001 + False + MinioBolIta; Minion + + + Minion-Regular + Minion + Regular + Type 1 + 001.001 + False + MinioReg; Minion + + + + + + Black + Red 2 + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Lime + CMYK + PROCESS + 33.000000 + 0.000000 + 72.999992 + 0.000000 + + + Night Blue + CMYK + PROCESS + 100.000000 + 50.000000 + 0.000000 + 0.000000 + + + Pigeon + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 30.000002 + + + Red + SPOT + 100.000000 + CMYK + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + Red 2 + SPOT + 100.000000 + CMYK + 9.000000 + 82.000000 + 60.000004 + 14.999999 + + + + + + + + + + endstream endobj 60 0 obj <> endobj 266 0 obj <> endobj 271 0 obj <> endobj 273 0 obj <> endobj 276 0 obj <> endobj 277 0 obj <> endobj 391 0 obj <>stream +H‰„”{TgÆ'@Bê©é‘1•dÚ|©K][ë…v/Õ­wEQ\•  r   $!1¢¹ +„@  ä& ЀEwźÔj¢Òª]—Uw«=žýâŽ]wÀžÝÿvÏÌ7¼óÍ;ÏïyŸ„H$ztBÔÖؘe»øyüü¼åÑ®€höFD#ÂC”oá¯üç½ÃäwÄÔ3¦¼U zÞ™×6»O¹9_(ñ³²%쥇>`G®^½ê£ÙëÇìùé<6G.–ðrÅìè¼Cù"a¾ˆ+áe¬`³7 +ìØÙ§ÄìXž˜'’Õ×Ø|1›Ë–ˆ¸¼\®è0;?óuBq HÈJÙ„ [$ +A¶!»BN²A"@E‚`$i ±I—‚ØAÚ`~ðO!’!²²„Rº$ÔN}‹Ê{cÁvmFé |ç%õOÀÖÉ`Èm h„+!pb Á•±G:|%„€X øÊå ü‹Ž/ýÂÕ¥ùøvH”?¸£à7€zdp¾£Íœl t9†d¤;Ð 7.Ó'ÊšOT–g1>}¹YWR©cè%dh£Z"%U–ÆóÀ™=Òò + >;Ù¢‘¾ µ„Á¸n´ "/XôɃ2«DŒÏgpql±bŸJÀPdç+ÕK¡Žè³Ã ª«èbTxŒšžŸƒõáTo¼ô’”›wšž[GÌ>†¥Ã[?Rih Çu½dLïT”ñemÜ‘ÅÉxux¿°‘iO”W“¥_õ*dawáºITûèÕªZÌz·ð<@íª&ranVÓTÔûª@#¤8!¹ùY‰!\UTY©¨À ;ZY„ÅüŽ—œb8I8)‚ùëÓ²fÛùöz;ëÜç_ ôS+(yPNïh(ÑÙA)O¡( ¢íE‡3ÓÅTn7÷vDëêé¨ùÆ= +¼cín·•Š +Œµ6ƒ£UþŽþ5¥?Ì?EØ4Cè’üý©,ñHÿ¥kM·¼ »¥­Ùƒ¹ÚŠÄv€^3¯3Ô™¨h—Íb±Z™ŽÜÖ¬è˜ìÌtVÔ®Ì÷>c~òyâ徇§¯±h5Ê‹ð'?©wÆÞ †O!¾;&Qž‰íP}=TUQWnÝpíŸ2ý9‰i»…üTÖÆXnÄ*&>o,¿»cºöÙS®€Tz >;è³S«j¬†ZÌáQfîKKÃA: ÆKºa®4°¨WÓ¡—…åÝ­¼ÓX Á—»o¢ßl€LXCï1w5xYŽV» jJýh×Δ¬¼ö«½¡x™JÙáø²¯£÷–Ôè[µ¡=y¹ÌƒQâ}¬o‰Ì}²9²,.ØŸ^°'Ž¹³çЬ$Á1eSe•µËXèMÇINfn}39ãÿ¡3×ågq»=-Ìr³ÁXo¦¢÷7Œ¶ô:Úš©^g÷Àufƒ¾Akc™Ê«ÊMåTô栮 +·í”¯ÄNl,ÔäêÖ騄@«¼À,Ähp¡IWNÊ`aƒ_7M M¨o¡_ÀùVºqÄ ƒjAgЧPE K˜sH¨Á´åµ­F€Î| Ýän“¥SˆI>Iâì¹¹õ¬Ë‚ÕœÔò4}º÷‘*­Jæ}rÛçè÷™"ú©f—ïh:¡päc™2¾°–Û‹Ú0¾È$}±Œpta¼ï»`(†oÒÅÂ<%V|ÂÒ\ -0Nn­:1«=Z"_äçÖþÞK3y]Q½¤ ³?¾4Ü h÷ç\ ƒ‹'áÆñçSúÛès4ðBò#½07“°©¸bΦçwS 7¨?8³g**ÕÈ@ªtí5„SMß’:›‹0´DMÔ ·¥¬ù%µ”ÒüòH]å,õ–$NÜ,µÓÙã$¨Kå5_}l‡&YϘpGÚ`Pu#c¤†@ú0æ,+ÈЀ |µ"Nw<Ž1éªiý³©›qÑ ©>„yõ‡“‰ÿBà÷³ã=n9çÆ{Ðàû?§$ ²'ŸMên£~øîl@æ^@ĉÈ<¸pséæÒ¿/&Ç+ ⶹƒ¯Âû/¹¿ñnãkò‚Pýš\¶~ÿ§ÿŸ0ó?„´qeW`aéÌÌ› +†ç±ô‚t¥8D¥oX³™[Û×Îœ¹âéîe}5Úóã÷ÌéÔ‹¿eáëñ:\:>é«cLõ36èá­øÛÛðyÜãÔR­B¯Æ8’Ñq@û®}…D¨W¯&UHÜãWIËzÃöÁåÐ;vÂÌ›^ÝÜTîÀ.HVá‹Váo–[XgS‚™@<]]-RHdÒB†:M ÌÑðå ƒÄmn3y«||KÖÜ©NÔG«¨’P¨®%7‡¢) UüÊR³y˜á„‹Èhgqck™³]ï;7B½tÕ3=ÊœJþ…X Wg³hb“¾zD‚àz0äô¢è$NüÜwÐÒë&ü*“'¨@©ŠWÅ+S®ÊnëWŽ¿1êºí§Û:©§]6£3×éµfPSl.7ÍÕ&‹±Öh9Y¯3SëµG-…XAÌîU@¥î2yÄRÞ)Áh{•ç!~–t{ôÁ¥`¤¤ß¿ïN§ÊµËMižSÌ.·ÓÝÞ&—ÚXF­åßúþŒ™–—–˜Œ˜ Œe¤j]\mus\`†cwZ¾t¶jºg’srfkrnok“¯m‚•ƒŒ~„{ƒ~y|kŒÅq¯<Î]vÿ€ÿ!€ÖØp°÷“÷vt[\t‡¡¹•Å÷›ö¨ªû«÷‚‘AOx?Gos’ÛMû²>zžhºåÚ¶«ÝÏGÒ÷ºèFÐJÌ‹w†ørFRÌ÷Ù·¶ž“’“•Šs”¾û:SVAm‚„‘†‘††—‚vzvqnŠ¤tª¹­Ã÷é¹ûg˜Ÿo¢ª¹¬ÑÄŠ{œihly|u{»¨`÷ ¦ž¤Ÿ£¬¦£Ÿ™•“‡}’bƒ‘‰‘›¡§¢w£kdc_û9sÎÄw~¯pqY\SZœÎøw©w’´°ø÷Lhr}l^9¢—iÐñê÷;÷N±Ë°—Ð~{v…€€r‹ŽZŽJvŽiy{~ap}u€t€lŸ½¨¡«Ã£¸Šª–œ‹š3ûûû +kh§i«Ž¥‘™—‰ž…sÚÈy´²¨¬ð¯|šùšû{—÷FÏ—÷ƒ’ü|— Cyÿ ¬ +Ù ÷zø  FÏ endstream endobj 274 0 obj <> endobj 353 0 obj <> endobj 390 0 obj <>stream +H‰|”{TéÆg ÉŒ]6^rÆC'íLt·X¼´UÖ*§ •‹Dˆ¢ÜL¸E„.aA¹&d%á"”;‚E¼ÊŠPÎVÀݪ-ZÝZ×¥ö¼¡ŸíéDÚÓsúGÏwÎüñ}Ïó¾¿wf¾Ça8Ž¯ð ñþuÐ?E‚"1Á-H“©´Ÿ¬´‰q›“Z‰Jþ>;?Èÿ1†ú?„°% ]Öý£ô-·‹4;“ÔJELl²ä§Qk$·lÙàjþLâxD.Ù§V%ËãUß„¨DeR¢22Y½N"ñŠ‹“Ù]*I\%W¦r» …J)IVFFËã#•Ç%‰Gÿ_% ù…-Æ1!£pÌ Ç¶cØN óæa~€cûøX#†1ܬãc[1%–Õc×p÷ÄõøÌ"¯E9nc>“ 5Vbc¹®ì&m»Dø§œ É"…§Çm¥#8LÌðl«W»+{Œ•NAÉ™E!b,ÜøOÿÜ?öGúÇÝMáÊã Œtku¿ãBçð¨øë¾àÍn;7íõfî Þ+ $³ŽÜúm.LóÏ +;)¨Ø$øC¥•Øúž+êbs‰ \ãŠ>rAÎä= 52w÷»Ñ7d15×àþð“qÞ<â1ï@G}ü2s—©G ä€ï:÷ðîÇ«“Y­>ûLN~vn^v·Š5•9dº¥MÝ+;ó að2yëzãðýØï9rJ<¤9u„©O>ä ªÆùBCªíÞx¶qù m•h|œë¢;üYD®Œ¬Ü1—”ŠA)ØŒö¬A«™Öi¦’/ê| ‘Ï!ê[ˆÈ3:-|Äå×f‚& pòÀ¤hV4ZÛuµÿèv落Øìž–=­tÃÍ1F4k|÷„Ú-½þl´ùê6öAìdø'ô/Ã"ü™ìxê1à÷`Ùüû¼zYÑÔõöÆš +=i¶šëé™]÷\%>[>ñ½"{Ë•‰JÓf“i)) Á4¾ |Ë_kn@R*lº„w=·‡<ÛŽN*§–Ÿ£>Y+>•u¾“…¢C×~¬1¥ÅÅ;³å*5™’¡ÉÌ¢Õ猆ŠÏK˜^cMïUñ`Ó1?VAħnI¥‘!©*E8-혨êjìeÊ•&E[>)}I¥&U'‹ãcê;Î[Ú«ÙêÊ‘ÆZ)|¤…¹Kx÷#žœ +ߟ¢Ë$Áˆ/{µ¥57¶›Í¯(-*ŸµÔÖV~VžWΚS’Å +ïlY+=ó©'=rÑðÝËwzáï5÷ ¼ÛðîI=áÙ–|GÅDÅkŽ‰w¸ Àš––ÂÒʪÒ\ZRüúþ®ßy G7ÄG4"º‚¨qÜ2}ƒAAMê®^´„F%è2Ya$w‡wÏ«ƒ×N§-Ÿ›Â›„2–—ÖèŒ$ZÚ+M=1 U™IóÙs“¸µ9-µ–ÍrõEŸWVT*Kô¥†b½Ö¨¶Ä›’Š#t1ÑǃÃ3CòÒÈ|uAÜúT‘˜Xªå‰n ¤:w#2­„{…®ì ·!|€týzï« Û]p!]¿¼mÊÿÇð«™‚»¢—ž¢ï=mlË(Ñ3Ϫòš}•NïÄíEäGè IN`RÆbÄ^«÷£E~½²‘tVôb0U}ø„BS¤->¥Ï<›Ò”ÒCŠ¾•$¤‡Æd"5Y¹'Utð 7a /ÿú—ŸW…1¢7ƒòÈ¢xq¸ºÊbj´ÔêÙ"“þt¹xæÅÀßš²[R­,× ­l¥¾èôÚ$¿1=Ù{±‡å*7½›§<¤½·[Î[-çÙs–F}‡øbkavÛ¬©QFÐáG?f„p€{á7@niOßMÃ!.¹¶ÍË(¹vwFX™FŒçŸñ§ßØók=;b­„ÿûì=QßÔiê)&'Âv°h×%u„Ù{I,12¼© . >®ˆ!…›O[çí­f§y³Ï(Îàc7$[ Ÿ÷5ç1"F»+#ô}g]qQ -9GÈ»‰Ï-ÀùÚ¤ÔµL®%ÕÄXnqQ2ì½í…â¬Dà\9ÑÐ|±¦[¬d…Í\òN½öš´ÿ¼ã¢Nð…!j ¡¡ºNl6æhªXÑxY¡ÐXFÖŒÖó´EÕ*ó‹Nf +ç¹ÁÂþw°Ývì“VÂã=¶Ð¼@84 +?üŠ×4].-?ÅdT_N½.~ø¤ïO÷C»·7³æÃzèÖšö¾®–dßf¦®¼ð¼ö¦ö_÷ý¢”wo“g4MPCIÂiÌnÂs¢nbZhrgP^ËÅ{o¿÷ø±èÙ÷?ø ÷—–Ž›ƒ–û÷~JIL[noÔû³;®bË’˜Ž•Ý´¡€xuƒypf™Ù÷_Ämv¨¢÷õ£wêÙ÷^ÙŽø ëhbe{h^`¡è÷­e…Bm‰–vª†¢ˆ”ƒfût'ÁfÒ¤¤’œ¨N¥š¦Ÿ¢D‘….©•ÔŸµŽ¡_vŒƒŽ³÷òe…B]‰–v»… ‰•ƒf÷ ™vø6¢Œ÷,÷^÷ ÷‹„À÷%½÷ +´å¤ÂŒÂ‘¢û>t´…˜‰mn7j1m:jÚhíkÞ€©‘’˜­¢û[tÄ„ˆ U÷!ûö÷é™vÿŸ€ÿ€t¢÷$øD÷¸÷t„µ÷´î°ì÷û˦·÷µ÷®ê¡Æ’’»“¢ûFtز†§‡„oyBj"sD‰û÷Îu^û +e#g/‰8÷Ž‚¥”Ÿ¸´’¢ûat¾„ŠV÷ ûù÷¬÷’¸½ø™øË÷’¸ü™^|šùšû{¡÷<Ï‹÷ƒ’ü|— Cyÿ ± +Ù øt÷å %ßú endstream endobj 272 0 obj <> endobj 389 0 obj <>stream +H‰|” PéÆ7À.«œ±²l›d5›{önüöÊõü¸*Xàð°((z +H€ð•˜`ùP HˆÄ@bðëDOh=õN¯rZì8:-Ò»+¶×{ã¬Óé½ö®ÓvvfwæÝwßù=ÏÿÙ‡…A ƒ¿'6&)aùö|q¾D¼2Z"ÊŽ—óEùY—oø †?"DóZµ“2-Q?Ÿ€—@P£qÈZô‹†/ÀÃ5[%…%ÒüÜ<9ïͬ·xkׯ_³"p_Ç‹Ê–d +xÉ%2¹à Œ/Î’H %R¾\½ŠÇ‹‰xI¯d¼$L UЫ/Axù2Ÿ'—ò³ùR!O’óÿN‚ }AK!h­„ ·!(šÅAÛ (†’ƒ¡‹Ö AÁñC´*èNpN7¤ +&` ²©Í ýÝÎÌÏ{:Ëüa’°Y&¼mÞ3 bXØîßH* °°é#?.ä³Çnõ~yã'6Ò òaæ´q´_¼¯ñ#ªÈÛØ· ¬Äéƒ+uQzå?„4œœ±Ê5³dûåB¹-’Ð¥ëªZïÛÉ`3|yTkؤ#/(€s‘(©ÁIlCî7×Ï'›ZUy¬Ìr¨f߀‰e¾l¾gêB_ìC°¯ÿ­ˆù;ãˆÿÓ>†Þß žsq½pRoþžØ*ÝF=[/„ý¢ïA¥É󋔨\z@—I¼SÙ~ÏNÞß:d5O6°ú`&ˆªr«ú” +pöðÎùŸØØ>¾¿ïHr‹Eb}q&ÚC[ƒ‰ðÐELœÉ~Ÿ¤ò( Þ‰x¬Z¡•Ä68v;v:ùží=… Dï©fav‹[iQÛJ;ØemÊAùe…OvKëBÿäúü“'ð +í¦ .eA°½ðîȉš“¼HCßæ½™¦f3ÇþŸ–+ÃûA8`ƒ0lÒ_`¼Xž«Ôº«³ŽÄFœvƒÐö¿êXØdéQe­¬­“ËLeDddzFùÁŽL +ZÍyïDvÿ‰ó]\OçÐh­ETïÀï•z*š‰ŽÇÞ±ë$ Và²,_&A3óŠÊ«ˆJ½Ã=dý¼sœìïtµÚP«­Õd#-‡u6òHt©¶eú4£`úžQ ²z†”á—@˜ +à“ »à_ëß‹c£©Q‚5ëÉjäxLgàHK¡ý©Tµ{CûzŽÄ.D¾x¿,ö¨Ü¬`ç6-ú˜8}Ã:ú)ùðê8 À<ÎÄÁþt.6•B±q +M¡°…\­Fe(% +d®/ldËßj½Ð3}£Âa-ÌÏhß"}G” '€t`àuÀT{è×/–å)t´Çþ]ÿ“PË`ì¡©²ÒXA$D¤ï%ã¼¾‚óî °÷b¿­™{þôàˆ{¶²x£vV¸ ÷cïÕk$õì4~Öv·ã +×uÅÕÓ~µØ&;ál7TÙI]š”‚JÄŠ‚bi‘ ågËÊ5D¹Öå!™Í=ðÔÇ Ár€ûž¶gOQ‘Rrél½Ñ\SOÎô‚Í7f8¾ÜS[·%Š„™Ü¨ü7Vq¨°Ûâ.>rüåK.Ý'—p«»JÄÏXÊ'›AèiŸ»mh7ʽ8êûªlr>mºßtû™•Õ1Sóé^ûûÝô(Üi'‰M7iÚj­¨µ±Õáæ´×ˆ;øDÜ6~:ŸLß/‹-ýšˆˆrM•0“ZGO-[ æNøO8%Ø46ûLƒw=ö^› ÕÝ°B’÷*ûõôÙ¿6ø’Í0E¤mMMJ$íØÙ>Øi!ê¹U$6›Déá¸R§ÂCÐň?OÀ÷fˆE§Fz{•ÝÙ$ÓÓ¨èRêk XM—±Ú/ü—•TV•Z³£‚Tw¨UCª!õ¶ÛÖÔlsZœ–>ÓÚZínã´I›EûRöìÜÉ•ÊIòÐj¤,éà '-‡[ÊíϤªwç¢UˆV6•šE¥eP©= mõó9ë¶e¨Áéñ ØyG‚;®9ÝÝÞSÔKôy?¸F2©„FÅs2Àè Ëè0ÏbÓŸc¸yõÍ.{a‡ãÊ[h±´]c×HuLG½˜¶Ë8WÓ€á¿øƒ¨3ÁW´éáSFZxº°àˆH‹0ØjÇÍc ÄÒb÷§Î?˜tŽÃ¢’ÃdµA“\ž¬ÙÅ‹ºÌc-ì©ÑßOº‰æ#Š,Úöó)”ŽS;½ÿaìãÀ॥' Gççûà?:³ìBU¤S‹I±úƒŒ›«kY¶«ðTk¦½„PÐë²P“–Mûy|¾~ÜПC¤ÇükЧ:‰zÐZ2—Z¯ÙU¾‹FbNÏ¥hNÎoAÄvð#Zv´¯A¾3åûÃd;Ñú’tvŽ´´õ•g/Ieˆ^Öëôw¤…D‰\§.ü!‘í0MÄþ_D&6³OsΞc E` X ’5øÕ›žÁ³äÍë§gqžìº±ŠŸZ&ËàÆfG¯¡Xœ-'Ö” Þãx-µ8™bü“ɲi« +ã¸&;¥ÛX5\+kÏr/úÁÅÄÄEq3ê‹Ñeh„Å" £¼–ÖR +¥”®¥½-/£PÚÞöö¶–RhyYÇpÃÁŒ“ Ñð%ƒ…è²ÌMLð‹§Ë]¢ga‰~8_ÏIžç÷ÿÿŽYØãpôX¡R=¿…Ž-oN(ãu2p2¦Ì£Dwxúúp±UŸ~i9K†J×ïr¥³Å.–íÁ©›º<ŠØæ%ÇùçÎéŒÆNî¤åb‹§ª½TÕØ$±V©- ¶:ƒÄ«Œú¢Þ¨[rô±›–[é³6‰*ÅYÈøÌ¥ê¿Ìzç%Ä\½ˆŸìa®‡ƒ[¡õ/nÞ®¬ß½#½_ök´bôè7Däüý„-"€j±ªÞÿß°¼O†¥²SJþŽbËS¢úSìFpMBĹÕá™H\âú|áºl~ŠøÖoóõú<>ã Ž2œ;j ‡,M¾¨’}”[Š53ø~êã˜VCQŽå;4‡ö®fÝýeë!qÝCo‹/Ìœ› #ãÒø(‹M4·†IbÓCº‡8!qó±áAi²""«)oWT’¥r{e½ôìrÓ5-¹Øà7襵ÆfMÍç³J²ƒ5» –v«QçÔ «ûÖ4Wá_»â´Æ’7äóYØÛ³(…²ÅÝý@«+«3CK7—ðP_£ÐîÄUÀï$БK ÖùƒïOƒOU^3Ø”ð.À?Ó©KÁ[»÷RØ¿ïÑý3zþ„o>Dì¤_NŸ;Š[_ïÔ sËO¼¦…çØ"ÕæRƒå@Û˜žÏû¯#è¹lÅ„;¼ ð™Ú9S ›ÉÃŨ·ñåíXgíùàc³¿nŽìÉ^(Oÿ?¢]`ˆ¦-¾ŠöÓ#„ž=ñ+^³3ÝE¼ò=Ú§®„½ d¼¶ê 5Ï@tžú´¢Üí¶^—ƒ"Î ÐöêuÍõŠ¨~r)±„mSS¹ hdX“„‰ÕäÖ +Õ +E³ù4™'“fJ†Ž€oægfÃÐïutâ +yƒf~'tÑêŠÅÑÊ°néÛg°¶è|Q %¢±ëiÍ*Lñ3xŸXOÇVk5'egLi­±F]BêämŠœê® »—„Û¦™zX™_(“SA˜œ +±Ðק«vSîš/ï.(>]q!çM¶å0:ÄÑ~ ÐI|Þ•$¸‰˜ôJóˆ–™‚È ß¢üðZ¯ÑžÇ&6ƒ.hËþ'sÿÒ$:èÌ¡ÆÒeâ!è%¬ endstream endobj 267 0 obj [268 0 R] endobj 388 0 obj <>stream +H‰\ÁjÃ0 †ï~ +ÛCqÚRv ÑnÃÖ±làØJfXd£8‡¼ý7´0 òÿâ·ô¹¾Ôäè¶Á'Ç8†‰-B‹½'µ?€ó6­]¾í`¢Ò7ó˜p¨© ª,AŠ8&žaóìB‹[¥¯ì=õ°ù>7[ÐÍã/H +¨*pØÉ 7ßÍ€ 3¶«è>Í;aŽ¯9"r¿¿…±ÁáE6Ô£* © +ÊW©J!¹úJµý1¼¸OGq¿OÇì^ßN¾÷Pvb–> endobj 269 0 obj <> endobj 270 0 obj <> endobj 387 0 obj <>stream +H‰bd`ab`dd”ò ws òÑöM,ÉHÍM,ÉLNÌ ÈÔõÏKÉêÿþ!ÓÍ#÷C–ñ‡8Ë9ÑÜßi¿j~Îg•©]Æ{ŸGé{>ÿ÷RÁïE<ªßOò¨0°22²ñeÕ8¦ä'¥z¦¤æ•d–T:çTe¦g”(h$k*ZZ(€å‚+‹KRs‹<ó’ó‹ +ò‹KRSôsr‚@ê‹‚R‹S‹Ê€¢úþ@ÜòóJB* RôA¤¡BJjgA0ˆ`bddñÿÞÇ÷ã{ã’òK—¿ÿ^óžùÇíŸ³ýæÕ±ü­ð[ñ•åwÞOî~W<^¹'wƒüw{¶ßÏ÷‰Þ[cò›é7s–‰…EÖ£ïÌß™Ö<º'Ï +Îò>stream +H‰\ÁjÃ0 †ï~ +ÛCqêÊ FÇ ‡m¥ÙÀ±•Ì°ØFqyû*nÉ` ~~}â·ä¹ym‚Ï /m‹zág²>ˆ£çm~¨Òíh’ ·Ë”qlBE]ƒ¼²9eZ`÷âb‡{!?É!ù0ÀîûÜîA¶sJ¿8bÈPÖà°çEï&}˜AìÐ8ö}^ÌüM|- A}¼‡±ÑᔌE2a@QW\ê7.-0¸¾ºS]o mÓÜŸõªNO¬T¥TaSëþ,líLÄéÊEJ¬5¸-ÅL­OÜ%%rD endstream endobj 62 0 obj <> endobj 63 0 obj <> endobj 64 0 obj <> endobj 356 0 obj <>stream +H‰bd`ab`ddóuqsÑöÍÌËÌÏÓ JM/ÍI,Éÿþ!ÓÍ#÷C–ñ‡Ë9Ñߊ¿û~=ùy€U–aÊ.Þï>stream +H‰ÔW[oÇ~'Ðÿ0~ –…9žû¥©b9 KA,³ÈCŠ´²˜P¢BÑj‚ ÿ½ß™]R;Ë%¹l‹‚¤ qg8çþÍùÎ +&è—ì—Á«¯?öñq5Ããs&pÍæåàfðë@I†ÿN*棢ÍïÙýàÍx jžTŒå?“l|3ˆi;2)=óJsoÙønP06ÿ\ËÔF%-ØÃ|òt¹(Ù·³ë’ÝÍžÊóòú´¼Y\içöbXIŽ$Wlü–T±?X燎ÿšNàs5›Îæ_M'”|žÿ8¹aÅä¶ð+ŸO>Þ.ø”¬+{Ï'ÿÈ—øÔçÙk6Ÿ-àú9­VjÖL‘ÄêlÙº?»üý3_ÎËŧù=»mžú³Î“âf™§®ÜÖÞî›Ü–»[me—òº!¹Ùm$k™Ø®líð •¯Þ ûôÓtrÅžf“kv]NËEyQ¼+g¿”¿w¦ªU•ÙŒP±¤åËJôóõƒ<€ãoN¿8y·O!—ú«¾dý¬ +ƒ³0~÷p9/Ç3*Pfgb­<Jô¬ëEVehùì3ö¢Wå›*yvõ»K^M +!°ÊCµÓéN0”ÓÇrß@[qî §‚wVäõktK$tÕ[hçþÓtJö/þ²Åƒîtv«áy l×o[_ÜTÀÿ>ä­–6iå ºœÂ›åsK~Éî&÷ ùF¤äšpŒâZ“Ý-¹$ˆ +¢g™†mÒm¤.?„Ø5µø¶C?ï%ô©ñq3ùíþ™÷Ž$JÌ.+fÇØ[1e5·VF¾‰ß(ÞG®(‡#SLñ7‹¡.Jv5”Ål8Ò:ÕÍPhx§§ço˜i¶Ž¤*æC)‹²|þ8þfðåxðê»éåUyýÝۯث³ÁÞ¼=aƒ÷Ëi“ƒ¶‘+ËŒO_2’;’Ç—K×ÕàòêÃÎÉDÄ>œ|;Ðì_Ì°36ø;Õlb…‡œd^j%»ºKÖé¯T\kͦƒ+—${7ÐÒÔ`·Á0/$¾õ³) nØȧ¯JËû>.é¸R¨L|V8’±Ò_û8†Ðt4±IŽÄ˜¦& ƒøey4KEÍ `HR(îDlJjÍ•v,ráãRp{z‘QëjŒ¾™m€6Jú«­g#Ë•s­¯«Á(péÍjQX-—’õJйú?¯¤2]+•½j)j‘”ÜPr¹m%õ¨B¸MõYï²ÞUuÅCÚ ŠáÞiŒü"ðȤþ’®hU +°6°ç^Œ lnTLQÖQ¥*\;ïñ­29O°ÜmÈPM ©Àr+­K¦3 ˜únôS=Á#=÷Òj„dÑ—q!`;Wq€ÉßÀ€ÇB_ +t5jŒËwb7êŠGRWé›…CáÀcò½/ ºš t ÛIÐr%cÁû>4ˆ©Ùƒ ™hÂæ]#hOüTOT²r€”)%HWó l°jîzÐä9XÍÙ6 š,¨–Œš:1äahH:ŽlS­‚ÛÁ‚B dÛ­ÿïß6/¾Íac÷gÁã ¦? *[6bF’ÒneAŒbQØó CiÍsv‘`¬±ëÀ†Öø¦ ÇH$è· MÖÛ’i‹ñu=÷Yê[™ÏŸå½‘ö,ëMêÈ™c_î;Ïû6L˽ÑTÇ£S1k˜Ý÷ßol”}ƒ7yðªüŠ2Œ‘F“/rºèÍtÇàrß%½¥@mã»ÍF”µ×s'᧵‚ çM¯÷<Œ>Aºô>i[ÃmÀ[RÆoM9z‰Bÿ 9çElöƒSÏ Æ÷ãEømˆœÐVð`2–ÂÕQŽ¨ét8‘&òänLh³[U±`·Žæ(Š¦ø ÅدE»Øí˜bé‹Ë¥–`Œ¬„ߊa¸&‘œUºÅm¡ÅmÛ1 "l¸®|Å{+]4TvóIŃôväãæ½gì¯ÍÉ5-šH÷ß·ßûvó" ú ÕV^ìâ@ƒÂ™}9ìa°_{ÃÛ‹É6½G2qtèG¾Ü'ð t꣎íÈìÿ€úLÀû¤hNÏûR=ߧ ,óp{Ÿ‰ BùþÄ—b7ö _Ÿ6ß!»¼'ñ ÐÒ:xïê‘.îãÕ}†Wr×1>˜Mþ@¥© /OYêDæ%Z„qÍŽÉ%"ç:MaacZ…HNÍ À›´"˜ à "’áðè5MO‰GT‘ôáA9KR6¸zZZß&?[j¿@?¬ê}Ô)Pm|\XT „¡S¤"¤…J ‡Û¯d¢V,±H†ŠM™Ñi4PÂ…¬r‚နyZ¸@f´Uœ‘軕 JÖi Ú¢µ×«<- ŒøRÕ™U¤.·¨ïô-dä¹T©Ýcbãk`g6Ío¦“‡‹âöbHgžñ—Ø ½œŽ;ŸŽßÍžÊóòú´¼Y$FäƒÎqj”ãH¦L•„yøðCQGºøm8’²¸¼{ŽT1-ÿ6üqüM»]ai™"‘8ò'd¨°¿æ?yí¡Q.Z¼¾åóÉÇÛ{Íæ³Åå¢<§ÕÅr»Žt†:náuZÏ£ÅEûòì„ŠR®ƹ€az^¾g÷ˆ$lŠ +›À/‘‡ì¬É Ò² ›c#6êê„WÓýÉqÕôX©wéØr—¹„s%Ó»¡Â=ÙÁò•à»:‚‡å!z¬ŽÑå¨o•¨>stream + + + + + application/pdf + + + BSTsearchHit + + + + + Adobe Illustrator CS3 + 2008-07-01T16:47:31-04:00 + 2008-09-14T13:33:33-04:00 + 2008-09-14T13:33:33-04:00 + + + + 196 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADEAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9FeevOml+TPLN15i1SKe aytDGskdsqNKTLIsa8RI8a9W/mxVilp+fPle4tpLv9F6pDaQXE1ncXEkVtSK4tVWS6jdVuGkHoQt 6rtx48QaEt8OKqPmj89dBsNNnGlxvJqsunXeoaX9YWP0ZFgW6aGR0WZZ2imWxd1ZF2UpzKM6gqrL H899AstN09vMUga7vfrcguLSIQRm2gu57aGY2txMbpTKLepjUSMn7fEYqj/KP5l6tr3m5tKl08WF kXvwkUwU3SraW+mTR8zDNPDVjqUleJ6BehDYql15+dn6YjtrbyTZSXl9cailgZpVtZ41V4J51cRr fW3xOlq9EkkjZaHkASgdVPV/MS/uvLt9qFvo8tjcw6quiWZvXikhe4k1EaaJD9Xkd+MUh5SKeNei s32sVSSP82dZGna2s9iqanoB1e7aZoeFnfWOiXZguFtitxJLFNxKbyKV5HYMOirP/MXmLT9A0aTV b0SvAjRRpDCheaSW4kWGKNI9iWeSRVFfppirDL789PLNhDdve6bqVu9lFHLPA62gkBltPrqR8frH 2zAsh8KoRWrR81VDU/z+8s6esjT6Pq1IhOWb0rZVpbXD20h5NcKKc4mIPcA03VgFVP8A5XfEmrvb 3GkXkSwQrFcaUsKS3/6Qk9SRY43SYwGP0bacsW40KbkH4cKvS7C7N5Y292YXtzcRpKbeXgZI+ahu D+m0ichWh4sR4HAqvirsVdiqS6r5pstL1ux027Rljvo3ZLpVd1WQTQwojhEbirtcD42IUHbvkDOj TkY9MZwMh06fAn9HJOsm46W+ZNfs/L+iXWsXiSSW1oFaRIQrSEM4QcQzIOreORlLhFt2DCcsxAcy q6Jq9trGkWmqWyulveRLNEsoAcKwqOQUsK/ThjKxbHNiOOZieYRuFrdirsVdirsVQ2paXpmqWb2W p2kN9ZyEGS2uY0miYqQy1RwymhFRtiqBi8n+UYrqa7i0TT47q5jkhuLhbWESSRzEtKjuFqyyFiWB 698VbufKPlS6aB7rRbCdrWA2ls0ttC5jt2UoYULKeMZVivAbU2xVq48n+Uri5S6uNEsJrqOR5knk tYWkWSU1kcMVJDOftHqcVUE/L/yGkMEKeW9LWG2lae2jFlbhY5nChpEXhRXb00qw3+EeAxVFWXlX yxYzNNZaRZWszz/Wnlhtoo2NxxdPWLKoPqcZXHLrRj4nFXTeVfLUseoxtpdqBq9DqjJCiPcMteLS uoDOy1qrE1B6YqpT+TfK88EME2nRPHAzOtQeTl5BNJ6rV5SiSVFkkEhYO4DNVhXFUw1HTNO1Ozks tStYb2yl4mW2uY1liYowdeSOGU8WUEbdRiqWSeRPI8n955d0x9mX4rO3Ozly43T9ozSV8eTeJxVC +Zvy68qeYNGn0ueyhtUnWOP6zbQW4mRI5GkCo0kUqgEyyD7P7b0oWriqNbyX5PdIVk0PT5Pq4T0S 9pAeHpF2Tj8FF4tNIRToWanU4qmtra21pbQ2trClva26LFBBEoSOONBxVEVaBVUCgAxVUxV2KuxV AajoOk6jcRXF5B6s0KhY25OtAJorgbKQP723jb6PCuRMQW3HmnAUD+KI+4lLNXg13SEnv9AhbUvU ZpJtHlkCgu5JMkEsh/d/Easm6n9kKesZAjcN2KUMlRyen+l+sfpSj8zL1NR/Lu6t4Y5E1DU44xZ6 bIhW6d1mjZ0WH7bMnfiD49MGS5Q2Z6OUcWoBkRQ6/BMvy1miPkvSrUOPrNnbxw3cFaSRSqu6SJ9p G9jksYqIatZMSyykORLJ8m4zsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirBfM95fWSeZLvTobmbX0eyhtDaIslzHYy+kOcatDd/uhL65YrBIag/C1AMKoHR/MOuJZeW9Xv9 IurvzNPprL5isbWKOC5CIyr6kkM7wA8Z+XAA9C5QEVxVkNt+ZXk951tr28bR7xjRbXVopNPkLeCf WVjWT/YM2BWTI6OiujBkYAqwNQQdwQRirU00UMTSzOscSCryOQqgeJJ2GKrLW8tLuET2k8dxA1Qs sTK6GnWjKSMVVcVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqWeYtT1DTtNMunafJqd /I6w2tqh4r6j7BppDtHEvV27DoCaDFUo0byHaRF9R1qVtQ8yXRD3eqxtJbulAaQWzRsrxW6AkBA2 /VqsScVT/TtI0/ThJ9Ui4POQ08zs0ksjAUBklkLO9BsORxVXubW2uoHt7mJJ4JBSSKRQ6MPAq1Qc VYy/5aeVo3aXSEuNAnYkl9Inks0qTUkwIfq7b7/FGcVSXVYtT0dNcutSupvNc2g6aNR0iyuIYUcy OZgeaW6RxyuPq68X9MFaniN9yqL0G+hupdK1i21PTdUvNQvJLS+utGT0YJYxbSS+nKpmuS0kDRhu TMGAqKLyIIVnOKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpEPOuhPeXNpb NNdyWXE3htYJZxGHZlUn01ZmBaNhVARVT4HFWKebvzisbaVNJ8pxjXNbuaCEwfvIFLCo3T+8NOym nie2UZM1bDm7XR9mmcfEyHhxqfk78t/Mp1J/M/mfWrlNfnQqkdq6UhRiDwaqvGw2/uwvAe/Y4oSB sljrtVilEY8cfTHr1/HvZPqfkSw1ICa7v759ThPKx1VZhFPbN0rAsSpCvIbODGQ42fkMudYl3qfm vT9C+lY+pWn+Laj0/R/m/R9eX1n/ACeXpftcv2MVZtirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdiqD1qG8n0a/hsWKXstvKlqwPEiVkIQhj0+Km+KvLxo2r3PnSLzB5cWW00Jo9Hia4j uY4Le3t9OknN9a3lr6quXEUgjVTGeDV+zTCrMvJGm6A8uqeYdLt4eOq3kzw3aAFnjQiNyG/leeN3 AHiMjwi76thzTMREn0joyrC1uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux Vj/m/wDxFcw22kaHztpdRZku9YFKWdugHqOgJ3mflxi2oD8R2XdVUsfI3lCytLe1h0e0ZLZFSN5Y Y5JPh/aaRwWZidyxNSd8VS1NM1Dy55qNxplu9z5f1+auo2kQr9TvmH+9aL/vqelJh2ej93xVl2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpP5t1q40bRH1C3RJJVntYQkleNL i6jgY7EGoWQke+KpxirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV Yn5xa61yxudE0m2e5uILi0kubgskcEbQTxXJiLseTOUToqmlRUjCqfaZq0V+ZozDJa3lsQLmznCi ROVSjVRnRlah4srEdR1BACo7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqh4NS064up7S3u oZrq1oLm3jkVpIuW6+ogPJa9q4AQzljkACQaKIwsEusPMnl7Ubg22n6paXlyoLNDbzxSuFBAJKox NATkRIHkW2eDJAXKJA8wjYLi3uI/Ut5Umj5MnONgy8o2KOtRXdWUqfA5IFrlEjYqUGp6bPcvawXc MtzEXWSBJEZ1MfHmGUGo4+ovLw5DxwAhkccgLINKlrd2l3AJ7SaO4gYkLLEwdCVNDRlJGxFMQbRK JiaIoqjukaM7sERAWZmNAANySThQBbxHzPqGledvK2oeXNI1bTbOWDU7yaS41LjFG8dybhop7aSS OZeaPMNwvP4TxZCVfIxmJcm7Ppp4iBMVbIdVk/MW9mtdU8ofV3+q2sVpfTSsGS8lSrN6DzInqRIz HjLVeRJp3yOTi/hbtF4Fnxb8kL/yt7zfonw+bvKs0EYNGvLXkI/o580b/kblXjSHMOf/ACXiyf3W QHyP4/QyPRfzi8garxUaiLKZv91XqmGnzc1i/wCHywZolxMvZWeHS/dv+1kM3mXSUMaW8hvpZU9S OKyU3BKVpzJjqqLWtCxANNt8tBt18omJoiiiNO1ey1D1VgLpPAVFxbzI8UsZYVXkjhTQ0NGHwmho TTFCMxV2KuxV2KuxV2KuxV2KuxV2KuxVhN95Y82y3V3JHc+okt366N+k7629S2JqLb04kZLfht+8 iqzcaH7Rykwl+C7GGoxADbp/Mid+/fn7ivk8qeZfRMgvkkvm07TLOeYTTQPNJZ3EktzWaNTJGJkk 4h1+IVO2HgP3IGpx3y24pHkDViht1ruX6T5P1qrNrOp3E/G0WCCOC9uwodjcCT1KGP1KJLEFkYcy UrtgjjPUrl1UP4Igb/zY+X6jty3VNC8m3GnL5fR5uaaZps9len153YzTrbAmBn+JUH1dqAFeO3ED tIQqmObVifHt9UgRsOnFz+fmk9r5a85ReYYLZbydrO0SKb6097eenxbU7iZk4kMtzIbXhE4lb4ag 1O2QEZX+O9yJajCcZNCze3DH+YB/mji32VLXyX5hA0kpItpcaKHg+sLPIn1kPe21w8xEX2lmhjlD pJ/uw9KUbGOM/JjLV4/V1E9+XL0yFb9xrcdGUeXbG8gk1W7uYfqv6RvDcxWnJWMaCGKH4ylV5SGE uaEj4uta5ZAc3DzzB4QDfDGr+JP2XSR/mV5a81+Y4LLStKvI7TSbiQrq7Gol9Mbgjf4l2pw2qaV2 rSGWMpbDk5Og1GLETKQuQ+lkHlvy3pPlzSYtM0yL04I92Y7vI5+1JI3dj/YNssjERFBxNRqJZZcU uaaZJpcQCKHpirG9Z/LjyRrHI3ukQeq1azQr6ElT3LRcCT865WcUT0czFr82PlI/f97CNPsLCz0j zB5Y8j3nrX8Oo207xRXKR3c1j/o5uo4LisYV6CWNTX4D1IJrhx0BQY6uWSU+PIKMgyTStX0SHzRo ul85bDUVsLtJLHUbkXN58csLpDJOZrkSyUVpABM7KvgDk3FZvirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVUL++t7CymvLlisMCl3oKsadFUDdmY7KB1O2KsP0v8AMe41G/1Kwi06 BNQ0u4MM+ktfR/pF0WKKdnit+HB6JOB/e8eQI5U3KrErrXfPX5l3MlhoMUmieV1Yx3OoSgrJIBsy kjqaf7rQ/wCs2Y0jKZobB32KGn00ROR45kWB+PvLOPLf5X+TtD05bRdPhvpTQz3V3Gkzu4HX4wQo 32C5dDGIus1etnnNy5dAm9/5U8t32kNo9xp0H6NLc1t40ESpJWokj9PiY3BNQ60IPfJuIlP+FfNP 6L/RH+J5/qnr/wC93or+kfqXCnofWa8fU5/7u9Plx/y/ixVleKuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KpN5xmht/Ld5ezTxW6WAjvvVnPGLlaSLcKrkVIDNGFqATvsCcVYHpulWqe Yj5tRdSmE13Lq9top0m5huRdXNglkYpLpj6JRY16GihjXlhVm3kK9tb7ypY3lvKsn1kSTXAQFRHc SytJPFxNCpjlZk4ncU3wKn+KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux Vj+teWrjWtcsJL6ZG0DTwLldNANZ75WrG85OxjhADInd9z9lcVZBirHrby5eab5rm1PS5I49J1VW fWdPcsB9bVQI7qAAFQ8ijhMNg1A32geSrIcVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVQeo6tZad9V+tOU+uXEdpBQFqyy14g06dOuKozFXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqw/8xb6ytv8O/WbiOD/AHM2kn7x1T4E5cm+IjZaipwhWXqy uoZSGVhVWG4IPcYFbxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV49 5y/MGfyho0GrWUdvca7qYvJ7+G5i5vK1pKEa0SZri1C+hyaNVQSvReQjPxHCrOND1TQLPzJeaDY3 kCwywQXtnYo68Vab1DKIANuBREk4r/MW/ayJkLrqzGKRiZAekdWU4WDsVdirsVdirHvOOkatqQ0g aZM9tNa3/wBYluY/SLRxi1njqFmDI1WkVfsnrXK8gJqnL0mWEOLi3uNde8dylcSec5/LkFtHE1rr Zg083F8ptmUSvKgvgiOXSscYY7rQ1+GuJ4q80xGEZCTvC5bb/wCb80BrEHmXSBq+oJeiUDT7GOLU rgWMLCSOaQXADMsSD4G5oJfgDt4bZGXELLbiljnwxr+KWw4j0Fd/u23oJN5Vi876pPDrqXM0cGox i2nnP1KrQRvqAilIVGHOLnblTGOLcqkMOkYcR3/HVyNScMBwULjv/Fz9G3x9XP7GXeWYvMcXlKGK +Mp12ODgTqDQuDOsYAJa1J5Rc+5POnXfLY3w+bgag4zluP0X/DfL49fsRfl3/FP1OT/En1H676h9 L9Het6XpcRTl63xcuVfalMMb6sM/hX+74q/pV+hirWn5owWGnSLfT3V9Nb8r2Hhpyxw3fKPirngh NvwMgf0yz1A4nKqnX9jmiWmMpbARvb6txv8Aby57LL+2/Mu20i/g02W9m1L6/M1rcyNprp9WYzvF 6YkCnj/dLIHoV/3WCo4lInW36EwlpjMGXDw8Iv6+e1/prv697tQT8zYU1WTTUvJ57i6imtYpJdOW OO2eFOccLOJOMkctVIdShUVBLHkU8fT9CwOmPDxVQG/1c76+RHxvy2S+Lyl5ze88x389ssV7qunM kMkRtWD3P1a3DQzJL6qNHJJGyLUfCOe45KciISsk9zadVhqEQdoy8+Vy3FdQN/l3LPOt15vv/M1r 5asLrik09nKYIGsW9KC3CTySyI9Z1dZU5LWiEAAVJxmZE0nSRxRxnJIdJfzuZ2ru5fFkegWfniHX ll1e5up7R4XiqDZegHinuBG80ahJAXgMLfuv2qhqAACyIle7iZ5YTCoAA3/SvkOXxvn8Em0HQPNV rf2l9Yxy2ckdvp1rrcciQ/6XcJdSG/lZ5Ku/7uT1FkRviqB1HEQjE3t8XIzZ8UomMt95GPPYUOEf oo/tZVqMXmnUL+yW0mm0ayVbwXjoLSZ2dHjW0P7wTfC683ou/Y0OWHiPk4UDijE2BM+mvqH9buYh 5uv/ADd5btr6S3u+DXd7O9nKP0clzcE21ulvVHRRIolDqwVPVoF7b5VMyj+A5+lhizEWOURf1UN5 X7tq61zRSaH5+tbG7gtprqKAXqXkENu9kJeL6ncPcRRNItKNbNHLSVqcvhrTkmSEZAfjvazmwSkC QL4a34v5gon42Nvf5sl8v2sya5qtxHby2tjNHbKyzIIzLeoZTczBV+H4laNWdRRiu1QKmcBuXEzy HBEWCd/hHah9+3RIvzN8467p8lp5c8uWksuu6upEFwFPCNK0Yqx+EuOp7KNzkcsyNhzcns/SwkDk yH0R/H471fyT+XV15f0f0JdZvPr9y7S3zwSKYi70qFSZJADt/eABz40oBLHExFFxtbqI5cnFEcIQ /mz8ndA1eFZ9OeTTtahq8WoB5JHkevIGdnYu5r+3y5D3ApgyYuLfq26LtCWH0kXA9GGaprGsaFHo F7ryReZGGna1cava3roEVdLkt0UQ+pE/75FZxTiGkdqM1AKWRBAouHmlGUyYio3s9V0CttqF3psT yNYR29rd2ccxZpIhcGZWi5OS3EehVQxqtSPsgAFrT3FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq0VUkMQKjoe4rireKpV5m8yWPl/TDe3KvNI7rBZ2UI5T3NxIaRwwptydj9AFSa AE4qxnTfIep3NuL/AF17GfVLieS7axuLOK8tLJ5ipKWZb05Vasas786O9W41OKpD5j038yPKGuXP mfSrt/MGm3IU6lZyqOapGKCiRgABRUhowKd1pWtGTjBscnb6MabLDw5Dhn/O7/x3fpZX5Z8/nzTp 8d1oemSSblLp7lxBBDIBUx+oBIzsQQRwjIp9rjlsJcQt1+q05wzMCbpPdL1lL2We1lgks9QtQhuL SXiSFkB4SI6lleNirAMD1BBAIIyTQmOKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxVDTabYT31tfzW6SXlmJFtJ2ALxiYAScD25BQDiqJxV2KvLfM0enzpP5aefT1fStVGqXFjqL+j YXttd+tMttcShJljbnNUIyEn01biVOKk2yDy1rGnX3mWOxtoIbE6XpSJDbwBlhlimkVa2jNHB6lv b/Vwiuq0+LoBSqrMsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqB12TW I9JuTosMU2qleNok7FIg7kLzkIBPGOvMgbmlBucVQ3lfy5b6BpYtEle6upna41C/lp6tzcybyTPT Ycj0UbKtFGwxVD+bvLMurwW93p0wsvMGmOZ9IvyCVVyKNFMBu0Ey/DIvhuPiAOKpt6mofo31PQj/ AEj6PL6t6h9L1uNeHq8a8eW3Lh03p2xVE4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FUo0DWpdTuNZikjWMaZftZRlSTyVYIpeTV71mIxVN8VdirsVdirsVdirsVdirsVdirsVU5L i3ikijklRJJ2KQozAM7BS5VQftEKpO3YY2kRJ37lTFDsVdirsVcSACSaAbknFVkE8M8Mc8EiywSq HilQhkZGFVZWGxBHQ4pIINHmpW+padc3FxbW11DPcWhC3UMciu8RavESKpJWtDSuAEFlLHIAEggH k1+k9N+uGx+tw/XQVBtfUT1asrOo4V5bpGzDboCe2Njkvhyrio13qlvd2lyJDbTRziKRoZTGwfjI ho6NxJoynqO2IKJRI5ilXCxdiqE1PVLTTbX6xcliCwjiijUvJJI2ypGi7sx/tOwOKsO8ia/C0N5q 8lrPBpHmW/F9pd+/pGIpcQQwxJLwd3jd3joOS03AryNMKs8wK7FXYq7FXYq7FXYq7FXYq7FXYqxv zt5b1HXLa0XT7gWtxaPcSxzCWWB1ke0mhhZXh+PaWVS2+6169DXOJPJy9JqI4yeIWDXQH+IE8/JG 6/pvmC+0+GHSdY/Q94jq010LeO65qFIKcJCoFWINfbJEEjYteHJjjImUeId101rOk6te+Xk06K/Z L8m1E9/GzWzusc0bXDKYqlDJGrgAeNOmCUSRScWWEcnER6d9ufQ1z7mNaj5E8w3E2o2sGqTDS7qG 4jgaa+vJZAs1sI44Xiaq8Y56yepzLFfgIplZxnv2cvHrMYAJiOIEfwx6Hnfu2qq6qw8rebH1XTJD dfV9LhtXtr+0TUr2Zm9QTqzBpEVpGHqRuj1RloV3HEg8Er/ax/M4uGW1yuweGPl8utjf70DZ+TPP lt+goIb+CGy0+KOHUIfrl7N6hQ0kdOSqhEqbem68Y/2PHI+HLbdtlq8B4yQSZHb0xH4rv69UVF5a 8+JZeWLSK5tLOLRRDBfJDc3JE8MPoD1BxihBZlikT05FZaN1rQrLhlt5MDqMF5CQTx2RsNrvzPeN xvs035e3sFtE1rM8l1Fq1xftG+o30KPBKZwi+opkKSBZl5ME+KhBJqTj4X396/ngTuNuAD6Ynfb7 NluqeS9evFureCQW0sd/eajaaks8kLO13azxwjlCfVVoJHRW7GMftbrg8Mpx6uEaJ39MYkVfIi+e 2+/xZHoenahHrGr6jdRiBLwwRRRBgxf6srI1w3GoBl5AAdeKrWh2ycAbJLiZskTCMRvV/b0+Cd5Y 4yT/AOLtCId0lmlgjJV7qK2uZbccdmPrpG0VFoeR5UHfFWI6n+aXlabzlpNhaSvew2rzvd3cCtLB ETCyBwU5cggJ5OBxVSTXrlYygypzZaDJHF4p5fr6sT8saFH5Q8oarb/WbLULq80aCwtdO0ORrs3E sCzc7+VeCkH96AzUICoBUniMsJoW4mOHFIR73oHlT81vKev2Dzm5XT7qBed1Z3LBWUDqUOwkX5b+ wyvHlEve5mr0GTAd9496fQ+ZdJluIoCZ7eSY8ITdWtzbI7noivPHGhc02WtTljgppirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdiqW+ZhO3lvVhbkic2dwISrcDz9JuNG7b98VAtg+pHz Nceb/Ler+Wlp5ItYovrVxb3QjtzbFJ0lV7aSeKJRDWJv7hn+E0ZCvB1WR+RdF0a0s7rUtPs47cap dXFxHMqUd4HlYwmpFRGy0ZFGwUjbBwgG2yWWUoiJOw5MkjhhjLmNFQyHk5UAcmPc06nC1sM8w+U/ Ken+ZtJ81yWsdtKl36d7cbLDWaKRIpZV+zy+sGMB/wCY1PiIiAu3Ilqshx+GT6Ur07VtVuvJOq/4 kmvjr1zEIf0XdWYt4IL5+awQ6fKLeH16yceL+rJSgaq75Nx3pWBXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXl/5mT+bPMOuweR9Ht5LWyuEE2o6k4/dvDUVAYfsKdiOrNt064+UmR4Q 7ns+OLFA5pmyOQ82WaP+XflDTNMt7BdNt7lYFo0txEkjyP15yVFGavSv2e1MuhHhFOrz5jlmZnmU P5Y0/VvLmqv5dEUlz5ZaNp9Eu68jZqpAewlJNeC8qwN/LVD9kVk1MsxVhdnpV75s1ddX161e30LT 5D+hNFuU4tLKtUN7dxMOvX0I2+yPiI5EcVUy1L8vfJ9/Zm3bTYrZloba6tVEE9s6EMj28iAGIqw5 DjtXqDviqJ8snzLHbTWWvqk1xaOI4NUiKql5FSqytEDWKQdJFpxruuxoFU5xV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVivknz1/ie91q2+o/VP0PcC35+r6vq1Z15U4Jx/u+m +V48nFbm6vR+CIm74hbKsscJ2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxVDajqNlp1q11eSelCpVa0LMzOwVEVVBZmZiAqqCSemKvNPynSXS7/V72/QxWPmS5S50a8BWSCZ HeQpWWMuiM/qLxVyC3Qb5TixmN27LX6uGWMBH+EV9z1TLnWuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxVKLzzZodncXEE0k3O1ZI5zHbXMqCSXh6cQkjjZDI3qpRAeW42yJmA3w005AEVv5j58+W3NAHz 1YLeoZAg0aazlvINQVpTKTDNFA8T2xiV1f1J+IAJaopSuR8QfBt/Jyr+nxVW3UE3d9wVx568tNKs Ec08tw0Uk4gjtLpnCxNIjh1EVUcNbyLwajVFKYfEDH8nkq6Fe8eXn5hL9H88399Fot1PpawWWstI sbLLcNMnC2e6U+i9rD6gZY6VRiK/ZLDIjITWzbl0cYmQErMPdXOufEa+PxpGRefdAWygubuVoRcG 5KBIbqQLHaz+g7y1hRouLFefqKoUmlT1w+IK3azop2QN6rqOovbff4IO4/Maws9QjW/gNvpU7XyQ agpkmYnTpUhmZ4oo34JzZqOWpRamlcBy0d+TZHQSlH0m5Dh25fVuNyU+0bVpL83sM8At7zT7g21z Er+qtTGkyMj8UJVo5VO6jeo7ZOMrcbLi4aINiQv9H3hMck0pVL5q8vxSSI94vGFjHcXCq7QRODQr LOoMUbA9QzDFUn8zeZvL9p5m0S0urpGmgkkuJ4kq/wBWR4HijurjiCIo+T+mHeg+LwBIVYB5S0fz L5Z8j3mmazFcIJdHtrPStJe4W/mm1OJZTJNZRxSTFI1DQ/ClKcC9B1JV6xpPmfQNW0p9Vsb6KSxi 5fWJWPp+i0e7rOsnFomT9pXAI74Fbs/MuiXc8UENyBLOCbZZFeL1gASTCZFUSgAVqlcVTPFXYq7F XYq7FXYq7FXYq7FXYq7FXYqlF55T0O7uLieaObndskk4jubiJDJFw9OURxyKiyL6KUkA5bDfImAL fHUziABW3kPly5b8uS1vJ3lxrWO1a0rDFC9tH+8l5COWVJn+Pny5mWJX515VFa4PDin83ku76307 q+7pyV9O8uaNpzSPaQFHlj9GWRpJJHdPUkmPJpGYsxkndix+I13OEQAYz1E58z+Nh+gKkWh6XDFp sUcHGPSABpy8nPpAQtAOp+L905X4q/fh4Rt5IOaRMjf1c/nf3pVd+RNFur62kcOLG3julaxWSZVk ku7hLl2kZZF5rzRqxsCpr7DIHGC3R1sxE/zjW+3QV3fbzV5PJmhSyXRnjkmhuluENu0jCNFvSrXQ j4lWHrOgZt9j9mlTU+GGI1cxVbVX+x5fJMNL0qDTo5hG8k01zK1xc3EzBpJJGAWpoFUURFUBQAAB hjGmrJkM68hQU/MZul8vao1oXF0LSc25ir6gk9JuHCn7XLpkmtg+oa3r1n5z8sad5as7hvJ0kUCX LwW4lsDbzJOFZXjgd1KMsNWM6AA/YcFmRVkfkPSdIsdIuX0y0gt7W8vLqaN4UVfWiM7iN2IHxLw2 jPT0+NMVTmx0bR7CR5LGxt7SSQUkeCJIywrWhKgV3xVj/mLy75eTzDpOuS2yw3E12lvf3AJjjmX0 pDbC5UEJIVuViERcEhqBeuKpDp+o6pe+SNWm8yzX/wCnPSBNhdWf1aC1vwzC3j0+ZbeH1yZuHBhL KeXGhFaYVelYFdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVeX/mdrnmTVtZh8heXo JIp72MSahfOCifV26hX/AJP52HX7I3qMx8siTwh3PZ+HHCHj5Dy5Dz/HL5sn0L8uPLulaLDpRE11 Ao/0lJZ5hDO7bu0luH9Fgx/ZKnbrXLoRoU6zUZvEmZVVqflWLVPL+ot5VukmutJSNpvL+p0aThbo QrWVy+/F4OQETt9tP8pWrJpZbirB4rKbzzqQvNSgaPyfYS107Tp0KtqE8ZKm5uYnFfQjYfuY2HxH 42FOIxVMta/L7RtTsPq6T3drcwlZNPvUuriSS1mjPKOSFZXdBxI3WlCvwnbFUZ5Yu/MUltNaa/bL Hf2TiI30NBb3iUqs8S1LJUfbRvst0JFDiqdYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FWuK8uVBypSvemKt4q7FXYq7FXYq7FXYq//9k= + + + + + + uuid:B4D572641149DD119EEFF96D7801BC77 + uuid:852ed07c-1a0d-af4f-b9f3-759b446c18bc + + uuid:1674efe0-8233-d14d-b102-fa10d8fdd283 + uuid:92F9E1E974FFDC11AC15B6426E08541E + + + + Document + + + 1 + False + False + + 16.000000 + 21.000000 + Picas + + + + + Minion-Italic + Minion + Italic + Type 1 + 001.001 + False + MinioIta; Minion + + + LucidaSansTypewriter + Lucida Sans Typewriter + Regular + Type 1 + 001.000 + False + LucidSanTyp; Lucida Sans Typewriter + + + + + + Black + Red 2 + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Lime + CMYK + PROCESS + 33.000000 + 0.000000 + 72.999992 + 0.000000 + + + Night Blue + CMYK + PROCESS + 100.000000 + 50.000000 + 0.000000 + 0.000000 + + + Pigeon + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 30.000002 + + + Red 2 + SPOT + 100.000000 + CMYK + 9.000000 + 82.000000 + 60.000004 + 14.999999 + + + + + + + + + + endstream endobj 121 0 obj <> endobj 199 0 obj <> endobj 235 0 obj <> endobj 237 0 obj <> endobj 238 0 obj <> endobj 386 0 obj <>stream +H‰|SmLSg¾.Ü¡ë2n:,ïÖ÷º‘ìùà²ý€M¦Ã`ðc€ˆB¡-TZZÚKk-öËÇ„Ò–R(ý P’‚“¨ÈÀh²f1Sm?æ\ü1]LÞË® +.û»““óãyÎ99'Ï9,!ãp8¼Ü#9ŸæçmÛ/­“*ê¶çÒB™´jƒHg‡Ù’`ÜÇB¶ã¯_Öæñ×0¬kâEtü%$9újÂ…”<ãn…R§’V×ÐÔ[UoS;233Þ݈ïSÙ"E¥˜*Щi±\MåÖU)TJ…JH‹EïQT¶LFåoT©©|±Z¬ÒÄÐg ¤jJHÑ*¡H,ªj)…äÿ:a1Ø'X¶;€}†ňØ^XvCœcœ¡8M|jüUtŠ‹šŒ(ù ZAÉŸkS¾@q%(Ž,& Ñ&‡'U)%ÉúéHdd`B@F5rÙs€]yNþÇlÀËÔo”i˜¦ Ú”ñûh×2)CÓ³¼cæ€É¼÷¿¾<IŸ)ˆ7È«ë-ÀÒÞ;Ú (1ŒðЛ}‹IßÑa„¤Ì®=Õ¡y‰ËŽÀ¼‚R–“žöáym¨o.Úë\úrfvjžhO¬C:Þ˜ßvÆ[Ätº¡ž £úZI¥ºžŠ„òFpÒ:41æº=|F–¢ÃÃ^‚”9<}v/à2<ã"ú{’3uåßG—w0¯X'ûL7¯t¶÷œuÀGÃhçwÒ&OŒWTJËÙùÂôŒ46yIqalÕóä±€5 ‚çGñ/úˆN—×îý#FÉአ+VB.jëÒ¬móOj9ßÜ™þ9©ÑfžZY"6‚¦¶îP'D\æ>ØÙæ3k.­Ë‚º¹¤Ñö3å¸õ™ߥ弄À÷èÚü䮺4 ü6½¾Œ²ï<]iþ‘|J2kôŸ¼¹„¶€¦öîQ'$Ÿî÷¯ø þ׸IßbÑÂrÍÎ’¬t¢51øþ ¿Ö­ÍÃöÏz“hI ý†/ôtŒ+½§´ vkñpx"Ü \-:±ŠÙÌÆ}–2CÿÞcáŠsø Q”€xó ÜZ/²@›i(4ž.ä/¹íºÀ_Œ ñ®€HsmYLMækÅ‹N;Taлºq\æ$k]ÇÒMØúú² ›@‡&MfÛTÊa´EVÉq$a(ž3<Ûgé 65ƒ}åcyCOŸ>dŠxf§Ê@k5 |s…ÌxÂ"Õñíô°û\WÄÉ—²{ªŸ»¹ØÚ”k"è$döà¡$òø‘NiG‹Û=Ï£Tœo + ¶zÁRß­éK ĵ#«×ÓVJçßPËšÍ5.Sn¼¹÷6š}˜óý¾¥ØSØ™Cæ/¡»¼¯¦.'p¹ÛÔ]pŽàYEÙr`i²;lÐa³y,@sJSëÚÂô(˜[Dàw8Ã’xuOP1Fg¢·®B²MïÃ¥52]#hÐ_1à +´É?ùÑ¡Á`/p»šOÇ­´Ú­ÐòhkEUå,‘ Õ7ð«ZÃy%¨?ZZP¹Þ5—Õ{PŽÿ¦'YÏ=I‚þݺÔõÍ/D“ïnúG€ +¯ endstream endobj 236 0 obj <> endobj 385 0 obj <>stream +H‰„”TWÇgH2»˜žÍ03˜™ö¬›SVPÚãO"XÔ-.4«‚„š`0»¸h<Ò´.(l„.ZÀbU[¬¥Z( md\ËnA¬ÛQ»é¶{‡}œÝèûgÏÌ93ï½;÷~ßçÝïà˜< Ãqç£Ó®-_«Œ‰É@(R‹]BôlŒn&övŇåçdVmbýÎ[Ê”ÀB ä9»Ð ß +Ô÷Ô*çšd7‘žþ fªvfZ9;{ hX¤…È ˆˆ™Õ­˜^[—^­L"{*‡‡6+?M8‹dH¡EòHž’¨Û¹9±,«R©ò‚èeàÒ€ôHO¨€å÷‹ 2?°´ØÀÏ7‚üñSååçX©:.È׈ <šžc „ªÙ C<¼ÍãÓØ‚²iCw Ø‹†°€@aº£á|cG×âÎÞú«ÝÚÁ±mº¦}9Þd ÁHý?zQØs{Ö£ìBUñŶqxq~Á«GÂ!*ƒ¯á&¡(ÒħNß¼üöiÖV×°Œy§ùDíi–꫸¦¨ªp«`Ò¼þ÷Yx…„pËZ·Ëù»,Ý:òÍ3Ÿž™bónËc3Èd9U†´d¦)ãp³Éõñ{ÿ‚•Þ‹¬ÊÍïwŠ¹“à*Uß 1HõQew<4OP}£ŠÂÞ|aß× €} é°l(féîµ6ë!j*Àc …ùX:ÈyëÚÝ·õÈŽ\ ë¿8ÀÀÂ×Ђì×X©‡ÄL<ERwi1jxT3J\ñÞ‚È=eå§u_’µE9¾õ *ö".‘MEz#èI2ó°xJÔðîRõ`šêþ÷(þ}Ï•²[ÌÕ‘“çþÌ~õYí$¨µÔ„¸~ IÝOögósº70hãoÐ&¤\~ŪÇ›f.³5D¹A±©²l+ZÌÄïm~3…tÑÓ“‹³˜5&…îê‘w/³-M~&Гæhy¤~÷ŒD¿'€[Ý“ð19t©¥‡™òÍ,’œñ_ò‹Ê6û9]gñÞ†l&m£3Öôÿž eØÏÃBWC#„#L f¡C¢ÐŽüF0Ô?Ü`¢!\Z +n.Y"å—HùC‡Œú`M‹™·%½S  ÝQT_¯ôöw‚šnïé?ÍÔžª<\ÍþÁýzEºv^6ùq«ø,sòT¥»š=^ùz…U;1%F’ÃGßr·êZÝ…ÍùŒ)3i¿SÒú7Oæ{¦8¿<:EQ}’ö5Äã^Æ? +B_Pýn’OÁ’$àÐN´M∖"f= /°¼Ér¿þÐýHÿ‘îeO/Ïç‚U¡ÍNHâÅ¥7&Õß<òÝÄ7ÈD DxøŸ°u_b ´™¦&~Âx¢¬I pðÔ8¤£z@œišzÀ4ÖU;ÅnâIª $5^í(<‘ÅXWU!ܪÓû¨NhÉþ‰þH¡QTklóõ{}cº¿–œ£9Ì+éÇ[‹ØC Çš®h¡ÜŒøŸt'‡? endstream endobj 200 0 obj <> endobj 384 0 obj <>stream +H‰\’ÏŠƒ0ÆïyŠÛC±U“´ B±-xØ?¬»`uì +k Ñ|ûÉ”.l@óKòMø&3QQžJÛÏ2z÷cSÁ,»Þ¶¦ñîW¸õVìbÙöÍüX…3ÔND\-Ó Ci»Qd™Œ>ðpšý"WÇv¼ÂZDo¾ßÛ›\}ÕZFÕݹÀÎr+ó\¶ÐáE/µ{­QÛ”-ž÷ó²Á˜?Åçâ@Æa½c3ÍØÂäê|mo ²-Ž\f¹Ûþ;Ob»vÍwíE“x»Å yϼ'>0ˆOÌ'ä$ŒrÂœ §¼ŸÒ~š2§ÄGæ#qÁ\ +Ö+Ò+¾GÑ=ŠcÅê]`œY£I£Y£ƒF1+bͬ‰ ³!æ¼4å¥9/Myiö£Éæ5å¨ÏÌgâ 3>ffø­ ½•aÿ†üöfÈ›ao†¼öfÈ›ao†¼ö€èQ *v”|öAs÷[ ´]¨=U½·ðìL7:‰Qô‰_¢ ¸ endstream endobj 383 0 obj <>stream +H‰|”{PSWÇo€\."qå›äº¹±êjW««]|[Dy¨X©Bx!4 Ix™@« ÄD <Y… ˆ€ˆÏÊN)hQ·T«3«®ÎŽÛµç2§ÛÙ@ÿhgÿØ93çÌœs~¿ï÷û™9‡†xy 4¶;2<8le„@$È}˜•‘*åg’f—QZड़룠~‘Wþôý÷R¡óIó€~~÷¢ßyùÏ\TîÊ:‘#¤¦Iy+’>â­Ý´éO«fæu¼ÉY‰)¼˜‰4%S %e‰Od‰ùÒ”äÕ<ÞÎŒ ^ôL•„"IËÜ»¿á $<>O*æ'§dòÅB^Öñÿ× AhîøЂà4d ‚,C•ò1‚|â"HŠDx!1^ÈYìŽx žÈFD„h‘'´4Ú<¤·<Ùž÷¼"¼úè ôkh6:á-ƶ`Ã>»}*çdÌùÙ7Þ÷ßssð ó{ÄØŸÍ`,™>"§MMxRìé#L¸a×áÆ4ž +£`4À¶V7°BÆÒA¨ls‚¨oÁràñû¥È&<Á²é@æH` Âm©0r\=‚ÌØðÍ°± ìuWÑ›Ä<ý˜ÖZ<A 3;XÑÊÇt†S÷–Š›¢ +Ì÷¤-¬éª»ÕÐ/¬`E/8CÀµèä(, Þ>^œ·;n­Û'¦pƒÖÔËèWÚ¯všRBW|´<|?¹/*$*ü&óf8•C”ù?xèæáOÁ‡T½ììéè!:Z³ã6à áÙ¤>•Ž?5ÖÙ Ä_Ç>Ý‘¾uWp|·9ŸTU(‹U§óÔÊu®ö”.פÂÖ›ÒëÄ©‹ÝwÈ‘þ«s¦ö÷‡¹Å%t|Ôem¾PeÆìµ5¶6Îw›Z÷Æ +R¹Q{è °^× \—ª[èð§" } yf!°¡žœoºIµö >á¼ì6sK¼ñ__xÞýN¯Ü™^ǵ¥}f +"`Šk„Ú2 "ìPøƽ¨4;´lü¸Gµ2õÕz³¡+5ZŠ­DßuIàÖØýKÈ ´>‰‰¿û&cõÊÐ5qÒŠa é·©f]uwÖÑ8àá£ÀošËÄÛ•Øß+V¨4;µl¾@Áœ®?%ÇÈ@7Ç]YÏ Ÿ²ùWusq| ×Â8®Ÿææ—òHY¹®ÞèÄË!»e:ÑAãS|OÀtKj…O´Ü-_ª¢Š’ +ØÒ ÔÔíE¥BÖ¹r£®”»cu]!û{¿¬y7L!¬Z€˜Œ#ƒƒÅ˜p‡¸ï i)‡'ðí6®5þ†P‘f‹–­Ò© ´ÊÙúÚÒžjdIŽJÙrL*Ž×$ë ëW’#àÇÙ¦ã¶ÁáfTdÏuÈeàJ;pÍ"6~„Pg™¡¢ÈCB®"C¤=NœDû€ÞÝbгgÀÛˆ¡ËÉ{H˜³˜h“I-4‘øfëAkT-¿)âÒ à¥m:ËÂ+Ëíòò|K^» NÞ)”õJFÔ6ìﶇÃ/8àˆ]„–£ø!­pìâìœ\¨Á±Ý 5º]³½ù=Ô÷=¹?ðùÌÞÊ6|¬Ä1K‹cŠ³1Qí¤`’ÀÇÁý°¿?0ÜEfÖÐcÚ2}œÁæ1.>öª~KT9Ù¦§ã®âaÝåÒ˪ÒS††›ÓŽ2 ¸`éÈÜzûó¯Ȇ<ú­Ô¦”Î!ÑÞ€å±Àçf!—6éÔý5íô¤Bk cÛÞsê0Ý…ÞmÖæ\ ͹e'rœúŠÓ„±‹­@r­ö$ñÓjôDa‰­T ÊÃŠàœ Ì‰Ö_«¶WVbÖš&óß;úÉO‡góo˜Íϸ[!£þÜwJîßüøâãT 3ÒT¹šÐ›jKI¼§ÐíÀ»þ_§KYøxÞ9y‰¤ +•JôD@À±„£dxd"DÖp¶µ$·µô;þÂmjìê»äÂJÐÜõômyMª*¢á¹ëÖ—$ «˜’¤ ¾$ KLË>UDj­ö.ÓÃÆ{dã½F[3YjôÂZý…ÆBžI/Q+0F¤ò1p8xÿø»ŸË{àÇÌ•I:@$K/ “xûuÒÞÇí¬«;_E\¨UÇ·’ø¨±¨FSWÕT¯ªä´|ÞøYÔîôäxnpDÚ‡Û8«ºcŸ>sÞÿšËxè&Ð{FŽ_ê’û·,Œ|Àħ(5@™ +IšLã&q~†Ä5€P×èmÆ3Õ*B½Tœ»™¹¼ÛtÚ ™ÿ@ǧô……:±7 ýØa2düâUœüÎæ6K·¿£³ÇÞ醢XGß_«²öç®ÛwHø®ƒyÅ2Öp“k»i»T+·Xõ•Dmýé¢JRsT ‘‘,]!Ζ`üdÉ)%qJmk"in(¯zi`X 0OÊ°˜Gcc³“ˆC9ׯ”éŒÅeäëf°ý«×œÞÔö]aû3„‰ÜQüe«9ÐwTtcà™õŸo¸îô:Ód/J‰æ',á“UÀ»£×^*Ηš\ OʨŸ¯‚°÷ûîù¯¤ñ—€AÍe¨>Í…~R¸%w·²SkÔg‹¥¤²LI*ËT§ÕE§µùg31±M]ÓØ[uµ;Ð×û¶ l­}ež4¾3±œt8Çýƒ8‡õ¢•°Ú•âFiVÖ•˜*0SEÕΩ/5ð‰0þ1>y,Nœ÷_º«6¨ëŠÚ¯¼ql%fÙÚÒ¦»n2mó£­3‰›Ôi]lÇu‹íÆÂæ# d‚$’²„@ˆod}!­" !Ø€18†€Ý„&n4É»&N3n‡ºý¡ÌtzE–™ö HÌ´?ôgGsß9çžsï{/á§xEÒƯç,ãÑȵZM@Wx.ìxö˜ UŠ®™±NØu{ =/óYÉb†§sÇHMøBŸU¶•¨…Ygµ§³ẇ¯Løi¸•’ÄŒÎ\hN0ã¾Ò"§„Ê<¥‘f2g²U§Ï +ŒŠ t–¼ÌРi(÷—vpbîÙ‚“g„I“=X‚CWá;“9ûnÒÒ6×)tØ.^´ÒDëBׄ?Øy©gp¢ácÜ[ÏZXÚÞ´öz†ü;È} äƼûôÁîdØM|Ï{É&žm*Ûì=øòõå¥ÕQ§Î­bˆµtNÓ·«ÃT¥jšÑ÷`È¥±¼¶¬çõ«wÀŠ-·çxTy©Y[ÈÈÊE’WñzÞGÑ-ÿÛ½/¬½fJ3¥›Ò|nÿ¤ Œ›ƒ8Üø±BD¾4’èÀé¹ØjyÁ怸ˆÚö>x°›Ë`.•yøõÓ§¯ëè:¨‹•R9rš«ÁŽUt ÈhË’«ÉdšB\”(ºÞ78ܧé‘0|î¸S½ÊÄt‡'. üEˆ•ÏV r„·‘ˆüpÍ‹3´=âŠñÖ"ë¼W`kôÆ·øñ!‚ÈÄ-7"qãQPâa×<ÄLJÃ^Ò“×уw—'þ´ÔEµ×•×2ùÜËF‘AdLÀî}*û‹`ùí{KÝ”o£g7;ЋðÔÌzÐĬ¡, ë‚Œ¿ì¯¹^9¥+3ë‹™býoÅ¿K¨oÞëy[öçxË)5ú.gú£™¢$Ôö6ËZò©¬£ÿp(è¤lHÀjFÊ4¦R$þß×»³Nç6ÄŸ€'í¤˜W¾&³<~©“òo ¬#­ðoj6óÈ+–Ù¾ò5Òu¯èßFä©Eˆ²“þ¢&À8ÅǶŽ¢™ˆîž 2’ï}~‹ùpöÊÃ? ¤üá§Ù¯_P‰éW$IÏq{…‰—žœ†gáÙÌ=%â¶Ê x}MM½‰*,¾vž›^ +{«ÓÑä¤úB… «ƒã“uôûÓq©:ˆ'FÀÝCZÝîuyB•À÷8Á‹Ü)*Çi¦W¢bÒhÏ­È)J¦ÜbcQUVà( º‚Ž Mð£5[µØT\%m‡^7Ö¿=Ý*kip;® ˆ‘|#>6·³õ,uÇ·ðÖÄ>;ßóéÂÏ3ÏaŠüšj-Í?êTÃ_€Ø÷¯˜·ÀäGÓÈÜW¾!–#&–ÌÌr/WŠŒ›Žjv/zçD/;÷æ` øÙfådk«ZâVk•«ÑewÙo—“µM>Üo,q•Q²Ô“2˜z^ÛÑQ£ÎšbŠÿŒñ6ŒÀ¶sqŸ~vçqîÂÏÉɬÁ”0]Ô&íìöv±¡P¸TÓNKöjOŸÅ‰ë¬ËÝÞ&¼”HÍ;W!Í¡3ÄæœóÂäé’Q%=YÔªU ßPêJåyC…t¥Û`Õ+L:U“ +—4Ï˯R_F¾x€ÒJ"Òcâkq‹èÒ0ð‡¬kÁ”ªÌe¬cûíÌ»à{hë¿Šqñúá© ,ºÛsÿRw{•÷†ÌaÀyiœ㶔 +†©›‘»Ãh©ýcÃÝŸÀ“¿Ty±}:zˆ¬iö[Ôøs/ýXIi›º'‘TKãPŒM{Ê»ÕÔk †NÀNÙLÈ¡ÄJ6—Šq;•#úZ¦v6Ä„ØÅ·§¾@¸";eh- :¿9@k6/<A3ðø-X:£éÜ6؆^>gŒèásû“ûÀÿþ¯WxYÝuþ¼¼XÕD›=Ú%ÝP –¦*$•º¢s(C³ÆÖÍÒÔU^- Ä¿:™šÍ°*¬¯¯Ûç¢\Í*™•i=ØÊý¤å η E»úM܉h7‡!7}N,D_D~’(åò&ÆìÔË…ùº¼â4Z%®,—¦¡Úµ³Õ€×ÝÀïYôƒç©œÄ©bÆ‹ª_öûܱêcË pâºÃ¢#ÙYû^p—í…—PH†^‡Ðï‚þq6^)íTÒ|½w•örenHlŸoäAµ}MïÞN¿y¸|Ï¿w>vcðoÚÉE|4ƒüƒG— endstream endobj 122 0 obj <> endobj 367 0 obj <>stream +H‰\“Ñn£0Eßù +?¶ ¶gZ Ej“VÊCwW›ö8)RcCò÷õåV]i‘‚¹sƘr½Ýlc?™òOÚ]˜Ì¡] +çá’Ú`öáØÇbY™®o§ï«ù¿=5cQæâÝõ<…Ó6†¢®Mù7ß>stream +H‰„UmTWžÉdf‚™&ÚD3ÅjÙ¥âÇÑ®uÁ" µE¾"Ä‚ÐA¨HAm“v‘(ˆ€XQ¡`…Š_ˆ‹Œ¢PEü€ºÖ“SÝw²7»g'ØžÓûãž9çÞç}Þç}ÞûÎÅ1±Ãq|Jèªèˆ5+¼Ã²S“ÔQêͺ5†L^›š¥Ñ:ÏU¼ç'‹è+þ¿ÿžONÅ°šb7ˆ™_L¬ž2!ÔÃ‰É ÊÈ4hSS6f©f%ÎVù.\¸@µ4)cƒFeÐeiÒuª•›3´™Zu–&ÉG¥Zš–¦ŠtâuªHN£Ív_ P¥êTj•V“’*j5Iª,­:I“®Ö~¬ÊHV¦¦hÒ2ôª™ªié†á‚ŒÆ0sa1l +y’Ø_l†-a,ŒÄ¢h,ÃâÆvpL„Ø|ì>>ÏÂ+ñ&ü²È]"J}&:*ê'âˆ:â7±Lì'Nç‰ÏŠ‘óÈU¤…>`|þøÎñO]ÿêšäZé¶Ìígww#`<Ò{@ ¸"ÌÊ 3½P RŽ*ãÇ‘àå¼hfx«£_ +®€!WÊÝÀ­l~ŽÝ—óØû¢Ö +Ì“ Vf?³ˆO•Á›w6¯2µ¹hÿ˯K¼)“Δµ3­xANÚ–¬¨ÆãJ®Ôÿóâ+ù³Å-‹×Mûà€ºfµ’Ù©Ct4š)ŸÝ‹d°¨ñÎ?.ÝVª/JótêŒ÷Ó£m·ëKkªªÙ#u‡öÞ{¹w-¹$a"wž’Vg}ß*o:zêô‰c™1ÙÛBý•îö2=ïZ ¾Æ^&]¿ÝÛ_‰O,zM–£ImHúÔG9ê;Tô]‰ä°'¤<¬_Ù»  å@׃èb¯òZoyËÉk®Q+q yIÏšì‘<}ÚR˜$‡É±ð†ÏSåœÿÒõ_KVÒ-E½ÝïI.Ÿ@"åH¼ ‰#C”aï…ä'|& ÷ÂÁ^ÐéaSÓ—M-’ÓmæÎòÇÈ yuÑ%a;4KÜ¡‚Ãm¼'aƒ +)ïÉ9<©?ËÀ ¸³!<âðN´Øè4H!þ[ØSA%(ÅÅ¡bÄ"e+Úq,'Fž;!w𖠶 ˜aBŸ.þÐtÖIÅÿWÝŽE¹ºä~›øU9¼E7ó‚¿$»G#B@Xä=ÚaAe¤;°œ•;oVÊ[8‡…²Š_ÿ,,i v‚„Eм„èªPs|¤7ó³lˆº j*¨›HMÚ(d´§ÞÔ)$• +×ó&‰Ò“88Ò&ÎcÔ +úçËlÌËQDPàZ]zè$ÛQwìêey}á÷š•ñ­1ûÒvKþ„¥ÞR[/©«¯hi•_Èì^U£Ü·¹ÔOâ(k´•úùhaÁA¶ÆP‘®‘'d«?Ö+s6¥þM±‰ +7PÌKnžµ&17I»…Ýš›³Í_1_hÌ ÿ’ÃÛmÞ+=±zo¸bÕô<¿@öýà͈ž%GK†P<|ùðê¡} ÊAúÓQÙ+H†&ŽÀP]†÷`Ñýžô‚ãBk8þ‡_³Â%qM~xt»vÜS{äg¶Ûo+;Ó#@á”l3õ˜:’$ý¥Èm¥µ££¯rý˜9µäsø++ñJÆGpȵPÇ¡:ȇŸ8Ç"gK ƒr7+n2+ôA‡: lœ# °§èñ!+1$³òb +Zb$ºÀO3<#ߦ àM ùì¬0;¸À„Ëø`ØYï1 +âÅÜ'm7x|€im“Ý ˜»vÂDÃ4G ybZa¿Š4ýÇ}Àž"üvÐÇ;äšÊ¿C"ɸ¸0@p²¾ÝDÁ·Žvò±=å]ÇYx†?KΫ¥›ƒÃ>b… 1"Óýˆ‚P7 .ʆ‘:KCEÝÉ7[Ë/ž’w¥õ…V++cá +äôñ +ÕùʈD.F.ì‡c‰YÁ³PYfµ³PÂ9úƒ Ä9‡v_=Þo…êD¿=EêÐÑãÒo>P.o¾»yPñâ»–†¶ù¼¹Ã*çýŸÐ¾éÙÊM9ÑyjEB²¥AËæ-<úDÎgѿ׷‹&à+Ù3 +LÂ5_H¡Ç(ŠáGIaêŠ~\~ÖtÁÛœGϯkeòá!Ü’¢IhÊZ$›{7jäQWûáZ6£Ôק8RµkO-Ëœ+ºD~^´ug‘"ÚØ|†…OhpMº‚Þš»:gK‚r!½ÿøå〗§°±t¸˜ÉGr:~mlAªb‰áü7ÿ‚yÆÓ¬ûV..‡O¾½Ç°*lÌ9&¸Dx3˜s=¤™ÒV5ÅŠZ9éú„œ܉ò±ÕxLþw­!©ë–«ñ$Jò4 +í¿cï6\ÒAö—I³‹³ •5¾Ï“(ÎÏÛ-£3Ê"N$²qí]Ša¦›!·x«ïV”T—6rÔØᄦFS_M÷¦÷¬>Ê6lªÐ·9éO©M•tUQCAKu“(./hÒуêK¬á_Y– m¡Æ'Ñ\q7IT·_à 'ª:Zi}¾°ïÎzˆwêttÿù¦>¶ƒ'ׇ½~¤D«Ñâó«%åå'›èú|ÓžVÖ·©Ê›Ù"9‹+öÞ_œU°—Ë +…éûèO‚ïÈØ´ýiªÔ§ÔÝêð:û€¼TÆV®ÃH”¦)è¾êMl,v&µ¯âkQ¼2µ¨VM¢H­ˆŸby[ø}ÆŸ îç‡ endstream endobj 223 0 obj <>stream +H‰œWKs¤È¾ëWpÇÂPU@o^¯½1ŽñeVŽ9HÔÔìÐH+èyü{ç«ŠuKŽ5õ®¬||ùåWZEð¿R:²Žž»«OÑxõóõÕ»¿ÿ–G»)RQ4íÆ«w¿B÷aºzw­þ›Ãàõý•*¢þÁ§1‘5yVF×Ç«›ø—.Iu<À¯‰ç$µqÿ˜˜xL>_ÿë*ç-Ñ´î 9ƇDËQ=/?¶c¢Müƒ:Ó$UE|¼Ã3‡tnïâì[HQqš\ÿêJU¦£ë_@ <ÓO ½,-AÎqÏçDi~Ü>¥Ó[lïàa_xP«ºIà!îŒüíà}ßQþ]¢ôjG‡2d‹ï•Ç#êö4É%)ìêÛ!ÂKQMó÷¼bÀɽ\ç4:Ùá +‘íEúš¨ŠÅƒ*Ï#RÜõ_@WC?ÒóTÞ¬\vlðTÜÁé§X™Ø"×@%Ì2À¦£Ÿ/îh2:Š¼x »DB†§5tÇ´•Ð)»ãÐy_w?ZÔ+Ù kèxñâìàæm?°c8 ´“» ¤âÓ¾ïœOq”.n²£¯£ |ƒ-ˆñ€{m|âÇrï5ƒ:_e¿&ðsêïÚ‰û¢qÿF>IR²Zý}Î…aѽiâkHîeƒ?çÃü )e|oìç +¹C?‡?tŒ¢Œ{÷ø;>Ê€SøŒLbb Ë!Í‹“¬h°ðjñ‡q/G;1q5vâoðà]?R 4 Ž`ÄE\äq ËnÔ£è²@§†! °ôæ;§Ç#ݼ/y<9¹Qs>K|9GEÉÙFŸs ˜áßk„:ÇÇiæÖ‡„ÉihŸe–­{àÓx¬__ãÅæÑÓ$“µà ~è`L,måÞvQáZ¼k‰Dˉ·1Ÿ(ÝTŸo“À“H;ßP㇞ÕMšßƒ't¬»inGöÊvˆ6P‡XzèxC„³OJÖ% Z,Èx˜Øqf„»Nœ5¸@8˜"XA¨/Ù OËHx-a°‡7x;Ù­IqHiã,"$c)Äp+¹Ò’(hC0y#Hí +èP*dšDC¢‰Œ-²ª¶Hk2Ý45òˆxß ÝÜÝÆ· ¦Ö³¼£Pu–›Ü¬6ÞÄ$`ÂFÆ·ƯN =r›YÅ«-¦FÏË[CÑSm³¼®µz¬%=˜%³ÛÐÀádzüᾷ–œ÷¯Ã7:ÅQQ•©¼%‘ý8¡4žÈ‰möD§7"LïCÞ…ñ›²ÓªRð]€*Ó­ݨ󯸙ç¾ìò¼0a–‹ì”½âàÝ/È…ÖD—-`oD©Š©«þ‰ò•7rÉ;þÖbF£lŸyÙ²pêJœöáÛ™žÝ(BOËðˆv~㬠°Ïø-çí7²SšgXP<=¾Ìy,€¶NýÐÚµ#}O +¤}Ô>Ÿwµ |Ç% /§ºiæX³ø +€ÄQaãO0–Ë.Bñ`Û6\…"¯2›ë2*«&Ë›Æ*Ü÷ßÿóô:(&ÚÖ«}èß(‚XšÓÁ3é@¶بWPâV24™ÉõeWl*ñEn3chªKn3tkà—Ìà`Ú_Úz ¼Ý‰`¦Ç72ò ƒ4ÖÓŽIúLššà-gÔ¯s•ÕÆب,rÄVV?@I÷<¿ª]”™²ë}/$ÊY:Á‘­!¨@Ÿƒ|ípIB¥l¦óD—YÞdeu‹¤ª²™2¦ØàbK×¹Ç/lSA +h ^E¼’qL*†ø@¢S~ xâò&Ø9²=‹¦ k@JˆÊl Å„Öi¼k‡V8aˆ!.àÞ +ò9!Ý=†!hlq†Ô܃i…ó$ ‹`ZMùŠR4=k÷ýÆ›ëÚy¯¯:`È×SÐFFý#Ê+ ®è×J¥»à6tNOü•Ù—=¨vocÑO-ßδXðNí€(›Ú’Éú½ÃÍî䇯‚ºühË—ùÑéæÂêÄ–Áª?§{)žBQÈ+)vùd¬?yô ´ðSØn`ÕÑ–•ßòà +øýÝÄ\„ºàþµ;QzµµÑÊ#3‰À(ÿ†ÚB/ÑpT+ßo-s¤û&ºXâ>‹§M½/Sdn…bŽ©¬) `’VqŠ¿©24†$€+ Má¨ôØýÍrVæËàI!äпዹshà ;%6Â+¼½ad±·fãHÄ$‚½žÜUÞ•¡ÓŸ\|äøCwq…³ò¦×hyi êÐuéªÊ*GË_ƒW4YÙP¾­(ÿu»ý‡îþuÚ® + öQ‘.õ†·¿¨ØVÕ©+rG¦$Ô~j’…†ø;.ñ]ÊRÕzu=¾ëO o,äûr+»Ï,^Æ·Š¥­6DŠŸ- è²…€a¨¼\¿dß ! )ê¬i ÍÝ¿ûñuó˜zñÕ¾”…±‚—¢|ÅX¦ª€ýí&QÆdOTÃâ뎿à%[T:(…F—xFªW…̹ú³†W +lªMVlâcÿpxÃ#Ê*«v¬¶{—(7Ð]RÆÆÓû´RVËÊ‹i;Èz áIðÒ—/L5x(„í¢_—˨ˆÕÁˆ$ËÔ׋+¬Üó®¡EžÎ©uMë•Ù`Õ¦ TŠêÁí™  ¶žO_.âg*Á¾ótÔ«–"Ѫ³´×!¦ò_Ê.ØL%µñHŒÚ®.õÅ—òùÉzÝÂû·tŠ‡ÎrËŒˆ}ÿ‡»Vä`5 `ù“lÂê–ßOî¶%SYÔÇãä.Ý p uÐ1PÑš¥U’-Dºsuœ;”b[ƒÒ´dA¼×%ÔKu†#ÕJ¶E +7ûHqû´ë-âxÂiØGËžö9d„H~žÍÊ 4•™@žælã)ÒØ0` gLtHëœ ÆBìǾðä@ÎQ)Tq.4ÿmâk!ë(wîOÂÐ w¾ž{ìŸI>…ÕYmË&RUéÓ%Ÿ¹{/KUeZAú7ÞÄNOÄð ÅîšELf* û1…q^3uV™2@9©bˆýß måêÔ Ï÷2µï§Ý ¨ª{°‘ð†/W A®^–«Ùšx ‡0ÃlÙŽ¼Gš¹ Þ0ýújéiÂwÿŠé©1ñÚNŒ‡ªU¢¡êzHƒÁV8‰Úªâ¿÷›Ù‡×ro±g<;;³ûÍËÓU `’®‹F­EN'±9Ný q:¬1_6û•ßÏöàƒÔiàãáL)Ð{‰K•éàÂH€, ¦àLµ¬ÆŸÿ ˜Ö: 1ç,ÞËy«_t’ÕUJŸ ÊÜí.µ¯‹è%Þn¹ßQ˜.oÔÛn÷8ö‰ä›ñH# +o\\ä4‚t5Oní÷\þ½xšOÂ$k©^ {q º|•’2ñ,9á{¹Š̵âÚE>‹€Naow]T&:¼ZêQ¢äQˆ Hòê)TòñYqn¼œ Û©Í´M /Ʋßž-*7téFCoÚ… ?LªÜ=—2nØ»KÖÜvݯ€`I*'QÚ3ÓäÚMs•¿ÈÅ ‹¸–µ­zÚÖ®¡ìÆ@²ÁyþÎ-Ìý ƒ—L§Ÿ/¬ýšÓ:8æ®ÜàU.ÞÅêK•¦»æþÙÓ!&JqÖ$>@nN,±õ»f{¥]¹¬äO™ß+sš’jØ…qíÞ·¬~Õг‹ìÝ¡nïß_WÁPÒý0ŠéGpòa6¤‡6Pù8R%JE˜.ÆI4Æè¢Òi|[÷Á&PhÂc¡JŒ1V‚ù•VÁŵÑftŬë¥Á.ŽY}¦N(Fëý÷®?6ÕéÂäÍ>CƒÛË ücÒAHDÛ¦Ùѹ/ÎœÛã³™hÑÔÍ’Ów“îë“Q­Œêõ¶zœï +úÔܾR¡ËW-©îé6,£)ŸÓj_×·Ç8“Ý~»êÌí•Êb»æMÕbp±k±æèˆú<óáÙö$¿^™égÊraiÜïïeMóݲ[¾ n ¿¯~}Y÷TÚÍŸlÇ>›°â4RiS©n.ƒ‡iµè¶1ᶨ4áÂA¥B\˜„«$´“IJÜmÜ€m”¥”'©…àɨ›Ìðf“Oàì'Xªg”Ç -–²z‰7óF*z”œ + ÙZ@^µŒá²˜åÒˆL€› =à}ÀÁÀ)>stream +H‰ÔWmoÛ6þ. ÿáú¥†ˆI‰’¦À’vÚ¬@cû0ƒb3‘VYr-%N1ä¿ïŽ”m9R^¶o“ó"žîŽÏóÜ‘¢èÃ8|uÞþ|Àuã¤RÁbU*L˜„•v®œoŽà€?Š ˆSAÆß rŽ'NÐ%‰)É„ÿ‡É•“s +\Hˆ…da“…ã.o.Ëb³2k8==?~÷Y}×êjÞÀI½Xf«ì²Ôd~¿få~ïMþÂi|ÎL>8îß4žüà¸`ѧ#Á‰„»\·Y«¡i³§»*ª¬„˺.uVÁùÇyíêFör=t|úãÉg ºÊÊÆFíïÔC”‚…e/á—z®aU×íØlV +ry@}úL{!$ÙWýýpü©Ñ n³ò‘çM©¯ÚX×y{8®á0p#Ŭ.ëÕSp–¨xÃ/šqêv¨v§Þò5^m^4 cQÿ!ïÍsLˆÏ7¼Ÿ"´‰0D0âQ:»¨ûÞ´÷ð~±mg[rÎV³|ËyŒè–¦*wæaŸàµÎ‹RÃÔ½ƒ×GPÝ”p;‡¡bEÕÂl±´‚!QZWzRcfð 5,®prÁÔÃÞÞ¬*¸cÃNÂKã*Ø…¼3„þŽQg=çÿ¾ç¿ëÁq©ñê óÃá¶.æ(A£WíXßÝèÄnÒÐðÀ&êR<ßg³í2³ƒ<×g÷[\q¤F÷‘ 3Èà¿Ò3ÅÈ©Ú¶£ö¥ÖënÕ¾€ð~ ¶¹‹æ\Ïq +Ó˜ÿÍØšLѧZ:?•ÅÍ{3<¶ oí¼×ÚƒMeÐßtå»McÿUðX‹[2±-ƒµŒ4ÆÃL{W§@¯½:Ë‹:ì9Á;uIñת`‰çfŸÁל>%+)?}õ”nOÕ’L»ì»Ôçæ~õD]‡TºÌGàl·…ûq]èøÁíñ)æ©s–JiÂsùÝýä éfÜ[/v3˜yÜ­=_º¸¢ZOº5‹¥ç ·Ôž¯ÜþM]ì::¯ ƒÏ…»ò8wµnP<.Tó ÊÃñÅd/]QÁ5p +iNåÒÛàÉ'çí J0k/4³j«‘ nIpb¡&“}°±çxð>ë¥â + +ð`.”%\ò><´K’Z0…o ªŠe@ÈíÁ˜Œ3žp YÓÜ ++K£$Q1,ß)˜ä®­”)Îã]J<駡ÓM‚a¨ðH‘¤;ðHˉ$ä>öz(¿3„”Á—,‘)(&Ót˦>$*ðh…”dàÿïŠb‚TB‚9ºoCØœ)°Ä©ækàÁ~C¡nX»N4Ð4J„f¬djƸ÷Ñ7-ë`n­Og%·À®Èš˜±Oó …'Öÿ[¼Ù8Ñ­u#º%XäÿÐgÎ? ­äŽ‚ endstream endobj 179 0 obj <>stream +H‰”W[o£H~÷¯àF¡(0fEê[F;ÚÞyhKóÐi*IØ`ìqáéî¿çVP€;³ÛSUç~¾sΟ«Lðo­² ¬²àT¯~ºÕÛíêêݧ4ØÙ@Ýu««_àõÉ®®¶ê6·+•)ü…G¥ƒR§Il÷«Ïá¿ê( û¸­£¸M×tOÁ)*Cx͇ø¾¶fåáKÐGqßj}ÙþºJ™lð‚L•cª„iÆ_3bªt¢˜éoçSe*´½9E±*C ­Cd»G|9D¸ÑÓFcéÑ?×ôü5ÊÒÐDpí/¸>³?‚ +:ÜãOצˆT:úŽ«GØKCǹ{æ +”¤·Ÿ¶Qµ™“}>Dª¿ùµÜoº‰ OðI1â Kòvw‘BÉó°«ÆÓ»] 6üª±ýb•dÁö=˜åhžÀÜu‘”±¾¤*îš»T—;VΟ¢"ƒ˜œ1&§x²"\®•®“u•o‚u®’´ª*ÄgHR[Ÿú»ð.¤ºˆçª®z£&?cv–©â¸j¹™dÙ®’h'4ölŽ¶ ¤Ï_`š¯|:šîúúêÍ®?›v[ë¯o?ÜÞfiZÝÜÜoß¿ VÀÄúð–žl:É«ãðŒ¦¦PÞoŸyƒ]E› B†ÀaaM¨'vf@Oxë c€åWöé^dÃ}8=÷.¸hóÕç¨C‰¨£Ý’œÃ7xå´i<©Mã*ÉËÒóóÙºt¡d x ë!Þ‘±|&ȇ&-Ýkåâ#œæØÝóÆLÿ²èŽ‡Hyü&FBõ]ý‚í[ÜtÅ÷)¦áŽ«»?—>S‹ª\,:¨6³èØ|€Æ‹T8QñEmBkö²" ˆ2Ѐ1Ip”±ùàv?»H¸tèÙêÎv› LÎ X»¬­7á)åfcyµ,Ò(¸ h¦$€­ããÂ`CÙ-‹‡›ÇïLŸ®Ï,6°7tá+6²¼˜4L…k—ÄYþb¥¡GóŒY37Ži-Z<Ë0%yaøñ7ˆ'^Õx]Ê Ï”g›"ÉÖåÅ¡°¡ÜÖæ´{~Êu¶IÖ)@¹‘ <ãë1~d™3.©çä%Vèùž³WnÒ݈]”‹jø|€ÒLhéb–º ;TU²Ö¹âA ÚèûFšÆ =på~ó» èTÚt-ËŽb‹ +PûÞC÷…SÂt¢ï?EùÐ$(”fOÇ<Ï-ü~¡ ž‡´ÜIr‰šÑÛA»Á I$¸¸ˆ·¡%tòð|«(žqAv®B¹zo ÙæÚ2g >÷t2ŠþÙ¬?žï½ÑgÒÏ7öYš‚W€ÅN¨ ‡Öƒ¤y©iÍØqcVùì N‰¤²«¬]6ÉCžPšásƤ3BŒ÷DÃÜ3Ѐ¨q!izVÛuòs¬EkÍ¥¤äÿ(ÃØÈÈeŸ¶-,2Ré`ÿ¼”B™¼´õv0ÈB#î=v1¬Ž ©êe0ž’‚¼pkÄ:Ó9¶Œ÷þ97b€RÇ^]¶p„ã_y6¢‰´­Mç3ÔH ÜQ|FC\å#É E‚ò÷]úG:äoYpF^§i©Søs3-$tbÔ†J@Ä°Æ-å,èÌ#ÏZhk÷Õâè:qé¸(à-1@p>Òë2iþEP‡âæçëm³cà;ã·¥ÿ¸Cë +‡žØ©£j–¶ ýªXÑsG9¤¦ÏnÈ% pÇÕWÀs +qR_†ÊõëUù#ÌÃ3‹uœÓêB¡qçФ۟&ëE:6U®õ*ÂEZá¦_1ᕳ‹n æÅhƒÎØAi,8GÇÔBJˆALÅtäâÏ@ŒàÊjÜc`J¡_*9Ç-$MFSe­7ìÝÍlr8ƒŽUxîF¡3w¨ÀWåöû»ŸŒ ¸ßßSúȵI•9œ-eÃqñ¨0ˆª°3nõZÜq±ÎœíªðßøØòx‹_€ +‰LT"놂 +´$TTÞY£%ó˜û“h>(hûbaj뺻"üœ}¡ó<Ú¹á/—&|Œ¦Ú\àÔ¡ê š”X=ëðynÞY›IŒÑvßé…pž~[: >¡9”Ÿ« vx—Ëðcä:_¢OüüÆ?S$\¦ Å=¡bcÀÓìgXNºNµ Í µ ±Áà»ß‘*2t)2 =xKŸ¼MÄe×u-¥pr>˜Þ0Q—k%ÂiOÁ©¼¹Jy]õEæQÖ`ž"ØX bËð[µÿ)ÂÊ6FÛv&aë ‰ÖXÛì‚˽»D°4Õè´M$<íçb3’ýhFË+(C¥.]­“¬ªJšÑ s±õ©uH+t•:¯¦7:ÿîSì,Üì®[]ý¯O–ȸâ§KhݳÐÚU7•æ<Å\³±/âqŽòFJ¬ztãi(.–µût4ÝõõÕ›]6í¶þÖ_ß~¸½ÍÒ4»¹¹ Þ¾€f(߇°LY‘àåSN>Q³JtZ¸ÁSnÀC4Œx¥¤t.ìà×!./tùÃœZ p­›£­—­1skþÁ;\P^a¢ Õ¡—µÖ™1ß&ý•ì¹B ,!w]Ëã§"s¤\½¡ÕP¾æ“\šèÁRxW\6¼Øô1Ÿ÷Æ'âPêE™ç]áRsÇË‹MœÐãÀz:×ÀƬ夽;fÖ6{ÂßêRšÓ%"´;ûmÐØö ±jÚLà»×8H7é  ‹G§^€ HëlÇK6Võco¨*©R7°ž³äýzdðf,ç'ÓìÄ w‘€cIÿ±æ•¡Á:ĵýA©ÀHX†Ïx€ÍÛ€rhᨺ‰[Èl,4åÂYCWã\,}§”Eк4êjÖF‘š I¢ˆØ[|í|zÈ€/´³½Æ$×ó¤dÚC/Nm +³wýÏгLna³Ôq£ˆº+ÎÓ6ÌôýhWéÁb3N½£,ˆFz3 (ØÀ€rh¯œW°à4!²´Ï9|àªø–_†Dƒõ3Т‘ˆˆŒŽâ¶ Kñ4«sì`p€€JGõS6ý ’6 ?¦ªÀÆ©¯’ÝF’#zçWÔ‘:0;÷åêö°1Æns Z¢Fš–Z=Mÿ½_D$«²JT·l€‰¬b.±¾÷‚\‘oÌî뇈òæ6jíîÞt¹¡·w4Õ"…Âf)‰ÏýíóOòî®~V˜ôëë»í/"¨ÜêOòY¹œV ‹žÔp‰üÿ3™Ö#H{î¥}AlºÃJÏáã3dD¯¯Ïø¸­-»©\ kÁW*§ïDI¥©ñr›¬Þòÿ¥ö +ý-Ž“ƒíØFaßµ’øwZs»«ßé¸eBëîYÆÅeˆî=ôº¼üïÕ…S%õœù¢m2üfª¸þ¸å¦ =OƒR ¤ë‡G‚š¾‚ ¤¯Hî{!Q5´D†C³|Wç8…LbÔ„˜©E?NU™4éU¯œ28µ&XöŽï|9øýWh†£îa°¿ª•6ÐÄ5ÿúi9!ìë=¿Û~:é’f¾‹íÝ׆t~ý#œÖKb *.œ^oáû.ñ¦6¤•†DË=Â,‡Æ´=Ê[[©© /ûF‰Å Iì…õ‡ÊÀ;êöñ¶ñ€e+\à #­Mmg!Îd‚°2þí¶÷‡ã—(‡ã©s2^ŽÆ’Ö½ý#ŒîóH}^Ý `É KGî·»î t€ÂÒó‡.`íohåÔ 5¤-IÚê\·g8µàOqk_·!O÷ûÇúuÉ­¹€£•M‰ñóžjòî¦-Ó+½~|ºÝ5«¨›év.ø© åõ­¦¤Mf7ÓéSVÌÊúðþVx_o9ª#û‡n„W>˸ké¿ëA¢—ïªÆ’72ëà+´‹,þ>èa‰ „­Dj‰ð¨_èÑm;gáÕö_ûêqkCük›<Žãbý8’tÁ纂¼ÜiK…-£3îñ÷ïƒÂÛ¹æiCÅ!ú€/áõÇ L;²›õM//š!!ls¤`†l2x¶ø&¿ÊçV> D&ÔÝÏ‚8- i¬yøfæMP£jòáøÏ«wÝÂlGX!$s °éÌï.Wï~¸ß^í®ø㟺wß¿×ÂÉï©ø¯+ß}ßõ2à7¼’¼NªäÎé |Œ®»zà=ø¯t6°0Mw¿ú€Óšm ÃSñ¦s.ªè³?yc†èˆ6tÎâÆâÒ°1¨PºMQT,ÛXļÿ@"æÃû¿­\÷{×’2‘l0^Eíp”ÅHh”.¾4„ÁLψ*ùHgXÉÃØ“³”?M -EŨí’i¾-¥u¢€ke\LË÷¥U1‡ì™2FÞè„,X•m9˜±r­5Pb9 }¥31w_v«»O5D¢­uÒ+“` YK{‡$w‹»é¿ ¸'(ãäãjµÉØîû×FCošÃÎú¤i]ýŽ4–Ë®ÑYý‰rŸ<êºAó!7£<ãÀI°ÎÉ—ÛY×P{z”*ØXŽX_䎱ib}z;ëËÑLœ«í³ÈG£b*‰AÆÅdªõãÂy•ù'ÚZûørÂó±?3ëoOA=U²7¯¼--„“Ë {!Ç—Àße«P¾ƒkÊ×°ŸW)ò"Ç2qXP|È°¸k¦Øo^ƒáGçcg³V9lj7àexã•5åEop’‰uKë`ÆIŒä°áŒ—_b¤ö>DѧëbÌÏwuœÔW-¬0ÆS7êj×Ô•kë*t£#OD¤#œ“SXB¢ »Bà¬exp’õÏÓtBc=žzëñý á¼lŸºÒèÀècìÿ_F|œ‘åõ Â…5 ðe‚m]`¨*¯ÞàòºXèÁ ‰gƒ‘ˆXÄaTI/á.*L™-[…q$¶¸›½%£¢w'¥¡Û££LÇØ`a²Èˆ ¨ÈFXí]d¶döEo`Ía±Œt2ΩÇ,Ì50<]‚ÈÓ¡,n›ƒ!xÉ“¹ËáY*mƒž•+IŠ¹˜6NQH U¸¸1dJ*8¿¤Í»7QDcAÔ´Á·÷Îʃ)z´ÆâPàèš2g]ªW­­F–ÃSµ=õ¿²‰¶ßYëmk~jÁ¿ŒÀ?žÀ[çeû,òøajÙ ]þXÙäW”ÍvOäÝåÊÉ'p×¹Y¿È_Þå’† +Ói,B6 ²€®VÐpÏÆ—o Bj°ª8B¸—(F7s”*¼Ï*¸LîÄñIˆZ-ñbü‚?ó•µlC±º¼E'¹q'ß_…3>/f"68ªqA gsL‚çQõ P­w_%Á]7:r$Áó 0|^¶Käÿp)]yµ§®Ü_}Z½»4ÿôx¸¼Y™ÚaªÆÓ%¸hxm0]>¬Ö7÷wŸ/.]m hÈ+¼½^ý´¾ºØ¸õãEXß?~¹Ø„õþâçË¿°Ñ°`ƒ·NâW“×w¿àíoŸd™V&g}¹È8Ê­Ÿ¶Oø¿ã%ß]ÖÖÇh~;m~M¦¢,“Sà† :Á`c½I'}lQÝ$à‰V z²i$wáØPiǹ ƃénœòž~q@R‰=d#Þ†BˆgùÙAÓÃO}¬A4`ñ­aayµ2*"PX‘i¤ŽæŽÃR:§¢õt´ÕʪTh¯ÆF†Ä«4YÐç‰éõNEÄÄÐÒ(†ôþ´¾ß]lòú¦OL°æ¥Ä´y Ù9(V¦ aQ…”`º—Þˉ@­(ãIMƒˆ’kò‹“åÈw”„Ä_"„ÕøZ2ƒ|ÀL%ã„]€tpú Ò©‰UÀmP‰ø™ÃŠ4¤Lgª~Î…Ež(—1ËÉpŠŽ1Qú|äÄšdŽNfO)MH¼ãV¶1/°f.ʯsÄÖ +k2ÅRú­cCŠ'X`áÀñAôð¦b6+T9U„ZDkhŠ‚uÂ…Ãà»aŠçG1DI®Í)FT…Ø°¯¨p…lÇíá¬b-£œ]Ž„ƒ.°Ùs$’‰­GÖ +E;OóÞ<Ôš6Q]¤Ïø¶$t 3ì‡q@H¤„ëƒÒ„öKŒ‰²Øy–[÷üTF‘ÊÐÈìbxWË-,F™Dö¥—u ¼€Ëâ…ں̃¡ÑÁ5kA¿ÉkÛ†uÑîÊjÁ”n†é‰ìGÿSŸ7 5"U7´÷„1%IWP·IAPKæfö–ø‚$yêZb+øP¤!¢|8‘Òj¹£‚–ÐÏx*?ÛFñ¢¬"Z)Í›%SÀ!àE5‹‘LFÅÙF§! ¤#5Ñs¾½Š›Š…/4aªáýD÷>æjª':Ì¡½‘xñ˜‹‰R(¡}etcDhD²+ÍŒÙ^£T#Íp@#C’vY¸g·8n~$Ü\«ÛZ½<ßb;¾õª-.ùÏÈþ™ÞÏTÀˆwâÌô“¦•8žVìxZ±õ¶5?~ÍÀu®¶Ï"Ÿ(#KѸý‘¢)¯)3ªÓoN­›rJäÏÊv‰üD‡·eñGœ‡fÓ¡l…JS ž +‡ F†(Æ ÁeÛŠ‚Eœ›ñ2ÕLò¤ã )òœ?³¼%4‘'à>¨ÌŠ8”š%žs"ˆ™îJø/õeÌÛF Cáý~…F{H#òN:i‘¥HŠ¶> Câ$FR£°Ûÿ_¾GÙpí­2ÝI¦qz%~Ý4ª#'9Ü«;ÿÑ]ùý4@´@Å u0!‹%²\|úÇ„œƒ²Y§–Ø´£„À›AS_¸ Aæ¬÷;}/žŽìšµWÃÒì…:Žô]ÞÂ{2¥dM êì97ŠÛäËéÞ¡Ž¨ãl<î[ã‡jÈYa϶<¢šCc‹ªßàh!}S䪵m±Ðœfr$ ÎaN±ØªÌl,¸äÝàI‡æ(LwEX.îyI(%gjÃhõ´Xú?º—gº­.la¢'Â÷0Õx^“ ‰Hü˜¹“¶Ó£ñ-¢Y…ˆ_™¹h ^§t ÌIL^üÿ)ƒxå&Õí‘ +@sÅ·ä üj:`Ýkw9ɽù¦0=u‚lVÖ\”(¡=öÓ}à:K½å«BÀô£û>û<Òìa·[ožÃCØÎEf«Çð¶Þ¼†ß?Ãzc“77_¯Â¯ù…èÌ_Íï¦ÝõÔ]ß.’ÊeÛÖbX¾]u߇Qp£Fì«1†Äp{ v&‹{5´IÍ:pœûʱ]£Rà«Ç´Y„ígCÆ„ÉäÀf Ç…UœÏ`O±—}^= µÒ®‘è+'‹þÒý`DŒ endstream endobj 168 0 obj <>stream + + + + + application/pdf + + + RBPassUp + + + + + Adobe Illustrator CS3 + 2008-04-28T06:36:52-04:00 + 2008-07-01T14:52:53-04:00 + 2008-07-01T14:52:53-04:00 + + + + 256 + 232 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA6AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FWCfml/vd5E/8Ce1/6g7vFWd4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUq8z6rc6Zo0txaIkl9K8NrZJJXgbi6lSCIvTfgr yBmp+yDiqXJ+Xvl+eNH1lX1rUAecl/eOzP6m/wAUSKVjgG54rEqgfPfFW9JF5ovmAaFJcS3el3sE l1pcty7SzQNAyLNbvK5Z5VIlV4y5LbMCSAMVZLirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirTMqKWYhVUVZjsAB3OKsePn/AMr+mZo5rie0H/H9b2V5PaUH 7QuYoXgK/wCVzpirEvzU/Mzy1Z6LDbafdR6hqkklrfWX1dlkjT0JkuI3kdagK/ClBuVPhvlc8oi7 DSdm5M4sbR7z1ZFpH5oeUb7TILy6uxpU00Sy/U74GGQ17RcwBMK9DFyrlgN8nByQMJGMuYU/LWtW nm3zFPrdi5/RmiCfS4EdSkr3cjRvcPJE1Hi9NY0RA4DHk9RTjVYsxxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVjvnK3S+Oi6ROf9B1TUBBfxf79hitbi69 I/5LvbqHHdajvirIVVUUKoCqooqjYADsMVebH8tPKVz+aN9eTWgkjFnb37WYoIBcyyzRs7oBT4/R 5cehbkTWuQljBNlzMOuyY8ZhE7F6UAAAAKAbADJuG8+1fT7/AMrfmJaeYtMt5bjR/M7x6f5itYEa QxXSilpfBFrtT93KewoxxV6DirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirEfzT1TTdK8ozX91JIl7DLEdEFuA1w+o8v9GjhQg8y7fCy90LA7VxVV0/VPzGf Trf67oVguovEhmKX7rAsjKCwI9CRxxPUDl8z1xVKvy61i8fzH5m0jzCFTzdDOs8zIf3M2nMKWb2o O6xICyspqQ5Yk1bFWfYq7FUg1e08xwXzajpk/rxkAPYP0ov8v+YOFVXR/NNjfv8AV5QbS+GzW8u1 T4KTSvy640qdYFdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirmZVU sxAUCpJ2AAxVhFp5V1jWPP0/mTzJGi2GjMbfyppyuJFHJR6t/JTb1ZPsoD9gDx3xVm+KsM/MDytq 13daZ5n8tIh80aHJ+5idhGl3ZynjcWkrnYBl+JCfssMVZkrgkKaB6AlK1IrireKuxVLdY8vabqiV nTjOB8Fwmzjwr4j2OKpKL3zB5ePC+U6jpg2W5X+8Qe9f+NvvwoZFp2qWOowetaSiRf2l6Mp8GHUY EorFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxrzRez3dxFoFif39zQ3 Tj9iPrQ08Rufb54QhP7K0itLSK1ir6cKhFJ3Jp3OBKtirsVY75h0m9iuhrelM31yIATQbkSINqAf Lt/HCqZaJrVrqtoJoTxkWgmhPVG/p4HAqYYq07oiM7sFRQSzE0AA3JJOKqVneWV/aRXdnPHdWdwg eG4hZZIpEYbMrqSrA+IxVI9R8pIJvrujymwvRvRdo29qDp+r2w2qyz81TWswstehNrcdFuAP3b++ 1fvG3yxpDJEdHQOjBkYVVlNQQe4IwJbxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xVA61qsOl6fJdSULD4YkP7TnoP64ql3lTSpYYZNTvPiv7743J6qh3A9q9T9GEqn+BXYq7FXYqw7z HoOqQagdT0ePipCtNHEx5M6tyqU2qCQNhhQynTr2O+sorqPYSD4lPVWGzKfcHbAlLPM+vabY2slh I7y6jeQyC1sbeOSe4cFSvL04ldggJoXaijucVY9+VupQ6X5U8veVtVjm07XLazS3+rXUUkSyvCnx iCVh6UtAKkIxIG5FMVZ5iqhe2NpewGC6iWWM9m7e4PUH5Yqxt9H1zQnM2jSG6sq1exk3I8ePj9G/ zwoTTR/M+nakfSqbe8GzW0mzVHXif2v1+2CkpvirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdiriQBU7AdTirEogfMmvGY/FpGnGkY7SSf20+754UMtwJdirsVdirsVdiq1Y0QsVUKXPJqClTSl T92Kse8nRwztq+rORJf3eoXVvPJsSsVlO9tbxDwURxh6eLlv2sVRPnSytLvyvqQuWEQgge5huf2o JoFMkU6Hs0bqGGKphpNzPdaVZXVwnpzzwRSyx9OLugZl38CcVRWKuxVKtY8t6dqg5uvo3Q+zcx7N UdK/zYqlK6pr2gMItVQ3un1ol4m7qP8AKr/xt9+FDI7HUbK/gE1pKsqd6dQfBh1B+eBKIxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVjvmvUp29LRbHe9vvhen7EZ61+f6q4Qqb6VpsGnWMVpD9mM fE3dmP2mPzwKi8VdirsVS3V/MmhaQ8Ueo3scE84Jgt93mkAIBKRIGkYCu5C7Yqu0nzDour+oNOvI 7iSEgTwg8ZYyenqRtR0r/lDFWL+bvzg8oeXS8Am/SWoLsbS1IYKf+LJPsL8tz7ZVLMA7LS9l5cu9 cMe8vM5vNX5rfmNO1to0L2OlElX+rkxRBTtSW5NC+3VV6/y5SZSnydwNNpdILmbl5/oH497PPI/5 e+b/ACXYuun6pbX5uX9W80u5WSK358QvKG4QSSI9FAJMTAinwilcyMcSBRdDrtRHNk4oilv5k3vn a38vjUdQs7T/AA9Z3EMnmDTLKSa6nn04N+/YSvHbUVBRnjCfEtQWpUGbhvRbS7try1hu7WRZra4j WWCZDVXjcBlYHwINcVUrbVbG5v7uwhkLXdiIzcxlHXiJgShDMArV4H7JOASBNM5Y5CIkeR5fBbqO safpxiF07B5iRFHHHJM5AIDNwiV24qWHJqUFRXAZAJx4pT5fq+9GZJraZVZSrAMpFCDuCMVY5feU 2hnN7ocxsrobmGv7pvanb5dMNq3YebDHP9S1uE2V2NhIR+6b3rvT59PfGkMiV0YAqwYEAgg12PQ4 Et4qlv8AiHTv8S/4dq/6S+p/pCnH4PQ9X0ftfzc+2KplirsVdirsVdirsVdirsVdirsVQuqajBp1 jLdzH4Yx8K92Y9FHzxVJvKmnTyGXW77e8vd4wf2Iz0p8/wBWEqyPArsVdirsVY15CtIpNFi8wTUl 1TXo0vru5O7BJh6kNupPSOBHCKo26n7RJKqVfm/5bttT8p3d7Gfq+qWaD6vdqSjGN5FEkDlaFo5B +yduVDTbBKNim7T5vDmJ9xSryl+QvlrS/TudZc6veLQmNhwtlP8Axj6v/sjQ/wAuUxwgc3Z6ntnJ PaHpH2vTIYYYIkhhjWKKMBY40AVVA6AAbAZeA6ckk2V+KFssUUsTxSoskUilZI2AZWVhQgg7EEYq x/yL5Tfypor6Kl413p8NzM+lo60a3tJG5pbFizGT0yWo221BTbFWHS+arm113U/QkW0l1XVLi2a/ mIijji023jiSNHkjlT1JJOZA4t3+GpGYxnRPv+53Y0wlCN78MAa/rE+Y2+SF8x/pk3OoTzaxcfW4 NP03Snnjhji5S6lL/pFEMXqRjgFcgUcHuOmCV77s8HBUQIijKUuf80bdd+7uerWEPoWUEQkkmCIA skqqjkU25KqxgGnbiMyQNnSTNyJV8LB2Koa/06yv4DDdxLKnavUHxU9RirFrHQPMWi35ubPjdWpq rW4k+Ix1JA+IKOQrtTChlUuoWkFi99dSC1to0Mk0lwRGI1HUuWoBTAl542txj8zV80LZX7+XjoZs TqC2V0VEv1tZlIT0/UMZQk8wvHavTfCr0WzvLS9tIbuzmS4tZ0EkE8TBkdGFQysNiDgVWxV2KuxV 2KuxV2KuxV2KuJAFTsB1OKsLF4nmrWoYB+7020HqvE5AaRunQfd8vnhQzQAAAAUA6DAl2KuxVZJN DEAZXVAxCqWIFWPQCvfFV+KsAbXbnyl5qtvKdlavrdvqq3GoWVlbsi3VjEr8pQ/qmOJrcySH0i0i kH4ByAFFWO/m35w862UOmTNov1LRFu455lndJnmkt3WWKKf0GeONCy8qB2LEdQAQ1WWZjydl2boo Z5ESNV06s10X8ytC1fy3+mrSK5ndKJc6dawyXNxHLSvArGp2NPhc0U+I6YRkBFteXs+cMnAaHmTQ /Hkv0Tztfaxpq3lr5evviZ1Ks9rGFKsRRvVmjkB40J+D7+uCOQkbBGbSRxyozj9v6v0o3635zmjr Hptjas3QzXcsjL80jgCn6JMlcu5r4cIP1SPw/b+htrDzfMoEmr2tuOrfVrJuY9g808q/TwxqXeon iH8JPvl+oD71WyubOwnayvNc+uXjFaQ3T2qSqWVmAVIY4T8Sqx3B2GIIHMsZxMhYhQ8r/TanqHnP yxZadNfvqVvLBC6xP6Mscjeo/wBmMAN9o9flv0xOQAXaYaTJKQjwmz5NabceXtLYQnVopr3USLgz XE0Pr3P7sKrgJ6asPSjFOK0oK+OIIHVOSOSe/CajtsDQ/BbsvOfli8s5b2PUreO0hme3aeWWNF5o xWoJbo3E8T3G42xGQFE9JkiQOE3V8k6BBAINQdwRk3HdirsVdirG/M8Ud5r3l3Tbk1sZZ5rqSI/Z lltI+cEbeIVm9Wnig8MVZJirHNAhjsvNGv6fbH/QmFrqHpD7MVzd+qs6L4cvQWUj+Zye+KsjxV2K uxV2KuxV2KuxViuu69qdp+YXlXRoJAun6pb6pLexlVJZrVbcxEMRyWnqt064qyHU4rmWxmhtqCaZ fTVj0XnsW/2INcVUNG0Ox0q3EdutZCP3s5+0x/gPbFUwxVBajrOmactbudY2pUR9XPyUb4qkZ8xa 7qp4aJZGOE7fXJ6U+gfZ/XhQq2vk/wBWZbnWLuS9uBuEDFUX5d/upjaWSYFYX+X3lnV7e81bzR5k iEXmTXJiGtw6yraWMJK21qjrVT8PxuV6sfbFWWahp9lqNlNY30K3FpcKUmhcVVlP+ex7YCLZwnKE hKJoh5D5N/K7UdO89avLoutz2Gj6e4tmniSN5pXliWUwfvVkiPpCRauyNvsByrxrhi4TbstZ2mc+ MRMRfU/qZ5qFr5l0C1fUrPUp9atLVTJeaZepAZWiX4pGtpoY4WEoWpCyclb7Pw9Ra6pk1tcwXVtF c27iW3nRZIZF6MjjkrD5g4qqYqwvWvIc9+fMN1GLZb/VHt1s3YH4YIAnqRu4Xkvr/vFfiD8J75TL Fd+bscOtEeAb8Mbv3n9Wzr3yZrF3eHUfVtobq5v7K4uYKyPClvp6P6SLRY2kb1WDmoUdtqVxOM8/ NYauERw70IyHncufu296lZeTvNMWrWl9Pd2cn1e7v7yTaQs8lyGSBzUDdIW9Pj0QDbl2Axyu2U9X iMTECW4iPlz+3fz8kJY/l7r0X6Mhu5bS7s7fTzY3EJkuERZJJfUmk4IB64lrR1ZkB2rtgGI7M566 B4iLBMr6d23ur4vQ1VVUKoAUCgA2AAzIdS3irsVdirxj82/zKZ9Us/L/AJZBn1iyvElN3EvNo7lK oIYhvyYh2STalCV7nKJ5qNB3ej7KE8ZnkPCK2/Wz2xu/zNl0yEXOn6Rb37opln+tXDKjkVP+jCE1 49OIuf8AZZcHTTABIBsPLtB89eZfJHn3UbDzkxlg1OcS3lyFqAxUJHcRcQOUYRVTj2A8VpmP4pEt 3f8A8m48unEsW8h9vke7y/Be8wzRTRJNC4kikUPHIpqrKwqCCOoIzJefIINFdih2KuxV2KuxVLfM GtrpFisywNd3c8iW1jZRkK008n2E5HZRsWdj9lQT2xVjt15M8z3+sad5iu9Zt4da0uO4Sxt4rUvZ xrdhBKjhpVmlr6S/FzT2C9MVTzy/rVzetdWOowLa6xpzIt5DGxeJlkBMU8LMFJjkANKioYMp6VxV Mru6S2hMjI8h/ZjiUu7HwAGKsTlbznqWoVVZdOs5P3dRT4ErXkdw3L3GFCbad5P0m0b1Zgby5O5l n+IV9l6ffXG0p4AAAAKAdBgV2KuxV2KuxVjGh3cOk69qeh3rCGW+upL/AEmRyFFzHOoeVEPeSKUO GXrw4t3xVG+afM9noNiGZkk1K6YQaVYcgJLm5c8Y40WoNCxHJuijc7Yqi/L+mNpWg6bpbOJGsLWC 1Mg2DGGNU5fTxxVH4q7FXYq7FXYq4kKCzGgG5J6AYqpi5tyKiVCD0IYYqkWvXWo32qWvl/TLlrIz wvd6jqEYDSRWysI1SHkGVZZnbZiDxVW2rTFVK68gaXJayR2t9qdlduvEX0eo3jy1pSr+rLIkn+zU 07UxKQaNsR/KH8trHRrnUb/USLvXbG7lsw5UhIgqq6yIrVPKaORXrXZWp41qhiANuy1fac80BHkO vn+x6plrrGD/AJveVtI1ryldXV2Cl7p0bS2E6Dk5kNAIQKiolai08aHK54+JzdDrZaeVjeJ5hryd +Wn6K0C0stV1TULm4iWrRW97c2tvCzfE0cS2zwllDHq9a9dumSjGhTRqM5yzM5cymlhJqeia7b6P eXUmoaXqKSfoy7uKG4inhHN7aVwF9UPFyeNiOQ4MGJ2OSaWS4q7FXYq7FWI+ftb0nRbvy3qWpXMc EFvqR5h2Aok1rPbmUDwjaZeTdFWuAyAZxxSkCQLA5stR0dFdGDIwBVgagg7ggjCwY1odzHqfm3WN Uszz0+C3t9MW4XdJriCSaSbiQaMsPrBK/wA3MdsVZNirsVdirsVdirsVdirsVec2+hy+dPP1/qev 2BPlzy2ZNN0XTryKsdxdOB9avWikFHULSOIkEEVYYqmfmX8q/K2p+X7zT9OsbfTNQkCSWWqQRKs8 NxA3O3k9UDmQjgbV6bYqjPy780XnmLy4s2pQG11uwmk0/WrYigS8tiFl4dij1DqR2bFWT4q7FWnd I1LuwVR1ZjQD6TiqUXnm3QLWoa6Erj9mEF/xHw/jjSoD/FWrXu2k6TI6n7M03wr/AAX/AIbDSGm0 nzdqKlb6/S0hcENDAKmh6g0p/wASxVfonkmxsj6t7S7uAfhBH7tfD4T1PzxtaUvM92nl3VIPNM+2 jR2zWWssBUwRcxJBcBRuUjbmrhd6MD+ycCVa8/MjyLbWL3n6bs7hERnEVrMlxM4UVISKIs7EDrQb d8Vd5Bla+0Ntfd1ZvMMv6TVUYMqRSRpHbx1XYslvFGHp+3XFWSYqlfmfS59V0C9sbZ1ju5E5Wrv9 gTxsJIi9P2fUQcvbFUv0H8wfK+rWzk39vZ39szRajp080azW80R4yo4JFQjAjmPhPY4qgLLzJpXm vzjDbaPdxXdj5aBu724iYMGurqGSC3SMj7SCGSVmcbV4gV+KirM8VdiqRX/mK9bVJNJ0SxF/fW6q 17NNIbe1t+a8kSSUJKzSMtGCIh2oWKgiqqUeZPOnmXyvpVxqGr6Ilzbxp+7udOnaVFkYhVE8cscT xpU/bXn70wSNDZtwQE5iJPCD1eS6P5b8y+fry583+ZfWfR7UF2jiHF5o4qsYbRCQAqiu9dz4tU5i AGW5eny58emAw464j+Lk9b8v+XPy81fSVk0Nnl0lgFNnb3l3HbdN1ktRKsYJ/aV0375lRkCNnmc+ GeOVTFFKfLQHkbz3P5Scen5a8xNLqHlnskF19u8sV7KDX1Y16dQMk0vScVdirsVdirsVdirsVdir sVdiqAvNd0ezqLi7jVh1QHk3/ArU4qlL+dY5mMel2M9647gcV+ewY/eBhpC3/neb/wD3zpsR+TPT /h9/uxVcnkqOZhJql9PeuOxPFfluWP3EY2qbWeg6PZ0+r2kasOjkcm/4JqnAlH4q7FXYq8380Ry+ ePO0PlAI3+GdBMN/5mc/Yubg/vLOx/ylBHqy9ug2OKvRhFGGZgg5PQO1BVgOlfHFWBeSNN1Hyl5q 1LykltK/la6V9U8vXSozQ2vN/wDSbFnFQnGR/UiB7E98VZ/irG/zC1XX9O8szDy9aPd65fSR2On8 VLRwy3DcBcTEA8I4gSxJ26Dviq7yv5F0LQfLen6J9XjvFshze4uI1d5LhzzlnYsD8cj/ABYqkPn3 S9Q0bzDpfnzQ7WW6ntAuna/p9sjPJc6dM4oyRoCXktpDzUAVpUYq9AxV2Ksd8mPCq6zakcdQg1W8 a+U/aPryma2Y+INq8QB9qdsVRPnKWwi8p6w1+oe0a0mjli6mT1EKCNR3ZywVR3JpiqL0G0mstD0+ zmVVmt7aGKVUpxDpGFalNqVGNJJJNnmkMdhB5MdZbFOHliXit9AD/vJJQKLla/7regEo7H4/58qr g9zmmZ1G0v7zp5+Xv7vl3Mnlt7WYxSSxpI0DepC7qGKNxK8lJ+yeLEVHbLXBY3e+fPLdxpt69hrC W7244tefV5Zkjf1DHQLxUSNVTRQa036ZUcorYubDRZBIcUbvpYCYXXm3QYL5NOa5f61LKbdDFDNI glVObqZVR4gyJ8TBm+EbnJGY5NUdNMx4q258x93NIfLv5gWI8pPf6pdPdX1paHULtUhPP0JpHMH9 2ix/ZAU06U+Km+Qhl9O/Nys+hl4vDEVEmhv16+f42Zdpl79e0+3uzE8DTIGaGVXR0b9pSrqjbHvT frlsTYcDJDhkRdonCwdiqhdX9laLyuZ44R1HNgtfkDiqTXPnfR429O2El5KdlWJTQn5tT8BhpVD9 KecL/wD3j09LKI/7suD8Q+g8f+I4od/hbV7zfVdWkdT9qGH4U/gv/C42qPs/KWgWtCLYSuP25jz/ AAPw/hgtKboiRqERQqjoqigH0DFW8VdirsVdirsVdiqF1HVLHToRNdyCNGIVe5JPgBiqJVlZQykF WFQR0IOKt4q7FXYq7FXYqgtU1zRdJjSTVdQttPjkPGN7qaOFWPgpkK1O+Ksb81fmn5U0XQW1O1vr fVJZGaKzgtJklEkygVBaMsFC1HI9vnTIZJ8IczRaOWedDl1Lzv8ALDQ/PHmjX7rzjfardaZb3AMf 1i34Bp+J+GNI5kliMUW/2kPgN6kVYTIm+jse1Y4McRjiPWPxuyXz1BqXljVtA806pqVzrflqxuRD q1veCALaGeiQagqW0Nuh9CQ0YuGIDVWmZDonqCsGAZSCpFQR0IxVqSNJEaORQ8bgq6MKgg7EEHFI NJRoOm32kyzaaD6ujRgPpsjNV4VJobZq7sqf7rb+X4T9kVhEEbdG/NkjMCX8fXz8/wBfzS//AAa0 Xlux0hLxitpcreXkiRKWuWWRpyvF2KqWmIb4uQ2yPh+mm383eQzrmKG/Lp9yReXtJvNRu9S9axls otSiurmKWWO5R9PubsBJYwk4SOV3DM3qRdN16EEwjGyfNyc+UQEaN8JA6eoDly3HuKb6v+X6X0uo G3vRZ297a2dmtssKskcdnMZafaFQ6krTale+Tlitoxa7hAsWQSefeGWRqyRqjOZGUAGRqcmIHU8Q q1PsMtcElILzXtea6lttO0pnMTlBcSkiM0NKj7I/4bChR/RHm6+3vdSW0jP+67cfF8qrx/4kcUK9 r5I0WJudwJLuU7s0rGhPyWn442lOrays7VeNtBHCvcRqF++mBVbFXYq7FXYq7FXYq7FXYq7FUv1r WrTSrUzTHlI20MIPxO39PE4qk+laJd6ldjV9bX4utrZn7KL1HIfw+/ChlGBLsVdirsVdirsVYv5I sIrqxi803iibWNaiW59d/iaG1m/eQW0VfsJHGy1C/aarHc4qlf5q+S/L2qaWutXdqDd6bJDLLLH8 Ek1sJFE0DsNyDGTw/lbptUESiJbFuwaieKXFA0Wb2trbWltFbW0Sw28KhIokAVVVRQAAYgU1ykZG zzavbK0vrSayvYUubS5Rori3lUOjo4oysp2IIwsVSOOOKNY41CRoAqIoAVVAoAAOgGKrsVSrzRrj aFoV1qi2zXZtwtLdWCFizBQORB6luwORnLhFt+mw+JMRurSO+8+39pa6lNJpAEmj+mdRhNyOSidv 3SRlY3V5DGQ5WoAqByOVnKRe3JyYaKMjEcX18tu7n15Naf5x1Rp757u3haKbUZNN0eCKU8me3UiV nYxiiAxyOz12AoFPdGQrPSxoUT9PFLbv5defLb7UI/n/AFW4g0e6gtra2tbk311eO1w0iiz04sru rCCvFyVYHjXt3qB4p2bBoogyBJJHCBt1l8WQeW/Md5rTSynTXtLD045bW6dmrJ6lSUKMiUZQASUL Lv8AarXLIT4ujiajAMe3Fcuo/H7D5J7k3GdirsVdirsVdirsVdirsVdirsVdiqWa7rttpNuGcepc SbQW4PxMf4DFUu0bQbm5uv0xrXx3jGsFufsxAdNvEdh2+eFWSYFSaLzh5dkuLiBbo8rWCS6lkaKV YvQhYLJIkrII5FVjQ8GOQ8QOQdLkABrma6cz5cwm0M0U8Mc0Tc4pVDxuOhVhUH7smC0EEGivxQ7F XYq7FXn+m+Y38t+Z7nyZbWc2s20EB1G2FiEMtlBPMQtvcCV40IDE+lxbnw6rReRVU/MPme71DzL5 e8v6ppdxo+h6rcMwurowFrm4s+NxDa8YpJPSWRl5Vf4n4lONDXCr0TArsVdirsVQ9/p1nqEAt7yP 1YRJHLwJYAvE4kQniRWjqDQ7YCLZwyGJsc0HL5Z0SXUZNRktuV1K0ck1Xk9N3gFIneHl6TMlBxYr UUHhgMBdsxqJiPCDt+vnvzUB5J8rBYl/R6EQzyXSVZz+9l5eoWJb4lb1GqrVXfpg8OPcz/OZf53S lkfkXylHFDCunRmOCGW2jVmdx6U9DIDyY8i1Bud/A4PCj3JOtykk8XM38kw0nRNN0mD0LGNkSiry kkkmfigoi+pKzvxUfZFaDtkoxA5NWXNKZuX6vuR2SanYq7FXYq7FXYq7FWLfmB58tvJun217cWj3 a3M3ohI2CEHiWrUg+GV5J8Lm6LRHUSIBqgnui6kmqaPYamiGJL63iuVjJqVEyBwpI8OWTBsW42XH wTMe4kfJGYWt2KpTr3mCHS41RF9e+m2gt16knappvSv34qhNC8vzC4/S2rn1tSkPJUO6xeG3So/D CrIcCpT5tvJLLyvq15FM0EtvaTSxSpx5B0QlacgwqTt0yMzsW/Sw4ssQRdkPOori90GLVIre4ddU 0nTtL0iwkeEScZZz6jiioENDMnWpopO5qcxrMb7wA7YxjlMSR6ZSnI7939ibWGr6/d+ZrpLHV5Lp 4NThsptOKQ+mtnBGGuZ5U4loiXdlUhl5MAKHoJiRvn1aJ4sccY4o1cSb35nkB3vRcyHUuxV2KuxV i/kPyhdaDBqF5qlyt95h1q6e71W+QEIxBKwRRht1jhioqj54qiPPflGHzX5bn0ozfVLsMlzpt+o5 PbXcDB4J16bqw333FR3xVPLZJ0t4kuJBLOqKJZVXgruB8TBKtxBO9KmmKqmKuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KvIfz3lOtWFrpGjQz6pqNjc+pe29jBLcmFWianqmJXCE12VjXKc0CeTtuy dTjxTJmasM7/AC9v7S58oaVbwyBrmwtLe0vrc1WWCeKFVeKWNqMjA9mGWxFAOv1MxLLKQ5GR+9ke FpSPzXq89lZpb2fI6hdHjCqCrAA1ZqCvywhVDyxocqFtU1NHbVJWJrLQ8VPQqATT+HTEqyPArsVQ OqaTDqSxRXEsgtkcPLbLw9ObiwZVl5KzcQyg0UivQ1G2RlG2zHlMNxz+5R1fWJLK/wBKsY4hK+qT vByD8WjCQvM0gBVgwAjpuRuRjKVEDvZ4sXFGUv5ov7aX6DokOjWclrFcTXIknluXluPTMhkncyPU xpGDVmJ6fhTGMaRmzHIbIA2rbyTHJNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdiqUecNRudN8q6vqFqwS5tbOeWGQiqo6xkq7D+VD8TewxVF6PpFjpGnQ6fZIVghH2mPJ3YmryS Md3d2JZmO5JriqT69FHZeZtA1K3BS6vbh9Nuwv8Au63a2muFDD9oxSQB1Y/ZXnT7RxVkmKqa20Cz vOEHrOArSdWoOgqeg9sVVMVdirsVecxeX/Mj2FlPeaP6mqi6Qa7cCaAzXlsZHkkjQ8wph5LHRHdf hqvGnXH4DXJ25z4+IgS9NenY1E/r5/esn8oebra2tV0uOOKaC21aeHjKFS2ub9wYIIR/xWhZVOy9 /YvBLp5pGqxEni5EwHLmI8yfevn8h3lzz9O0eysb6+09prITKskVvZIzSSyNE5VpJX+E8WY9G69H wmI1oHM3IRlvXWXTfoE20HyzLZebJrqKw+qaXbwNb2iymGQqQVVDaujNIkToGaRJAPj3FanJRhUr ac2oEsQBNyJs8/t6X3EdGYZc692KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqF/f2en2 M99eyrBaWsbSzzN0VEFWJp7YqkcOqedb6MXVppNrZWzjlDDqNxIlyy9jJHFFIsJP8vJiO9DtirH/ ADH+Yd9wfyvD5bnvfN98jx/odiWshbuOLXct4AqfVfiIrQOW+HipxVMfLtt+YuhaNZ6bfx2Wvvbw on1yOeS0kBUAcGWRJvUC9BJzDN+0takqoDzHoP5mXdzZ+ZLG6so9U0lnaz8uGslpLFKvGZZLp1jf 13H2JAiqn2aEMxKqM0H8w9Q8xQGPR/L9ymp2r+jq9vqTGyhs51+1C0wjmMrkfEvpRsOJBYrUYqmn +JdUsLuCHzBpsdlb3Uiw2+oWlwbu3WWQ8UjnLxW0kRdvhU8ClaAsCQCqyHFXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWO+fmSPy79Ym/3jtLyxub4UqPq0F5FJMz f5KIpdv8kEYqyFWV1DKQysKqw3BB7jFWO3LRzfmBp625Bns9Nujfkb8YriaD0Ef3d4XZP9RvHFWR 4q7FWO+RjGNNvoGoL2HU9QF+vRvVkupJULd6PC8bJX9griq/8wDbf4J1tJ15ia0lhhjH2nnlX04E T/LaVlCf5VMVTyASiGMTENMFAkZeham5H04qvxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KpN5w8zaX5Z8t32tan8Vraxn9wKFpnb4Y4UB6tIxCge+KsX8heSvNNp5X tl1LXr7Tby55zy6VZi0a2s1lYulrB9YguHRYUISgem22KoXThP5E/MM6fdTzXPl3ziytZX105llh 1aKMI0EkrfEVuI0DR1OzDiopir0vFXYq8x0Ian5w88a15i0jUZ9J0HT1/RNncWiwkahdQMTPPKsy SrJFEf3UZp/NxYYqq/mB5e8z2GnWvmm01S71q/8ALtwuoPpUywJbzW0ass6RwxRoPWETFo3YswYf DSuKs90bV9P1nSbTVdOlE9jfRJPbyr3RxUV8COhHY4qjMVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdiqT675V0rXL3SbrUfUkGjXP121tw9IWnVSsbyp+2Y68k8DiqcY ql+u+X9H12xFjq1st1aiWOdUJZSssLiSN1ZCrKVZex9uhxVMMVWyxJLE8T1KSKVYAkGhFDuKEfRi qE0TRdL0PSbXSdKt1tNOskEVtbpUhVHuxLEk7kk1J3OKo3FUu0Dy9pGgacNO0mD6tZCSWZIAzMqt NIZHCBieK8mNFGwxVMcVdirsVdirsVdirsVdirsVdirsVQ+oalp2m2r3eo3UNnaR09S4uJFijWpo Ku5CipxVDaV5j8vawXGk6paaiYgGkFpPFPxDfZLemzUr2xVMcVdiqC0/XNI1G4vbawu4rmfTZfq9 9HGwYwy8Q3B6dDQ4qjcVdirsVdirsVSseaNBPmL/AA2Lsfpv0TdfU+L8vRFAX5ceFKsB1xVTufOH lq11ttEuL9ItTS3e8kt3DDjbxgF5WcjgFUHqWxVHaXqmnarp1vqOnXCXVjdIJLe4jNUdD0IOKoTU fNOg6bq1hpF7drDqWqMVsLYq5aUgEmhVSNgprU4qmuKuxV2KoKHXNIn1e50eG7ik1S0jSa6s1YGS OOWvBmXtWn+dcVRuKuxVD6hqWnabatd6jdQ2VqlA9xcSLFGK7CruQoxVDf4l8ufov9LfpWz/AEVW n6Q+sRfV61pT1eXDrt1xV3+JPLv6L/S/6Us/0UDQ6h68X1eteP8Ae8uHXbrirWl+ZfLmrep+itVs 7/0VDy/VbiKbgp3DN6bNQH3xVQsvOnk6+u0s7LXtOuruQlY7eG7gkkZhuQEVyxIriqc4q7FXYq7F XYq7FXYq87/P+/ktvyr1e3h/3q1MwadbrWnJ7qZEI/4DlirCvMFv5h8nebNB1u6lsNMvL61t/Kmk wRu88FtZxN6txfXMrpbc2jVf3cfHjuKnY1Kqmn/mh5wuPJmt6nYX7apNHrc8FhEUs01NdHthWWeK 34RRyyjiTRoz8NfDFU5v/PvmNdR8m29vqE8mj6nFYC+1e3tbd7g3l4ytFFfWhJa2jni6MlKEnqFx Vjlr+YfneT8t59b0q+szrmueZ/0dphitIU5RyyCCMFQW4uRE7c5Q5p9BxVFf8rR88xy63699C+nw eZrbQpL+3t1Y2FvQi5kSICR35y/u42kDCvj0xVl2ieaPNnl/8s9V82ec3muLu2W4uLayliit5BBG xW2WRI0TjJL8JevSvQbjAqT/AJe+f/MWu/mFBpl1rEdxaHRI7/UbOOKFIE1C4k5Lb2rhfWZYYqhu UjHkp6bgKo6+8w+eL38yfMOl2GsxWHl7y3Z2d3e8bJJpS0pMzQgu32pIEPx9B2Wu+KsQ/wCVxee1 8vw+dWmto7DUIXjsNBm9Ah7ie69C3aMx1uPSgXeZ5GHJvhVQKHCqf/llMNV/ODzbqU+q/pafS9Ps tKhumWKP1AxNxc+gkSx/uUlpxJr1HxNscCpL538zT2Pnb8xvMtncwpd+WNCs9LshNGJlLXUgmkAj JUNR5EViagVFQemKpjrHnTztpF9oGl6fqFmlpZeV5ta15lto+Ci3h9P1E4HhT1vsJGFA71G2FWGa h+YfmCTVvImt6rMlzeadoxvdQ1RY0aGyk1q6FkLiWFDGpMMXVBT4uvfFXsnnrzBq/lf8qNR1m31a O91TT7Wq6rJDGVmmLCMN6URSNSXYDuB4HArznVvzf80paeZ/qurQq3lry9ZC4kaCNjLq9yVWWWMD hsrNx2qik9DthVl35V6n5z/xPqWg6lqUusaTpGnWAlvLlY/Wj1KaJXmgMqKhkopqedWXap8QqQX3 5h+ZLSz/ADU1yG+tFk0C4isNKZbSPmHiqjBwG9R/3kyqrOxUGtF3phVkH5c+aPO9/wCfdV0HzBfQ Sro+k2DXdpFHGhW+uEWSQhgAz0T7dKKCwoBtgVjv5j/nFrdvc+ZrPQ79dNm0O4s9N0xFiillu765 dTO83rJKEt4UPH4VBLH7XQYqyf8APjVGtfye1JI5lnudTS3sbeVSKStdSIpK8dqMnI7Yqgfzm1DT 9E/J/UvLFjOr30NpYaXHANiFuXEEddqDlHE5p1oMVb/OO+sdG/KLUPK2nzK+oR2un6VFADQgXTrB HXYgco4nNOtBiqA/LZIZPO3mLW9W4adqHkqwj8u/oqEloxYwL66XbzMEaT1eB4VReKjFWBeWLa+a z/LWXWBHc2PmPzFc6zHZ23KO9W6aQ+nPJKS4eFBRnVVTbvhV6j52ub++/OXyroUeryafYWtnNqtx ADEEkl5/V4BRwQ7MzGgatOq74qxrzB+Zn5g6f/izXI9TgbR9C1pdG0+xFmgWeZowjLJKzF0SGSRX Y1JenEFK4qmuoeevPPl+zgtr68XUNQ1/W49N0tAtm1zZW/ph5RMITHbG4YEGONmIXkOTNir0DyA3 mR/LccnmHUIdS1CSaY+vb+kVSMSFUid4FSJ5I6cXKqByrgVkeKuxV2KpXrnlfy5r6wLremW2pLbM Xt1uollCM1KleQNDtiqrd6Dol4tkt3YW9wunSLLYLLEjiGRF4q8YYHiVB2IxVAyeQ/JMtvFbSaDp 728Ez3MMTW0RVZpf7yQAr9p6fEe+KopvLHlxtX/TTaXaHVygjN+YY/X4BeIHqU5fZPHr02xVZa+U vK9pa2dpbaTZw22nS/WLGFIIwkMwBHqxrSivQn4hvirEfOX5XjVLq0j020046A0k8+s6DMr2sV3c zbrcvNbqzs8ZLEBhSu/WlFU/8q+TU0zyVB5Y1i4/TcCxyQzm6HqK0Ujswho5ZmSNW4LyJNB9GKpr YeXdA0+7a8sNNtbS6aFLYzwQpG/oRf3cVVA+Bey9MVVrbSdLtbq7u7a0hhutQZXvp0RVkmZF4IZG Aq/FdhXoMVSqHyB5GgsbjT4fL+nx2V1IstzbLaxCOSRG5IzrxoxU9K9MVTHT9C0XTp7m40+wt7Se 9YPdywxJG8rKOKl2UAtQdK4qhrryh5Vuxei60ezm/STxy6gXgjYzvCQY2lJHx8CopyxVVuPLPl25 Nw1xplrK11bCxuGaFCXtRWkDGlfT3+x0xVRbyb5SaG4hOi2PpXcC2tzGLeICSCP7ETALui/sr0GK oq70LRLzSTo11YW82klFiOnvEhg4RkFF9IjjRSooKbUxVhf5j/lgmv6QdO0Gy02w+u3NrLrM8iek 08FkyGKA+lGxZf3ajc/CBsMVZvpWmWOm2MdpZWkNlCoqbe2UJGGP2qABa796b4qhB5Q8qi2ubX9E WZtr2f63eQmCMpNcc/U9WRSKO3P4qnviqKtdG0i0vrrULWyggvr4q15dRxqsspVQq+o4HJqBR1xV B3Pk7yldS3M1zo1lNLeSx3F3JJbxs0ssApE8hK/EU/Zr0xVU13yr5a19YV1vS7XUltyWgW6iSUIW 6leYNOmKpfJ+Wv5fSwC3k8uac8IkMwja2iK+oVCl6FftcVArirn/AC2/L94Vhfy7pzRLKZwhtoiP VKhef2ftcVAriqMu/JvlO8knlutIs55LqBbS5d4ULSwIVKxSEj4lUoKA4q7R/J3lPRZRNpGjWVhM FKCW3gjjcKf2QyqG4+2KoxtG0h9WTWHsoG1WOL6vHfmNTOsNS3prIRyC1YmlcVQ0nlTyzLpl1pcm lWr6dfStPe2hhQxzTOwdpJFpRnLAHkd8VU7ryZ5RutIg0a50Wxl0i2YPb6e1vEYI2WtCkfHiD8R7 d8VTa3t4LeCOC3jWGCJQkUUahUVVFAqqKAADtiq/FX//2Q== + + + + + + uuid:BD14D8DC7C16DD11BCFFD65EC7B1D34C + uuid:d81eb84f-0775-844f-8950-327b309a2838 + + uuid:BC14D8DC7C16DD11BCFFD65EC7B1D34C + uuid:7D197ACA7416DD11BCFFD65EC7B1D34C + + + + Document + + + 1 + False + False + + 15.500000 + 14.000000 + Picas + + + + + Minion-Italic + Minion + Italic + Type 1 + 001.001 + False + MinioIta; Minion + + + Minion-BoldItalic + Minion + Bold Italic + Type 1 + 001.001 + False + MinioBolIta; Minion + + + + + + Black + Red 2 + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Lime + CMYK + PROCESS + 33.000000 + 0.000000 + 72.999992 + 0.000000 + + + Night Blue + CMYK + PROCESS + 100.000000 + 50.000000 + 0.000000 + 0.000000 + + + Pigeon + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 30.000002 + + + Red + SPOT + 100.000000 + CMYK + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + Red 2 + SPOT + 100.000000 + CMYK + 9.000000 + 82.000000 + 60.000004 + 14.999999 + + + + + + + + + Adobe PDF library 8.00 + + + + endstream endobj 170 0 obj <> endobj 172 0 obj <> endobj 173 0 obj <> endobj 382 0 obj <>stream +H‰|”kTgÇdÂl]Öq*ÉÔL¬kí­ö¢u×UñB±Pä"¨+HH¸äR“@Œráb0ä +¹$¹ˆA­.*µ®ÚÚ#®»v÷hw©Ûݵ{é;žé‡`wÛÝ;fΙyç}~ÿÿóÞ(.Š‰‰aíÙµ÷ÝÝ{V¥ Ë…Òòד¥Aª’'ò£Wx ¹8N÷ÃX*“²¼§}6/… §yà'€†Ç^~a[bt¡n‡TV%––)¹¯ñÂ}sÓ¦7VGïoq· ¤EÅÜì*…²ø}7µœ/•Ë¤rž²X°†ËÝ.‘p³¢)¸YÅŠb¹Š~û„+Tpy\¥œ'(~Ÿ's¥%ÿo'ˆ¾b åÐëЛÐÛP2´ Ú ½íÒ t(Ê„²¡h” ¡´d(ZµBŽÅ&ÅN-¨Xp?.³áËŒ%ŒpüÏ㯠[‘–¼Âd~n‘3 fLÜŸH¦‚Z’й†—@€ññƒ–ðebf`üÒö“ä±Ý­œñèã_yý‰=¡ure\;qÊÇ@gâû&«QEA¬TêKúQcÜfb¡Áur³´YZmÍH³ÝÝÔŽŸ¿¨HþY^ÆrBÂèâcèÜÝO$kV¥¦¬ý…ÒyÓMD€fÚÌãäþÙ¿,|ÆÁLâY“ý{{ë?5±Lb˜”0|COÜÃ¥ö$E¾RX¡F”òÃÆ"|Cm×=/q |íË>kcÙúaæ´¹h΃©y¥åQ•à#òfÎe³"V®ÿdX¸íí½+×ÈÕV[5¡?Œ}¨…[ÚÌMmXÚúÏY°„}S|–ät¤Û³qªžnßùNMAµÆópàÃÖÿ†Íd§XÌ¿ë»5ýj8; "óBÀB’B²K-ß›+æTJÊM%øÆy`¡‰Ü6 +jWŸ9#x‡ Ê()b„]±‹@7·ïkÏôóÂé½2g +7&¡^G·Ú¡u ²ŽuªG”—TŠ[†òÇÀ§7³Á +é¡ å` ¹&ñÝÿ±rûsÚM»õß´ÕN¹î|µ:q$XˆÎ’UÆ*•¥jnlrù› tÜànßõ·ºæ$töèqõ …iV*,Çðõë +ó‰w÷QÐZö–S‚ÁS“CÁ“œphô|o9ÁÐl€· ×øðà£È•kµ¬Æ| O!EŠÊ*ªõx­©½{Ôõiè:º +t¸—»ÃâÆÛÛên¢A$_n¨D˜'hÈõ jPÒ;ªN(X˜Z€¡I``•Š2•‘†m‰ÂNˆœ‚í m5¸áÇrÍf¢<?h6 )õ*Œ>´ÔÖškð´õ¢‚ýDJÆáe«ÙGx#}Ý>Îäé‘ñîš»ò-x—Ö_Ów?Šürš ¾:uß ^æ.z»<ˆÃÝnñâþ®:½—0æË)¨ª\%ª”W(ž@Q­Ã« 0Áäêî/&bF@Xä"„åçåUðñܪ‹g­f{“•xÒ¶~ô„=Q:¼cO†D\ÄÙžÉ[±†M-¼]þÁ…ß·ÿõK=§1W·¾8‹W¸œGø@üé‰î6ÄæliváÌíTÝùt¬^T'ÊÂ/0(ø zÈÀ:L! \=×Ýl/Î_QVH áT +Öa +ëS#£GÚä*vAne/Õm$|z²ƒ>#K1ôªÆ(4n5">¥Ä)Àó3Ô¥ùÄ>ž"+—½s´ðv5§@ZQ}\}¼ªC¨FЙ×ÊÞ;¸ü…èñ,ØrÄNMr/rJÛÔ^'Ûa³Z›9hËíÀdG¨ëTÏÐäñ»ˆ·ÑSçáØ›BͽÞÁa“RÓ]¨i~vâ HÌ¥èúô+vòQdz†ÐöÀ*iÙ·Á´è܇À _t× ññü‡²2¯öw„¸Õ\Sª'ЧY” N9êW…qú€Âž¥aûe…’â`ÅðxßÐHŸºG@0NÕI þ2¢ákéãBKŠÿ)+ªjkñZƒ½½†Ð5#šQͨvÔÐãnõ¹ý¿£ßr¦éh u²;å>ÉÁܼÌLŽT¦<"-C=`i/`‡pÔ·à +åšóQlŠFQ@âSù…Ô!‡) 0:­aû9×e–cÔæ‡t²=­;ÅW‚ìëê­èÃû#žÓ“²9Uψ(ãH8F‡ÿ):÷ðŠEÏÓ>}õ/œRÝF‹¥íº2MhOÂôhTÒv™ççxÄþk4˜ÁyÏÁbp,N?¢%{±&†ýJÄ9zßN|6Û…w4¨øQ;s)-mgÇ·®FBW R÷ü¤˜ûÔÁðó½2¼JiÔÊ™vW~v2í‡ç:|Í]?X‚ó’ÿÓ¨á·Ñ2¥Ô&]Ž.§:‡Ål  ç@ê”ZE.›NÌû,F# ™\‚5·¶Z|øÀ¤b+þ†bm r·ÓÈ™# 1ô H&gÕòËu}Y%Ë! ¹BŽµò›¡°Ö¦g‰âAo+Ü Yd9Þêc¡‘ x FïÛ=ü¾ïöÙÉ+ȵ[=÷n²—‰‚e%&C%‡I½âTÏÊýÚL›…uƒr?Æßý=1Ž¨‘‘R›k²uÙºxñ¤e¤õŽ÷ íõÌt{‘`‡ç„ wzêõ-z½Eï2»ì.»Óá 8=¶P­éÐÉ]¸(ï½u‰FFÛÇt©Q§i°gR;u7@Ä¥Ï$Þ{xÿ1:~ 6bSC9aŽä_š“¾p¹ÔŠE3—-[YR>WNøƤæófrï˜9uúÜ9Rk‡§ÆW§'ÉE%´$eKù-ÚZ(·7gZE™TnaUI~êü ™r Óëú+ê««Š{Š9RzÏço–þøáÑ`â‹&¹ Û„.ëˆ ß7}íèc-,ŽÍ¨“®ï˜¹z’ü¡ï³_M\½™õ7'Ûêï2µ3Y…/ü涩ra dËÍš\Çz‘-âw?ëo†ÒÅ›¤÷¸µ X@.$¿«ß<¾Mæ~ñC釭hkp¹~[‡I¼¹N¡tEÏÒ½À°º±ë{ëÑ•Kˤ£íy}ñ$éI]À$$ü"ñw8ëožÂ-5Ë€ó¤™Ëä—ͼ¸ûð#`i^íÀê_7-côBH¾€¤ÚVhývùûÖ:6¾šY?åfý.þÝaîùn¶ïÍ“þÔLg—[à\)þŸ‡s×w>î¾ï"?‰×Ó< endstream endobj 171 0 obj <> endobj 381 0 obj <>stream +H‰|•ipS×ÇŸl?ñJ‰2õC€õ’wÅ”™¦%aLé2¡¬!˜ìšX,l°lËF¶emÏ’…Œž -O²%Ù–ð¢ï±›'”°MÃjÜB–! m¡zEWNû¹3wî‡{–ùó?sIKA8ëæíÛ²¶.Ï•ÖHå5ïdSâjiéœaY‚à$–¤Ñ RXÀ¶üëñËIôMq½÷¿•?{cž<}ÎÞ$WèTÒŠƒ”ð­ÒŸ W¾ûnæÛs÷/…Ëä%¡H§¦$2µ0»¦T®RÈUbJR¶B(ÜX]-ÌŸ‹R ó%j‰J“|ý/ƒPªŠ…”J\&‘‰UUByùÿË„ ä=yA²Ò\ÙÎAD)/Y’ŠD9iœ +N"e&U•úmÚª4º +pß઄<ø&}½H“øUÌ Mz×=Ä«áDœ¿ÏÔeôÞG§Î¸ßØÖÊ*”fÂÜÜm]Û Ñà‹#­KŒú–àÕ­ÚC-z"çw’¢Ý GTÈr– ~=¬ úÎtøɳŽÇ&±fn Ôñ;Xý IB-3(1|@_U^¢Vbâ2±¬ž¨³ô :o‡¦@äÚ@(äÅðj»Ç×ê%x'è?À©o÷ŸJŸÆGà˜Æ§ä{ˆˆ‚ºSWnvßÄÁ艾`˜èïÓ«ý¿ÉnomwaøˆÏíözYOEvÎÁò2+·|éÁª +>øføæ5’w†¾ÿ=Ή=€ù÷SásÈãçåèʉ­ÆÚšÛmvð}®ýã7‚ñÊÁ‚â<…ô¹1_¼,SÀο&œñ¼xN²ˆñ;aê™sQ?Öæô¶zˆ@˜.ßY\Ì‚ÀËb•š—Ø0´Æ9¿HDRo'VóÊ:Ã5¬¤×Ö±é +6Ê®ÓcV«©ÉLÐu.»ÐvSƒÕŠYÌæÃF¶Ïäï:㛜 c§ŸA#æŒùaÊ fI°eçsan¤÷Òé¥5Aàhpgœ˜ÓáñuºmŠ ”øð÷Ò=bPV¨\x5ƻ˅2MbqÌ<بM¯yÔr¿ËÁgy_à·7@tòǘ‘Î9èñ÷ºKòßÎݶ¿¢fà:ÀÿdŒ¿:ÀÏÙølb0v7œ=õuX\®‘ öe©w’~Iò“yŠ´b°§D¹}‡`ÛXéeYX]OëF¯v@Kâ_Ù´¢¢"Áæ/+^ƒ¿ÿûlVô»@SO M©¶­_‰åÎ$H´·í¨ßHX6©mºÉyÑfë3XñªØT`*  2x$‘ökáÊ¿¥_Ÿnz¼íþÉéQT–*Ì„Åæé±üé BG]î!A­*}ÜZ4Øs¦ßM8[$f€?ÿ€¢ûh/í#"ÏîE£ÿª<¡çŸ öGîc†€œ(×JÍ Öæ×÷¼L—æåòd8ŸÜ™øK*TÃ|µb¯„&Ž¹ƒmòwО¶csèÙ”n5ÐÿúÒW ºNßAuþï¯LÆI,á|< k¦SáÙD>_YB«K@VɆ¬P°y`íÓ¯†GcäçScÿøJ0sàÒoIv=;ƇoÝym'[]­ q.,YšÙE[ØùâÃX“ÅÐh"DÔÔÀƒ?c-³È2#2;ûЈŒÁíãFMby,}'|Ffð!XžòÁn[€¸§2ÙÅ™ì¢5²Úv ž&vñM•Òjj3LÅÕt¥YªËh¥BLŸ+âȲïWüpL–†l#F̓&œ‡ïßÝ&mib˜ÉŒ^¸ŇºzŽz‰k¾[g/bW®‡g¦Ó…“?UW7š’<ŸKg¿ã@p+Š’嫲 E»~ÐçD,”Ôç¨n·T²+»Œ» »3¦û[F½ŸþšÑ>êî†û}v†`Ú- p606ÆÎ8\n»Çî>Þae°Ë!w-¡ÌÉËÜ ŽrÛ?E/ºmCÁÓÑç!{†soêË+©0…æ?yòøþ±?wTw‡O +FB½¡>ÆGÚ-n[‡Ûãnm·µc›¤·’(*”ÕªAañ‘R­`ïyj¢’ŒW8Ô*Ay•ªF^å–‘fÆb34`z‹AW/¨²]V¼²¹½0ËiKJ,5"éwîáŠä×넯ó5Ô¾BŠ05O3à2ôý³-EÙ…Ü“p‘Ù¾1¯n=º…+W;hô!7—C×ê:ØIÄ¿~0qðê½/I/«÷À¬Î.´8^Õ{æ‘MºÅ³ ~40ÿþ á×üÿ0ÇÔÎ endstream endobj 150 0 obj <>stream +H‰œWY“ÛÆ~篘G bç0€sTE+Çe—­XZVùAJ¥`’»DD‚Ô´¤¤òßÓ×€Cp¹*ÙÇrº§ÑÓÓýõ1fÖ(ø¯4VùÚªÇõìÕÍ^,f7·wZ-{e”ê—Ýìæ; úÙÍÂüKsq?3¹Òð/üÔNy§³B-v³·É›Ôºd?4C:÷I»O]ÒõªéVj™“ì·ÈyTï´óí¡Oÿ¹øa¦Y‘zǘpŒ‘c,ïZ:ƸÌð1ÿèÖ*­“Mj|òY¨!5:Ù ñüI»NMòQX©±É:Ûd5ÿ5µÉ¶Áõ2-’÷"ñân!«fûæ  “´Ãf×Ë^MX욶àÿ¶{¶l‚÷ c¿MçE÷“>»LN’m—Ú‚ÌM9«éÙ<-)€%k1ÉÃuç.6°'ç&³jñtìV E’ªíúé'Š ‹¶k܉¶¿!¥V”®@é«ÔVàÝC3lÔ½Øä’› +9Çè+ òesHàhIþêÕð‘ ñ{2hyLƒ=øño)øŒÎ TÛ¶{ßgdæÍ­ÐœëÌ0ùÏZ6៿.þÊ$N÷Z :°µK}rÜ‘Åì9´æH¨)ZèlÅ~\#ØÙ>ö³EDö°>.Aå†=˜A‡ôÍný{lFsŸ0ºGzžÆP/›»Ã¬ùÌÔ°i†°’¯·hx÷VÝ›è§/H[t5±€þy>Õððt^FRb‰ä*%,;ŠLYˆ“ŠçÞy+–vAu¸{v䪳‡ÔJŒé˜¹(?¹œ„÷ñ‰¥¿Û‡K{2oóçÌñI–² =ÿá‘A>aÔ“;mÒÄ[6NŸˆ {§Ù¶ÿ±/ÿ8ª¤ªÂW˜ã®O>5çõI¢å4ô÷ w£PO6{9uâgöéè¤íº!+?®éš°0Úä~¸”høgjAuVCÇcÎÍp…˜A+±À'ý.´bW„lÅbUd`&¥.d¦åDœŸŒš3D¶Q]ËßSMâ‡Fs3Ï Ì`G—fÜd€Tâ’9)WÁiIÞiCNsÊ`'Ló~­œ5™Ö¹«³¼®=ÎýÉ«ýj=é´§‚ËmVú²8û„ç8 +kdFò(lÈ4äK>‘(ΫÌÅÍAƒЭê@ßF…ÐbžSe 5k?ç©y ‹È@ +` ¥À°›è÷Ƚ&¬ÄßñÙÛàydá Œ«oœöâ csE:Yñ<,DÏÅZ¨Ós ‰MbTm ÇõõW6Ó.7ÊÕefC„ß|ûòz€ë*³•¯Î¾ Ç¶Pô ¹kÎNñ“„4á9…Õ–f^Š½ uîÂWÖLÊz$ÚvcPwô˜; à»óÄñ(¿¼ÓS&´º¨ ãš“ÔE•ŽéS¢Qɹ‡öIh¨¸6òlõ0;ÑʲޠQûaš¸¬Ä +êP|¦I¿?öãë¢ÒS?’¯äõÆâA\ÉÛ©«o˜ñ’ýÀ¹%£?.Që¿œÅBOŸô†'ú±7×û±k5£m¿çÕ1ýóéLlo®5®žïÜ(1nx¶ñqy´!2ç\˜p–|}|Ó„wŒc(ÏÛÓ%]CEî7“Á +Ù\u==ý #ƒ£¾Œ“™§[rã#ÇêÞ¥Ùɯq€N3;vþž™g'mçnž9^21LÒÙSå+Û¯[9ƒï ‹u/UÔlƒ ÏEð¼èâSÇÑ[²áÀá‚OVáÜÍ°îÛv_ á#òóÉà‡¦ïù£xص«µ+¡/¾?žC2J’7Æ:Q$ãí‰_3úÖ“‚Ø\¥ë>6¥>Ù4$2gôAûÇ÷#>Øägø0ùåÓŸŒPŽûQ¸£UÓá[õ3­ù% ‹ûÇ ´#šŽ‡_aS +ð†¸,’¹È#mÁìRÛªåŸ `l@Û(ç§ ì^[xH¨“°Ž‚ýòxñl#:ÍÙ{–± ‚ Ï<¼Ç4¡ø +<ඵKK({ƒ’©àI¤³÷çErªÕ‚ iy~ƒA¸Z’Ë*yq·àŵç,l­Úûûè%ZVc׃%ÏSË&áä‰Æ/P Rü³(G´ò’ÃsÑ!ce“´§ÅX™€ÓvOôŒ}hš§QR0¶ƒqGF + ðLùÕéZÃœ´ÉA‚KÈ„ÔVQÎP½Ç´ëÛÅìæçm³\¯~~ùwuóÓ­V/^ÞªÙ뙦ILgF½ŸÝ|w§ÕC?«²µÍL镹»„_ç +jBëÙ}ø¾°6v® +[eõ(˜ÐjCŸhp&}% T‘À‡³ÓrŸô‹êf/rý.—®i˜ íOY¥A·­=‘óù#?P+·S†z¹¡¢J€ÿ +ho% ¡‘*ˆ°tÚ’Å¡ÃÎ¥-Œ³e]œÛ‚a¬xŒs8ÆÑÃqŸâKìª)Ö€“r]>mŠS6¶¥SæFkx@i« +m2oªÓãK="þ×?®ï‡wÌØ°-X~9Kþ+u(QJ}RQ›ì±}Ø ŠØ‚ÍOÙtÅ{ÌÁïιË=N9¨ŽVçêÂ&<âÇõp|ìÔ§‘÷?\À_Ïnn¿Ë.®úe7û $.ðÐû‚ ºÜ v3cNHÛ _ˆ‘6g3o=¼r<Ĩö‘NÈ#Øϸw‹DQU®¬Ô\gÎçDÁPUm”ͬ6èk +7¤‘ÚZµœÁ{ÊÒ¸UæUÕ´ç<< 2_ÐŽ®+ÄP•ª,ª@HçHoè’â£Û;ôÑÝí+°±PU®~R_á®»¯vWUº«¨Á¨È]º(à&eíÈ_º"ÂQ’ƒLU*Ï!Q2ƒî‚ûk‡.qDÔ¥/€7 ûÕ:RE(áct|Íî¨Ñ]ÀuiKg#;¢½ÝÅ'J%O‚ÛZŒ©uä#]8N¥ÍÃèê5ŽîðÊ­jH¾útñy aÛ\Vû«XY]@X”ÞFŠ!êìÄ Ž)€]²‚Û#flÅ)tNYž6ñd‚aY#Q™‚€W¼à"†ß †¾¨8®"kn}ßÄØëÁŠåÐÓëk£‡&§xÒbãT:jèÜCÔ—”4`VÔmá_m”jFv&|‰%=í\F{{¦Ê¦¢$°»4–- 2(M¿0ÎÆõçuE1µê¡à‘P Z/ðd8´<ê8¡Ñg„Œô¹Ç²}•¡nP¾5èÌûþ•ä7®¿ÑÇ».yئ`L­%_ï19Ô±ÿ:¹ÓbVF²+ªƒŒdqŽÿHÏ(ÇÇvžêãqžÑמ1<¿gÔe$ÖŒ=c¹÷aÁæÕpõVd%»‘Èà5Õø®ç@]äbômwÑÄrãÒ‹ `b‡?ž!«8ém—\åÛhQ¤v‘\KV²Ž;¬ÕÁïÄÎæ¡ý<›S»Ä8µ·³ßÞý8Ù`‰ bï°ë>R©÷©uŽÎE7üº9¿½lúãøÈ‚ 0ƒ;ùˆ#±;óFUÞò0oóFüñ0o<ÎóÆûøx’[:å`%¬ØàšríÍòáArÙ{:L¹Ž8oícå2±¸bcì¤û—9\éÐM‰ÓñàV +-ËÉ=¸µO÷àAÂáO +fƒ#›·«ú62a±S·¥ ™ÿ–]é!ûdó‹¤$ð0£ ³Ø +-jù}ê”Å>‘­?Åb3"F†ýôîp‹ÍÎáž¿igpœÉ>…“i³#º3Ú3}­ÍƵŒ!ã}¤=6;¹á×ûm¶MöÆGb9û&H.ØuçºsÝ¡_ÿysÙ”C6÷hå©ý(ݵ×ÍÝ}s£G½zü«Öb§¾kèïKÏ<.åË3joÎÖ·Ÿôã–?#už·³è¹¬M›þÙü‘¶_ +œ+bkûƒ”RÀNÛŠgËej—oþ_‚jì +V;IŠ“Úü‘¶ßK2×w¸ç´ýØ;^_ûæúÃëÍÙw?CS–—?¿üGóÝë¶ùûK<\w,éÚ^¾k(;µ[e‰^¢Vþ~‰\­ .êk˜ý¾ÉVÿë§ýÎry™äe(/ÿµo©6·›†"—3ÛŽ-¶ÁÅaáÐË('ènQof–+彟%çÇÛ¾ÓXÓEëÖ0‡¯$϶×®Çrú}ûkÛ?ÚÜOö ã}n¨þææãí§æy¾Ú± ÚĦwAÝ.®7÷5[=råQÖ˜¹ñIŽ°?[bþtw‰>u\–o>þ~ýøkyr]âÕÔ¼{yÖþ[Æïþ‚]4Í—æûæzq³¼zü[õ´<ù¾ù²¸—Hõ«îf Ÿ^ÜÝ ÓI0ý7ŒÖ¿|óÃËúÅýòñÏûÛæËêÙ:~ÿ2.¾µ¢xfåÚ6ºL¨4×w—S¡C(YÅ ¢7"F¸agRåÐ’“…K¢CˆwÈ1¤P¸Ü’d$W,ƒÂ…&#΢YR}à “(›YD1úX/«²Y¹Èè%è§uS7è¦vg;E¥‘¶Ó„…EúN­m*Øom´<ɼCÐ9ªÁ’4:§è˜ Úïk°vÐ`Ós4Øô¼ –µîÁ¸`IݸÁö·×¼:£‘Q‰B¸d* ½â­^W­é]O’ÜðÆ”ÞõôwWgv¸ C“½0Ž3Ä9ù¸,’’ 7¥äpmÙªeY‰ ²ÔZV£Vø\~'æ!mZÁ mÍÔÝL–J&—%c親ý}ñVìïÛ?¹Í *.ÇSm#æ.@ße„ò°Oáçú.XoŸXH¡lÜùT[Aé ¦è¾T£¸Âè¤J +eÜ=¶ ›³ýÌnd´6˼~Sf b­"–õÊÐtŒ¹d}Ó/ŸÔa®5s(·þDŸ…—ôi‚–€BÈ ‚É)¼ó®ð¦rʲ»Œü {|Î| ~ ` \Ã@y åj!Ìé©îýÀ2,®%¡.rœmIá‡)ôÐ>›PæìÆ"(;•oÄr/m•a‘¡ÌPNTú tQÖ}Cç]•‡£ +‡ÄP²ÐJ4M|mIM ¬Eˆ,Ñ’ÕéŃzÃn±ˆ8Ö—y›‚ÂÕ¨ 5¡ÑnBó‡ù£9ՓɾnÖYVѾxÑ~¸¸-©6£jQ”Çc´U›´M¾G®ç®]Îæ¹}œÍCûy6§v‰qjog¿½ûqºã"T‚•dO«H¥î'N°I6hðys~{Ù¬¦Œ@‰Á†øá”´äŒ-ÙgLžû/õUÓÛÈqDïüÛ0ÇýýÀ—híC‚5¼X>Ø>È"µRV‘“KÿžWUMrz8’(nì]^D6ÕÓSýêU½W¿7-O4ø#˜çñÒ„©kȼîvõøH Ýx=<²œuëë‹»§i 8d ÷‰÷”àÀ“ä‡}Šñd@›GÐæ +ml¡chÓÚ4„V›-¸f’'w×Ó#Ê*‚4¹á²Ò˜>ÌÆtóÒ­.ÖsîQKêI2©˜àh D=¿={ÔH66ÝCt+ A'¢¼¹1ëd_É9k´ùýA!nŸk†7AʳWŸš0È壴XÔ¯¹ucª[OºõŒ¡”Ž‹Aêž[GrunÆ–± ÇU uDn/įڹ¾hÃOé2ÛðÒkã`6’‡»ñ‡Øp$½äJ‹x +_‹ ?¡Ð6áè.6{ÜÉbŽJSMjlÂKs Y×_È¥ÆßÁŸÆ¥Ž±ÞhÝБì]ùs¬w¡kÜÇmzÎ{»>$È^³ýï]zS‚ky–·"ûêЄ¾Œs}O/îcwêK‚íq~ã7´%‚(Œèö¤ã†%”3¥õ>L%Ç1°ñpBœRìÇølÊe)œî“)éÿ골Ũá¬Ýž½mß½=S³o~¼½¸\-|ó½úæí™U}ƒwâ@â"˜“*<ꨅIÖ@ÙxX!_;Î…à8IF“—&PmTõ Þjmz˜_4¥ªÈ†¤ùlÞ0mGƒ.«ì¡ ¹G³Ý¹æŒºÂI8ÄàÏü™· ¹‰ØÑ[~RíÁš 9Ÿ¡ûûÒ'Ow?ˆ>Xjr$½Õôúâù½4¡ñºØDk'ö%’KATdc\oÁÈeO¸…ÿ‚X“ãé‹CÖªýa'ƒC-9Í´Æov£•NL4ºê»}K}0Tï€ÊZ/Pù†P9°‡œ9Pøº‘'1úb ‹cªèy»¶:L ÞUP_ˆ{éIðÇp8^Eãë[­´À14¦˜4‰l® íÜÙ]â¤#(ãK€95Œzí]D¶Âë$cÙñ2Ô‹[ÃW ÁÊ:—Ê!Kœ °ÑÄ jHàŒ`j7ÍÌ"f‚ òÉ«¯Äˆh†Xð[Äð#j Ék©A$êº ‰Mx©“h,Çêa7™¥r#ò5©3$à._;0^óÃV3Ž §f8/¼ÒžCבø 6ª섉g⪪X$+Ž .æiâŸ{K`˜\æ7ò„ƒÜ”RŽi6Á£©ÄÀ_‚oŠkˆš‘ÀDw¢ÅH½…š-³‘;:š‡œalˆZ$V³˜qö ÚÆ=)΢îVÛxJId¶Trɉ±TbZÇÈÆ1¥F½æ`¨^Ýl€P.òé©[¶HI6¥´5¼ª¥ MÄ8±HvŒ€ QÚU‹×ÌÃì‰!@" ¢trªíËJ+–’5´Ÿf~:+Mmû»®LòOšì[M6ð~–Îá*1V4ùºjò»™#økdÏan pù‰ìaŠÝÖë®1c@Y ,€&¦ì s½'»gãŽi|P–Lêc`Ë‚F¯&Å‘-S}íù^˜ˆ Ke2‹–Á³–©ÚQÛ=ÐÂà€ÓØ̼Œ™¶•’¸ª‰(© +®°4röD +\-–Hjb™OR÷P^Ý +RÒè¼Rt¦‰úq&ÉJ]ÇXÉ +QŽ(/Sbj³*JÙ–(òB 6Å +%³§m¥.nŸ…÷V0/b&­L,R(™^e|šl‚¾`NÍdŒöúL•å0E"Jg®6¡AVù¦£HV-{vÄòjÇ7"b®D$Pš’ö:añgÂòz…%Æ”8M›˜ çjÓršDnsÌ(m³?¤E˘!™v#ò¹J>ÚÓP“˜+½3 ES×èÿ>3£êÂ=!4ÞG¦ÍÁÍ #A¬CÌYô“¸[/èsÿ¹èèZ¨èèqÛ¡)ØýLšxW@_GœMºZãˆXeñiS¬ò|röžæ“÷g?ì7l\:Z3ѱÓ·~‘ »ájðG„°4ŒsjnŠã ý¥™/ÍÇ%ÍWÝül¨´ÌæɺÒÜ}廕§š³¶'Êûd©ëš¹jX²o Né.×{”ÃDSUèƒ÷£àm¼ÌŽ›à±ÚoË0x«š#Lĉ†.¸:ŒÕèù4ì÷‰Å³ÂjœíìDÍO–ü³’úk·˜&kƒÙˆª S¢xÚÐtÈÒ–¤/ÔÛ^•Bä’e²ÎÔd/©É>^Þ‰“â¤3ï…6ÉŠŽš½†“þ¹»œ/\w?wÝ¿n—ê7Z¬Ôíj¾ÈÝÕzþëùßxv «ó%¶ß?¨‡9²ÝÝ|À‡ë®×êöæî#ïô–|('Ç›æ¥ÃQ¶[î6Ñq9lÏ»X¯/‚ï®W›ÿgë¶ÿÿçÍrI'Ü®ÔÝ=E·\ñ6´@š¶ê®5â¿WŸèÿõ¥¹»«ñGŒ·<ÅÑüÆÛ›ã@yíGŽìQ=~â·Ü¬ëé…g½áév± @Åø1ð`QU†ÊÄ¢CÇð¬ ?¯‹¾ìIô‘lÅ“Òü´Ÿpp‰Mç —Î¼¤ÔC£ÑÔÒ£{VdZ•§4ׇØ'ö3x¿×ÆÕB5ÙNë +c­õÝÚÁsƒýºëê„cŸT[Ý—œÒD;x^mƒ…Ñ(•umá¾P·Ð=kÉOóõË‹Öd¥Dä[¹ÝôÜ¢´Q”ÖÐàXŠbÅÔ4!òÇæg‹fâb4ªdüÃVýý~¾HÐO¤O7wÔåÜ@ŽCw{ Ý£õÙꓺP~ÑH!‡à%„Âá]Ü+šÄ>ôɤL/ëþ}³TWxÙÙ=Žü¥ûá~¹R׿Ìççÿ`]é­:3ëþCëó?Ï:¥ÔuI›Õ·êOõë_šÿÞ®®ÖÛ-´g÷C»ñáæÃõzxØà‡íÎÿÒ(ëwoÏ{t.¨}ï œ†„S‹p"hâ’Ñêmãß‚ÊÆ K.àóv­çut…׸v*¶n௲§þJÛ6¿ªH?(½H¿f^/è=øÅdÙ€OÙ‚/›MôU¶I£àȵD~"A¿›ýO€Êlj endstream endobj 119 0 obj <>stream + + + + + application/pdf + + + RBrotation + + + + + Adobe Illustrator CS3 + 2008-03-30T09:43:48-04:00 + 2008-07-01T16:04:02-04:00 + 2008-07-01T16:04:02-04:00 + + + + 256 + 80 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAUAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9GWNmLkuC3HjTtXriqL/ AEKn+/T939uKu/Qqf79P3f24q79Cp/v0/d/birv0Kn+/T939uKu/Qqf79P3f24q79Cp/v0/d/bir v0Kn+/T939uKu/Qqf79P3f24qld60Nn6zzSLHBAGaSZyFVVQVZmJ2AA64oSa484+VIJBFJq9oZ2k SIQJMkkvOScWyj00LP8A3x4E0oD16HFVyebPLclpqV7HqML2ekM0eo3CtyjidEEjKXGxKqwrSu+3 XbFUDpv5jeS9Rtorm21NRBNK0EUk8ctuCy25u2P75I/gEA58/s074qirfzn5WuGk9HUonhjaNDeV ItC8wQxxpdEeg7sJFoiuW36Yq5POnlQ25uJdUt7SNTMGF4/1Vx9Wl9CYlLj03ASX4SaUr88VWXvn ryhZ2slzJqsEsMIZpjbMbkoqRmZmdYBIyqIxyqRTp4jFVOX8w/I8VnNeSa5ZrDbnjKDKvqA1YKBH /eEvwPABfiG61GKou482eWINKOryapbfooSrA1+kqvAsjuIwGkQsq/GwBJNB3piqL0vVtO1S1+tW Ewng5MhYAqQymhBVgCPEbbihGxGKovFXYq7FV0aF5FQbFiFB+ZpiqO/Q0/8AOv4/0xS79DT/AM6/ j/TFXfoaf+dfx/pirv0NP/Ov4/0xV36Gn/nX8f6Yq79DT/zr+P8ATFUlvta0GzlMB1O2nuklEElp BKkkyMSQ3OMNyXhxJavSmQlkAciGkyS3ogd55LdM1vRNSu7SztL6KS7uo5ZPQDrzjMHD1I5VBJWQ ep9nwBPQVxGQFOTSZIAkjYfp7vJNLuye24c2Dc60p7U/rk3GRei/al+S/wAcVTTFXYqleo641jqd tayWVxLa3EUskl9DG8qRNHxosgRWI5hjQ+2RMqLdjw8USbFjp3t3+rxjT47uwminR7q1g9RGEicZ rmOJ91PXi5wggtcomJoilh1q8kS7EOl3MbW7PEs1z6McJZRUSVMvIxb/AGgvjkeI9zb4IFXIb913 93Nhdz5o82S2scr635YSP1gUkt72dQWhKuUYgPzWjAyD4aL1NN8qMpd4dhHT4gfoy8usR1/GyW6Z 5p8wLoV7FJr2nXgib0Lm4jmmaeNxwgEolGyRMYJpKhK8aNQ8shxmubfk02PjB4JDryFd9V37gc/L oyb8ste1XWY9Wm1C8trqSO5ChbVnaNagkNEJCWETx8OHuG/a5ZbikTduF2hhjj4REEbdfxzu7TPU hG01wsi84yWDoRyqvccd6/LLnWsG8oeT/KN1oenapDpAshcW8UkNsLm4kVIxLHcRMwcp+9JgiaRi vKq8WLAbqp5ZeT/Ltlpt/pttastlqYYXsLTTSc1eIQFQXdmRREoVVQgKOlMVWar5L8v6na3dvPAy /XSzyyo7BxI1obH1FqWWot24iop3pXFULF+W/k+KB7dbOQwyOk0sbXV0VeVFCeq6mWjSOg4yMd3X 4WqDTFVefyH5Unu47uWx5TxTNcI3qzAeq1wbrmVD8SRMzMKjbkwGzEFVTn/L/wAsy3lzeCCSK4vp JJL90mkPriZBHJG4Zm4oyquycacRSmFUJ/yqfyD6RiXTWjiqSI47q7RV5R+kwVVlAVXj+FlGzAAG tBgVMNL8ieVNK0ddGsLAQaatwl4LcSSkevG6yK/JmLbNGppWm2Kovy95d07QNOFhYB/RB5FpG5ua KEUE+CRoqL7AYqmeKuxV2Kqtr/vVD/rr+sYqyLFLsVdirsVYr5Y8+2mr2avcwyQXbvcBYIYZ51Md vMYuXNIytfbrlUMtudqNEYHY2NuoHMX3p7HqsMsiRxQXLMxoS0EsSqO7FpVjWg9jX2yfE4pxECyR 8x+h53qa6ta6161zbeV/rs8gggjaGd3aS7uHWPlKsDP6kiRzIwrTkKnuMoN30dtj4DCgctDzHQd1 8hYKZeW/LXmzStTju9StfLyWMDzyPdW0Mwu4opObCOF2VVVEqFp/J+M4wI5006jUYpxqJyWa2JFf H8c2T6jcw3NtaXMDc4Z09SJqEVVwrKaGhGx75cDbrJRINHmFTRftS/Jf44oTTFVJbu0aJ5VmjMUZ IkkDAqpXc8jWgpikC+TFtQ/NDyvBcmy05ptc1EbfU9LjNy3zLikYHj8WVHKOm7nQ7OykXKoR75bK egLf3M13d635ai0qyuWWWG2j4XLvMSWea4SJf7xvho1KjcE5KF91NeqERQjMzr7Pcp3mv+btIlni v/Lcmq6C7MIZ7J1nuVhepCTWz7uQDxNDT55GUiDy2Z4cGKcRU+Gfny+ajb6j+WXmvTG0S1lgspSj QraelHa3UPPiHSNJUoCeIVuIIwXCQptlj1OCXGbPnzB+TJY9A8rxM1sbK0aecrNMJI4mlmdOVJpK jk71ZjzO9Scs4B3OEdRkJ+o/Pl7kbY6TpVg0rWNnBaNOQZ2giSMuVrQvxA5Ur3wiIHJhPLKX1Emk ovf965f9Y4WtB2dlZ2VuttZwR21upZlhhRY0Bdi7EKoA+JmJPvirEtIvvzMh8vTx6nYRXWuIita3 EYhWJh6cBdZY/rK8pQ8koXiURuG5jBFVVFLv81Jr1Xezigt7eRSsQEEa3CNbXFRKTNduvGdYPsFS vJh+8UcyVTbypc+ebgTzeY7e1s0VVW2tYU/es3BWaR5BcXCL8RZfTANKfbYbkK2t95vv/Kl/M2mf oXzB6cy2Nr68N1+8Cfun50EW7dm+nFUJbXv5hwR62txYR3j87hvL7qYUAXlctAlz++TkvGOEAqA3 7wBvss4VQi3P5o3N8iyWyWlnDcWcnqIltG00LPELqORWuL6gCPKfgKsCq8WfkQCrem6p+aLWl3da tYWtoLayeWO3gg+sTzXNHPBES94gIVWil/3gP2ozUKFZvirsVdirsVVbX/eqH/XX9YxVkWKXYqp3 N1bWsD3FzKkEEYrJLIwRFHiWagGKpNJ5mt70enpUVxdR8kE99DGRDHGWHJ1kk4ep8FaekHxVDWcu m6APQ0mzln0dyXla1KzLFM7EkgM/qSF/2ljDEGm3xYAAGc5ymbO5V72Lyh5utxYXfp34tpBO1i7P FNHIlUBkhJjlT7RFHGCUQebLDnnjNwNF5u3kuxWKyhl8gctXnWZ2sRrMi0htxEplV/UZKGS5px5V A+eUcH9H7Xd/m5WSM3pFb8HU3ty8k1m8iw3E8UT+RY44fWjhaYaq4C29Y1MnBGQ1WPktOo4gDkDj 4f8AR+1pGsIF+L0/mdd/0syfR9O0fTrPTdNh+r2Vv6giiDM1OTc2+JyzGrMTucyAABQdTlyyySMp GyUZov2pfkv8cLW3r98lvaC3UNLd3bCO2tE+3MQQXXtxTj9t/wBkb+GKpF5p0bQtWvNO/wAQadIm mRlow7OqxesxUQrN6Ln4PtBOXw8ttqisZQEubfg1M8RJgaJZPp2l6bptuLbT7WK0tx0igRY1+dFA wgAcmvJklM3IklE4WDsVSLzXoPk+/wBPmufMdpbSW0CFpLmYcXRR/LItJB8lO+RlAHm34dTkxfRI hLtJhnsfKkcFtpF2iRsZbdZDG1wsQlJjd1Z+frLFQhDv0U9xhiKFNeTIZyMjzLKLO8tb21jurWQS 28o5RyL0I/gR0IPTCwSS9/3rl/1jihRxV5p5c0PQbj8v9TsLbzRb6n5auLSSG4urnlKLR/qsKcqz TsIFjKtMYWA4lhThx+JSlWp6T5PvjqWp6/56+veXo76CeO0aeSKCIw2byLBbPFMvqErcRyj0gTVQ NzXCrINFtodR0Kz8t6X5vtr24063tZmmtWuDLLGDIGeV4731uEgKUCSrxZd6owQBCWXemaNDaXF5 J51SfUbO31GN76DlcXaQtLbyyLxt5mueMHpfvBGw4+oePpjiAVZBpJ03TLC60oeb0n8w6hLLDBd3 dys0qXDgtEkdpLKyBo0kT92iry2JG+Ksn0i21C102C31G9/SN7GtJ730lg9Q1Jr6aVVdttsCsB0L TdHXzXM+i+aETVytyw0yVJhHIhutQrytzNF64iuJdyu49PYqJMKobWtD8u3GoXMVj5yi0y21C61Y 3en2TARNPJp6JP8AWDDKgU2piM7l6fE1DQkEhKM8rSeTvL+qTQ6R5ns102eWytF02aWaUoz2dYFt 3kuTEBOAsiOIzy+JeTbcCqheeVbOwuLWHzF51hJtYLWUWt9K4rJb3yTrecbu7mKvJ6Zh5LTqeNB8 GKGrO2tI7e5uZvOrTTtHqq2VtqFxeaeomVFhd5ka5jmK2zW8hbiFVSxaMR0XAl6VompadfvDJY3c N5GrxcpLeRZF+NElTdS32o5Fcb7qQehxVlhIAqdgOpxVi82o21xpNxfwG5+ss0rW2oQQyOREJCEk Rijo8QT4uNCGG4DEipVA+Y9H1CLT7PUvLNqNc1RpC6Xl1PFMVjeCQpNC9wTGg9UxtxiChhtsN8rm ZVs5OkjiMv3hofHvHd5WhrhvPE+uSaja+XW0+dbC8tRdm6tJWmdQWsuaVpTnU023bc8R8VZ4runL j4IhwmfEOKJqpbfzvx+ldBP5xudfsNU1zy6tvbadbyASm9tmSGR6CS4qKNUxhgVPwgU360fVYJHJ SMIxmMJ2ZH+ad+4KMOoeaPM13YzXXliAaYk8lvO0txbzGAxyenNNHKpWUSRyRMq8Bv1r0wicyeWz HLp8EIkGdyqxsfh80/gisLbVJ7B7i71C1hjQ/V5PUu1t5GqaPJxeRmdCGAd2KjfbkK3utTPQr+K8 s34O5eCaWGSOUMssfFyUWRXo9fTKkE/aBDAkGuBVut/7p/2X8MVU9KMoS4MKq8oSsaOxRS29AzAM QK96H5Yqu0bRGtJpr++mF5rF2ALi648VWMGqwQIS3CJK7CtSfiYknFUymhhnheGZFlhlUpJG4DKy sKFWB2IIxVL9IsNRsJZrZ5xcaWoU2BkLG4i6hoXY19RF24OTy7NWnIqpnirsVSeTRbi+1kXuqOkl nZOraXYpUoJAAfrM1QOUoNRGv2U+1uxqqqcYqk7aPd2msC/0uREgun/3K2MhIif/AJeIqBuEw/a2 o4+1vRgqhdQMgnuDGA0gLcFY8QT2BIDUH0YoSry/q36X0Wz1IxGBrmMO8J5Hi3RgGZYyy8h8LcQG G42OKoKDyR5Zgs57GG1ZLO5hNtcW4nn9N4zFHBRl9ShIigRVb7Q3ofiaqqC80/lp5Y8yvy1BZ0Ek 63F4kErRi5okcZjl6n02W3jqqFfsg9d8VTGz8n6BZXL3NnDLbSycRJ6VzcIrcLl7sckWQKf30rk1 G6sUPwHjiqHH5f8AlMVBs3dTDLbBXuLh1WGdWR40VpCFUJIyoFpwDNxpyOKomw8o+XbDVpNWtLT0 9QkEitN6kjfDKVZwFZiqhmTlQD7VT1Zqqqtp5Z0S01y8123tuGq36LHd3POQ81QKFHAsUFAg6KMV Q58leWzcNcravHcuXb14p545A0nr8mV0dWU/6bNQrSnLbotFXah5N0C+0s6bJAyW9bp4mjdg8cl8 sqzyISW+I/WJKVqBXYbDFUFpv5a+UtPjg9C2l+sQC0AvPrEyTM1jD6ELlo3Sh9MlW4gBgSCKHFUT qPkTyzqIAvYJ5iLeO0LNd3YZoouYXmwlDO1JXUuxLFWYEkMRiq278geUrty89iWLfWOYE06qxujK ZSyq4Vq/WJONR8PI8aYqn2mWawajJMJZZDdTxylJHLpHxRI+MSnZF/d8iB+0Se+KUfeWOpatqMlt eJ9X0CCgaGqs98xANH4k8LdehT7Uh2aibOqnYAAoNgOgxVKIrC70y+Daenq6ZdSE3NlUL6Ejmpnh 5EDix3kj/wBkvxVDKoG88i2d3PeSzalftHfSxzzWzSpJAGicOoSOWN1T7KrtvQbHrWs4wepcyGsM QKjHYd2/3ofU/wAuotSFwLnzDrXC6VkuIku1WJldQrL6Xp+moIHRVA3OJx31LLHrjCqhDby/TaYR aXqunafDpmnXdzdPKx9XVr+VZ5IUAAqAQObn9gceNas1fstOMacXNl45XQj7tk00/T7XT7Vba2Uh ASzMxLO7sas7sd2djuzHcnC1oTVdMuWlGpaWyRarEnCkhIiuIxUiGfiCaVJ4OASh3FQWVlVK/mmm tbOWaBraaRC0lu5RmjYhaqWQshI9jTFUNBdTQEmM05ddq9MVVv0pefzj7hirv0pefzj7hirv0pef zj7hirv0pefzj7hirv0pefzj7hirv0pefzj7hirv0pefzj7hirv0pefzj7hiqFmPrFzIA3OvMEbG vXbFClb29vbQR29vEkNvCoSKGNQiIiiiqqigAA6AYq8s1bzz+Y0Wv6kljYNJpNvcXFvZ0spZGk9K OONSWVuW084b7NHA+E7NhVCw/nX5o1CsOneWHZpommt7iJpbj9zKxS2uPSESFo+amNvi3bdaqMVT PSfzmvr3XbnSZ/LFzaS2ttNeMry/vpIo4fWjEMLRI0jyfZC/dWhoq1qX5o+aI9VtI7fy1dGyhtzc 35SOdxIZI0EUaO0CFVV51Ltx5fCw47bqpnpH5ieY7+5vI7jypc2EdrYz3iPK8jM8sJ4/V+Ig48mf kBxc9KgHFUA35s69a+XLrVb7yrdRyWTwxSisscbVSR7iX4oS6RwiLlUgijLuDWiqWw/md+YUwN0n l2VEdVEdoYLl05LG1ZBMsYYpI00Liq1ABXrviqc61+ZnmS3s9fOn+VrqW40qaG1s5XWUxTySSSRS ShSkRaKNogQUY8uQ+zuQqjPNP5i6xod5awReVb+9juE5SyIQxhZjKED+gtwnE+jUkPUKfsk7YqlW i/mf5p1HzhFp8vle/s9OnEUB9eF1WGYNJ9ZlebgVYLRVVV2YfFyHTFXpuBW0ZkYMpoykEH3GKon9 J33+/P8AhV/pil36Tvv9+f8ACr/TFXfpO+/35/wq/wBMVd+k77/fn/Cr/TFXfpO+/wB+f8Kv9MVd +k77/fn/AAq/0xV36Tvv9+f8Kv8ATFXfpO+/35/wq/0xVSnuZ5+Pqty41psB1+WKE0/Q1r/M/wB4 /pil36Gtf5n+8f0xV36Gtf5n+8f0xV36Gtf5n+8f0xV36Gtf5n+8f0xV36Gtf5n+8f0xV36Gtf5n +8f0xV36Gtf5n+8f0xV36Gtf5n+8f0xV36Gtf5n+8f0xV36Gtf5n+8f0xVa+iWbqUcsyMCGU8SCD 1BFMVQ9p5S0KzbnaWyW78Fi5RJGh9NPspVVHwiuwxVU/w1pX1v656Y+t8PS+scU9T0614c+PLjXe mKq36Gtf5n+8f0xV36Gtf5n+8f0xVSufL2m3UD29ynrwSjjJFIFdGB7MrKQRiq9NEs0UIhZUUAKo 4gADoAKYqu/Q1r/M/wB4/pirv0Na/wAz/eP6Yq79DWv8z/eP6Yq79DWv8z/eP6Yq79DWv8z/AHj+ mKu/Q1r/ADP94/pirv0Na/zP94/pirv0Na/zP94/pirv0Na/zP8AeP6Yq79DWv8AM/3j+mKu/Q1r /M/3j+mKu/Q1r/M/3j+mKu/Q1r/M/wB4/pirv0Na/wAz/eP6YqjsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir/AP/Z + + + + + + uuid:39AC52ADCAFFDC11AC15B6426E08541E + uuid:46ba4750-b6d0-a148-b72a-6aac87b46fcf + + uuid:11ce5472-22d3-2e46-9483-571136a36a67 + uuid:96F9E1E974FFDC11AC15B6426E08541E + + + + Document + + + 1 + False + False + + 39.000000 + 7.750000 + Picas + + + + + Minion-Italic + Minion + Italic + Type 1 + 001.001 + False + MinioIta; Minion + + + LucidaSansTypewriter + Lucida Sans Typewriter + Regular + Type 1 + 001.000 + False + LucidSanTyp; Lucida Sans Typewriter + + + Minion-BoldItalic + Minion + Bold Italic + Type 1 + 001.001 + False + MinioBolIta; Minion + + + + + + Black + Red 2 + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Lime + CMYK + PROCESS + 33.000000 + 0.000000 + 72.999992 + 0.000000 + + + Night Blue + CMYK + PROCESS + 100.000000 + 50.000000 + 0.000000 + 0.000000 + + + Pigeon + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 30.000002 + + + Red + SPOT + 100.000000 + CMYK + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + Red 2 + SPOT + 100.000000 + CMYK + 9.000000 + 82.000000 + 60.000004 + 14.999999 + + + + + + + + + + endstream endobj 116 0 obj <>stream + + + + + application/pdf + + + RBrotation + + + + + Adobe Illustrator CS3 + 2008-03-29T22:52:51-04:00 + 2008-07-01T16:04:40-04:00 + 2008-07-01T16:04:40-04:00 + + + + 108 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAABsAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9DQQPPJ6aU5Urv7YoRX6 Iu/FfvP9MUu/RF34r95/pirv0Rd+K/ef6Yq79EXfiv3n+mKu/RF34r95/pirv0Rd+K/ef6Yq79EX fiv3n+mKu/RF34r95/pirv0Rd+K/ef6Yq79EXfiv3n+mKu/RF34r95/piqjc2U1uoMlKMaChxVU/ 6VX/AD1/hirtJ/3sH+qcVTvFXYq7FXYq7FXYqtmlWKJ5WqVjUsQOtAK4qstbhLm1huYwQk6LIgbq A4BFaV8cVSPzh5rHl6C1uFhN0pnpe28XFplt/q88vNFZ4x1t/wBo9Aab5Cc+Fy9LpvFJHLbbuuwP 0sgRw6K6/ZYAj5HfJuKRTeKEu1r+6j/1j+rFUL/0qv8Anr/DFXaT/vYP9U4qneKuxV2KuxV2KuxV jHnrzM2i6VdPGgb0bK5vruQr6hjtbcKHKxBo+cjFwEUuoO/xbUKqX6LqV9rulRaXYaoLMxAGHUYr WSKWWG1la3miNvdUe3milj4SBw3UU60WMgTyNNuGcYm5DiZZp2lWGnRslpFwMh5TSsWeWRv5pJHL O7e7E4REBjkySnzReFg7FUu1r+6j/wBY/qxVC/8ASq/56/wxV2k/72D/AFTiqd4qgNe0W01vSp9M u2dbefgXaIgOPTdZBxLBqGq9eo7UO+RlGxTbhzHHISHMJbdnXdCSJ7KF9Y01RHFLZqIYriBUAUyQ iNYo5F4r/dcQa/ZNPhETceW4bo8GT6jwS796Pv8A1oiTzPB6k4tLG8vobVil1cW8alI3H2kCuySS sn7QiVqH4ftAjLHESDVvzi8nWki22nyy63fuP3drp8ZlJJG3x7L9xJ9sqllA2dhg7NyzHEajHvKA +v8A5w+Y/wDeOztvKmnt0muj692V6GiUIB9mRfnkbnLybuDSYuZOSXlsFaH8o0NveNqGuXmqX2ow SWd/JeFngltpgBJCYldJFU0FCkqsCBQ0qDZCFdbcXVaoZaAiIxHcibPytq/lSmo6Sx1WNVdb3Sjy DtG8sk7yWss8k0rXDSys8nrSt6pP2louTcNlmkaxpur2KX2nzCa3clSaFWV1NHjkRgGR1OzKwBB6 4qjMVdiqXa1/dR/6x/ViqF/6VX/PX+GKu0n/AHsH+qcVTvFXYqo3t9Z2FpLeXsyW9rAvOaeRgqKo 7knFXlTeWPNGo+aNG80W1k8EGlXV5c2VvLa2qz3Ed5JcH99PJPDc2q8bpvgCPtxZl5/ApVl/kE6d DBc2D2cVh5jt3Z9ZgVERmeZ2cTRsoHqW7kn0m7AcTRlIEaDIzkQATsGWYWLsVdirHdQ0Z08wR6ho kv1TUpuJ1RCOVtcQCigzoCv70BaRSL8XY1UUxVNWubu1Km7CPAxCmeMFOBOw5Ixb4a9wfoxVG4ql 2tf3Uf8ArH9WKoX/AKVX/PX+GKu0n/ewf6pxVO8VQrX9ZXit4XuGjPGRlKqit/LyYip+X04qkMOm XWt6891rYCWmmSq2maNXkPUG63lx+y71r6Siqp1qX+yqyjFUj8z6HHexR6jb3A07WNODPY6lSoQG heKVaj1IZKDmlfAijBSFURp+p6nJYQT3+nPBMyA3CRMJArU+LgDwkZfCqhvbFUyiljmiWWJg8biq sOhBxVbc3EdvA80n2UFSB1J7Ae5OwxVKI9e8v6fPJb6jqtnb6pJ++ubeW4iSRaryA4swbiqf1wGQ HVujp8khYjIj3FVk80eVGj4SatYtHKWiINxEVJAXkn2qVpItR7jxwcce9P5bL/Nl8iv0PUrS6g9O 3uo7yFKm3uonWRJYgStQ6kglGBRt+o98kDbVOEompCiu1r+6j/1j+rFihf8ApVf89f4Yq7Sf97B/ qnFUyv7iSONY4afWZz6cNegJFSx9lG+KugaytTFp6yqJvTLpCzD1GVSA8nH7R+JhybxONp4TV9Ft /DIOF3AvK4t6/AOrxn7afTSo9wMUImGWOaJJY25RyAMjDuDuMVS6S7tbvWBp3rRl7VRcS2/Ieoxr 8B4deKGhJ8eONp4TV1smeKECv+h3vDpbXbEp4JMd2HyfqPevjiq+6AkvrSJ/7sCSYDxePiFH0cy3 0Yq8l1+78tWPnnWl1+3k1C0uuYu2jRYmiaKOB4grJcKzD0ZACSoNV+EVLnMSVCRt6DDHJLDHwzwk cvtv+Hv/AByXLqf5dvYPNpWi3KS6RLb3kZup2Cf6RNaROyt9b6+mI6FyEBXc9anihWw5I8PUCVSk PVY2HcJH+b7/ADekWDWDaBot5psbW9qsdqLKJ/trbzBIxGxq9fgYftHcA1OZMarZ0ucSE5cX1WbR Wtf3Uf8ArH9WFqQv/Sq/56/wxV2k/wC9g/1TiqNheNrm7vZ2CR29YUZiAqIoDSMSelW6+wGKgWWE 6rf6X5l1OLU9P81Q6VDpUn1MqWQes09JF4yR3ETenMY0op+16ZHSuUEiRsGnbYoSwx4ZYzLi391f 5p3H6U88pyWGm6fDHc+ZotZfUZSLG6knB9X0kSJo4eUsvMh1LNxP2m6ZOG3W3G1IlORqHBw8xXx3 2CbSSnT2vAgrEImuoU8H35r8i1D9JyxwmL6/5TFzrluYvM50rUZ7VYLe2jYpNMyzNNcSUWaJnEik g8RVaAhtqZVONnnTsNNn4MdGHFEGyfhQ6JPc6Pbkt6X5kNFKkTtJCl2OJczcpHKtc8gOAZKchxPx AjplfD/ScqOU9cH2eX9X4qvkmyXUtQjaTzNeXcsNrHLLpty7rI63Mf1iO4ERuZ6emLqNa8SAyZLG N+bDWmoEeGBZ5jyNVfCO4/N6BDGL2yjNxtPGzKZEPErJGxjZkI6VIP0bZe6hd9UvBsL1z7skdfwU Yq39Vvf+W1v+Aj/pirksf3qS3Ez3DRmsYbiqKelQqhan51xVQ1r+6j/1j+rFUL/0qv8Anr/DFXaT /vYP9U4qjL3TZJVuUjKtBeKUubeQsobkvBiroQyErsf4YkWmMjE2OjG2/LXy2xDHRouQ4/EL+8BP GQyipA3o7E7/AKgMr8GPc5n8o5v532D9SLbyTpTfo0fouBRpEz3OnUu7mkUssonduIVQ1ZBWjbdu m2Hw47eTX+cy+rf6hR5d1J7HYl/Va7YTSTp6ThQVQR7/AAqKk99zXfJuMlV35WhuNVs9UuYUvL7T gVsrppp4JEBrXkIyyOTU1qu+RMATbdDUTjAwB9MufJKj+WPln0fR/QsQj4qlBf3gPFGLqKgV2ZiR kfBj3OR/KOe74vsH6k1sfLENnfG9s7aK0ujCLczevcXFI1SOP4Y5OCBuECDl1NN65IQANuPPUTlH hJ2u+nn+sp5bwJBCsSVKr3O5JJqSfcnfJNKpirsVdiqXa1/dR/6x/ViqF/6VX/PX+GKqNtcG3l9Q AMaEUPviqL/TUv8AvtfvOKu/TUv++1+84q79NS/77X7zirv01L/vtfvOKu/TUv8AvtfvOKu/TUv+ +1+84q79NS/77X7zirv01L/vtfvOKu/TUv8AvtfvOKu/TUv++1+84q79NS/77X7ziqhd3z3KqrKF 4mu2Krv+lV/z1/hiqDxQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqjP+lV/z1/hilJtZ1nTNF02bU9T nFtY2/H1p2DEKHYICeIJpyYb9sUIOLzn5SkeeP8ATFmktssr3MMsyRSRpA5jkd45CrKisp+Iinet MVW6F5z8ua1FbPZ3sPqXjXIs7d5YvVmS0meCSWJFZucZaIsGX9nfFKMvPMOgWV6lhe6la219JG00 drNPHHK0Shi0gRmDFQEYk0psfDFCD/xv5O+tWtr+m7EzXsLXNoBcRkSwoxVnRgeJFQe+/FqfZair Y87+T2nsoE1uyd9SV3sCs8bLMI39NvTcEqx5/DStSQadDRSozef/ACbHJYp+loJV1Ln9TngLTwN6 TrG5aeIPEgDyKtXYbmmKFa385eW5bC1vXv7aGG/llg0/ncW5+svFKYqQMkjpJzK/CFau4BAO2KoP T/zK8j3un6XfLrFrCmrkJaRSzRCQTeksrQSBWYJIgkUMpOzEDqwqpXS/mD5agmkS6me2jD3UdvcO hKXDaeD9bEPDm59EowPJRUg8eVMUKuqeffKOnaRqOqSarazQaXzW6SCeF5BMiswtwOYHrPwIVCQS cUppY6vpd/JPFZ3cNxPalVu4Y5EeSFmFQsqqSUb2OKEkX8wvLz2t7cxM0qaZevY6siNC0ln6c0kH rzxiTmsLPEeJALcfi40DUUsy/wClV/z1/hirGvOMWkv5Z1CTVw50y0j+u3aoqszR2bC5ZeLhlYN6 VCO4xQxHSPyc8tjSoEjuNUtLZnF9BYzSWrvb3TIirLyWOXk6JEqcTI8e24JqcKpppn5V6Lp+t6br EeoahLdacZm4SyxmKeSeS5lMk8axqpdGv5uBTjQN86hKb6t5P0fVbjU57v1GfVdPXSrgKVHGBTMa xnjVXP1lqmvhtihBRfl/ZQtayQanfRXNvHfxzXKm353A1ScXNwZawlVPrKHX0glOnTbFKFtvyt0y Cxt7M6tqU4hW+jknmkgkmmh1Nke6ilkMNSHeMNyFHB6NTFUPpf5PeX9Pn0+6XUNSub3TJpLi2vLm aOWbnKYefJjF8QMdsIv9RmHWhCrWu/lzLNLoyaVKUgs76W6vZZ5lDGG41OHU5oxGLaX1Kyw/BSSM rQVLioxVH2X5baTYx2K2V9ewS6fcW9zbzhoHettp66bwYSROnGS3X4/hryNVIxVR1T8rND1WKW2v p5msvVuZ7KBBGrW8l5cLdTskhViazJVa9AzLupoFCHuPyf0KeyktG1HUFUoIIZFa25Q2yxXUH1dK wFSnp6hMOThn3+1sMUpz5Z8jaZ5d1TVdRs7q7nk1Zw8sNzIskUP72WcrAAqlFaW5kcrU7n54qgn/ ACz0kSagYLq4iTV3rqsZ4H1YWuri8eFSFUoHku2VjueA49fixQzv/pVf89f4YpSLzJodtr2gaho1 zQQ6hbyW7OVV+BdSFkCttyRqMvuMUIuyju47SFLyVJ7pUAmmjQxI7AbsqM8pUHw5H54qrYq7FUMm pWT6lLpiyVvoIY7mWGjbRTPIkbcqcfiaFxStdsVUbvXNNtNUstLuHkS81EutmPRlMbtGjSsvrBTE rcI2bizAkDbFXatrmm6SLb668ga8m+r2sUMMtxJJJwaSixwpI+yRsxNKADfFUZBPBcQxzwSLLBKo eKVCGRlYVDKw2IIxVfirsVdirsVdiqM/6VX/AD1/hilB4odirD28u2Vz+Zh1qO/QXun2kIudM+rm npzrPHFOZSwBmqrqrAfDHySnxcsVX6rpmnXfn7TmfXdYs9RhtvrEOj28ksWm3EUElHaQekYpGDTK HX1OVOO1MUoLzLoGjL+Ymh+Ybm8aLVKJb2FtHaS3DskKXSTcpIq+lEx1BDIzgKOAqd9lU01Py3Nr +m6M8mrAzWiyynULSMKJmubCa09WKjuI/wDen1F3bpT3xQkGh/k1p1pp+k2esz2utLpd7cXnGXT4 YoXjuLYwGBYQXjjUPxlNB8TLUiu+KU08u+RJdB03QdNt/qE0Gk3bTSzram3laP6pJAsgAeUNcszr 6klRyFdh0xVlltdRXKM8QcKkkkR9RHjPKJyjUDhSV5Lsw2YbgkYoULDWdLv7Cyv7W4V7XUlV7GRq oZQ6GReKvxapRS1KVoMVRmKuxV2Koz/pVf8APX+GKUHih2KsXvPI6XHnm382LdKlxbxxxLD6ILFE hu42T1eQPF2u0crTrGPmFLtZ8nXmsRW7XWqFL2PSr7S5rqCH0+T36wBrhF5t6fE29QtT16imKGNa b+XXlix8vaZq3mCW31Kw0bT9RkuZbnTFgrDdyi75/VWDNB9XVXCxBNuRAC9MUo3Q/wAtbfT7fy/a f4hurSXSo0aKz0lhp1tfJAyFpbq1LTmV3qomfkOXLtXFU48zeThq3mDR9cN2luNGb1GhMHqeuvqJ IVlbmtVThyjFPhko+9KYoU08t6b5mutB8yX08Gq21rFc3OmhrYojJfSQz2soWRmKvDHCFqRVq1+H pilifnf8rbyTy1Bo2hwLcr9Z1F4IRb24trZNRmMisEkuLf02tlbjG8auQK/BviqJs/yN0mxhsFtp bR3sRZMUubFZoJprWK4imlli9VKtOLlWPxbNGh+KmKs80nTri0vtXnlW3VL67WeAwKVcottDFWcn q/ONun7NMUJnirsVRn/Sq/56/wAMUoPFDsVYxceS2l89Q+a1u40MMH1f6l6FQ3wSKJS/Mfvl9Tir 02j5JT4qhVoeQ9Pu9cXWteW21e9Gmw6cfVtlCAoZ/XkRXaUKJ1ueLJ4DqcUvNPzA/LtriTyp5Ljm kkknsoNMj1SSyDwRLZ8ppXilM6ejNJFG3KPi3NVAqKVxVmdv+UdhbNpZtp4E/Rj6gIWNoC8cGoXP 1hRbMJAYJbY7RSfEBUnjvirJPLXlb9BaXcaf+ltR1b13aT6zqtx9amTkgTgrcUog41p4k4qxry15 MtfLFzougW93bXMsU7aoUlt2jZYbfTo9Pmkt+JdFke4kSRqsP7xup3Kr0HFCA1XXNN0o2gvnkjF7 PHawOsMsietM4jjV3jV1j5OwUFyBXFUfirsVdiqM/wClV/z1/hilB4odirFJfKkE/wCYS+YotQgF 1aWyRzaYIgzcZFlSOdyJAwkqWVH4/YDoOpIVQmtfl7e6vctdXWo2z3c+l/oy4u3seU0TmOZHuLF/ XH1ZpPrH7wfHyCgVxSg7zyPpf6L0ryrNrsFnqCvqVxawQKkDut9b3cTLaWxlZkjtxdkoAWoqU98V RWg/ldp+n6lZ3941pdGyN1JbWkNmtvbQTXMlvIr2sZkmMHp/VTsGNS7Go6YqnOt+Uv0rrOn6p+mt VsPqDI31GxufRtZ+D86XEXFuYb7J3+ztiqG81+RYPMGr6Zqck6RS6XxNtyhWVlkW8tbr1EYsCjFL RoqjejnwoVWte8nXmsy6dPd3Vncy6dcXEqw3lj9Ytmjmasf7n1kpNCgCpLy8Tx3xQlmj/laNOtJ7 c6kH9bULC/5Jb+ny/R9ytxWUeo3qTzceMk21djx2xVCWf5Macssa6jcQX1kl1FcTWhtAi3Ihju0D 3VZZBLcOb0F5qCvBRxxSzTSNMns73V5pEt0jvbpZrf0FKuY1toYqzE9X5RN0/ZpihM8VRn/Sq/56 /wAMUoPFDsVYlc+VdbP5gx+ZLW6WOxMMFvdWollUyxxRXtVeIAxN++uIWRjuOLUpWjKUNrXl/wA8 ahctcxXMVtPNpf1aMw395DFZ3zRzB544Ei9O6Vmlj4mbiU4VXfFVC88l+bbnQNKt11FINWsJ9RnS 6aee5aEXdteQWqJPKolmMH1qMc3AJCk9dsVVdB8neZYtSs7jVtRmWxtTdSx2EOpX1xweSS3a3R5p fSa6RVimr6w258QKCuKpzrejea7zWdPu9L8xfovTLdkN/pv1OG4+shX5MPWch4uSfD8PTriqUeeP Iuo6/wCZNB1i1lt1TRD6vozj4pJBd204CuI5Gi+C3f40+Lou6MwxVhen/kv5jg0zTLJ4NKE9nFcR PqAkHqxyzfVeF5CIrC2LTQ/VXKeqzPVt5SNsVer6TFfpfau1zE8cMl2rWTPO0weIW0ILIhJEK+oH HAdwW74oTPFXYq7FUZ/0qv8Anr/DFKWX2oWGn2kl5f3MVpaRU9W4ndYo15EKOTuQoqSBihXxVinm Hytr2o6tqF/ZarNZ10v6rpMSXE6QxXrfWA880CERPtLFxLciCvTYYpYtJ+Xn5gyWFjM+poddi07V LGS4j1PUo44ZLqYS2ckRKyPMIl+BvV+L7JLOUXFUyu/JfnjULGT6zq72l6bfV2t1tNQvFSK8vLhZ bCrosHqRW8XJPiTb9lcVZL5a0bVtM8uyabf3T39wst2YJpLiZ5DDLNI9uj3DgzckjZVLbkU2rQYo Sfy1oPnHS7TSbbVrltVuY9QklvL5LyegtjZusfOOTjzCycY+G4JpKfiLUVZrirsVdirsVdirsVRn /Sq/56/wxSxzzdb3lz5W1a1srdru7urSaCC3RkQs8yGMfFI8SgDlU/ENum+KEw0+3mtrC2t5pmuJ oYkjkuHChpGVQC5CKigsd9lAxVXxV2KuxV2KuxV2KuxV2KuxV2KuxVGf9Kr/AJ6/wxSg8UOxV2Ku xV2KuxV2KuxV2KuxV2KuxV2Koz/pVf8APX+GKWtLVWuwGAYUOx3xVOfQg/32v/AjFVK7aytLWa6n QCGBGllKoXIVAWaiqGZjQdAK4k0yjEyIA5lT0+60zUbSK7s+MlvOgkicoU5I1eLhWCtxalVNNxuN sANpnjMDR5hrUJoLNYG9BX9aeOCmwp6jceXQ9MLBFehB/vtf+BGKu9CD/fa/8CMVd6EH++1/4EYq 70IP99r/AMCMVd6EH++1/wCBGKu9CD/fa/8AAjFXehB/vtf+BGKpfq8caRxlVC1J6ADtiqH/AOlV /wA9f4Yq7Sf97B/qnFU7xVZNDDPDJBPGssMqlJYnAZWVhRlZTsQR1GKQSDYSjUfLNvJEr6Q66PqM KMlreW8a0VXYuySQ/CkqFmLcW7mood8gYd2zfj1BB9frieYP6+jE/PXnS80TShd6oYYLbSbm3jvr xBHJ6l0IvrJ9KGa4s/3YTieKu8jE8VQ8eRmOW7TOrPDyZro2qtepPBcKkWo2Uno3tujcgrUDKyk0 PCRGVlqO9DuDiijVpjih2KuxVBa1rFlo+nPqF63C1jeJJHqoC+tKsQZixUBVL1Y12GCUqFtmLEck uGPP8FFW9xBcwR3FvIk0Eqh4pY2DI6sKhlYVBBHQjCwlEg0ea/FCXa1/dR/6x/ViqF/6VX/PX+GK u0n/AHsH+qcVTvFXYqg9W1fT9JsmvL6X04gVRFALPJI5okcaLVndzsqqKnFWJnyfqOvJdXeu22ni LUJ1uV0LUbRNSigaOL0YpWrIq/WTHs5Q8APhFaF2VW6j+UOgXsgvheXtrrlKvq9vMY5Wbt8A+BVX oqoFooA7ZXPGJG3O02vnijw0JQ7iEJ+jfzh8v/7w39r5osl6QXi+hdU67PUAn3Zz8shUxy3cjxNJ l+oHGfLcfj4Iiw/NOaS6XTNR8uahYa1KD6Fq6qYZOILMwnbgOKqCzHj0G1Ttk4ZLNEOPqdEMceOM 4zj9qM0jz+dd05ZtFSzvJr2MtpdzBdGazaUKrNFO5jimiljV+bRNHy49N6gTldbOJjETIcW0U1tv L093AH8w3BvbmQRNJbRM8VnG0UiyqI4wVLUdFPKSpPsDxyIhfNulnET+7FD7e78UmthY2thZQWVo npWtsixQx1LcUUUAqxJP05ICtmiczImR5lXwsUu1r+6j/wBY/qxVC/8ASq/56/wxV2k/72D/AFTi qd4qgzPdXM0kdqyxRRHg9ww5EuOqotQPh7k99qYqlf6GCeZIdU1SVr10T0dMLALDbOwIcrGP92Sj b1CTt8I41+JVkGKuxV2KsV843dzcXunaTo6ifXElF3wZuMENsUeCWS5YBmVXjkdYgBVn3AorUVY/ oPkrX/J9vazWyHVLKxdZJ7Ezia8kEdnHYxyRSLBZRM0FtCqLF6Y5/ExcuRirP9K1bT9WsY77T5hP bS1owqCGGzI6mjI6nZlYAg7HFUXirsVS7Wv7qP8A1j+rFUL/ANKr/nr/AAxV2k/72D/VOKplfzyR xrFCR9ZnPpw13oerOR4IN/w74qhL/VtL0GKxiu39C2nkaBbmRkWOMrE8xeZ3ZaAiM7/zfPIykBzb cWGU74en66VkvdH1RJrW3vIbllH71YJUd0+IgN8JJUhl2PiMIkDyYyxSjzBCrYXEjo0M/wDvTAeE vYNtVXHsw/Go7YWCIkdI0aR2CogLMx2AA3JOKoCW41ee2kksYYo2ZT9Wa5L7sR8LNGorxrvTkD8s VQvlbSbTTrSbizzalPJ6mq3c9PXluKCpfjsFC0CKvwqtAu2Kp1irGdb0eewvjrWgMkGq3Lqt1YNU W9/QUpKFBKSqv2ZgKgCjclFAqnJvrmFQ93bCKGnxSI/qBPd/hSg9xXFUb13GKpdrX91H/rH9WKoX /pVf89f4Yq7Sf97B/qnFUelG1abn9qOFPSB7KzNzI+ZUV+QxV5v5p87eUL7U54fMOnXMlhpqytYt G/B3ubW5MVytYrhF+HhGyB/fxUHGnOJO7u9NpMsYg45Dilz9xG3Me+0bpvnHyH5d0e61q0sLy1t5 r5NPn5t6sjuI2ulkAeeT93xmZ6g1PKtMlGcYiw15NLnyzECYk8PF+ju57M7uAqalaOh/eSB45F8Y wvKp/wBVgB/ssvdQh9QvbWTUrXS5Hp6zFnWhPIopkWOoFBXiWNewp3wXTIQJBI5BNAQSQDUjY+3f CxQV6DbTLfr9hRwuwO8fUP8A88ya/KuKo2opWu3jiqCsv9Jna/O8ZHp2g/4rru//AD0I+4DFUY3G lGpQ7UPevbFUHZE20rWDn4VHO0Y94q7p8460+VMVU9a/uo/9Y/qxVC/9Kr/nr/DFXaT/AL2D/VOK prc2cFxxLgh0r6ciMUda9aMtDv3GKqf1B/8Alrn/AOCX/mnFXfUH/wCWuf8A4Jf+acVX29lDAxkH J5WFGlkYsxHhU9B7DbFWE+btK8o6lp+kJ5jvZrWTUZSLUwDd7m54cfi9OXgYyECtUbbHaoyrKImr c/QZMsOI4wDW593zDHb/AMv/AJQw3RsbnVbuG5tnuI3aJHjCvHGsLFnit1j/ANH2Knop23G2VGOM dXPhn1ZHEIijX6+pvdry/wCWvI9rr+kXQ+uq8810bKWYKQHtL2O1jjkQWyNGJGAI5FeJPHq2MYxB Cc+ozSxyHp5C/jEn+dvT0mjCBtNUkR/WBbK1dxEYxMVr7ISgzKdA8+/MOx0hfO1rc62Fa0e3it7S O3ExmiT1DWbaGWNShd2AU8jxHSjVxctcW7vNBOXgkQ52SeVe7mPL5pZeaD+VdzbXP1LU767ubWza 5ht0QRK0dpbyLQSta8FEnpsSe7b4DGHQt0c2qBHFGIBNfMjpxPQ/L9jocHlo3OhqURZri75vH6Mh nEj+qkilIW2oYt1+yB4DMjGBWzptXKZn6+YA89q+PvTbV2DQQsOjGo+kZNxkN/0qv+ev8MVa0tlW 7BYhRQ7nbFU59eD/AH4v/BDFXevB/vxf+CGKu9eD/fi/8EMVd68H+/F/4IYqlF9oWlXZT1Ra3EcT mSGG7hjuEjdjUtFyIZN/A4CAebOGWUPpJF9yhL5Z0WVpGltNJkaVneVmsYyXaT7bNWTct3r1wcEe 5mNTkHKUvmVVdC09TbFU0+I2ZY2jxWkavCZDycwlmcIWO5oN8PCO5ic0zfqO/Pfmjza2P1X0BNQ8 vU9bkPU9StedfGv0dumFrQN3pNreSLLexadeyqoRZp7dWcKCSBUs3c9sBiDzDZDNOIqJI+KjD5e0 iAEQ2GkxAo0RCWyL8Dghk2/ZYMaj3wcEe5kdRkPOUvmUVb6fBFapZI9ra6elR9UtIxEpDEsy7NQB iTyou/jkgKa5TMjZNlU1eSN44wrBqE9CD2xYof8A6VX/AD1/hiqDxQkmo+c/Lem63b6Je3TQ6jde l6Mfozsh+sSGKKsyoYl5yKVHJhviqIuvMmkWmgNr9zK8WlpEJ3laGYOI2pQmHh6vfpwriqYGeATi 3MiidlMixchzKKQCwXrQFgK4q6eeC3hknnkWKCJS8srkKiqoqWZjsABirpp4IVDTSLErMsas5Cgu 7BUUV7sxAA7nFVl1e2tqsbXEgjEsiQxA1JaSRuKqAKn+g3OwxVC2XmDR73R21mC4H6MQTGS5kV4g ot3ZJSwkCMArRtuR2r0xVDr5t8vtY216Llvq93cx2MJMUwf6xMwWNHjKc4+RYEFwBQg1oQcVV5/M GlQaE+uzyPFpccP1mSZ4pVZYgKlmiKeqNt91xVMEdXRXWvFgCKgg0O/Q7jFUhufP3lC1u/qt1qUd u/rva+rMrxwevGjPJH9YZRDVBG3L49j8J3IGKpxaX1rdiU28gk9GRoZQKgrIh3Ug0PuPEUI2OKpn /wBKr/nr/DFKDxQwXWvyzn1Xzk3mWbVV+H0I7exe2LxrDDHMrK1ZgHdmuC6PxBRhtXfCrEdN/JfU n1uez1Oj6VbWlpaWerEqXeO3+q+ukcIkLxfWFhdDU0T4iORkNFWUaB+U0ekJcH69FNcTaTJpccwt FjMbzTTzyzgCRvttcbpX9n7WKpNe/wDOP2mzxJbxaksNrClusERtg5HoxxxyqzGUco5uDuV2o78q mlMVRJ/JFZNc/Sdzq63C/W47r0Xs0JEcMtxIkIPqcfh+sIqnhQCNRxpsFU38v/ltLoek2EEN8l1q VpqI1Ke+kjdPrDtbtaO0qtJMS/pSFvtULAdMVY7N+TV3aabcWq3Z1efUbWDSRM0QhFpbkxtdTHlO 1VcxF+KKW9RvCpCqcT/lIp0R9LtNQhtPU1K71N5Y7NQCbiOaOGPgsqbW/rAjffiBQYqlbfkLCIp4 4NZMH1mBrSVkt9xA31ReCfvaLSOy418Xr2piqa65+WEt55Y0nS3vTJFo8Eyz29rbpGbx5OLepErz JHDcko3GRnI5Ox2xVDf8qiW+8pabplzNFY3cQ1Ke99OFZla41W3nhY/ajqYDcAqe4QAU2ICWZeWd Bl0iO+9WUSyXtwsxK1oFhtobSPr3aO2Vm8CSN+uKGS/9Kr/nr/DFL//Z + + + + + + uuid:96F9E1E974FFDC11AC15B6426E08541E + uuid:725ae99a-7e76-5e45-a638-be54a8b3e099 + + uuid:713cf01d-bbe4-1349-a7d2-b732843c5112 + uuid:C78F7A50FFFEDC11AC15B6426E08541E + + + + Document + + + 1 + False + False + + 11.666667 + 28.000000 + Picas + + + + + Minion-Italic + Minion + Italic + Type 1 + 001.001 + False + MinioIta; Minion + + + LucidaSansTypewriter + Lucida Sans Typewriter + Regular + Type 1 + 001.000 + False + LucidSanTyp; Lucida Sans Typewriter + + + Minion-BoldItalic + Minion + Bold Italic + Type 1 + 001.001 + False + MinioBolIta; Minion + + + LucidaSansTypewriter-Bd + Lucida Sans Typewriter + Bold + Type 1 + 001.000 + False + LucidSanTypBd; Lucida Sans Typewriter + + + Minion-Bold + Minion + Bold + Type 1 + 001.001 + False + MinioBol; Minion + + + + + + Black + Red 2 + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Lime + CMYK + PROCESS + 33.000000 + 0.000000 + 72.999992 + 0.000000 + + + Night Blue + CMYK + PROCESS + 100.000000 + 50.000000 + 0.000000 + 0.000000 + + + Pigeon + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 30.000002 + + + Red + SPOT + 100.000000 + CMYK + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + Red 2 + SPOT + 100.000000 + CMYK + 9.000000 + 82.000000 + 60.000004 + 14.999999 + + + + + + + + + + endstream endobj 113 0 obj <>stream + + + + + application/pdf + + + BSTsearchHit + + + + + Adobe Illustrator CS3 + 2008-03-29T22:50:52-04:00 + 2008-07-03T10:39:12-04:00 + 2008-07-03T10:39:12-04:00 + + + + 108 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAABsAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9DQQPPJ6aU5Urv7YoRX6 Iu/FfvP9MUu/RF34r95/pirv0Rd+K/ef6Yq79EXfiv3n+mKu/RF34r95/piqGuoRaSQxTyKklwXE KgMxYxoZG+yp6KpOAyAZxxmQJHRZYCG/JFpMshWKKc7Ov7u4UtGfiUfaA6dR3xEgeSZ4pR5+f2K1 xZm3DetLGhWN5uHIljHFTmwUDkQvIVoO4xJpjGBPJ1pZtd20VzbyI8M8aSxN8SkpIOSniwBFR4jE G0SgYmj0WTwiC8tbOWRVuLwuLZAHIb0l5vVgpVaL/MRiZC6THGSCRyDWnRLqNv8AWbORZIOTIHId ASpoSvNVqvgw2PbESB5JyY5QNHmqXNlNbqDJSjGgocLBU/6VX/PX+GKu0n/ewf6pxVO8VdirsVdi rFvOeleWdS9BtX1Q2QSOeGKNZIAXEhUScVlSRiw9Pj8G9CymoJGVZBE8y5ukyZIXwRvl3/o/HVjy /lj5Pu7We4N9qlpp9ur8xchLeJYi0s7bXMCngpnY8m+/bIeFE97lntDLEgVAyPdv3DofJUn0f8vL 3zTo99BqZvr8zIlqlrPaSxoLO29X98oBf0+MKt3o3Erx5bnhjY3YjLqI4pRMajW9iXU9PPf5d6U+ b/LXk69V7iw1Wzks7i9hn10pcQGQCa7ljSX4FoeD3zjlK1AETrxIaM4g8i36XUZY7SjKxEiOx6RG 3+xHLvKKtPL/AOWK6HqMEOqmO1llk9WEz2YlZLeadfTjHHeJ3dvT5f5LAg748MK5sJZ9TxxJjv7p dQPt7/im6+RfL2seXdLn0uSRYbeKS4tYOcKxXEszJMVvOEcqt+8hUPx6b9cl4YMRTQdZkx5JCXXY 89q29O46FOPJXky38q2b2lrcGWCVIi8ZjiX9+qlZJOSKrEOOOzVpTrvk8cOFx9XqzmNkb/oTLWv7 qP8A1j+rLHEQv/Sq/wCev8MVdpP+9g/1Tiqd4qlHmjSLzVdMS1s5/q06XNtOs+1UEEySkrySVS1F 2DKR45CcSRs36bKISsixRHzClba7LYLbWXmHjbXbrDEt+D/otzOyqGCPReDGStEcCo+zXegEq2LK WESs49xvt1A/HVW1ZwdU0q3aQolw06MiuULD0GO3Eg7ddumWOMDRVdG8uaHosRi0uyjtVapdlFXa pr8TtVjv4nIxgBybsuonkPqNou9s7a9s57O5T1La5jeGeOpXkkilWFVIIqD2wkW1wkYkEcwkFp+X Hk20uDPb2BSQxywn9/cMvpzBhIvFpCu/qN22rtkBij3OVLX5pCifsHT4ImPyT5Zj0+409LRha3Tx y3C+tNyd4nEiMZOfP7Y5ddz1w+HGqYHV5DISvceQQn/Ks/JIlmlTTzG9w7vL6dxcRgmVWR6KkihQ yyMCo2ocHhR7mf8AKGagOLl5D9Sf6fYWun2UNjaKUtrdRHCjOz8UHReTlmoOg32G2TArZxpzMiZH mURhYJdrX91H/rH9WKoX/pVf89f4Yq7Sf97B/qnFU7xV2Koe+06w1C3Nvf20V3bkgmKdFkSo6Hiw IrgIB5s4ZJRNxNF5Df3Ty+dLYiK3vdHgvb2LzZPdT6aRDCkk8dsjJcgXa+mvouphkCgK1VZy2SYJ 5p/5qR6JDFZeaNM1OygT4LXV7iFnWaGv7p5TQOJOHHmKE1rlJy0aIdji7NlkgJQlGR7r3Zvovmfy 9rcfqaTqEF4KVZY3BdR/lIfjX6Rk4zB5OJl0+TH9QITPJNLTMqirEKNhU7ddhioDEfM/nyWx0z67 oNg+tcZViJiWUxuCkjM0UkaSBxF6fxkfD2ry2yqWTu3c/T6ISlUzwfLy5+/oyyBzJDG5pV1DGlQN xXvQ/flgcGQor8KEu1r+6j/1j+rFUL/0qv8Anr/DFXaT/vYP9U4qneKqc9zbQAGeVIgdgXYLX78V Y3dare+YL+XSdDlMOmW7GPV9ajO/Lva2bDYy/wC/JOkfQfH9hVOrHQtGsbW0tbWyhjgsRxtF4AmP uSrNVuRO5atSdzviqMkjjkRo5FDowoyMAQQexBxSDTD9a/KTyRqcv1iOzOmXoNVutPb6u4PiFFY6 +/HKpYYlz8XaeaG18Q7juxbzDofnrQ9N1Oxg8y3+qf7i7y80WCNSLxry2CCOPmnKWWnqBuAI5EdK cgZQiRzNtWq1EMlGMBA9aTTynZz6/ayaZ5kjmubaRXupLOf65b8PSvJobWVobmWS6RLqKISiGZ24 MvbJSiCN2jFmljNxNF6MqqqhVACgUAGwAGFrbxV2KpdrX91H/rH9WKoX/pVf89f4Yq7Sf97B/qnF U2urhLeB5nBIQbKOrE7BR7k7DFVKys/TBnnAe8lFZZOtK/sKf5V6fj1xVSkjTT5xPEOFpK3G5jGy qzfZlA7b7N9/bFUfirsVUL+/s9Psp769mW3tLZDJPM5oqooqScVY1a6RL5ouE1fXYJYNPiqdG0eQ tGyVBX65cBSrCdlYhEr+7X/LJ4qoi98kaevC80MjSdagDelqEYLmXlSqXYY1uY24ivNuQ6qynfFU TofmNry4k0vUrf8AR2u26l5bItzSSMED17aSi+rESw3oGU7MAcVTvFXYql2tf3Uf+sf1Yqhf+lV/ z1/hirtJ/wB7B/qnFUcR9av6H+4syNv5pmWv3IrfefbFWPeYb7zUdftJvLdst/a2ySW+pUnjMauz I5VoTPD++RYwFJ6CT2oapGV7Ofghi8MjIeEncbfpo7fqTTy3N5kvNPm/xJZw2twzBFt4qMrRmJeZ JEkw3kLgb9B75KBl1aNRHGD+7JI/HkOiOsGeNpLKUlntwDG53LRNXgSfEcSp+Ve+Tcddezyr6dvb mlzOSEYioRR9uQj/ACe3vTFVCfy/pdxCI7iIzMrLIJpCWkEkbB0ep7qwDDsMVV7KeUmS3uCDcwU5 MBQOh+zIB70ofcHFUViqUahplprF9AJowU0yUSx3C/DKs5WlI5BRk+FqPxO9aeOKoma2mtR69q8k nDeS3d2kDqOvHmWIbwoaHviqMiljliSWNuUbgMjDuDuMVQGtf3Uf+sf1Yqhf+lV/z1/hirtJ/wB7 B/qnFVa7SeKG/twZIluw5t7yJWkMbyJx+JUo9Vb4gfDuMSLDKBAIJFsHt/Imp2qulp5vvIVmkjmm AhujykidjWvr8vijKo2/xUqa7UoGEjq7OXaOOXPGPs/4lNU0DUY00NI/M16V0m4lmuucVzI97HJM JFilJk34Rj0wTy8aDpk+A7btB1cDx+geobf0duY2+LK4WaW5e8dDDAkfBDIOLEV5MxB3UbCld+uW OCxDVvMXmnT/ADG95aaPc6nYS2UbLCisqo0k5SOjrDKxZV+KRQagNXieOVTlIHYWHP0+nxzx+qQj Li+yvePx1dN+YHm2Iink27mQo0gkjeTZTL6SKVMAfnvyZQNl+IVGDxZdzYNDiP8AlR+Bfeqad5s8 y6lqlmZPLNxYJ6byPcSNN9gGQNCyvBGOTekrLVh1X3wxyEmqas+kxwiSJiRHTby8/wAUy65vQLRJ LakklzxW1B6FnFQT7AfEfYZa4LFNR/MfQvL97daRLZ30zaaoa7uo0iMZZ0WUmryoxY+otfhpVvDK pZgDTn4ezp5IiQMfV7/1KUf5w+W5RamK1u3F3O9tDQQCroIG7zUAP1pOp8cHjhmey8guyNhfXz8v JP8Ay/qiXVtbXaQS21jqi/WbKOfhzXmOfE+m8ij1F/eKOXiDTploNi3By4+CRjd0ita/uo/9Y/qw taF/6VX/AD1/hirtJ/3sH+qcVTvFXYq7FVDUIXnsLmGP7ckTooOwJZSADiqQXlz5iuPMOmz6ZfW0 OjxKw1XTbghLhmIYCgMTsOOx+0K08MgRK9uTk45YvDkJA8fQ/gpA+mfm60T11/Tmd4+JiIj9MOXb kam1LU4EAV79a5Xw5O9zBm0l/TL8f5yO8q6LqXlzUH+s6hb/AKIa0t4haJIJJGuILa3twyr6SOf7 iTo55VHwA5KECC06rU48keR47PyJke/zHT4shi/0X6pPcr6UP7+vLpEZnDx8uwotVrlrgMNvdL87 6b5uvtW8u6XFNaT+oG5zGlxzWKVXYPdAAiUzKvwAKCTQ8tscxkJWA7eGXDPEI5Jbjy5c/wCj3Uin ufzWvLG7jubCC0lT6tJZtalRIzpPC8qNW6oRw9QFeS8hty3w3M9GAjpYyFEnnd+41/D7v1MnS4u5 tO06K/RI9Yk+rS3NtEaiN1KvNSheir8QryPhU5dG63ddkERI8P03t7lbWv7qP/WP6sLBC/8ASq/5 6/wxVRtrg28vqABjQih98VRf6al/32v3nFXfpqX/AH2v3nFXfpqX/fa/ecVd+mpf99r95xVZJqYl FJbeNx/lCv68VU/rdt/yxQ/8CP6Yqvj1FIjWK2jjJ68RT9WKqh1mQihiUg9RU4qhfVsCa/o+3qev 7tf6Yq71LD/q32//ACLX+mKq0GoRwKVgtoolPUIAo/DFVl3fPcqqsoXia7Yqu/6VX/PX+GKoPFDs VdirsVdirsVdirsVdirsVdirsVdiqM/6VX/PX+GKWMec9X1TSPLlzfaVDFc6ijwR2tvMSsbvPPHC FJBWleexrtihgFj+ezzQSyyaXF8MkyJG9wYLhEUqY5rm3Mcvo26rIEkm5tSRWHHCqL8n/mzNfaro uhX8Uc97rL38iXkUhMfpQ3V6sYhIhRJkjjtFUuWRjyU8T8XEJZJ5i856lpWq6ha22kre2mlaX+lr 24+sGOWjfWAkUUIik5kta0JLinLFUmi/NG9kvNLLWunQadf2upS/WJL56SS6bcCFhaOIKTo6ESJR QWQlqLxo6qFtPzjku4NK1CC0sm069j1H16XcnqGawlRUitudvGZJJon5xxOiM1f2ePxKq/lL84rD X7/TVmNrYWeoR3kcbNMx9W7t5bVYord5ktmcut03welyLL8NRuVUBZfmZr/m6LRT5fhTTo7nV5LC +czj1eMNgbwx/v7OYKRusn7v7ScVYq3qBVMrDz1reqWtpFcPZ6VNJrdxpWoT2dwty9sluLkqsizx IsTzPbJGvNTyD8gFLBQqkmn/AJ3awnCPVNIhE5SBiFkaBZPX5yJ9WY+v60ksJjMUXwnkJFLfDhQu 1n87ZtI1TW7ie1jl03T3isorMT/Gk6T36PJOyQO8TzizQRxmq0ZGLKGYgJZZ+YnmvVfLttpeoafG lxH6tzJe2kr+kJYLfTrm6ZfUEc7IwMIZaLuRxJAOKph5c1a7uta1yya5+u2do8MlvcFUDRtcKzva MY1VSYQFI/a4sORJ3xQy3/pVf89f4YpYz521W90jyfrWqWKF7yysrie3pwIV0jLK7ByqlUPxMPAb AnbFUzsI5Y7KCOa4a7lWNQ9zIEDSGm7kRrGm/wDkqB7YoV8VdirsVdirsVdiqyaCCeJop41lib7U bgMpoa7g7YqvxV2KuxVZFBDCrLDGsaszOwQBQXc8mY07sTUnFUf/ANKr/nr/AAxSgZYopYnilRZI pFKyRsAysrChBB2IIxQstLS0s7aK1tIY7a1hUJDBEoSNFHRVVQAAPAYqlMvm2wj82xeVmgn/AEjP b/W45KR+kYByDSV58vhdQlONasKArUhVT1Lz35U0zzJZ+Wr2+9LW9QVGtLT0pm5iRmRT6io0YqyH qwxShLzzsbL8wbfyvcWztbX1rA9reRqCEuJfrjskxLg8Wjsvg4od61PTFUw1HzRDaapYabb2NzqU +oQyXUb2htyiQRPEjSM0ssVRyuE+xy8emKEji/Mu2j0/T5bmzuXutRuLqARxxQp9XEGorpwM4+sS D4Zp40YxO/LdgoGwUoXy9+akup6b5ff9DXM1/qsyWd6kLW6JDObBb8unqT/FG8T80+KvGvL46Kyr N9PvRewNMIZIOMs0PCXhyJhlaIsODOOLFKrvWnUA7YoROKuxV2KuxVGf9Kr/AJ6/wxSg8UOxVhku uaXF+Zg0i60uFriWC2l0/VUhjMq3DxXpdJZC3qCtvbOIyq9OQJ3AKlNbrzdHHrn6Hs9NvNSnFml+ 09r9W9ARymURKXmmh+KRrdgtBTpUgb4qwnzL+Z+h6d5VtvMUukjUNal0mDUIrz6rCscL3CyRWnqh 5zKqNLLIvGN3KqX333VTrQfOWl3N9oNpp3luaA3MF9bI4S0hNklhcxW1xDwEu0YfiSIydgtAxrxV UvO0n5cw6/5c0jWbsWF8LxLvSrGG0R1muJLpHBMv1eZouc6/Hwkj5VPMkHFUx8yz+S9DbR9NvdCi nh1K9ij06KK2tmiW9RUhhPFygRxDsjgbKlKj4QVVXWZ28uadYvoItks59XhhvoZEklLnUr9Y7ho5 BKvB1knZtww/ZoMVY9dfm9+lUt4PKFm91eT362RllW2mjVWhmmVxGt5b/E62z0R5EZQDyAPEMqyb RvOUmo2Nzdvo93bJb6g2mqGe2f1GS7Nozrxm2CMtXrT/ACefdQyTFXYqjP8ApVf89f4YpQeKHYqx q41ny7/jiDQ5tN567Lbi7hvDFAR9XRZY+fqFvUHAyPHSlf3hoOJYhVA6nrdh5Z1u2eOGyh8v/oO7 uma2tws6RaW0TIkciOEaLhdtwjCbHofixSwnzHNpPmnUvJ82k6GbrSIY7udrAW2lTRtDplwkMkEb tPHxXkw+KKcxEcaLIOVFXoGhXHl3V/K2n+ZbzQ4tPgSM6rbpPFBK0JlX13uIjF6lC9eXIUc9wDti hGeW/Ovl3zRpVxqfl67+u2tu7QvIY5YgJUQPx4yrG3Rx0xSknlbzNpPnDRdJvdT0VZtQkMdpciSK 3eOCaW0i1FmQvJIfRcCNloS1ePIAqaKsuXStLWAW62cAgE31kRCNAnr+p63q8aU5+r8fLry364oU LTy35ds5WmtNLtLaV5vrLSRQRIxn4svqkqoPPjIw5daE+OKrZvLHl6X1i2nQK1zcQ3ly8aCNpbi2 kEsMkrJxZyrqD8RPgdsVTPFXYqjP+lV/z1/hilB4odirGLjVfLI89Q6LLpYbXpYPrkV8YYD+4VJI jJ6pb1BxqYqU5fHsOPIhVQ1XXvK2lma1/Q/1mw0jSmuri4torU29tp8ySERKrOjlZhZleESMuy8q DFKTz+adI0S30PVLDTLbTdBik1WzvLH6pGt3atZw3NxdLA9vKYV5TWFGVQwfryxVMvL/AJr0K3ur fy/o/l240+VpbhbmwgisoUtDA8CyySiKf0yP9Ljb9zzND7HFU113z15T0TWLDRNWvfQ1HVSqWNsY ppBIZH9JRyRGRauafERiqR+Yb/Q/L/mjy/ZfoaL6gedzHLaJHE1tdF7bSoJWX1IVaMRXnpEBXYfD xHw7Ksk1XzLBY3djZQWs+o3d+0oihtDB8K25Amd2nlhQBCwBAYtXoOuKGNyfmQ1/Bb3OjRejGmoa db3UV9CGae01K6W3jmgaGf8Ad/tMPUUttugxVVX819Kk9FbfSdSuJ7uSFbC3jW253Edwty8c6crh VVCLGXaQq4oPh3xSy2zvvrM13F6EkJtJRCzScKOTEkvJODOaASU+KhqD23xQicVRn/Sq/wCev8MU oPFDsVYZNrelJ+Zf6GvNKheeaC2ksNUWGJpFuJIr3mksjN6grb2zhCq9OQJ3AKlZrV95HsblhL5e ivYND0v65JfQ21m8VpYvHNwSPm6ScZVt5FVYVYfzUBxVLtR8z6Np+n6Hdx6Xa2vlmObU7W90uWzj NxavY2t41x6JhlaBd7Z42CqwYMfiocVR+g+Y/LUOpWekaT5Ymsb5DdQSW0MNjF9SRJLc3BcxTceD NcQufRL16kVGKpzrfnvypoes6fouqX31fU9UZFsLf0pn9QyP6ajmiMi1c0+IjFUo87eabDSvM3l/ S7jRoNRl1ZxGlzMaPCovLVfg/cyg0kkSX4nQVjFDz4jFWK/4+0+/0PTb298mWDadMl1rAgmaQGJI Wt3mmhjuLCJZZ3a+qpjPFzWkhJxV6RpumaB6moW1to8FosV4ks5EMCpPchY7hbgCOpLKWX4nAbkP kcUIi18ueXrSVprTS7S3leb6y8kUESMZyrL6pKqDz4yMOXWhPjiqvZ6ZY2c95PbRCOa/mFxduCSX lEaQhtyafBEooNvpriqJxVGf9Kr/AJ6/wxSg8UOxVjesa75K0/XTFqSRrq0Vr9ekuTaSS+lbRpOB JJcpGyRqEE4HJx1YD7W6lJLvzL+VSzWX1jTUaO2sLuW2uW0qUpa2tk5t7mE1g5QcG5I0dBTo1OSh lUde+Zfy20uxhtpooksLP68IoYdPmlht1s2a1vW4wwusSK0jRsxoG5U3BxVMvLDeTptIh1Py7ZwQ 2EQuIofq9obd0Cy0uIxD6ccqkyw/EvH4iBsdsVV9K83aBq1vbXOnXD3NvdzG2glWGfg0qxGZlLFA FCqpBJ2DAoTyFMUI680rTL1g15ZwXLBDGDNGkh4F1kK/EDtzjRqeKg9sVS6DyP5KgeJ4PL+mxPBJ 60DJZwKUl2/eIQnwt8I3G+2KUys9MsbOe8ntohHNfzC4u3BJLyiNIQ25NPgiUUG301xQicVdirsV Rn/Sq/56/wAMUpH5i1K50vQr7Ura3W7lsoXuPq7yNEHWMcnAdUmIPEHj8JqdtuuKEVZ3dteWkN3a yLNbXCLLDKjBlZHHJWVlJBBB6jFUJe+XtGvpL2S7tlmbUbVbC95FqSWyGQrGRWg3nfcb79emKpOn 5Y+SU0u20uOweOwtILq0hhS6uk/cXzBriJ2WUNIrsoNHJoRtTFKKi8ieVo7R7QWjvDLb3lnKZZ7i V3h1GQS3atJJIzsZXUEsW5eBGKpnY6Pp1hZy2dnGYLeaSaaRVd+XqXMjSysH5clLO5Ox27UxQl2n eS9C0xLKHS0lsbaxumvI7aKaT0nkeBrdg6uX+Eh+ZUUq/wAR3LVVT3FXYq7FXYq7FXYqjP8ApVf8 9f4YpSbW9Kj1fSLzS5ZpLeG9iaCWWH0/UEbji4X1EkT4lqN1/HFCLjjSONY0HFEAVVHYAUAxVdir sVdirsVdirsVdirsVdirsVdiqM/6VX/PX+GKUHih2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVGf9Kr/ AJ6/wxS1paq12AwDCh2O+Kpz6EH++1/4EYq70IP99r/wIxV3oQf77X/gRirvQg/32v8AwIxV3oQf 77X/AIEYq70IP99r/wACMVUrlIoraWVYkLRozAFRSoFcVUrGSCbTLa7nSKMywxySGgCguoO1fc4l QLSfU/NEEenyXmjaa+sLHIsYMMcnpyBufJonjim9QR8PiKinZSX+E1nJ3buXj0tyqZEPl9u4q/xt uyL0IP8Afa/8CMscR3oQf77X/gRiqX6vHGkcZVQtSegA7Yqh/wDpVf8APX+GKu0n/ewf6pxVO8VS 3zDrcei6et7JE00frwQusYZmCzSrGWVUV2YryrxAqemRlKm7Bh8SXCO4/YEbaXVvd2sN3bOJLe4R ZYZBWjI4DK2/iDhBtrlExJB5hVwsXYq4kAEk0A3JOKvOfP8A57sjp2rQ6LqUM76TpV5qd3FBISJG gCiKF5YWDqhLEycGV+lDSuASB5NuTBOABkCLd5Pl0/zVp6WF7D9Z0co80Not3JdwRm0vJbVSlzSF 7m2n9H1YDIv7J7caMog80Ys0sZuJovRgABQdMLW7FXYql2tf3Uf+sf1Yqhf+lV/z1/hirtJ/3sH+ qcVTvFVOe2t7hAk8STIGVwsihgGQhlah7qRUHAQmMiOSSaj5buISt15amj0u8TgJIOFbSeOOgEck S0CnioUSIOQG3TIGH83ZyceoB2yDiH2j4/o5JbN5yvm1iCwQwWcl3PNa6dBcQXcq3U1t6vqq15Eo gtifq0nBWDMyry4/s5Y4qVv54/MLW5JLfy15ZNmkbtDLqOquFjV0Yo/FFI5cHBHwlunTKZSldAOz xafTxiJZJ8/4Y82h+Vuta0RL508x3Oog7tp1nS3tQfDYDl8+KnB4RP1Fn/KMMe2GAj5ncsmsvy/8 m2NukFlpcVt6TB47iIulwrCoqLlWE42JH2+hI6ZbGAHJwM2pyZT6ySpX3kuCNv0hoMrafr0dWW+k aScXApT0bz1GZ5ottqtyT9gjvJoRuheY01CabT7yE2Gt2o5XenO3I8CeKzQvQCWF6fC4+TBWqMVT jFXYql2tf3Uf+sf1Yqhf+lV/z1/hirtJ/wB7B/qnFU7xV2Kpdrmu2ukwIXVri8uGMdhYRcTPcS0r wjDEDpuzEhVHxMQBXFWFw/ldd3eq2XmHU7m3j1y1kmuLQxLct9Sa6keWWOB1uIY5RWU1M0TVJO3A hAqyHy9cSaNJB5b1LaQBhpd/0W8QVZg5PS5UVaRf293XbkqKskxV2KuxVJtU0q01jULbmpR9LkEs d7EzRzJIw3iR1IIVlp6gOzCgIPZVFzQz2ame3kkljTeW3kYyEr3KM1W5DrStD0xVGxukiLIjBkcB lYdCDuCMVS/Wv7qP/WP6sVQv/Sq/56/wxV2k/wC9g/1Tiqd4qgY5r27rJbskNrUiORlLtJT9oCqh V8OteuKpdpWkJa6/d3+oObrVrpSttdNQIlspB+rwJ/usBvicVJY7ljQBVU/xVLtftLC70yS2vYjM khURIhKyesDWNonFCjqwDKwPw9cVas7bXYLKJZruK5uI0CuXj4+oQOrMhUcj3IQD/JxVGWlytxFz ClHUlJI26o69VNP8z1xVq9uWggqg5TOQkCH9p26V9h1PtirEL/8AMbQ/L97d6TPaX08mngPeXcaR emXkRZSavKjEn1Fr8NBUdsqlmANOfh7OnkiJAx9Xv/Upx/nD5blFqYrW7cXc720NBAKuggbvNQA/ Wk6nxweOGZ7LyC7I2F9fPy8k/wDLuqJdWltOkEttZ6in1mwjn4cwrjlxPpvIo5L8ajl0NNqUy0Gx bg5cfBIxu6RWtf3Uf+sf1YWtC/8ASq/56/wxV2k/72D/AFTiqPv2aVksYyQ04JmYGhWEbMfm1eI+ /tiqhe69pWmX9rp93Itr9Zid4JpGjjh/dPHH6dWYHmxmXiAN98iZAHduhglKJlHev2/qX/WbDVrY vp15DcSQMGimhkWRUkpVeRQnZlbfxU4RIHkwnjlH6gQirS5FxAJKcW3WSM9VddmU/I4WCQT+a9Fi 8xm0v7mO1WC3ee2mnkijibi/pytV3DVG4Hw0oG3yJmAaLfDTTnDiiL3ra0ePNvlU1/3M2I4lwa3M QoYzR+rfs98eOPev5XL/ADZfIoZfMnl06kjWWqWlw9wONxbwzxO9FqFlCqxPw0IY+H+rhEgerGWn yRFmJA9xTO7ZI760ll2hAkQMfsrI/HhX5gMB88LUwS+0nzxpfm+/1Xy9pUUtrN6gcPMaXHJYpFZl e6UKyymZV+ABQTsa7Y5jISsB28MuGeIRyS3Hly5/0e6kS9z+a15Y3cdzYQWkqfVpLNrUqJGdJ4Xl Rq3VCOHqAryXkNuW+G5nowEdLGQok87v3Gv4fd+plAmu5dM0wahGkWrym2ea3j3Cygq0/Hd/hUch Xkdu5y6N1u67IIiR4fpvb3Kutf3Uf+sf1YWCF/6VX/PX+GKu0n/ewf6pxVEi7htY9Vv56/6MWaYC nIRQxB1AqR2Jb6cBNC2UImUgB1eZXPnryRrF2b/zDpt19bt5o49NMMjREW8rPEGJjuVRmjk9RXYe Pw13pjHJE7kO8jo82McOOQojf3/6XupkWhebvJmi2Wi21hY3VlF5iu5YLaCQh2SaB0sz6vKaQqKq qrxJ2HbLIziKrq4mbS5shkZEHwx9h9W2zKL5nglvmgJDvamVgP2XWqq/zI/4jlzrGN+Y4/IH+JtL 0jVbKSa+1OCOK0uFkZYUjtnaaGpEqcW5g8WVamtK0JyqfDxUXY6bxxiMoH0x/Tt3MQuvMX5PTxma XQ7pgluBFdOwPweuXQBvrIevqp7EDYkKSMp4sfc7CODVg1xjny+H9XuTv8vl8vS6ytk+mJBqkFhD NFJFLJJEIZ7eKaZGWSeVz+9vn4krxI/aqMniq+Tja7xOC+K4mRHLuJA6DpEPQdNCy6eqP+9jBeMF t+SI5RSa9aqBmQ6dv9E6b2t0A8AKD7hirf6K07/fC4qqQWdpbktDCkbNszKACfmeuKoTWv7qP/WP 6sVQv/Sq/wCev8MVa0tlW7BYhRQ7nbFUxnhs5ZPVE3ozU4+rG4UkDsRurfSMVW+kf+rlJ/07/wDV PFWvSJ66lLT/AJ4D9UeKqttHZW6sEkBZ95JHfk7H/KYmuKqK2ttHtbXb26f77RkZB/qrIHC/IYqu 9I/9XKT/AKd/+qeKrWtopBxmvpJY+6F40B+ZjVD+OKopJbVEVEdFRQAqggAAbADFV3rwf78X/ghi rvXg/wB+L/wQxV3rwf78X/ghiqX6vJG8cYVg1CehB7Yqh/8ApVf89f4Yqg8UICHXtLm1u50SOVm1 K0hjuLiL0pQqxykhD6pX0zyKmgDV2PhirV1r+kWuqQaXPcBL64UPHFxYgKxKoXYAonNlKpyI5NsK nFUwxVZFPBKZBFIshib05QrAlXAB4tToaMDTFXQTwTx+pBIssZLKHRgy1UlWFR4MCDiqFOtacNKk 1VZGksY1dzLFHJKWWMkEoiKzv024g16iuKt3er6faX9jYXEhS61JpEsowjsHaGMyuCygqtEUn4iK 9sVWX+vaTYQ+tc3AEYuI7NigaUrcTMqRxsIw5UszqN/EYqtn8waVBoT67PI8Wlxw/WZJnilVliAq WaIp6o233XFUwR1dFda8WAIqCDQ79DuMVSG68/eULS9+p3epJbSCZrb1Zlkjt/WRGkeP6wyiHkqx nl8exoDuQCqnFpfWt2JTbyCT0ZGhlAqCsiHdSDQ+48RQjY4qmf8A0qv+ev8ADFKDxQwu/wDImuXO peYruDXVs08wQrbt6NqwnhSK3khhCzGf9lpTIaIpJ6FcVY9oP5Owx6rDeXEUNtDpt7btbQvAkhni s45gWH72UxLLPctIoLs1FTkK7AqjNb/Jay1bV7vUpdQ4SX9zPNdAQVb0pUgREjb1BweL0CUkod3Y 06YqpR/ku6eYItW/TCcI7+TUXtPqScWkkmllpX1NjSSNK06RjbFUT5H/ACgh8savbahJqEd/9UgW K1X6sYWjf0fSlZWEzpSUszsCleRPxYqowfk3CtuHlu4zqEC6XBaziItxt9HZeCGrrvcCMF/5enxU qVWPaB+SF9qGiEa7x03UWklMwYLdtP6gtx6krpIqkrFFLEOpJYyn4jxxVmf/ACrBBpxs1vo1Muty a3dyLbAeqHaR0gYCQf3ZdaPX9n7OKsZuf+cfUnSAHXirRWsNk8i2tGMcEKwVU+t8LMjTb7/b/wAn dVPdb/K+S98taRpT33OHSIJluILW3SM3bycW9WNXmVIrj4W4yMxHJ2O2KoUflCt95VsdPuZorG8D anc3oSFZgZ9Vgnh3oyAm3+sLQ9+AAp1ClmflnQZdIjvvVlEsl7cLMStaBYbaG0j692jtlZvAkjfr gQyX/pVf89f4Ypf/2Q== + + + + + + uuid:92F9E1E974FFDC11AC15B6426E08541E + uuid:f2359209-ca4b-f145-bc24-11a32d3118e1 + + uuid:C88F7A50FFFEDC11AC15B6426E08541E + uuid:C78F7A50FFFEDC11AC15B6426E08541E + + + + Document + + + 1 + False + False + + 11.666667 + 28.000000 + Picas + + + + + Minion-Italic + Minion + Italic + Type 1 + 001.001 + False + MinioIta; Minion + + + LucidaSansTypewriter + Lucida Sans Typewriter + Regular + Type 1 + 001.000 + False + LucidSanTyp; Lucida Sans Typewriter + + + Minion-BoldItalic + Minion + Bold Italic + Type 1 + 001.001 + False + MinioBolIta; Minion + + + LucidaSansTypewriter-Bd + Lucida Sans Typewriter + Bold + Type 1 + 001.000 + False + LucidSanTypBd; Lucida Sans Typewriter + + + Minion-Bold + Minion + Bold + Type 1 + 001.001 + False + MinioBol; Minion + + + + + + Black + Red 2 + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Lime + CMYK + PROCESS + 33.000000 + 0.000000 + 72.999992 + 0.000000 + + + Night Blue + CMYK + PROCESS + 100.000000 + 50.000000 + 0.000000 + 0.000000 + + + Pigeon + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 30.000002 + + + Red 2 + SPOT + 100.000000 + CMYK + 9.000000 + 82.000000 + 60.000004 + 14.999999 + + + + + + + + + + endstream endobj 135 0 obj <> endobj 137 0 obj <> endobj 139 0 obj <> endobj 141 0 obj <> endobj 143 0 obj <> endobj 145 0 obj <> endobj 147 0 obj <> endobj 123 0 obj <> endobj 125 0 obj <> endobj 127 0 obj <> endobj 129 0 obj <> endobj 131 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <> endobj 373 0 obj <>stream +H‰|”}PùÇ7ʆ=ÑP²îH²šMÇóêWÏzÚV{VÅŠ‡"/â+ !AD“@H‹@€¼HHH$¼,`$(/Õó®*ô®ŠíÝ”^ëÝÜÔ¶è\[ì´÷Ä[§m"NïúOggvgv»Ï÷å³?µa0œC¾“xhËaq‰XZòÝ©D”¬HÄÂÈÃM!’Z¥[½‚N£M룴OçÐ bmZÂXÐÆM¬¦Ù‘…ºRY¹\\P¨äo¾ÊÿÞ®]Û^œ·ó÷‹¤yùüŒr…2ÿœ‚Ÿ\"”ÊeR¹@™/ÚÊçï—Høé‘·üô|E¾\¾»,„/Vð|¥\ Ê?'ó¥gÿß—„>7$A£’Ê@2ä‚Ćm"+•H€qœ1½"cåú•£Q¯DÝE7¢ÌuL'ó ‹ÊÚ>Í°ZWÇ`|¢x˜?‡‰ä’£Yż2I‰ñ,yž9 &S—ÉÞnâ´šíͽäÜÑO(º–>¦ß¦/¶Qøn×1WšGà?<(ƒ(£¿1wXúÔ­½ÂË©ìV”益÷ô½ØŸ{?þåC.¬£±áÑ&že,þÈh6¨h„“L¾Ôö9ÆbÆ™íÃ{Ûf Ö—VUhÇt•š=là@ ¾*”(S¨õ¤¡Ùæi¥ðk@û ºçïu­ñøBÅu‹¢ kU*L•äÎ9¹ÙÔ;Góhä îžK¢‘K3£Þ~žßœÇZ˜šï£{*üÕNÒû‡ñ÷ïPt"¼N(„BŠå–VÕ’5FW_Ðö±o–òÍúzÝvÌfw›ì¤««Þ`§ŠäõeË®û <šb ¶¶2´â‰ìãÇK…dVù«mMææ6êñìýð1wª`ìÀ¡TIqoš`ÓV.3_róú箿}Á£càaë«ÍOänPNˆ¾<Õ×…µ[/¶ÚHÖ·éóªÐ¿&áÐ?̲·„ÞÅZMTî¬þ±†^£¤¤9¨«Äô}c-©S8Út”®­ºN_[g¬Ô6žÃä½z·oÊ99Í»>=õ—xËó¨ã“Žù'¶xï(J¯bâ pzØ5à"]}:¹Â;tÝ-6+f³º]}ܞ毀L:$ÈP9§‰?ÀR™’S Êš¤ë¦BKõj¯š-L«€&>Æoƒ v +YïíÉXóÁˆ+?{SNJ.…ûOÒI„Ûè¯RcÁó]r7'«,]ì¹ð_žqóà³PßÖĆ½Ì©”XEdvªº ›:&P¤gqßæÎWñr¤¥UÔÊÝÊÞ* ŸÛ\xäÔ1n£¢‡ °ç +¬øYÞ ÿ¯ Kí°r-ímm­<üâ|ïŒÛ×si`tæÂG˜£±³®“gnöµ:FÆ8,`‡Q©A8T³á œ—qøW°ÝA43Ûß÷B”y{píÁ‚—ô4¨„µþì$­E“´.•Ÿìt‹Ò eŠÂš¦çh~uZÑ®<‡Œ,WÊÄTQy†(mÖÈüuAGÌ ]Õ¤þe¹f7U2=ÒdÌ7Po>;]s¢ædÍ ‹¿¬hpÙsÀ΂F`¾ˆ/=Ñáy·æ"óTÒ¿B[¸¶_€½a¯’ÙΤ§R)êé ø,d[SuAXñR:mD“*ˆ[ :âçwý«ÔÝ;—Î}˜ùáVÁ™JE./Q”°Žçî»´0l†Y¢…^ŸA3Šª°F£±±†—Lü¶ÝZðÛ©V«¥ÙJõ‹÷R¬R« +þ8ÿ˦°oPÜgC'aâ7tY"ºŠ ”˜Þ]¡ËÐer ®ßè¸ï¸ÇÁ;çºG½ƒ˜×ÝÙb#­õµ)|öb­­Éf¶™­G¯µ³ÝWãÄÜ:¹­”,:~dÇ)ª‘Ùõ«ð¨ Õ8RB²v‡cçMæN°ï‡7ù1À:¢Á„žWdV‘º†Îa3õ8·_A闘ð¾²Åç阷4o£iÌsE–*ô>óÝŠÒH©·0@ÞXú$à§XZÇSžƒ.í€}®{MLЛŸi;¢yÝÊ×ý{õK×W+¦y5 dkC¯ÿ`${¸u endstream endobj 132 0 obj <> endobj 372 0 obj <>stream +H‰”•kPWÇ»™éža I-q»gS¢qgŘUãÛ1Q"Š ¯áa@pÑQEC£‘AQŒŠ  (¨¨Ñ ¢Ä6 +Q‚@QiŽ®{š½Ôf{°¶²ûq«?tÕ½ÿsîïþï9÷â˜Ô ÃqÜc¹Ïg~K–kVlŒ‹ +_¾Ù°Æ˜¤KÕÇ%ëôŽyµ@ã‚»ÔŒ +„ýs:1ÃjöŒ ïAáx8û¸94Û´‰IF}\Ll²úÃÈÉjïY³>V/ŒJŒÐ©W ɺƒÚwsd¢>)Qž¬‹òR«ÆÇ«zƒ:@gÐéSÄÑwê8ƒ:\­×Åĉz]”:Y¥KסNŒV/Š‹ÑÅ'¦ª'ª—%Æ'è ^†‹æŒcïa˜†1æ‰cÅ°)ö†-’cŸb˜?Ž­Æ°@[‡a0,T”‰[Çœ0 æÙ°SØ .Á?Å“ðl¼Î sÚîôDâ-)’¼‘N‘ÖKßjba$.’Näb2—¼,‹–;»º[Sq˜ËK„ša«"xïÌŒ©Þr/¯ô>rW¡±-H1äÅ zÿ”y!K~[V´¤dÅ}y@÷&¡ÙIpºÚÍܼß]ÒT$—k—ÜCžŠó–þ¢ÁùÐP (`¬ +ÜCà}¯!fêÀÌâàB¹¯¬)³{GÇù·>'*$Ý„¤K˜ –˜ÂvË]Íà‰ƒ<%`T‚'x"OÒ1{~GSUùõ_Ö7ÉÏ´XÚo«ž!QuC–=;Í-2¤ÿ‰–ã9¼Q°IU6nÄFòÒwW3'<àð›<\³Kn*a nÇnv²½?Áø.ÕÙ½öȘö„€^äK£U$¯UØó»ò/FÉï¯*Fc|U¨ }böf‚™à(&ËKÞ*…U²ÃQ¨åP-˜à!72Û!fE‹p^¸RðáÐÀ0«!]+R†cRq®®ôJ8e¯Ð–O¹‘6âÙpÌÜ‘óy$:+œ'¦:tÐÁA‡ðh— (yèxJÂ:ÔA€3‰¶Â@­íTYíéquÍ%WT7âïúaÊ7Dšýi¤u _'Ûßš‘Ó'As3DºfÞYÚknÀŸ9·®_!§Lðî)ÐX䈔ÓzV<½ÑVu”M,¶…Þ¥Wì+:ÊR­™×ˆÜÌôœLz½¹ñ, [dàuMšöYÊö0f–¬ôø·ÇûiÀÌKcØ™¿”2!•lc`ÈŽ8z¾ñò7ÿ€ÌgX×t.4EˆîcªÛcÊìT+ezœ¥àHªµ¬‹°úŠú Oh û‚a’H9aíÌD#›EZ~% K#ãG¼v˜±­51‹wùEG±)iñÆX:yý¾[þŽU/NŸêöÐNuS§…#B‰‚ê>hõ¡Q¤1ˆ]eyÝŸ8s3HúqÛAë)ölW’ÿVQᶨ(pºò Œíº–º£^Ì×çó½0sPwØ¡œwP ‹”ü°UƒŒ¤EKd‘GRt-ÓH®Ö õ¢Yhò-$Å›‹jË ™uOá©Õš3h$5ƒ¦îîקØŠCµeuteëžåß9aÓ8¼û-ì·K„cpXñb,DÑ´©h<š¸ÖêÕµ’‰h¾eà韮•—4ŠÀÑS–›Óiã´/¯³±¹çskå0B¢aN(¾}æ: còsD+ÖÀA ‡C‚X… J^ ‡,]ä%ó}pÿ¾É”q”y +Jˆ´Î¡Q’©—°«‘§þ3é¼äg±^’}-•Mt¿YÎ"±3~“ÝÙ}D’©KZg‹ ×ÏKñü½fB9.nP.ã©!¨]¨AZ$©Wé¨qÊe´1ýE§E§‡ŒÚµN¾£=… zþ +ªYä;~´.ñ‹vhµK =]¾Ýà‚ñ¾ F+ÐRÑ4ÑèXÉrR$‰~mÿ{ÃKILŽU#bÔŒ°>4<8ª4"È òxeGÿ º¬87ç;Ÿ“QÍ ‘Q=…†ø}a´nz.µÿ ¢w$î0È£Ú–ZÛĮֻ̲́Ƚ‘ô–à‚ê6Í–S~IÕΡt 5ˆDîZp—¹¦®JjRÝžŒšÑ, 5 + zIþÍ/$-‚žaæYРßdK÷o©ŽcbjZMôÙ>M¬*-ëC‚u´&o¯èfås&C(ü…àB¢ PËÀ&Â" +B!ˆ@cHB6‰­hçà5çYÏüû¨!!G|Å>OqËlsL0µyçÆxÕ–¯ Ûjèàt"?«ÀdRù„lõc6jÏ‘-ßy;sÒYêÕ¶éDÞÞ¬/ ª´Â°cñLtÝ%S?}™‹"×Î6ÿ¸?¿ô«J–úú6Qp°àP©ª#¥}Áa¦j_ÕþêSòêæ¦bÕÜŠì*†zµë‘gÉ®²©õ˜¯0 äSö­|F½z&(.“ÔÐáGæº lñ玫ª³«sJÅèíOÅè›MÕÝRÕÉœã6’ËCw•ä[ ¬âú¥O‰|‹å›*Õ¡½M›3 Ñk̦ÿ­pç@ï¿ÝmÝÒUÝ^*ßèÎÚQÓQV%å» ôZ±\IKIsQGQvw|£T]oy±ÜT`Hô—ÔHYÙu‡È¥²ñUÎý™>÷wúôï•ÓÏífû8ý2×kîïD  endstream endobj 130 0 obj <> endobj 371 0 obj <>stream +H‰bd`ab`dd”÷r ðvóÒö)MÎLI NÌ+©,H-/Ê,I-ÒuJ+ù!ÍøC„¥ûwß÷¿LXe–µò~ãÿž(¸òûJ!’*çü‚Ê¢ÌôŒdMCKKSÇ”ü¤T…àÊâ’ÔÜbϼäü¢‚ü¢Ä’Ô=Çœ… úb… ÔâÔ¢2 (Ä +™Å +‰ +E©é™@E©) +%E‰)©¹‰EÙ +ùi +N™é©9ùå +j +ù9¹©Åz @àÉÀÄÈÈäÌ· ì‡îwÉï•åŒ¾«~÷ø®Ê|A ȸ˶jþŽ=‡¤NLN–ÿ}(òý]ÂßìFa‘^Er­l?±~oý­ÊÎW9÷gúÜßéÓ¿WNÿ=·›íwâtö×\ßU¹{xø~¼0tuç endstream endobj 128 0 obj <> endobj 370 0 obj <>stream +H‰bd`ab`ddör ðvóÒöÍÌËÌÏÓuÊÏI +þfü!Âò[ãwŸ KõÏK¬² S:x¿GòÜðýªHQ½s~AeQfzF‰‚F²¦‚¡¥¥ˆ4RpLÉOJU®,.IÍ-VðÌKÎ/*È/J,IMÑSPpÌÉQé*VJ-N-*ŠB¬WÈ,VHT()JLIÍM,ÊVÈOÃg#'#3##‹UÑ÷¾ïŸ~F•3ÞºË|ëûbÑßÞ§~ë}WQ•›¿˜ÕäràwûïRߎ~·tY®|1ëoUŸßz¿½¥ º¾Þeþ¾¨ï»·Ïw½ß*åÊ‹Y9ýmÿÛAê·Cào{g¹ùŬßU>žú®÷¨¯fÖO¹Y¿K§w˜¶›í{ó¤?5ÓÙå8WŠÿçáÜÇõ»‡‡ ÀySŒ¦ endstream endobj 126 0 obj <> endobj 369 0 obj <>stream +H‰|”{T“çÇ ñ•Õô”·Ù$ïš'žy¶º:§uÓVE­(ˆ¢ÄrM !!€¹¹ !7r’p‰ D¡XuZµÖµX¹è´žÎª›º³sž¸—v{ƒž³ÿvžsž?žËïù}ŸÏ÷÷#“¢"Hd2™ž¸u÷ŽøÄvæçñ‹— âæe‡7–†0rhq”ü­àÚ?x5NyD2.‚‡Þ†¢w}5&|N¾…/–æå±ÞÏ^ÆZµvíÊåáùCÖ¦#|.Å– +E¼"!+¡8›_*à—rD¼#+X¬M……¬”ð-!+…'ä•Š‰Õ×9°ò„,KTÊ9Â+â”°ø9ÿ/‰D&i‰´!%‘IÉd;’”N"Ñ y¤R$i-é>9›<¡Œx)ŽÊˆzNÉ¥.¤¦RŸ,H\0Ž¬FêÆ.÷/cáÛŒ QïQÎòìek˜uÔiø#ÅÝÔàP`ªO…ëÁ蜗nûÎèéF|—'†0½*ÿÙvüE@YU®.Å2=³V@K¯üph8&0ƒÀ)Eñ÷g±±ôòáË·ÚïôŒ‡×Õuz+…€Þ2kѵtÀn6Ûl g‘;7!éh—¿3gÉ'ŒÕ§Óÿ<ô}ÿ­ëLÚmù5Ž8´f°F¥„Âÿ,Ü55ðå+àcBä8õdcX$š¥(ÄWSˆe¨ü„K^w87$îÞÿ«%Œµ~¾·c¬ßbgž÷Ÿ=s梥 +q„lžã½áÑQðš¢H…©Í>=è‡)~¸ç4LAÜM9¦ŽVlh¿Ožû‰^¦ðÇlé¹¼c]^W b´uè½XO§Fåêtá +q€Wš/!nn±£qåárp +¦Ü„/ žœ”.ÍÁ_Ž55¶4èÁÓ.¸þ‹ïü¾ôÃÉ‚¼,æ¦ÎÒ• <ú:ßßwÏòò—A„Þ +#ÏúH“Á¦³`ÎnyÎÞÇqÀ4üC¼Dü +釚òoC=‘·Cëè‚­’r*[%__ŽÇðdQBy%¢Ñ(kU˜¼Ü¨—¹^Y­Ñ j•ê˜‚!ñ*mçìãC̾àÙgƒPÜ40â¥i±ËKÁ£©pgçâÖã‘‹] ¹Ú|Âd@ Í»•ÑÞ påa{våíç€#%­Ch2ü¸‰C¿ªúj$1ųڻm®&ƒÞŽƒ h šZ{˜}N·£kç¦,ß¹ãPnqïM€~­™Ë¢'%:¯õïtC»ª·t1Æ ÷2ï¿bÒ‰8GÙ’\ØÏ-ÙÊØ1˜}IÆÌ(¬’W26I¯„‰~£À£RÙ™™Œ­ßåO_‡ Øñ }Œ¾€ +Â>‚ülañ‹[ÐÇ_Â.Šßh>%ÀD«3Ø{€YBq¹Ïuš1à 5¨¨Ûqå Ü&·c=Ͼõùú('TI?éêôÕƒöz™“åHò ¬ÁQéÅhnùU®8{k¾ÅÀMÐ*ô|èãûôÒ2©J†)”&w(ÊúWùå¾S]m^;bimÓ90Gs}]3°Ö8{m ³Â‘—ýÉ–m;˜åâr‰°ˆüC(þMSRnVlÒ o$á¿.ÀŸ‡¯TìS¤ÉÓ§:7º g-Æ€¡ÅðlïØéÙ‡°;]J'æì³]!Šd»QüêƒpŸülr译Pߢ xr¬ºÞìjš$Þªo‚Hºîo-™3Q6TZEí˜ãéåñ  =}Ã=²¦_Nk¾Eð½0r/Œhn#üA †ïŽašyäÃ{ðjJšL'ôÎ#ÝpŠyòêÆyä¶Ù¶™Ö¯‘çž|S%¦¬¬UI@–dãþ?ý©¥ºþF™hцA}šÁN ƒòx=¨Z)*_[•¨Ê”¥ÅÒ¼òлä33°x&ž¥ÐK¸r!ÄsãVà,ÆÖÞõÏ\ëö™7® þóã^ÖÅ5L|#>H‡ïONûZ˜:£UgÂF»y@#þómx4çR«–Õ(1¶èÊ$ m6Šáž!ø*²‰è¥ ì´yãt»ˆ|ê¤û _¥HS¤ÉöÅÎtjý¶οǶøýÞSH§]oÂL-5j0T›LzS³Ñ¬·èÍ'¬bUW˜Ë°ÿªÐÇß J¾“mÆ ÖCÓzÖ•Hó)Ôïûþ{7ãã1gª}ôèáÍu Ë|·ÈçÌOX±ZjÃò%Ë×,­,›-7±yZÏÌiÓ§õÏè™Á± 'uI–tlLni±|LB[r¹TÔ¾’mYr»Ò'I¥eåågO^Ÿ+×4µ¹§®…£º¹®²F*»çházi¾ß" ªÿ?ㄆÿ Š B×nk¶ÉßùEËJ¢cJ¤Ûîœ*ôûìoV¬bý-¶ú»XÓDGÿ +{Vw¶üâIõ¬·Ù|obµ«š—1Wz×Ó[ÛVËó½WfqåBw¯×ßþzC¸ä‡ñsѦJ§æá-a%¿…[„Kö­>>Ør8ð½™uÓ”®%Ò¥®(?¥ñÂ%1¿SY‹7ÕN—^ºzîìÅò'·:¿ë°~Ëÿ-.aJϸJnõÀä–JnMàæú÷w¬l|ß뀩8¨|50+ÿ!Cxƒð…Š?ÜD=³úþfòúÍÌ]—Û¿3tãÞq¾£uC©tf`@T‚üÔJÖ5›çΙ!=­¯8²O¾7uâoïI&KÙ<¼ü]àüw`“fæoÆ)¿™¦ªE^ù.ø=påŽ%ç.])µ¾lAYiiq©\Ó”ºR©”‚èâd¹œ°¬¨ât …Âê¿sÖ}ç©ÿÊÁW3ë§Ü¬ßÕÓ¿»Í=?í{ó¤?5ÓÙå8WŠÿçá\Ãu“û{•È;Q€æt& endstream endobj 124 0 obj <> endobj 368 0 obj <>stream +H‰|”}PwÇ7†­h<²î”d5››Ö;[[ëyÚ;m=*Œ”JyðŽ #Á¼BH"ïy‘¼Hx X@$T“³­ŠgÇ—{™r½³Îy7ÈôîèÍOè:×Ûˆs½û§³3»3»¿ÝçûòÙ ‰^…°X,^ÊwßNJÙòŽ´L*/{5A.“T‰dRqäá¦0É +¯Ö¯YE§Ó­¢uË·ÐbkZ âu ‹›ÜãçFêåå• +iq‰J¸Yü’ðG»vm{%rÞ.Ü/‘ 3+•ª¢SJáÁ2±\Q.WˆTE’­Bá~™L˜yK)Ì(R)4ÌÝ!B©R(ª"IÑ)‘â¤P~⻾„ ,æ@^EIŠFRYH ÉDòŽ±‰¬B¢£È7,1‹^õQTNÔhMôm4e'²p›.‡ï³Ìáá(ˆ]æ“óf‹IC#¼ƒô—Ì¥Îô†™g>‰†el÷è{‹Ž±bK¼2O%Uk1•âç¦BòuCÏ'.ê.<öb·Ìwð:†QÎc›&¼ãJ–;\àA,>®”¨Pk¤©Ùîk£ðË>@û ¦çõmñøü™sÚe;Ö¦R¶V“;wæäQo¿[H#¯ñ÷\Œ\˜õ÷ ‚ЕÁ ¬…]õ:ºçL°ÖMúÿ4ñáMŠN‚W¥X&RʱÂuMi0{úBößæ¨À\ ×ëÀìo«ƒôt5˜ÔÙRÅ Æ +ŒãЦYã°¶^ ñD^NŽZLfWξßÞdin§‡`ïÇ‹üéâ±Ä”4ÙÉBÁþtѦ­|:ö^Ùµ«_xþþ¥€Ž…YÂÞWW”!*xAD¹!æât_Öa;ßf'9ߧOkÂÿž‚”šãn ÿ_Nx Q½³ögUôZýFÕ}5f4ëH½ÒÕ®§ôíµõƺzsµ®ñ¦è5zÓî©+‚«W¦ÿ:oúu~Úyï+{¼¥W³ñy86ìðž>½"@á úî» ³Û¼ž>~Os™_D&§ˆòETþ1eÒ™Ÿ`ilYq«åLÑõÓá¥É­_ËU&†Õ@›FñP;eyï©X{{ÄS”·)?µ€ÂƒGèdÂkVi±Ðé.…†ŸŸ]‘!:è»9¼8ãÀçáb¿Qe’šöš0·Jf“yiÚâ<ê°H™‘Í+Tp¯F/WלӞ«ôªzk0üÖæ’CGó•>œ‡=—`Õ/ +g„³‚â.­ËÆ·v´·· ðó÷zg¼ž £3ç~‹¹õN¥9Ð6èã13¨I´  i¹ðnˆK…8ükØî"šÙú!Ú2€=¸ü`ÞOúÎjÄuþä­C“uMìgºNéÐ +eIÍÖ§h~} ÚОBW9Y©2UH©ÒÊLIú>¬‘ý›0‚ŽXÎvÕ’ÆU»©²‰˜‘&s‘‰úñ“c†\ÃC.#\Q´øÜ[ÀÍ‚F`#¾€/}¥'˜y×oEæiä%Ï~…v¦¶_uԊɼÄãi”KŽúzÆV²½©¶˜Q¼”A›Ñä3>F1þˆåT"·¼@VäW]ÒH(Îmš~ Ѓ´gQÄãºðÉ*u¥Á@ŒO-¥óWW…ªBºqÀÑévø¬>ëpë¥zÌÛœìæw+ܲ£Ù9ééy¹ê´¼„1<>öžµ¡«š4þPQõÓ§¶›#¶%ôq1W@·šãÝÝ´LÙ?àYC¾`Ãg<©}ÉîØážAõ9<áüÃuŠCólše*¢qÖU/á Ÿ-ãÄ{%I|éO\hrM×·õôGê©`âjzZÏ°ÂWÿ¯¼ø4t.¬‡u·aý;ð=fUB„K„+CÀôçó=¤w…€¥ìg¼ÏFÜø–€ú•ÍiáÔ£ñ‰WЕSåºy™ L Î9ô¦£aä)JøoScÙÁ4e¤Šé]ú,}VMó™~*ŒM±Bû . +2õÄGw‚ãïSwn^\ü‚ÿ0ëã­¢ãÕÊA’$aÏßwa;`Ø sD ½!“f•Ö`fs£”–Mþ¶]Ÿ:¨6›µÙFõK÷RµM\ø¸‰ñŠ;àD8—'ý.kDW©‰’Ò»k3õ™ú,Äõ·ŽwÞwÝåáƒÎ[Ý£þAÌïu¶ØI›³¡î<…ϯ³7Ù-v‹Íêêµ9;7æÕ+ìj²4çÐŽ£T#»ë×̨ÍÏÝ&6-Ot1‚îÄÊç¿YóÜÕÕÀ‰m^Ãòõá—‰ÿ0„ü endstream endobj 148 0 obj <> endobj 380 0 obj <>stream +H‰|•}PéÇ7À.Û³†3ëöLVwc­wv´žgÅêMßNOÏP” +’ð.Á$$¼™I $Â[xG^" "øŽJ½SìЫJÅÎÞLñ¦í/ÎúG—ó¦ÓþÓyfö™yöÙßïûûü¾Ï><$ÀáñxÂ{¾ü|﵇S©¿ Q¤Èö«%)‰Ò…—«}Ï·4@ÿs?ök^óf] ¶âÅ Ó’Áåx­`a£~—"-S™Ÿ ¯‘þZüÉÖ­Ö-<7ŠwʱrqX¦J-?­ïO•*”i +¥D-—­‹w¦¤ˆC¾R‰Cå*¹Rí¾"NT‰%bµR"“Ÿ–(“ÅŠ¸ÿ AxÜ@øB"ÈG‚ »ýÏä‚BÃ~H˜"àêEüD„¤#?ðªxÿðëòßÿqÀ‘€t+êÂ>Æ.®4òù›!tŠ×]þ×ÁMælG¡sM¡ü±âNX5î[¡å¹}27ì"Á‚eÿ.ïDaá“ДŒB7VÞùiyI¹mXXý ÁªÆÑ`lÚ·ݱ‹YÄŠY’]‹¿l"ÍL>Ÿ|‰[°£¬å¿æB{®‚y(¹Sàkë!æ €ì‡d´Ûj.î£.a<†¬*¦òlÅ™’Èó2ëu딹‹Ó¦äI“Õ¨aá~ö{nÊ7îy'ç&'ç“r£µa;¬Eg±™Ò‚Lväh<¶Su® ˜âcÓø6]ÑiÝ !,"¦}™€’êx­2–Øë, 1Th36üP`YFLgŸ×–ªÊp‹Ze>KGÇD1ŸË"‹¶uɺ»FzšZèvÏÀ•¶~¼ËÚŒnËnÏ­¦š^ôߺ˰{a©’¦HT +<6!]—Oå™j›ìöÜc<÷Òmj?Û¡ÅÎÔ(5¢èc¡’ýuw½í}#nžùâIâN–1Ѹ݈W«Sl2*ê°6>Š9*Q…툙ÐÑÑŠtÝyíùL·ºQ‡ãk¾ˆ<* +ù.iv¶]¿ÑØñ5:¾F벉*ÊËÊ,4Q9Ñ8âö4tµöŒœŸÄ]EÎ'm-ñXÚ\ݽB>+äº,ÓrúE‚q„É"°‚˜#æ_ëÉ–ýcãLN+ªQ$üäú2†˜û#8ÐkŽ‚)µëdèaÆ¥@뼞 +ª¬87>Ÿ!æCYº/»NÓN³@¾9HO‹I‘7¥÷uôx;´­2†ÏþÖ¦yÃ,k‚Îr¦š'æž¾!È~ìkˆùߺÐ}º.'ãÖ“Ó‚r–Ëàdÿxøæ€ç»ú?–ãÃ{?#€¥t–‚÷¹]!.²³Þj‚€ŠVü/ÃϦ(w¡Fº ó›Ãétÿ”âÎB¥\ +®Ò‚wç{î ßÖI]iT¦Ú˜“Ƥåì‰ + Á‹0ç=ô®ã\w% ù^*ç˜xv«>\® òoë/ûð˼X;`‰?„éÉÛÚ½—˜wû^͈fÿZ/9yVCï•…l`—‰vtmœ†5p,e—‡±¼$^d2åQ‰©ƒaÃØt»ƒ±Ø*JlTGKâv†ÿ-k¸ ûGµßÊ1A‡,XJôƒÅ÷i©ª2WSFTÛâV¸™ +We9lFzÎCê­ÒìȤ4¥0OšªOÉOÈV$zìž +O¹ð£·å†˜<ÃÁ|aR ´U¡',IæóUƒB¢¿ ~“ÆZg‘“z\=qiä~÷aëÔ×¢çQ×Y4-ÎdÈ ù°ià%âsÍ %ç;NJ÷þ¬ŠXIF&‘ý47L¦Â’³·ê‘ë¡hsŽ×÷4µáMng©²9ÏåW2ĽÊ|{±Ýj·Ú*\6g¹'¯wë•öt*)â‹M‘LVó'.Õ€ÍÔJñ·êïC?L=}î¾ï"?\D aí3 endstream endobj 146 0 obj <> endobj 379 0 obj <>stream +H‰„•{XSçÇàÄ#mÓ§œf…œ5oÜÜVWgµnë U´VDQ. +*`€! È ÃMn!@!H!ÜE +^¦eê\½qÑi7ÛNŸWŸç ;´Û ú´ÿmÏyžóÇ{Þó¾ïç|?¿ß¡R|¼(T*•¾sßîðw÷ddgädÿ&LÌÉÊHñßÝdb8364‰VѲ¡ŒÑÓR¢12®x­<ź 2yÉ¢\”“ÊáâùÅý=º›—c¦»³ÓˆbYZCs§*à÷ÓÓ2(¥^¼Óý®žó~´ã´SÕš$5X·œ¦N¬ÔI¸†‘Â~¼gªiðxpé3_gN‰»Ó9ëSÖ}À*§ÍÁïöÚJ“W":¾Œ/ÛÆ/ô¶ÞQ´Ïyij·5Ư„oâUa~±O8š=Lq^þ:qÔop냳Ї!ΉOŠÆãòG/Ýh½ã®6»µ ï°ˆL»Q_ÔXÓ¨G±¾æ†£‘iá·§…E¤ó’Y!{xk>bnˆûãðãÞ3,úMÅUŽÄýA©ÊHB?×Ü;Û÷ËQ¯HÈIÚ©*$–¤Ì"6#äp8ÿ¤ :š–Â÷Åÿ| 3Еco›è54³Î¹ÎŒŒü ­¦‰ )ZÉñþèø8x‘¢XW58µ F¹àþ…¶×V™xñ6Ññ`€õ*‰ÈåïyJûЄñ/Ž‹À>Ñi·6¢zc›ÖŽ;:4j(Žmd +¸Âcb1ÊINË–àôdÅ4ün:4 £îyÃEHgDFÄÉxx¸òúDmUc¥<é„[>{Ì<Öw4R‘ÄÚÅY»‘IøÎä¸zîž-²9D-Ðûì¸Ó„ÖêŒ5ÜÒ¥àÅ=J€d@'Þ'r%Kh/ÔŒQívxßt1¹Õ*ä>M¾I±%Ÿð‘â°üT£Q•©qE¾^+ +­ê„Fƒ«ÕEJ¦Ô®2™Ï6O³z†Î<퇒º!Ý z=«÷·Ú—÷8lÓøæXA݉†“õ:TWghnb¶V +¬øþ½ñz$7¸(¥Ë‰äKÜo ©{J¥~Ù Õ÷Ì®DÞÂnnƒL²zûëûZ¬K»©ŸhMŽZ¿gwbZv÷5€}®[NbD„[® ÷ ÝéºÒöÂî|tLЕÍgŲ,±ä:éÑÒ4ˆOÎÝÃÜÝŸrQÎ:’U¨(`*Òn) »¥$|b¢˜;¿867?øÍiþ`È ‹c‹ìjcVÖ×h›êQìѶËmC»uØ\cf¶”¶7³ô•µ•úJ»ºÍ\ÕÙ|ÊYÒàONÌSó5[5(y@£,·^€Ógõ7¸zR +ó‚c)RñJC»`_]‡ˆKßpZ€‹7‰Þ¤ˆµýlG®;YÌ%+j1”p"‡FE3îxz×éØßxîÆ)k‡³´VÈ-98Oš!¨y•¦;NoW\I–¸n¬t"?¸ý!Vˆsø€!Ì“©å¸RUß^r‡“žç_ê9Ýi¶7£†s 7ÕU”צRK·‘Ù 4e¤|´c×nV¾$_*â“È_»C^6%ÕNÑñ­@vþ%2Ÿøe&ñ^±QyPy@7Ûá_Õ®;c˜Òê]ƒ¶Ð¶=¶ƒht‡UeÁ-=Æ™1²HBõ’¥w=}òÓÛÃõ†"ø*C$8ÄUà'*¬µÒݷɽ*<Ÿ7L, úq¯5ËõÈÖ‚&q+nzrirÐáó•àýàÏæàöÛÏçKïbÏ1÷’ø_Œ<>LòDÕJ’ÏÍ –ù–ÏÑoléž0 ÊÔR$Ùr(h-IÖúylɬ/ÀÕ’9ž·+1èWhÍú%2ÕXíÉå“#Ñ1ž\l¶~™K™ŒÌ…K†«äf;´SvèUg˜ê†>1‰ÛÊsSÕ •”ÇÈcŠbæ:tSí×»¦…Œ ÜQš™@þ“Ü{=i…¶Ïú“—ûAöܳ9Í]l¾íQxe}ÒwRa_øæÞ¡YQxt?q9 ¯ÙWxÑ@³¹?‚šÌ/À‘€ªàÒàø?ü@Þ€t»¢Ïýfudfÿ—ʲ{i*ãøLÎ\ œS¶ç(uData¥e©‰‘5£–™áÛÔæÜÙl¾lg;Ö´–º¹³·Ô-ߦ“™c™‰(º’L¼ñ%ÍÈ +$È‹ ~‹_°æî‚çxžçûùòÙŒ“+|Y¡F^ˆgž;„éÃgw^,¸FÇ°E¿÷çWáÖíÙd ¦B/]Ùb°VsG+¾v¥àO`\&Œ¾ÓÀi¢Ôz-šKøWp¬#$+Ü Y^pÙG*ÇÆb®ã`p‹çžÉÙmp ³DŒO‚qg*Œ]ƒïD|­©ZMÔ(mA…F¢+S Z‰ºÏ9ÙïÚò 7ÅÓ‡åzm)ÆM3+Að{À—#Anhûê,q®( 곱нšUy$.'I)Rç 6û[Fm‹ŽfôéHŸ‡3Òo7Ò(Íè)oo¤ ´‘6™-F«Ñò¸ãÍé j- +Tv)'éÞÌfÞ 3ƒ‡@¹ š)_E¬ù¿ÌG‚}þööçuÙŸíÃ+º \náóÞá>•ÒŽ)‹¡Ãbµ´2†ã0õJÐ[âJ…<¼[#¼1EŒK°‰“¼ZX\^}OZÞ>R‰éhÊ näÔQjU½°Ü0'A¹0vOµ‚m¡_°IVÌʯ*díà_IܨVï|IãsÀþ»Í5„ÀX¶ÄéŒçsî§"™l©Ü¤A6ØÙЋ¤Ôv•v¢ß>Œ»qînXòkb>®j6~­ñˆÀ©@2_wU•FžOD@<‡ÊZÜ~&djÓ€B¼æG½U¨"ý¿`šõ{ÁäbX„$ʽ V´ÏÝiïÁßúf–&B>!…±áFw¢Ì§=4!¤{8è¾ +v-›[oûƒÙ`dt.YÙ€2ý­·FaŽ ªøàÁýÃÑë@ml …ÿO€™Óš| endstream endobj 144 0 obj <> endobj 378 0 obj <>stream +H‰T”{TwÇgHf’Z§ƒtFgf»¤Õ“s¨ZÔh6š²$ëÛød3oàMÆÄd)ÐdŒç3L†xcªÁ´†OKà’)iþC~~ZJªÑìƒa¸ÔöŽÆ°qÆb˜7†}Œa$¶ÖâØ2,ÃVbØ* £%Ř&Ã|±ÍXÖƒÅ}qþmÈ,²6YŸìòy½üE"®)ŠÑ*•0YÔ#æ¦Q.¨€@:ÅhuH« Ù†:5004’T :-8ÌtËÄ£ƒNMäö鹓&+}|¢ÐäE£±mHÓïÃöM~¸å\žò¦"fßÜ‹:•¡®Õ ‚Å ðøÖÅþØé:кOù6WŸ[vi5g=ûúž(ûûÛ@ciðŠ‚1>ýì¤'ÓK"w+ƒ­[\›®ù+¿:Ždˆ ‘|5’‡ÎeùÏÍŽÙª”thq°‚VVOЂiÉalûŸMÒÔ5íljUžjs\ºI÷"ÉëE¾ßzsB¾RÌ•ÿ78Á-à-b™¬8X& •‘nùÛ¯Êz_|-àí2ñâ`”æàçK÷‡0‹ÿ¼aZ·$h-RL Ñì‡(v>¾Z]ÚÀÞWä$-Ë f'zï Äÿ=øƒ_÷ÔMõœª*k0Ñ‚ ÷àò=™àyOl/"áôP;Ñ;˜8sèl!‰þ"ž%&‘*› ú&‹úÁå¢NŠGÄÊUæ bPœ±ˆûÜ9ýJ{êÇ$ ™Gí ÜÏŠÍé!™’‡:àPàqù)Œ½ñeS§²uݽ°ZÔ× ÒM§²ÅO÷ S‡¬¤COä‘G²ŒmS¤äu(‚£Î£‰×‘ 4¿ÓUWÉ:ȼ;­^oÏeܺÆÛû;N6sU‡ê*™êóÛ\•J0_€)îúöJ¬ŽÁaÍóÍ0E£)“Ðxôa¸ÓçÆ6öÌu³›yø]å©á„ØmŒuÊÎ+‘\RËŽ³;ê”0D¢AA#JnžºÂÀ¨BôNlá091T€0‡T· R=Ýb(8ä¸A^°w‚×­Öìܯ؟ûR㜟1(ÝŽø¹Ü2¤ÕƒV¡BÞï=›EýÃT¹©g¯P&§õBv'ómÇÞ§¹W÷uƒš¦ºÄϦ)¨g!yŠãIqÍ34ë 4)'6¡Éà{îne_;ç suÄì­Ùè}&à˪òD\pR3+2$=†™¶ºÛݼ»ãX;×XÝXÙ¸Z#ÌÕoºï“è㿺Áæ–ýêé†ßÈîkmÕ­L]oàÐ7üKñÓÖ#¦lcú—e±LĬ¬Éa\éxA@žN1œa•£`¤ZšÖ7ƒÛu…£¨Ea$õÒaÃ;rxb¥g"‘j‘Hµ _2º¤Ã^þÍœÁ%›‚]0þãƒG‹ÐI°l4s«3ÓËiKñê£)lmZ³õÈÖß“½Îol±èC”ÏŒÀúƒ±ìp9O û + û +Õ qµÁ0ÏyÉî¼ÍþU±%>n{³.²¸6•[_VPy†Z° Ȥ‘ÈK^ +•ýõ´,ñ¨E]'6SéPìé&Aú'¦’ÔI<4Š3‰ ¤ +I£< À+AÚâ½!ÝT¿X ­æ/¤W°ÎÏžÉů͉N¡×í2o`©þƒ¾DQ^qv6•¹ÖŸ&;ÚÌÁ9…96Žz¹Á—(Üž·ÆL¯ßs,…Mh¼ÝÃ\âÉp?ûý½E廪9ªÿM¢ø`ñ¡rúZÖ%ÿÃlÍžš½µ ÊÚãöÖºtGU~ K½ÜüQèȯ)£»îÚ/³Íÿ×åîî%½ÔËWÈ[s‘¤úwÙÏqÍÇJO×ÓµùµåRôÆ_¤è‚²2ÚÕVÓÁž¢É«ß8Pä,vJõË!ŠŽ¯kèCÛ[×Ö³Í ËKý˜p}“¤ø»߶Âù™\î<¢ » k½¸*¬ÓÌflËØjJRšÖØ£s霖]f¶d¾DbWF6ýé,ûrÖ(­öŠÁÄ +”è«UØIdp*„îwÅcþ-ÀöM endstream endobj 142 0 obj <> endobj 377 0 obj <>stream +H‰”•TWÇgHfö =Ë43˜Éöˆ–Í.kW-þNk*JEäWøaA0A~hA‘Aj‚€bUAAE­¥ŽU¨PüQ8lG«q×½Ã>Îv'zöt÷Ï=óÇ;ç¾{ïûÜï»wŽ‰0ÇÝVø|æ¿l…zå¶È¸¨ð5á[ kÓ“t©ú¸dÞ¾¯âiœw›P!ÿ¯Î&¦bXíÞI°ñØÿûcnŽ.vŸíšÄ¤t}\Ll²êýH•×¼y©–D%FèTkÒ ÉºƒÊoKd¢>)Qž¬‹òT©–ÄÇ«ìþU€Î Ó§Ö·ª8ƒ*\¥×ÅÄ z]”*Y¥KסJŒV-‹ÑÅ'¦ª¦«–'Æ'è ž† æˆcï`˜†)1ÌÇ>À°1l©ûô8¶Ãql=†mÄ°P ›*Ô9`"L‹Y±ÓØ(.Â?Å“ðü¯QÝ"…h§hPì*¶Š GBEDuGþ™Ô“õ­ä•³ó¸%‡œˆ¯·È‚÷ÍÍœé%õô Aï"WšÜ†dcžÊQ¯³.fKoKŠ–•®¼/ èÛ "  9×ú”Ý÷ûJ[Š¤osr¢{È]vÁ<\4:"kLV€k¼ë9¦œ92·8ø€ÔOÒ’Õ·³k±ôŸ“H„oFâ€eÊ•‹—ÃöHMàŽC:¸‹ ]îàŽÜI» öþfG3eÕû[¤gÛÌ·O‘àuS’ãfˆÎ‘ò™âÿÄÃr,ÞÌ[EÍÀÈx+;a%9ñÛÕÙÄòX¼›ƒë6Q·æàÒu¼»‡ø¡¦ö*Îí³E~¯ìL@~4ZMr™­ ·àR”ôþêb4ÉO:ÐÇ&/e°=Ô±`dñל赜_Í"ÔA=‹êÁÙ oÒ¹2e<&gàꀈ•ð$œŸè žŽÇ,˜¸O¢süb¦ÝºX¨fñm¢9]OHXºp$Ñ6©·ž.¯?3¥¡µôZ“âfü]ÿcÊŠ‘&-4vÆdçkrø8h>rd‚Hç¬;¾ý°ö&ü‘uéýÒ8Êáž MFnH>«ÍÈ“›ÕuLb±5ô.}´ò`QCµg]'ò²2r³è ¦æs l•€SÔ 4cÖg);”ó$e'¾91LfòaB$Z1eD +ɦÀqô¢ô+_ÿ>4eœ3ØÐ>zÒS]qPn£Ú)ã£lKRí彄™ÔW6n|L ØÏ 3ü@òiëæ&¦3Ù¤ù²ÕnÂKfciFWóÉnÿè(&%->=–NÞpð–Ö~ +ïÉêS]Ú¨>ê Œ/•Q}%!Ej1«-soh™ˆ³Ý±@Ò:[N3$»“´Û—¥@ÃÕŸarïõÔB¾!Ÿïøi¬ºËœš_*çÆ-j”Nš5D6y,E×ö¤*5Ú ˆ…{ƒ†IùÈ1"Ÿzˆ`!Å!A‚œãÀÌ"s/yÙt\¿k1fÖ)HŠ"-ói”dBªeÌä®w‰3 +gaÊ0/g3R]nÚ ’£ž½B>²]-—÷ék=‡Ng~[4. +jŸ?GB=ÓfKNÆF6- ÑÂÏÑ"$õhD^0ûbÅhc&3ÕÄ¢=ÆOÐzéúʲúàŒla°6)Œž³yˆk:Ðs¼ƒi¨j¨h¦ûZ6ªÞЯÔÇâ ƒý$LÀ r¨«­ª…6iÂ$LƯ’;{ŽéO)’Ö[#è S¼ë{†P&“ ”ƒÂ8j êjQ³IêeÊÀIØrz3˜ZA©fA©fû%£N „“o) Þ@PýÿÕ*p¨É·}‰_²A»M2ðë7øLõZ‰|MÐ4D÷ ÷`Ê‘(ú•íïM/¼iÆ{±*D¼#lHÀ5–êµòœ7då® @¥e¿/<<öRjSñVá_Ü*F‚„ŸP(N$Ú•°¬,R  4‚4‰„ d%œ‘0Š6^±.ýT;Dñ¹Âsõ¹p‹[½M1ÁLÔ–]›â[¿4nWRc‡gÙ…F£Â'd›¿r“æ<ÙÓfðÛ•¿+7ƒ¡^nŸMäïËþ H;v<^ÝpÙ8L_a£ÈuÞ¦”}YÅPc_Ý& +)St¥t.>ª¬>X}¨æ´´æ¤©¥XQ’W™S­¤^î¾Cä›sª­ŠÁ~ÓUeùß”†V=¥^¾BÓdWHjìè ©á"Ót¼äü EMNMn™½ã‰kµ*úÚª{”çÙMäŠÐ£½¥–B‹p~Ù¢ÀlþºZqd_Ë–ʦèµ%Þô:M£Pñå‡&ï½ù;r¶1™¾Ä¿ÕQÓQV%å» ôZ±\IKIsQGQvw|£T]oy±ÜT`Hô—ÔHYÙu‡È¥²ñUÎý™>÷wúôï•ÓÏífû8ý2×kîïD ljv endstream endobj 140 0 obj <> endobj 376 0 obj <>stream +H‰bd`ab`dd”÷r ðvóÒö)MÎLI NÌ+©,H-/Ê,I-ÒuJ+ù!ÍøC„¥ûwß÷¿LXe–µò~ãÿž(¸òûJ!’*çü‚Ê¢ÌôŒdMCKKSÇ”ü¤T…àÊâ’ÔÜbϼäü¢‚ü¢Ä’Ô=Çœ… úb… ÔâÔ¢2 (Ä +™Å +‰ +E©é™@E©) +%E‰)©¹‰EÙ +ùi +N™é©9ùå +j +ù9¹©Åz @àÉÀÄÈÈäÌ· ì‡îwÉï•åŒ¾«~÷ø®Ê|A ȸ˶jþŽ=‡¤NLN–ÿ}(òý]ÂßìFa‘^Er­l?±~oý­ÊÎW9÷gúÜßéÓ¿WNÿ=·›íwâtö×\ßU¹{xø~¼0tuç endstream endobj 138 0 obj <> endobj 375 0 obj <>stream +H‰bd`ab`ddör ðvóÒöÍÌËÌÏÓuÊÏI +þfü!Âò[ãwŸ KõÏK¬² S:x¿GòÜðýªHQ½s~AeQfzF‰‚F²¦‚¡¥¥ˆ4RpLÉOJU®,.IÍ-VðÌKÎ/*È/J,IMÑSPpÌÉQé*VJ-N-*ŠB¬WÈ,VHT()JLIÍM,ÊVÈOÃg#'#3##‹UÑ÷¾ïŸ~F•3ÞºË|ëûbÑßÞ§~ë}WQ•›¿˜ÕäràwûïRߎ~·tY®|1ëoUŸßz¿½¥ º¾Þeþ¾¨ï»·Ïw½ß*åÊ‹Y9ýmÿÛAê·Cào{g¹ùŬßU>žú®÷¨¯fÖO¹Y¿K§w˜¶›í{ó¤?5ÓÙå8WŠÿçáÜÇõ»‡‡ ÀySŒ¦ endstream endobj 136 0 obj <> endobj 374 0 obj <>stream +H‰|TkTSW¾ Üxµ6Ž\3•ÜiNìØ5ãªu鴎ΪZiE) +AGäæA “\Ðò"!AЄg €€Hå!Ž:µZmµ¾;âšé¬vÍXÌœ8—Ö¹ÁþžuÖ:?öÙgŸïÛßw6 ‰e#,‹—¸cÏ®„Ä7’Š¤E2é›;•¢Ò¢üèÁêÁŠ¬Œ5,eÓ€¶ü÷ѳ)ôUq ¾ .ƒšåƒ¿Zd‹æ¶ËäZEQáa¥ð·ùk„6n\¿6ºÿN¸í,O,LÕ’J±„î”æËr™B¤Z'n+-¦Do‘Â1)V¨™è Â"R(*¢Cb‰HQ"”ü¿JÂbò> ÙÁB>b!I’Œ ©l$A¸ C„Ä ]¬7YOÙi1›b®Å®Œ £¯£Mè¿8V.÷†á‹luäía½&®onžÁKáÈï@U å&¼³£ã÷Q'P•¤°ÌHë=ÝVÐ9ˆ¶==Ú°’ª´X /mÐTX*‰Ýgï»S³hÖjþ;aM[óDÈãœ;}vlx +«çH¡–×ë?Zíµbåj}†‡*K +òÈ2LtH$Ñå¦öÁ^ûW—A×ÕPG‡ÃKmîæ/Á½f8 ºEþ! ëâÐ\<3÷ ðÆ9=–ê#X3_h‡ñpZ:,Z›¿æ]Agþˆž²š}aü€¬xŒÏyÞÇŽ@xëï¾4=BšuiôKÑË3% JWnRÙò®Yà~k¸"RGÞ¬Ñ@-ƒ#n`~|¿ÿ.£à?(Sœžú(<‡*¥ßB™pƒ²ü8E$oÊ-̉{öÿzã€,xr2ìnœ8{æÌ5ÌÂ!i MøÓB·ŽŽƒ½V S½«ÛÂ0eî= S°SÖzŸ0m%+¶½äªl ÷¡ûéZ1žÆ|:Þíìvoƒ›hí4|’›Kƒ<ÀµÓG DyeØØ[£‰“ÎZ!ø,ùkü«­í¼Ag¿¿KÐÛzÊ×NLžÈKY›´ë`¡4ôÀoQcó9¼Ý‰­ŸôßéöšSºP96&ï”JøÈOß<ð˜:‡S5…"°?¯lO×`þE½ «Tg¨äS^MH#À¿¦èØ´ÔìlþŽÇÅ3WáôI††¢@rçI¾ÙÙ`ó81|nëå“íÁ6¬+00ö%ß_ã75 f«ÙaÆð+[[ê;š{ººV2‰*£¤zs5ÆôjËœr‚ûÄ¡Ž€+Ç5Pµ|ÿÁäýª;øYø²—g›@¶½Ãï]è†l¸d’è¬-ɦ>–F›ÐtƒMqŠð0ZŸ[ÐZÕºÊâênøøyX~×ZèÔ”¾Ö¤©Š³·lÀê8#4`­c\kÚNVlÚ©EÝ n[7Ÿ[•Q•aȈçÒo9ÔÏÞˆþó·GþI¸”GÊ3ÅâÈ1W›@nä6cýcÑ";•ÚM@;ñs‘UóNts¥Gy‚ð}ijpáâŸéÅAáÌÓ™ê»ø|5Ê,Ù-LfKàŠI¢½zÙè^úš®o ƒ Ì^¸X*f˜©_`6Ô2ÛòÀ {(vVU•µF ÈÑlÙÿ‡ß`µœ¶oÑé&KŸœP~•š\4 ¸{­VlôF]¢1[ŸÏÝçPÃçß± ø2¦FRxŠY©éÑü¶“ÃL~vŠé T:•®ßÿ Ý2à½ÖúÏø¦_8؇…Û›mNÂÙTcrû§Ùis6:\6·ÍuÜSíÄ<¦ +—Š(Û¼>Ôqšþ‚N»Ì}J‚ûŽaÒŸ²î^~|)² ¼¹¹G÷ú¨ö¤!Pz"·³‡ßßèµêfÍä2{\nWC“¹ k5‹ÅDv–DE‚¬Ü£ù~æ„r¤X0VØH*ø% +©¬Ä–ŒN“Y«4éµ:~‰ùbY˜à +£Cù9ËJ!Ï‘Uwû..Çû¡.ã©•²”DUMÛY'¸›ÿcíìFéœøK£m[rùôCŽŒl4 3œ$zÝ\ÑrØOŒýíþH£ªQ5EÓèúÚ帋÷ã7"«" ¼4šD³iã´c7k Rw ÃG¯×V÷«ˆ¢½{2sS‹†Nû}M„ËBî·€z±ÞÕø6äL=º qÆ2ÓÝC³4Û¹š‰ž¿—ý]£X`Àìâ‡Õ­j•ŠT Œ½ŠH~€Ì”¦g’…̃ø \¬‡K ÿƸ:ï3—®tÃÿu7šçuîE‚ÖíÚWž/]Zrï%X±"²†÷?¤Í…ü endstream endobj 96 0 obj <>stream +H‰œWYsÛ8~÷¯à#¸2QÜM¥jrMÍÖQmìÔ,Ñ×å1¨Iüï·/€ %;3§D°Ùúüºû׫\Gð¡ó¨nòè±½úõWïVW¯ß΢µtÙuõúgxÝÚ«×+ýß ˆ«»+]FüÁ£)¢ºÈÒ*Z®®Õ/±ÎT?ÄI­ãZq±‰ uZ­;º¿®þ~•ñÑ=¯ÝñZŽÏùkNÇë"Õ|ü8>Sm'¹Vwp\P¨õÉ2¥ëù9ì:¡<˜‡8©T ¬L! ›œ´K<©Rf?2ÝÁÑ™’cp¬‘Kkõ[œèJu›®ßòç6ÎÕÝMVÔëoêçð°Ç÷̀² ìå{¼D¤ÛEÚÕ•úW.”¿ðWjT,N–ÊQU¯þ¦MtšG«`±É¬;XÉDö N,Õá¿÷Ñ`nA‰}­c]°‘Óõxã>rX [G÷±^®~²L¿‰Œµìtmðk®6š , "ŸZ›’œèêœ]‹°öskñúuœ”jÇœï3sI–ÖD°¾É2:ø÷Ô â¦HófÁ,×*âAÏ£]C1ž‘T¬<ìÀ@[Vãù·¨d‰Ö‹\i“äiU.• !0=‹cû B·Cá xúäÎç§Àl_Å%9 FÍ@ ΂}~ÝL’BÖNØ‚–[ý¬0 Õ·’©Ðsîr¤+ +¶ÖB$§Z𮲋êä69Ùq½³²îƒ¬vËfõŒPföÝÚ+‰Ô9L1• ˆ ¶ ­Šg²b¸SL'Ï#*‹yø@‰}I*V…v±¾@aŽqtèO)\è–b‰W&p'EµAŸ|¢J>]+á¼µ¦¨Ô´2Ú;ˆHoé&¨ž°óî$a½sÅéÀŠá‘Õ¹YL¶ÌÒË´^z×”„‡|V‰-ÍÛ>?˜þÍ›×?­‡“Ù¯ÚïÛO?}ʳ¬yûömôîÃûèJ‘E?þ– Ê´j<þ³ ¥j|ðÀr%@m·=Ž_ÎÔ€²œ6YÅL•ÆAáÌ/ˆ»?B Š=².¬ÖFH‚Wàã¢D[kuèú–¿Ã#wÌáýF×ayæõe¸¤OÓDǸ³üÜ·Öz¡zŸÈ'î¯Ð¨5B*+q^ª€í8ŠÂ× ny5ÆÃ$1Ï£Ëç%ŸÆÔ]õRÙ#?5—#z,]ߢ8 Ïu€K—ÿȉ®uòJb³ÎKÑ™×3Ž™gA._óŽxëFzßqÐîc‚¾„ B¿ :¿D.Cávð6ê«äôc»Î¬¥4g>!Ö²â€-¡™ÍÖÊ™5tžÖcº²8ýý\è$ áVëH½š£h†dhOòÆâš*ìMD³?|\YÍeÚb +ŠrxþyGzÙb\0`Wwdy¤õË(`‰GⶠêL9 ÀÜÒuóæ5†%52ºNË:¨î0w„é×8²´Øõ ô%Ž!—q©Åáî(ìþðò{@q‡¤¹{Rç`Ù˜ÁðÊ—£f>.EZ$™E,U^›ðûžç1?l »ƒl;zz…´³-/‡©K†;’@6í73‘(ÄIAš½¶s>M(PhÓùnŠÉx¨¤¸B¸Ò Üã´üb#ÞñíŸ"®ëÈM1Q·)ÜX‹¬Ó±¶‘–±).#Q‘KæÔ›=ÆE’«P ‡N—ëðˆ£I‰—M²Q„Í:‚ [•Ä-+Åï<Ì| ‚%5oEÉšÂS7‹ÌÒŠ¼H”:³’™…òn 2숺KS7P©nÃyÇÐïöd8Œz? 2|â9˜"Y˛٠}O^-Jqñ¡‘Ñ âTé4ÎÓx eªIe=Ö$Xƒ™@²í™ãéÂÁ¥úW<È8»ëiJÕGêüáíYå8%À9ëçs¸q®»¹¤û¸âÃò@#˦»ãYN ¦–Š]º4 J1ú+§‰Â‹•Ãë–2kdJ e[–FbIÖZÜÝ2õF½û¼¢|3E2y!Ü™â+X_Š+áât¡•H½~;ˆl“²°XL²…»¯Ùƒvç—ðÑÆZ}Ÿô˜½+*<ã±ñ¥VšážAÄV? +R`÷wÃú¹ Õࡼx6J]ŒÁ áÎïû/‘fbx§vÄù²ÒÏF!~òþ—<)œ¼Sç;¦¤ü1NZýøP©ÿüãe~.â¬ÿ¨2zfêë¸g»Ó±ñæ´smü¬,„ ¾yÜƹ+m…ëÿ9ùöwÉ›œ#§L¾9Í&ø€Wx0¦ØËÐqg ëéŒ0âBLvðzËåFkAÐäBŽÛEoý;™nb@Ø° Åþ @Ò­#ŠX¢t“ê&¥˜—èb"(Ãý†ã`q2PV€‚Œ‚ôsQelt½øÊÞ»ndÁÖ¹ÖÅ×óê’.oÔu-üøò3Ρ§¤¦Wr9LZïõ €1®>ªDVb ±„-ÖbìK_ ý~3˜ÓO|ˆx–ÀSÄÔÀÃÀ¯óÑi|¢tξ¦öÜÃB8üηâÏàó¿eóÁ× ö’Y¬Ñ÷³BBTr?<¥¾]â Ê)p‹Q£Qã°2öÚw¹ˆ9N8À;M `&Z^{á<éKf¬”µð,’ OqÇ 6^ÐrÂ1ÖÍœ.À•·0‘¦B"Å]û\vbë)Ë‚pº“Â$$ ôÖ¹Ms‘½¤7(¹ÏJëIÝEØ?RâÈÛ ™dK/‹©nâðX] Çyv½žI-S(<ûã ‹–CY¬u9ì:`ЀÓ"¼}ŠõrDÌ‚bwïvaaðû¹A–“gÕR²I²yÈRº@¬Héiè7¨ôìP MðÆP&ñ–Ùd!¢©J F‹ñ<¯|îç•·O(óìø9­ c“à Í£¥Ô¬’ô–ýå´M‡oCvåIÉ,Pœ—å`ÿñ´¥qf‡¯ïbW4¸³À"N÷\W_ñ„¡ƒÂ“ƒºÛN@ø`CO1wÅùR +ºQ©i””ùÕ4íæHc]cªP%GLÁŒ=Fg‚IƒÈúÚcDb±L(Ð,{¢—€ó4}“#j›>Î1.]ûH³ ÌÈ>˜1úÏ{Ã÷”{åtŒÑ¾bƒÕŽvàH<¶`~äO­™Îœ}±8ЭçÕn¶N(î +õ{b:³ÙðKt—ƒÊá`º€FÍxL-Ct›5ŠE™ÍÂ5Šk@‹M:f8ôˆ»yG˜diVD«õÿ©¯¶·$ú®¯èG é¾_ž±ìlàÝ œhâìƒv.ñÀ#%±f°ùü=ÕݤšEÓv0´Ù쪮®Ë©Slù5#œâô\)µ}j³Gíív»ˆf‘lA³l3ãšæˆi³¶¤Å°—ðS” JSE ¤}eeS€v<v(ö8²Úæ6- +"ߤcbШãÚåõöaK¿‡&+ 2UĨc¶´Åv Ê!©Ù%t¼¯í;ma¤Ö_}•.ûf%1ÚQ3L°šVßfS©Eé´üróŠýk¥AÖîþL+ÔÏwM…5ÃÙ§èV©Ö[ª'ŒÌ˜_ÖÙ»•`$ +y¤IÉ"ƒ 'àćbУ×m¹˜‚»Øíã}ü’¼K[FÜû·¸ã’¢1_.s¤›mÛ¤ì´KÈÇ8¦Q?­/âÚ( 8™ób)“áw·¿på@~ÒB;LľZI‘gƒÞ–ìÀÜJ«lýîãÄšžû1J« ƒ%&uÏv4ÆKí}HA+ +'N~Þï«Ä‚༒œgÑ»}D.):xœ®ú~V"ZŸÌ/¢ìïwWú8âãœvØÿ|K€÷xO¡ý¼lÜЖ´`ŽEŸ! _ŽyPK~M §Ãb>6l]Ée[ñmí»„äåk«LBÚÄñª¼tL™8m9·üEJEܬ†]Ãîm3q]g°K¯Œ§J¤Ið' OáD2?ÄçøEžðHm,…–R¦­MÊá±çȦÜ};ÙE]wé¸rr+f;|ɬ„ö´SÊ¡8q›4mékÞA½ ÊrÑFhˆgQ3<&Uœ7q—#ŠÉÐÐÝî·¸r“>¥®‡íÁ~HÏ.îìiúv•þ:õxWÒrk D®ÓKq»¶S÷Ì(IÕ×G5Ù‡…’Ò‰ÑþôsÛV½õÛ@ὑ*iε²èØ¿·CÊÝ!–À§E»LK‡]JK‘°Eõ÷Å89Ÿ?$׊s3¿iRé§Á-‚Z9Òb9(ð»1'Ž£‰ôÐãçœÆ=Ÿ•íKóZÓE-ØxmbßæöGÂQ:§ ÍEDíÁ¸»#g«.‰iCªÏNÂZ¢à(åCuDóèäO‡' n˜˜-ÐVvMàœ¼.jaüH³Ð¦ 3MÏ=̃Íb^W˜5¦ÉT-™úf kg“4æµ³”ùyx¡‡5³²}"ÖPñ6ä.ÓýÇÚ½âz ‚c-óyx¡×îgeûÄ” +sš‘±[p+c_-Ó +á™âƒ§N ›|×ÒÖtPÜ¿sýòöÝ˧s&Äm&O Î,:27µâ*Åk=/ßpTt}vÂ'í$~=+ÛÇ#ˆYR0‡Ñ!# è“2º6Î%–}1FdÎaŸiw£7 “§• +&—µMÙ}“ãÕçºÔ˜ÛÔ&¤.º„©)UCðŸ]‹LÀrE]Fê‚!ÃÆ÷KÝAÒ›û“pxÕñø•Ëùd9¥¹³ºÂD̶ª–A‡ÔbIÉóÏ3É£e‰0+©ÆÓK6 ¨8¥(µ4“ÓÎÃáâìy£‚Vó/>œ_Rv«gHQœ'|­5E XïÂÀÅ9ÉJ`¨”*Šz5 iRE©àkBÝVPÕ^ê(Fž===H­Çƒ°½öS)ÊŠ$ +¯ÎžT×9 1²OMu™ÑºKõ¤¢œÕ>œDQaîösÖÿÿ eØz6sµýÄó`m®©XTÏx<ýXŸìE£¬Ú'²È7/÷8TÔJ¨vm£@§ ධf'6hIIz›I]<5½Æ; {vöOlHÊ×Ê#l*X¨Häó5{CIÔÅ=áòz±üŽVe­ñÊã¹Æ°ŒÎJ`i o t&—ÐY+{ +³@ea“—CWø’ °ø óí  ØrGî–ˆyÀºñ©¨¼ðz¨s ôok3,Vu<#¼-}–“fÚqCë±q"€1£ö Rݙ霉DÐÍ—ˆhb©æ“÷rb÷GvK}†lHJÔ(ÇYcÎZ8Ø‚½JÒ§©ù û×p žÕúÀpVœVjÇúðÄÖ‡ -x^¶Ÿ´à ©®üh=‘õÃóT8;ÎÕö‰­×añ–F +Uçlì½¹ÇÆÆË‘bÔg¤Å +3Mý؉¸ü6·ß! 3å ýÐãaiÏc%_1 ]1ñb&?»ð-YÁjvY|ˆÞŠžJÜÅ·\…‘†FY¢&]¢ÝERƒE6çÅÙp6$129 «Z(Îöûy$~DÌdÓ•éµ¹‚qºGd¾iztÓLe›-Ù>stream + + + + + application/pdf + + + BSTdesign + + + + + Adobe Illustrator CS3 + 2008-04-27T19:25:19-04:00 + 2008-07-01T15:04:52-04:00 + 2008-07-01T15:04:52-04:00 + + + + 256 + 204 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAzAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FWL6pDNr/mObRJJZIdG0+3inv44XaJ7qa5ZxHCzoQ4ijSIs4UjmWUVoG BVeReTPNel+ZL/ybptvoNhouq6mtyddv9KiNncWjNaS3dibaSNq/v44ebLLzUjYg4Ve2+VtSvb3T ZI9QKtqNhPLZXsiLwR5IWoJVWp4iWMq/Gu1adsCpxirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVYx5r/Mfyx5amjsrmZ73WrigtdEsF+sX0pPTjCpqoP8 z0HviqQaNrHnWy1m88zeYtCXTdE1OOGFrW2ka9vLQW/MpcXKRKVKuJSriKvCi1FOTYVSzS7DyBpM flibRtTg1bWtFW3FxFpiLcXeotbaXLpkQeNJG9CizcuTnitKMR9oBU7/AC280xzXmqaDrNu+lebx dXF9eabOQRJFNIRFLauNpoliVU5DuNwMVZ9irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVSDzZ578r+VIEk1m9WOec8bSxiBlup2OwWGBKyPU7VpTxOKsX/AOQo edDQc/I3ltyNzxk1u4j792is6/7JxirKPKnkTyx5WikGkWgS5uN7u/mZprqdu7TTyFnap3pWngMV T/FXYqxvzr5F0zzTawGSR7DWLB/W0nWragubWUd0bujdHQ7MPoOKpR5R89alHqy+T/Oscdj5qRa2 d1HtaapEo/v7YkAK+3xxHcdRt0VZvPcW8Cc55UiStOTsFFfCpxVUxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2Ksb1SfVNX1yTQtPun0+ys4o5tVv4eJnLTcvTtoCwZUPFOcjkVClQ u7clVYnc2jTeb9R8v6RoX6S/RUNnPe6hqGu6hDIReeoECr6d0W4iA9XHbCrMP8B+WP8AfE3/AEl3 X/VXG1YvaWFn/j1/K17o72Ub2M+o2Gp2ms37SvFBcRQAPGBAYmb16/DI1KU3xVW8s+TdI8oec5S0 X1+fXvUltNdvGae/WaJeUlpJPIWJQxVaPjx2Vg1djgV6FirsVdirsVdirFPzQ0TRdU8magdUtmuD ZRNdWLxOYp4rqNT6LwzDeN+dBy6eO2KsQ806ZN5ePlqzkbTdT1zVzcRal5g8xQPeIgtLGS5f01Ek PpRsYacVNB1IZqklUz8oXb2ukeWPMVna/ovTvMaW8ep6Elfq8E1zGWhuLWM09KsnFWVdmVuRHIVK r0fArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirFr29HlvzJd6jfKV0LVo4TPf0ql pcwAx1nI+xFLHxo5+FWU8j8QxVjGpeS77UfPV55v0zTPL/mO2uYbEafPf3MiyWstmZGLwtFa3a/G ZENQw+yMVeoYqw210nWovOknmzzHLYWNrZ6fNptmsE8jh45riOczTNNHCsbAQKOKlh1+LFVWw1e2 81+YbW60qVbjQdCeV2v0IMdxfPG1uEhb9tIopZC7j4SWWlaGirLcVdirsVdirsVQOvaUmr6LfaY8 hhF5C8ImUVMbOpCuBtUqd8VeXa1e+SfPn1C283XdvZSeXbu9tdXs5kJs7ic20lq/1e6fhHVHcSp1 dSACoNDhVEQeaY01HydoGqXdxdaWLhhF5luLVrSG+vIEItLakhryPMOZdlkdKJ1ICr1fArsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirzLzFcT/mJ5in8n6dIU8paTIB5s1CM0+szKajT YWH3zkdPs7d1WYt5F8ktx5eX9NbiAq8rOA0A2A3TFWD/AJueUvKmk+XtP1210Swhi0fVrC5v1ito YxJaNMLeeN6KOSFZqkHbavbFWdQ+SfJkEiyw6Dp0Uq7q6WkCsPkQlcVYt5k8o6x5d1qbzl5GtxJd Tnl5h8uBhHDqKV3lir8Md0lahv2u/uqyryn5s0bzTo0eq6VIWiYmOeCQcJoJk2khmjO6SIdiD+rF U5xV2KuxV2KsZ/MbzTL5a8p3d9aJ62rTlbPRralTLfXJ9OBAvf4jyI8AcVRHkTyrD5W8qafoiP6s tvHyu7g7mW5lJknlJ/y5GY/LFUV5o8taT5m0K60XVovVs7teLU2ZGG6SI37LowDKfHFWL+QfM2r2 upTeRfNkvqeYtOj9Ww1E7LqdiDRLha/7tT7My+O/Q4qzzFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYqoX19aWFlcX15KIbS1jaa4mb7KRxqWZj8gMVY59e8231jJqrzW/l3S0Rp0iuIGubv0VBb1J/3k ccPw7mMByO7VquKqehza7ruk2ur6V5ngutOvUEttONP48lO1eLyqw+RFcKoHzfPq+maYYdT83/UG 1DlbWzWemtLeM5Ulvq8cTTSFlXeqoadcVUPKFnqPlfylZN5fWHWfLcCFzapazWWo8eR9WVRM7erL yqxjkRGJr8XQYqzyxvbS/sre+s5BNaXUazW8q1o0cihlYV8QcCsF/MrUbfVdC8waNPLFY+XbS2Mf mLW545J/R9RA/pW8ERDPKqMjlq0Wq7OagKoiTWdc8v3z6d+kV8wNp9nHfahp725hvls2dohPDMn7 mVgYX/dFeTU+0NqlWa2t1b3dtDdW0glt50WWGVd1ZHHJWHsQcCvPPPfl278v6n/jjyk4g1qaaC31 PRySttqwlkESIyjZLgF/glpt+18NcVTaC68z3mqvpk+u22n65Hax37aTbWbTwxQTSPGhknlK+t8c TLVDH0+yNsVTXQ9bvpNQuNF1iOKHV7ZFnV4OXoXNs7FRNEH+JSGHGSMk8DTcgglVPMVefeYfN+pL ol35lFxc2Plu1njtrKPTYrabUL15LlbRZQbytvHE0r/CKVK/FyFeOKpD9Yk1PXNP13VLnUbqw8o3 7R6po2qRWkN1ZXVzEggvZPqY9CaKKObkOP2QxfkaUwq9fwKxy9v9a1XWrjSNInGn2mn+mNU1Tgsk vqyoJFt7ZZA0YcRsru7qwAZQFJJKqsS0/SPLvmzWopHi1+8/RFzcpY+Y5p0jgW4gcwzrCYpElT4k KH9yqtTvhVO/M9jpXlzSW1a/1DW3sYZI1upYbyRvRjkcIZ5AXU+nHWrlakDemKu0Sx0jWp9RSw1P WXg06f6q94b2T0ZZVUNIsLByW9MtxY0A5VArQ4qs8y6cdEtluIh5i1KPi7TS2V/CBAsYB5yfXLi3 Wn/BDbfFVPyr5q1NtN0nV7h7q58ua40cdpLqMUMN/aPM3p2/1j6ufRkinbiqMo5AsteXIlQrPMVd irsVdirsVdirsVdirsVdiqR+d7K4vPK19FbxG4lQRzi1UVaZYJVmaEA9TKqFKe+KpH+Ylze+YfIP 1Tyuv19vMjRWUVwjOsKW05/0iSaREkaNPRV0Y8diaUrtiqj+Uun6/osGueXtWsFsobLUHutM+rNJ JZfVb/8A0j0baaSKDmIZWdW+Hb7qqqvm6O80zz1oXmlrC51LSrayvdPuUs4nuZraS5eGRLhYIg0j qwgaNuIJFRirJ08wacNDOt3Rk0+wSNpZTexvbyRopIq8cgV1JpsCK4qhPI9rcW/lizFxAbWSYzXI tG2aBLmZ50hYb0MSSBD8sVYR5ztbq4/L7z95btreS41vldXMVrCjPNcQ3snrQSRooJcAVi+EdUIw qiLKz1Dyx+YOta3r2pXmp6ZD5ftf9y13BBGOaXdwfq0ZtYbeJ33BC0LkuPFcCsz8mWN1YeU9Is7p DHcQ2kKywn/dbcB+6+Uf2R8sVQ3nSVbOLStWmWtjpV+lzfk9EgeGW2MrdfhhadZGPYKT2xVjmp6r +hvzYuNWuLDUbnTbrQLO3hu7Cwu76MypeXMjIWto5QCEdTv4jFWQpeQX/nyD6rWRdK024jvnpT05 L6W2khiau4cpbMzKdwONftDFWSYq8t1LS9S138qG8n2AYeYdGl0yxvIA8aSoLG8gb6yvq/Bxkt4T NGSCGG1Cariqaaz5f03QfK2q6Ha3E2o675uaa3E146Pc3VxcQiBpX4LGvp28K8mCoFVF98VZ9irF 9NvYNG8z6lpd+wgGs3IvdJuJDRJmaGOKW3DUA9VHhLBepRhSvFqKpHpOha+n5hrqtho03l/TpXuT 5gZrqCW01GqkQSw28Ujsk3qUdpGRDSoPInFWT+dbfWrzy9cabo8CS3WpUspJZeBit4J/gmuHRyPU 9OMnigB5NQEUriqW/lp5f1byxpNx5YuYa6XpM7Joeoco63FnKTKokRCCJYWYo5KgNsw6nFUL+aVt 5l1G207R9O0e41TRLyYt5i+qzWsUrWsVGFqv1ma32uH2dlOyAj9rFVTUtUbWrXTvLsNg9hqktxbT 3+myNC72Fna3Ky85mtnmiQyrCFhAetWB/ZairNcVdirsVdirsVdirsVdirsVdirsVeX2trJr/wCZ upxeXrmfR9B0VGj125sXMa3uqzUPp8G5w1gj3kcJy5HiThVPfNGiahpnlnV9StvMGqfWLKyuLiHn LCV5xRM61HpCoquKu8r6JqGp+WdI1K58wap9YvbK3uJuEsIXnLErtQekaCrYqkN7ZvoH5maSvmG5 uNZ0HWgsOi3F+5dLHVYasqcF4Q1uE/u3KcwwoCMVeo4FeZtCfPX5kzS28slvoPk9JbJ760keCa51 K4UerEs8ZVvTtlA5qDQud6jFVbz75G1NNIh1vRby91LX9AuI9SsrW8neaK4EAPO39H4YgzxkhXCc uVN8VZn5Z8w6b5j0Cx1zTX52V/EssRPVa7MjeDIwKsPEYqlf5jeaz5b8tyTW8Iu9Xv3Ww0awO/1i 8uPhiSndRuzf5IOKpf5U/LMaP5csNMm1nUjLDCq3ogu5I4XkO7+ko/uEB2VYuG3viqX+Rnk8o+cN S8iXjFrK/aXWPLN3ISzzRyNW7tnkYkvJBIagklihqemKs18y6/Z+XtAv9bvAzW1hC8zpGCztxGyK BXdmoBirDfI35eLLp8nmDzVCx83a3Kb6+uIZZree1WQARWcc0TxyKkMaqhUGhIxVvzx+XaR6cmve VYX/AMXaLKL+wuJppria5EYIks5JZnkkZJo2ZApagJ+eKsw8seYLLzF5fsNbsgy22oQrMiSAq6E/ aRge6tVTirGvzb1C5/w/D5c062S61nzRN+jbBJo/ViiDKXmupAQRxt4lL/OmKo7Svy08r6fplpYh Lib6rEkRme6uQzlFALsFkAqx3NMNqxnTPLmly/mprukSfWG0210uwuLe2+tXPFZZpZ1kYH1K/EEX v2xVE/mf5Y0jSfy88w6lpwuLe+tLGaW2nW6uSUdVJVhWQjbG1T2w8i+WrjS7ZpoJnM0CGUm7utyy Dl/u3vXG1ST8p0k8vXGreQbyIC60aT61Y3oQKb3T7piYppGUANMjAxyE7kiu++BXouKuxV2KuxV2 KuxV2KuxV2KuxV2KqFnYWNkkiWdtFbJLI00qwosYaVzV3YKBVmPU9Tiq68tLa8tJ7O6jEttcxtDP E3Ro5FKsp+YOKus7S2s7SCztYxFbW0awwRL0WONQqqPkBiq28sLG9REvLaK5SKRZolmRZAssZqjq GBoyncHqMVV8VUrWztLRGjtYI7dHdpHSJVQF3PJ3IUD4mJqT3xVVxVbFDFDGI4UWONfsogCqKmuw GKrJrO0nlhlngjlltmMlvI6qzRuVKlkJFVPFiKjtiqriq1oomkWRkUyICEcgFlDUrQ9q0xVdirsV dirsVdirsVU1trdZ2uFiQTuoR5goDsq1KqW6kCppirc8EE8LwzxrLDICskbgMrA9QQdiMVXqoUBV ACgUAHQDFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVO5ube1t5bm5 lWG3hUyTTSEKiIoqzMx2AAxVIk83zzxfWbLy/ql3ZEco7pUtoQ69eSw3M8FxSnT93v2riqaaPrWn axafWrCQvGrtFKjq0csUqGjxyxuFeN17qwBxVG4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqx3zfFFc3Xl2xuPis7vVFFzEfsyCC0uLqJW8R68EbUP WmKvEPzU0TzTcaz+Y7acsjaFqYI1qdfs250XRrTULevh9YeQxbde+KvYbCSzs/OunpHKkc+r6MXv ISQDJJaSQrbvSu7FJ5Vr1IUdlGFWYYFdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVSW885eXLS7ls2umnuYP8AemK0hmu2h7/vvq6S+ltv8dMVR+l6vperWgu9Nuo7 u2LFPUiYMA6/aRqfZZe6ncYqlXmnz/5R8rhV1nUY4bqWn1exSs11KTsojt4w0jVO32aYqxz/ABB+ aXmj4fL+kp5U0t+mra2vqXrL/NDp8Zoh/wCMz/Riqrbfk7orv+kNZ1PUdZ8xAcrfW7mciS2kB5B7 SFOMEPFhUDgfA1FRiqYnTfOC2l7YzabompLf8lvbyV5bYXQaJYC1zaC3uFcmJFRh61CopsKDFVGf 8q/LWsRSTebbaHW9VmKlrwo0HoLHX04bPg3qQRJU0AfkT8TEnFUCPy+846EOXk/zZcGFKcdI14HU bY0P2FnqlzEtPBmxVr/lYfnHQxx84eULlYUHxatoTfpK2NDuzQ0juYlp4of6Ksl8tee/J/mZSdD1 a3vZBXnbq3CdOOx5wPxlT/ZKMVT3FUDqmvaHpKo+q6jbaesp4xNdTRwhj4KZCtcVVdO1TTNTthda bdw3tsSVE9vIksZI6jkhYVGKonFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqkvnG6v Lfy/MLKU293dS21jDcjdomvbiO19Va7Vj9bkPcYqx/8AMPy7Yaf+WmrnS5bvS20TTb27sX0+7uLR vXjt3kDytA6GYlxyb1OXI7nc4qgNb8uXN+PK89lq95ol1rwjstbubBljnuUSxlukZndXpKrW5USA cuLEVpQYVZN5W/Lzyh5XLy6Tp6Jey73GozFp7uUnqXuJS0hr4VpgVkeKuxV2KuxV2KuxVjnmb8uv JXmZhLrOkwXF0v2L1AYblSOnGeIpKKf62Ksav/KHnfyrZXF/5a83T3VjZxvO+k6+n1+MpGpYql0p juUFBtu2KpV5qnufLWh+W9budYXR9Y8w6nBF5i8wlLZ3jgmtLic28TXcc6RwxvGiooHav2mYlVE+ XbrUG8q2/nm4auoQ3kiSaisS2zano/1swxzXEMYVeRtyJY/h2IFPhYglXqmBXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYqsmmhgieaaRYoowWkkchVUDqSTsBiSkAk0HmHnH8+tA0vna6Cg1a8FQ Z6lbZD/rdZP9jt/lZRPMBydzpexpz3n6R9v7GG2vln82PzFuYr7VLmTTtNDCSCSXlDGncNBAtGYj sx/4LIRE5G3L1E9JggcYFkjpz+f49z0fW9MuNTghsfN3l+81g2gdEu9LufTtbpH419e3FxbN8fAc 45VeMdmOZTzSW695q1vRfNmi6x5p0n9H+UAJLa2mSVZWsLuakaT3wjrGqvGWjQo7KnI1J5bKvTlZ XUMpDKwqrDcEHuMVbxV2KuxV2KuxV2KuxVB61faXYaReXmrSpDpkELveSy/YEQU8q+O3bvirzHy7 fJrXl3y8fMWj6xFp2k3YvNAvktjcm7toopba2N3BAtxNGWgmqwKANs3LcrhVGweVL+90KXy15Ykv dE8vfWDdw3+owjnAVcTRWtlaTLFL6CTKrH1/2aotQfhVV4vzF8weVplsvzG09ba1JCQ+a9PV5NOk J2H1hN5LVz/lVWvQ0wK9Btbu1u7eO5tJkuLaUBopomDo6noVZSQR8sVVcVdirsVdirsVdirsVdir sVdirsVUru7t7O0mu7lxFbW8bSzSHoqICzMaeAGKvPNc8xa7DY6Zq2pyanbx67dJZ6R5f0ZLMXIM sUk8Zuprwr8ZjhJYI6hT8PxfaxVR1zzr5z8p+XV1e6sZ7+zuGMSR6oLaG+tJSxCfWPqBkt5Yn4/C V4sNgSeW0ZkgWHJ0mGOTIISNAsHh0D81vzLlS51OVrLR2PKMzAw24HYxQD4pD4Mf+CzGqU3oTn0u kFR3n8z8T0/Gz1Dyd+UflPy0En9H9Iaku/125AbifGOPdU+f2vfLoYgHTartPLl2vhj3Bm2Wuudi qjfWNnf2c1lewpcWlwjRTwSqGR0YUZWU7EEYq8m09NS8qeW/MVzHrl7F5B0CaddOSCKGbUuEB9Oa 3hmuS8foRTB0TkvPb7QABZVmmor5g8tQNqqajNrGj2w56lZXaRfWI4BvJNbywpEWMY+IxyBuQ2Ug 0BVZUjo6K6MGRgCrA1BB3BBGKt4q7FXYqgNf1dNI0e61FozO0C/urdTRpZXISKJTvQySMqj54q89 8yy+Y7LV9H0+5SbXNc1q3vbmSKLV7rRbK1WyETNFAtqjGSv1igeY12rUA0CqBtNLi823Hk6+1W+v NQ8l6tE13YaNecGIv1iFxFFeSABriJI4pWTlX4l+IsCMKvXwABQbAdBgV2KrZYoponhmRZIpFKSR uAysrChVgdiCMVefXf5Z6loNzJqf5c366PK7GS48v3PKTSbgk1NIh8Vsx/mi29sVVdK8wec/M6Xl pPp8/lp9IrDrAge3uLie5MYkSGxlasSoY3VzJIob4lApuwVS/SNfj1F7D/B+rajcanc2st5Lp+pM s9vEsD+k0F9zPq28jTBo1MTH4lJoyjCr0DQtXg1jSLXU4EaNLlAzQyUDxuDxkiem3KNwVb3GBUdi rsVdirsVdirsVdiq2WWKKNpZXWONAWd2IVQB1JJ6Yq8184fmVoWuaVq/ljypDc+aNVvbWeyb9Fxi W1gaeMxhp7pyluqjl/OcVW+eFvfOnl7y3eaTYXd3NpusxXGs6bZ3UdlfWxitbiKaL1WmtuEkcsqj aQEjcVXFXeZ/NmjaT5b0fS9ahu9LJvrOW8h1GUahPbWlreRzfWLuaGW8/dyPGsYd36t/kmitvTIp YpokmhdZIpFDxyIQysrCoZSNiCMVXYq7FXYq7FXmGu6bqGqflv5q8k2cQfzFEt2lvZs6RmaGe4aW 3mQyFV4OjgFq0DhlrthVPtU83X50K9jvtCutL1K7U2mkWF1LaSveXEyMFSMWk9zRUpWQtTitW6A0 Csn0mx+oaVZ2PLn9Ugig59K+mgWv00xVFYq7FXYqlHmzT72/0G4isAGv4Xhu7NGICvPaTJcxIxPQ O8QUntXFWIajomh/mPreg6slwsumaPDqFrrGmi4ntryK4ufQUQTJAyMOBt3EiOwB22YYqmlvf6Nq XmbStD8vvA9n5UP1i++rspjg5W01nbWqha70kdjT7ISh3IxVmWKuxV2KtSSRxxtJIwSNAWd2NAAN yST0AxSBbznyr+Y/lu680+ZtPsZvrNxdTreaYKrGLtks4bd4IWkKqXDW1RyIqGqNlJyMZiXJyNRp MmEAzFWluh2eqfl9ql95m8wmBbDzNE995g9IxKbPUoyzxQQLVZJ0kik9IBQzF15ftHJOOASaCdfl D520rXtFktlb0tWjnurq7s2IqPrdzJcFo/5kUy8a/f1FYRyCTl6rQ5MIBlyP4pn+TcN2KuxVpmVF LMQqqKsx2AA7nFWC6n51vP0dFrsuo2vl7y3dTRW+nXN1by3VzdNO3GGTgrxrDHJ1UMGPH4mKbgFU ZqPm+78p0k84ywHSZarBrdpFKirIF5ejcW9Z2VmCng6MQx2op48gqVjzx588x/B5O8ttZWbfZ13z DytoiKV5RWaVuJK/sluIxVdF+UkeqyLc+etau/NUynktjJ/ommIwGxWzgIViPGRmxVnVjp9hp9ql pYW0VpaxikdvAixxqP8AJRAAMVQGo+VNB1C9F/PbGO/C8DfWsstrcFB0Vprd4pGUdgWpiq+w8s+X 7CyuLK1sIVtruv1xGUSGfkKH12fk0tRt8ZO22KsBg0nzH5C8yWejeVOGq+XtZMzQeXrqZ4304xqG eaGcpLS0DMoZG3VmHCpNMVTRPOWufUNP1ODU9K1CHU72TTrGzFpe2hmuoTMskC3LST8SptZAHeAK 1O1RirLtE1m11ewW7gV4iGeKe3lAWWGaJikkUigkBkYU2JB6gkEHFUfiqnc3EFtby3NxIsVvAjST SuaKqIOTMxPQADFXmfkrQ4PPN9feftdgc2+ogW/le2LPE9vp0LErOrIUdJblyXJBrxoK0xVM/Of5 YWN9osk+gqYPNVjIl9o+q3EslxOLm3JZI3nuHkk9KTdGUtxoa02xVP8AyN5stvNXlq11eJDBO/KG /s2+3b3UR4TwuOoKOD16ih74qn2KuxV2KsR/MzzLqWkaLDYaIvqeZdenGm6KhrRJZFJe4enRII1a Qn2GKr9C/K/yXpmg2Gkz6VZ6l9Si9Nru8t4ppZXYlpZGaRXNZHZmO/fFUg8+6cvk/VNO8/6NaiOz 01FsPMljbIFEmlu20qooAL2rnmKfs1HTFXpEckcsayRsHjcBkYbggioIxVLPMGttpcECW1ubzUr6 UW+n2Ybh6khUuS70bhHGil3ahoBsCSAVWKP5p1qPWTpLa/ZvrKvHFLZQ6RfTWcUsqhkhlu45Csbs GBq7DqDwpthVgnnfXPzH85eYn8l2+nnTVgKi+to5C8bbBvVkuOKcod+SCgrtUcthi5eImnoOzfy+ LH4sj6h9nu/W9D8m/lJ5X0DSntr21h1W8ulC309zEsiMK14JG4YBAR8z37Utx4xH3uu12vnnPdHo E/sfJvlSxm9e10m1jn4lBKY1ZwrCjKrNUgEdQOuWFwBs8g/Mb8ttQ8pX6ea/J7yQQJKPUt4qmSCS VuC+moqXjctx4UPWm4O2NPEQdnotL2nDJjMM/d8/2sv1Hzl5l0exguPNOoR6JP8AVhcTQ2mj6hqc UagHk1xdQFoVI41ZBTj/ADMKNmSHn51ZrkyTyz5puL6aGx1JIxc3Vqt/pt7ArxwXtqeNZEil/ewu nqJ6kTkleQ+I12WLJcVSzzPYXOoeWtWsLX/eq7sriCDen7yWJkXftucVeZef9L1b8xrfRtO0DT4H 0ZNPurqdr6SW1t4rueJ7KGINFBP/AKRaFpWMdBxIFabVVTe780n/AJV/5VbzKDp2tXt7piXFveAx OJrK8ikupWDgFU4wMwYinxLv8QwEgc2ePHKZqIsvSFZWUMpBUioI3BBwsG8VdirsVdirHWkitvzA BuQAdQ0xYtOc/wA9rNJJcxr/AJTpNG1O4Q+BxV5hoHk/zZb2Pky4nm1F4IPNN5PNokltEsNpE0uo FbkssK3AVuSkNJIV/ebdVxV6f5TZJ9Q8x31uQbG61KkDADjI9vbQ288it3/exNH8098VZFiqG1PT LDVNPudO1CFbmxu42huYH+y6OKMpp44qrQQQwQxwQIsUMShIo0ACqqiiqAOgAxVfiqlb2lpbep9X hjh9aRppvTUJzkf7TtQCrN3JxVVxV2KuxVxUEgkAkGo9j0xV2KuxV2Ksc12eOx82aBf3RC2ckd5p wlanFLm6MEkHIn7PP6s8YPdmC98VYlr36QsPOzXflK31eHV7y9tU1eye0kbRryEmKOa5a4ZfRhkj t12dHDErxKtirLdFmivPOPmC8thytoYbLTpJx9lrm2a5lmVT+1wW6RSf5qr+zirI8VdirH/PPJND S8ILwafeWV7dooJ/cW1zHLK1BufTRTJT/JxVi35kauL/AFfStAuLHUbjytKi6jrF5YWN5ex3Ko1b eyV7WKVeLuPUlr+wAP2sVT+6vbbVPNHlyOzR1ltoZdTuRJG8UsNrPA0EccsbhWjaWSSvBgD+7b+U 4qyrFUh88ebLbyr5au9YlQzzIBFY2a7vcXUp4QQoBuS7kDbtU4qx/wAmflveaboy3N9q19beZ9Rd r3XLq0mHpPdTku6LBKJrbjHXgrCOtB1xVS84/k1pGv2LPHd3P6cQExajdzST8u/pujHiie0arTrT rWvJDiDnaDW/l53Vg8+9gPlPz95r/L7VV8s+Z7Wa4sAwSCNQZJkDHiptiP71GOwQfRQ7ZTjlKJp2 +u02HPjOaBA/HXzel6h5/wBSsHiF7Z6XpbXW9nY6rrEdpfSqTQUhEM0fI9gJjvsSMynmmR6Fr9tq 8M3GKW0vbR/SvrC4AWaCQqGCsFLKwZSCrqxVh0OKpnirsVef/m9fyXFjpvlTS1VvM2vXKrpU2/Oy WE85tQDL8Segn2SCDyNN9xiqdzeTLu5szZXnmXV57Vk4SRh7SBmWlN5re3in+6TfvXFUl/KfUrmy tbzyJqxUaz5UK28bgBBdacwraXSqNt0+B6Vow364qz/FXYq7FXYq7FXYq7FXYq7FXYq7FXYqwf8A NvWJY9Ai8t6fDHda95qkOm6ZbygOihhWe5kU1+C3jq5268cVR9j5C+r2NvZTa/rFzbwxpHIjXZUy FAAzNKoFwOVKkLL8sVSL8vpZPKfmS+/Lu9Ym0/e6p5VuHNTJZSyFp7csT8UlvK567lTXFXo2KuxV JvOHmfT/ACv5bvtbv/jhtYyUgH25pW+GKFNjVpHIUbd8VYt5D8gazZ+Wrc6nq99Yalel7q90+xkS O1tzO5k+rQROkgiWINx/d03GFUEbcfl55+guPWmk8rebzHaXc11NJO9tq0a8YJHllLtwuUHDc/aA 6DAr0/FULfaVpuoNate2sdy1lMt1aGVQxinQELIlfssAx3xVFYq7FWMebLezfXfKk93EjRRak6pK yglZWs5/RBY9FLgU/wAvh3pjSeI1XRi+n6t5Y0Pzx5tj84SwWuoand28mlz3oAS408W0SRRW7ODy Mcyy8kH7RrTfChlgEX/KxCbevq/on/cmR9mn1kfUq+/+9NK4FZHirsVS/wDw/o/6eOvm3B1f6t9S F0WckW/P1PTVSeC1fckCpxVMMVS6Xy/pEuvQa+9uP0vbW8lnFdBmU+hKwdo2UEKw5LUcgaduuKpj irsVdirsVdirsVdirsVdirsVdirsVQkmk6ZJqcOqSWsT6lbxPBBeFAZUikILor9QCVGKovFUFfaJ pN9fWF/d2qTXmlu8thcNXnE8iGNypH8ymhHTFUbirsVQuoaVpuopCl/bR3K200d1biVQ3CeE8o5F r0ZT0OKorFUFrOi6VrenS6bqtst3YzFTLA9aExuHU7EHZlBxVG4q7FXYq7FWCfm7qsv6Cg8saaiz eYvM0os9JjNf3JQiSS9JX4lFoq+oGHRuOKpxDo3na3t1to/MVvNGqhRc3Wn+pddKEl4riCEnw/c/ OuKpH+U+oTFdc0fWfi84aZeka7cEkm6WQVtbpAfsxSQgBEGy0IoMVZ/irsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqTL5T0z/Fr+aZGlm1M2i2ECyMD FBCHMj+ilBxaViObEmtB0xVOcVSw+W9IPmRfMghK6utobAzqzKGgMgk4uoPFuLCq1G1TiqZ4q7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq818yfmZ5k0/zjruhadY WM9toej/AKanuZ5pYyVH+6G4owV2ALA9KYqn+h/mV5YvvLWja5qN3Bo36ahSa3tL2eON6ueNByK8 hyNA1N6jxxVL/wA3fzFTyf5WvLrT72y/xBGIzaabcgyyTerIIwBEkkT9Wry6bHbFWY27340uJ51j bUBAplUkxxmbhVhyo5VeXehoPHFWN/l154uvOHlJdfayisnuXuPqNqZy6vFBIYlkMhjVuLOp34bD FV35bed5fOHlNfMdxax6fBNPOkCLKZVMUEhiEhkZYvtMh/ZGKsqM0Qj9Uuoj/nqOP34qxPRPO95q XnvzD5aksooLXy/HbNJfpOZOcl2OcSMpjjCN6YqRVvnirLmZVUsxAUCpJ2AAxVa0sSoXZ1CA0LEg AEGnX54qhhq+lnUW0wXcJ1FEWR7QOvqqj1CsUrUBqGnjiqKLoG4lhyPRa771/ocVcHQsyhgWWnJQ dxXpXFWhLE0fqB1MdCeYI40HXfFXCWI0o6mq8huPs+PyxVAal5i0XTbjT7a8ukjuNVmFvp0O7PNJ TkeIUHZV3Zug74qj2miV1jZ1WRvsoSAT8hiqWW/mXTL6TVrfS5Bf3ujn0ru3iNKT8C4h5tROfjv8 PfFV+g6peX2hWeo6nZfoq5uI1kmsnlSb0i3RTKlFbanTFUxLoG4lgGpypXeg74q2rKyhlIKkVBG4 IOKoe81Czs7K5vbiVUtbNHluZK1CLEpZyaeAGKpB5G806z5nsl1iXTYrHQr6GO40iT1zJcujs4/f xemqxkqquOLt9rrirJfWi9T0ua+rSvCo5U8adcVYr53/ADG0/wAowyXF1puoX9tbIs1/cWMSSR20 TtxDStI8Q/2K1am5FKYqyayvba9soL22b1La5iSaFwD8SSKGU0O+4OKsX0f8ydN1LzZ/hl9N1Cwv ZbRtQspbyJI47i2VxGXQK7yJuekqKcVZczKqlmICgVJOwAGKsd8oee9D82yar+hvUltdJuvqb3jA CKaQIrsYTUsyryAqQK9qjfFUx0/zFouo3mo2lldJPNpMgh1DjXjFKV5cC5HHkB9oA7d8VR7SxKhd nUIDQsSAAQadfnirbOiU5MF5HitTSpPYYq+fPMP5c+d/MuqedteGkXFlqlxdafc6DbXU0HoXVtp4 4NbTxxzPGRMPi4yKVqO2+KprpnkvzRq/nzV7zzL5cnfR9TOmy2ls1zax2UEFogYQT+nznb0JCSsc a8HfdtqHCqTz+QPzSvraW3vNGWWTUvNq6nrNy9xDynsbc1gUEMeECKlFBBbfZfFV6Xrvl3zHpGhe ZtVttb1TW7uXTr36lo8ogaNJnQtH6KxQxyEqRxUVO3vgV5ToPknUdP0uy8waRp18B5c8p3MbvNDN HPdareQtWCKGRRIY4OR+yvGvSp5HCqFGnecbLQYNHk8uX91Y6H5TL6fYy2zG3GqXTN61xMlGDSRj l6SULDwX4iFU48uaHcRap5f8t+aPLmo3vlu18tRw2GnfVHlhfUriQC6kmp+7hkpy4NK68F3qrHFU Do/l/V186S6rrnl68v8Ayj5g1m9txpItpSYvqaxrplzKlV5IVRlUv8C/E3vir0v89dFv9d8taVol jBcTTalq9lbyvbiQ+jBzLzTyBPhCIqbs4oK4FYN5u8lJH58fysmlXsPk2402R7VLO1mvvWvryX/S pRNK7RRXJQcRLOaIvSla4VYxaeSLbzXfeatN0KwkN9L5gtrKw1aRHYafY6SAss63bhl5OfhCI/Jj 2oK4qy2PyVqMifmN5xj0q6m1621Cc+Ukn9fnzs4DEl3DGxHqli7GMkMKj4cVQek+XLSDyHfas8et 2esatp9ppF1qcGmTD0izepK8lszNdXFZQfrExB5hqJttiqneaf5tt7DyTpV/of6M0a5fULnWIdN0 6a5t3u2JW1eWxjp6ZZSJFjccFc/Evw8QqlOufl5d2MXm6XSdI1b6lpGg2WiaNaSpJLLcz3rK87fu uayegXq4jPANTwxVlV55XnTzz5JhbyzcahY6B5ZYL6tsskbXXEwxxXDueAMYQuFZuQr8I5GmKpJ5 S0jzNq3mf8vr7W9AvjctPfatrurXFswme5YlYFZnA9K3hDJwViNq8V+zyVVNF8u6hB+Rvm64j8sX lv5j1m5uPShS1eK5Zbu5WOOKJY6TGKJAr0K+n4V3xVF63oWrpcW+hXuhXt9o1p5P+peW7D6u0sTa rIBAzTFecccyrvykI4rU7Yqx/Vvy/wDNFrZeZ5rm11DUbzRvLunaDaemlxKt5d3QT1zEaEyJbVp8 Pw1AJ3GKvUfPNl5m0z8jINN8uW92t9b2VlZyxQKzXiWy8I5yioWfn6YPTcCuBWDea/LK2Plj8x9b stNNl5e1SDTtO0DTZIjCZ5l4W/1sQOFZWLyURmXk32vfCr1PU9NvPJf5T3lr5XslOp6bppFtFbR8 me5WIIZeCirvUcvemBXn35a+XtUX8z9Hu7zQry0g07y8ofUbmEiWfULpq3E91M9Pjbi6has4FKhd wpVPPzF85Q6zqU3lGXQtbutDR0XUHtdPuCL+VXBW0jmZUWOHmo9SWu/Rfhq2BWV6i3nDQ7ubWJLy O48rWa1Hl/T9NaW99PgEVI5Fm+Lgx5bR/ZGKsR8veWdcuPzD1jzL5UuLzTtEv9JS3NxrKXcpm1Ey FlkW3vDHP6cMdO6ipIXauKp75j0P8wpPKrW+o65Y3YWczakyafcKs9oqrxtfRglklIZ6+pxNWX4e lcKpf/zjzY61D5MvbnV7f6pcanqN1ey2clvNbzxyzSHmJBNswZAhXiKU2qTgV5np/kjUNQ/LeK0X y5eWGteYvM6fWZxbNC8NnLcF2JC/EIIY4FNXX0xy+GprhVPvN3kpI/Pj+Vk0q9h8m3GmyPapZ2s1 9619eS/6VKJpXaKK5KDiJZzRF6UrXFV0vlW61z8w9U0DzBYaj+hbA6Zb+X4orV5ALO1VXJS/dvQh BkAac19R6cVO1MVe/YFdirsVdirsVdirsVdirsVUb31fqc/pep6vpv6fo+n6vLiaen6v7vlXpz+G vXbFWCfkp/hz/DN1/h39I/o767P6n6U+r+r9a5f6RT0N/t9eX0bYq9BxV2KuxV2KuxV2KuxV2Kux V2KsO82foP8AxTov6b/SH1XnH9UpT9E/XPVH1f6xT4vX9Snp8vhrTvirMcVdirsVdirsVdirsVdi rsVdir//2Q== + + + + + + uuid:D604B9AA2016DD118D05AA6D720C964E + uuid:1f382f0a-0ae0-7240-90c9-052bfa9b93bb + + uuid:29342be3-7e33-de4c-b6a3-50180e31c442 + uuid:A55D623089FEDC11AC15B6426E08541E + + + + Document + + + 1 + False + False + + 15.000000 + 12.000000 + Picas + + + + + LucidaSansTypewriter + Lucida Sans Typewriter + Regular + Type 1 + 001.000 + False + LucidSanTyp; Lucida Sans Typewriter + + + Minion-BoldItalic + Minion + Bold Italic + Type 1 + 001.001 + False + MinioBolIta; Minion + + + + + + Black + Red 2 + + + + + + Default Swatch Group + 0 + + + + White + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Black + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Yellow + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Lime + CMYK + PROCESS + 33.000000 + 0.000000 + 72.999992 + 0.000000 + + + Night Blue + CMYK + PROCESS + 100.000000 + 50.000000 + 0.000000 + 0.000000 + + + Pigeon + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 30.000002 + + + Red + SPOT + 100.000000 + CMYK + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + Red 2 + SPOT + 100.000000 + CMYK + 9.000000 + 82.000000 + 60.000004 + 14.999999 + + + + + + + + + + endstream endobj 91 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 365 0 obj <>stream +H‰|• PSÙÆo€®º†šËÝ’\Í«»ëŽÖWKWíº*VðÓ 5fi-ÙXšíªjŒ¼2Ó20N}1:tçžp&p4 BT\‚âS}¶¶êÚ*Ìé°7v +l<·÷P¨*>V´sNb;,›¤—h8vZên‡í”r3>Ìù¤ `ƒQ`LD¡“[Þ¾©¼¸Ü<,¨}€>âVM¢¾Üiz º•Ë,døŒ#ff%ö]qûÑ݇w¿ÃJ¹™j”ª\§¶]£†ÁnèHlçÓñ ÀÐñt!±+ù@X¢(-)ÙCžäŽ€ÉTg²–›¥ÖâFrò¼t'ÅÄ1r¢™ë²-¾ÉvÐä¸öµ¦€‡ÑUèƒ×T:5•:kF“ ³^Ó«º¬V~ahÄþÔøÕçO„ðskaSÉÅÃŒ‰wyjìb~`?¹yÛ^Këc¥m)7V8ðþaVÓ¿ÉÒð;X€OÓé€iªXÌ+¶8J)ü‚P'x6ü5¿ÔŸÎ8­)Q–a¥*¥)“ôõŒŠ ö8Î k„›;¤£]MgE®æþ‘Ö>¬„«ý5º9Õ]K6=î»vƒbüa¡ŒN’(åØñ¸Ô¬\2Çhsö[¾jž š'šíVÌbµ›¬¤­îTž•*HP,3¤a¼gú˜½W¤èÖ~  h˜oü"½Ž>Là#áÛdk7R…Ü/á1ÚYQP—M–+´›¨ä>ÏÎ"£,Â/úþ´3Óÿ´ªB-ˆ­Lý”ì¹i¹MÍ\Ÿæ 'OtFŠðoÃÁ`a ~,EdÐkó3Èeã7Vªîo%澋Øùö‘.i³¤É(^¶þ°ž¼Âï>>?ÂBB«:JJU­ŸSx÷¤í¾sDÔ[_¦–¬vŽ£ð©Š\{^}f¯=S[#ìoþ$hG‚ô˜È_Ü;›…«=¼ü¨ëö-x,ßá ÄÌ >8,ž|†6—HSÆ©óX:gæè\„¾ø¿eË™÷P|Æ”“S”MîõMˆM](3Ÿ‹OÃÑv[ ËÙ©W4Søl•¾¾ÄbÆ,f»Í)l(Nn’»%‘*ò¨Ò?ãC,›kÊAyb–™TóAÈŸ~ KðYüù =qöqßø$¥kAÕò¸7ûªŒú3°¢cÖü®h2b{xp U#G ½Í•dYQvl.…?fŒh@†Cí"ñ'@¼ÜKN‰J’5¥v_hëêmÓ´H)ÞÌê³j`þ sQ5àƒëèÄ¿ªÔôœ2ÇPa˦tMÚ^m¿¶_×oh±VÕZ•ŽÊvÓù|Ì^è¨Ö+j“Ž„ + +ÉST'åqX!·–´‚ÐBì\婺LÒð¾B»áU°Šç‚%e£™ˆ(&¼ÒèÜú2WÅ媠²¿Üáraø¨m¯3 6;ØКÚF¶÷Uÿ~œâ1³ú%5·ÆaðÊd£üŸy‰}Ü7[ôù{?Õ Yu¬XÖ®kã”î,Ê=µ«èÕ14 úÒË_™Îoðúx±£üjˆbnŵ&ð¨lÁ¾~0Ý@Ú ÔÑs~†1:ÖOû›ŸÎaK°Dò_Ÿt³W ý£#º&…LWåéR¨ÝŽˆ?Öê ô†õTg )ñû©îf3YÎ’2P±ÌF}¨>4+TÀ›ÑÑاÁVö…=qý–«wºu£çé#á“Л«%á™Ê(‘¿Ôo-ã#ÜÚ±0¬€ ¢„YÂp²°B£±0‡ŒOøÖŽO»þ $Ûý˜”“Œ”ª¦i?÷ ûƒ¹÷I½wvø!ÅW÷X÷z÷´÷ø——Ž›­¼s?Üû6ûTsz˜”„èø`’c{Zjprcnl‚hx“i¤•¤“¤‘'ü‘ƒ`ƒL‚j÷¨—«YjŽŠ—“¶´£÷Ô„™‰™ٛз¼ÃÇϧ×Íà]Àûpf…ƒxu”v÷å÷ ö‹w÷÷˜÷føXcF\ROšoŸ¡°¤“‘‹€j„iû:€SST÷¦Ž²—њϨ™É ¯£¨£ž™•”™‡‚–È–‚•‹•’•’”“š¢”™‘¤›žr•ujWN4Z‰œÒ˜µ”…®nSË÷´÷MÉ×ÞÙä¸÷Ú÷8½^¯T©lœg¡§¨¢™¦¦©twØ’ƒ˜ˆž™¸™•—œ¬a£We_{gbZ`„bkLÅrµq½l–xvmqztoeŸ°i€—~x{zsŒsdÏo³ñðâä:”vø¹`¶Ñ÷ °÷²÷ˆŽqs]h~ˆ™«’Â÷›ê‘«³û «÷}™Ðû > endobj 364 0 obj <>stream +H‰$’oL[UÆÏéåž:§ [µ½5Ë–f¹M­àÈ`( MkÜd\Kµåâm¡vÿbÔOvCP3†¡èPF0†!Ž¹‘¹1¢câ1A6%sY?,—l!¾§;uñßç}ÎóüÞ÷Œ2Lc¼ª|Ç ¯l-q•7×ùë½5ÞÆÐöh“ÑüaEK÷%æÀìáŒoewïl³:þÁýðÚ +hÉì½S¶2-Ù[¬6E5¿¯!,¯©[+¯w»7É…õêE®‰†ÂJ0$—5Ö©Z“ªyÃJ}®,ruZ’«•¢µ§ÿçËþì•5Åç7.jJ½Ö¼õJЫ½%«oÈE~ŸP#òjy«*¡\dF¢ÇÑj´¹Ð:”‹Ö£ h#r£|d1D&$ Mè]ô%º€îb+Þãø¦ÉcúÈôÅòE x)«ŽàvvMh·Í‘iðŠ'ÓÜ+.KúDâV+ >-ò ±D/³ÛŸZØ™ä.kWÕKG*í}ªHÚ¶¥‘›×Øùss¼ÿ}áØÑçeóÁ†šæ2·ñÌìù<ù] øZ²Ä(ôQØOñ¢.,ÚXå Ðý”÷Ã~¸BSù$Í7Oa"‚©ݺ@m:ÌC7Ÿ×“>ŸàÝ0á2(»A1p]˜o³¾70~à¬ãÇÓýƒÒÔxûï@ìl'¿X ÁT©¹$–Ë3•æ{7;ô¤Á€u°m¡<‘”\éĤpë‰ë+G§žÍµM‘¬?’Â!3䤊Ä?IÖä° +ñп–Ù¤ßGøªTžø!áÙ,Oä÷,SøÞàÉÐá“2 æáirû\ßÀ˜tfèØÌÏvØÎ bn'¯%z±U'#@b|¹'RФ°ªì{ÖQ¹ä3I¡‡â„ê‚0\&¯x•OŠ°ŒðfHô6ï|äÄHçÙ!ûDà·{Ý;ëb•^œö=OÆcÜôŒ§€/“>stream +H‰¬WmsÛ6þ®_û^C†à›¤ŽÇ7¶·—I;™X~¨nn`Y²˜P”jRuÜ_ûE)içúb‘¸»Ø}öÙÝßG‰ð_¡1ž&âi9úUÔ£ëÙ(ø¯ŸG¯¸‹Åc3z=SÿÅ•Ùj¤rÞÍE’N¢DM31N¦Ñ8³Íè7ù~$rÕ†Õ2s©ë²~ƒ$–ðžÈ‡ð:(d¥A&?‹Y0åS0æ½eügöŽT)£*eU©H&q”áaO"eT} T!·’÷A˜‚Œd…j,[qGòHác€OJ>ÃV!ËEËÏžÄèQ¬Ü‘Qò‹iMóX±¢7AX ¸©Ü¡&j”láo,7°>‘u+¶p-‰›@¥r»Ùê} iàŠ'q·€íT–üÅ‚mDS’(Ërª(³Ð÷!˜ÐU&²´Ç@7JÚÖâ— U².áÀµX4þiJ6è…DÆQ\dß(òU 2)~~'âIže윈û¢÷ˆfQ# Tû,ÓTY +°îº +’DÞ7`ÎuN¥^´,õn§ë‹‹×W‹v¯«ÙòK{qûöö6‰ãôòòR\¿¹#)‚Ù§ÑÛŸàq† ï&¤?)¢´Ó?Ãû­—"ÈЯ,Â{ˆG¥ñ™P@û-†Öâ6[ óG¾¡Åú +1FoåfW!â6ø§nñ<"·îu¥ÁÇJ½´Ø,5iYJÖƒš›WA +Ø!áµÝÌdgʾ/òß_èñ‡`¿/ïuC¯ºæGi€A!:86ØxþòSCÀs.ÛuiR‰û«/d,Ü®Ã+ú1@ “Lãq±4›5¤f.Ÿù…¼·G»X>ßmÿ¯«í¶[ÞÛîŸøaAY„>ÞѶf/ãJ­+£«^=a6éÆx Ž‚th!9öìÞÈÙL”ž„YÖŠ §Íþ ~âDðsG³`&( qhB ý4-D‚¿âõ6˜Â±±üÒ¢‰ôÅwû¹¡} +þzšÚ5ÿ‚ó‚Žå2YÁà hÏw¨Z·Ú¨=í :àA³˜ ›S…­&ÏðQÆù0n öý¸À5Ò± ¨¦÷›ï¾3ø€—wX 4ö8&µÛù`®¼´&inëúî ýþd1ß·C.ƒß®1¶/ô²§ñýpÇËæ”ÝÂfÁÅStÖ”66MÔ ýmdøruBcUaä…tú^¢]Ï=x(Œ½¬À@6K~ì±Gσxbm<„Jy¥a¨ÄÍãt|@t„²ÅœPï6Œ”Gþát‚-FµY®ySkyel›CìDlL5, æzµ¯I%ÎùÆ”êÔÖË,Cµ—‘t·”;<h©ù—Z‹•¥emôÊs¾ŠÏù—:'¶Î‰=Ò_â7ûIŽå?·(ÒñÄZþƒƒÏxh]¦§Ý»jÔ< ¤Ðú/–у—¤H» ÇäÜÎql7Pý© ÂÖN;³ç5kÒ–5ÿÔÔ&ñseh‰ßˆÑá÷g5AqXÉÄ^·êhþRó3°@slˆ—D,y,ÍM†˜õ¤L!欮[çŒ.º½&ÀùîˆÿÕûÃâZ·ø»Yšr +A£ —úê@¥â°¨SAQGy¦zY¦˜Ö  |`CLÚ(Ù`?på…!¨+üÔ ¶-þŸðÍ@Îr .y sGY7^ ýz(8`Õ²i8¥„üeȵÝbBØ7Ðäï9úÚa|–aߥɆ³vß¾¨WöšÚ+Øâ›cœÓó͈/.»r /ÐDué–³5?žêùp/ Swþ©[ ³³Š +%YblP4â:) ˆè² ÐèžÐ÷çcWYcŸáø·0ŠÜ"æ^ƒn«hA-éÔ+ ˆãBâÿµ ncOZñiØßÝZÙÁ–áŽÂõîE—çÅ1‚ ¢¤ÂUa#Ux£×¸˜”Ç뢳¨íšþ’äêæû#ˆÁ´5æ]háÎ/öÔûUç ž#3PÅvr +c˜•`tùq~qq0.F,u“^G¯&Ò Kf.XãÆÓ‰»Mtƒe8Tc •BdAyÕ܈zípGÒhÅŸ<½ØÏï±{aIô×kèpl a~TGš%+6-­2]÷†z ítjt9U¤I6ÝyÞñsMŒÝÔ0T,–R§ßQU¦¾a&'œÉIÅã g;¤ñašÿF_•ugÁ@ØTô„çQVœ—ýÈY‹c¤I±®s3-  ²êÂBN”[Û›m鈫RPï£<+|ÏáL”7ao·ƒŸ]7ô¦"žùhC?°®!i»rqÐ6†¶Ó…‡Foø»£¸ÀÚJ7Ž®Ígµyàð +=¬ØæEQbU[³oX. •I„^7ø£ ¢ÉGá»ÛéúââõÕ¢Ýëj¶üÒ^ܾ½½ã«øòòR\¿¹#P +BÞþ^´Ó(™æg¢J;™Puü +4ÔÅdÒùÐ&×¾2Ý$CÔ¾8Ù‰ -¥iH´àæN.¿Kë.~ CWºæ°û&õ o5Øâv«lN©qUÞÊ5ôÀs0E €K`Ìåø'ÏT¸öþ )…ǹ_ +á½ÆbL(U¶ ¥wÕÇæí{µ>šäÖTV,pe¤A×FïœC5W.»x"ËÕAßÞ±[b2èOî@Pm¼Éë`\MŠ¯Œ1Iq|9QØ»c”ŽðüŒôÏ:vÄÉŸÞ’«GƒPëoóÎ|"X—eìúÎÄÕž7yÑó$]Žá˜Ø È2ùÊÝz«>t³.˜8Ô½ü‹vè‡w í®G œÜ %NX>J©î;ØfŸ¦OVµü•á‚\6k7RÂö߃¼× ˜†ýr$ØLþ€ ¦A ]Ù,<àœ-. ïXF>Îwh¾Í%jÑ’Xrä¾a,œ¼3žA”–ó8û•%(?&¶„x-áÛ‰Úþ×¾’[Ð!›hÑ%9¼$y¯Æ§“(g'hŸ EhÎ8¢;vÓÇ#ä•8ú†PBÙÃ)Ô4«}%Û,W]`š³ÝÏ·:æ~ªˆ&ÅÙëáBj¾i‡£x’Òó$)‚þLŒß€ºˆ ~Yä–;TÐÃ~ÃY·'çx(\#¬]¢@ÆjÓpË Ì¤ièÇ^­­¸3õѹÆÈ(µ3¨8Òb4½(±$¬;¸@Zdv­ti ³E û +ÅeÅ#ª:Ù@ÑÉlо²nºkÔË᲌ÌÉÈÉå­ôÛIEâ;ÃÚ‚‹*á.ž°ÁYñxZ½åžÄ±W8ŽÉ¹ðsºå'7à ²“HDVÝZ +†½cÆ…Åó” :*\žË÷ï?^Ÿ8‚­n¬½¬9¸H ‘ßoL9Šÿ£¾jzÛ‚è_1ÇXŠÀãk£¨·J©zÈ ƒk“bÔt±¢üû¾ùX 6Ê!=õ» »³³oÞ›ÁìQlÜZ¤AlljHpa +ŸWV›¡–;‹ß? h¿“ª¶ªÑ1¹ŽµƒÍk-s…¬¿©ü¶íþT»©ØN⃆B¦Y¨l¢}Ðgr_,®R_ò„J”Ö°ÔG­¯ìÄ6©e¶,]ï$!­$'^à÷ÉuT¶(¨Þ¨ܨuž|,°ª}ÉŸ>J“:ç÷YÜ5µÒîÌà»æHçƒ ¬Í©Öç{²†üè;»:3àš»Õ@ ôž„aœÖøÂ}FÄâå"Icµy¾qLÑ;f°fW +wöuNÔ/B²Kº¹íUß– +y:^$Iæ—˜í¯ËEž-:¸¥«Bªÿk/7ªñ]r—‹A«$“׋èºN˜¥Ñí¹G5~™hd­mUÔìtprÂn§F‡C}`S}lÏä{*|mŽ/£>M»O¼ƒÇõóˆ™0vïx@Õ´6iæÏpÝMÀÓ€•GÐom5áýï!ÃèTÉ‚sÙòT…$¢ë³Ç°Gž~-–¡mÁêsŽÂ…ÃäÝrr¼îÍ»ÔÔÛÂ>$½Àý=dîSkM͇§à1x®BJW eË„þì‚ÔãyD÷9>P~ÿ-Âã‚»¯˜Þ»àÈà¿€eÑ’Ê£¬rDÂùÐiœÈ8]ndÒ|½‰Í@^ÕÆfÙÌÏRÊG2Àl&ã9(S<Õ/Þˆ_Õ,ÇÉ"u>4çÿ§ƒ¿ _ / endstream endobj 65 0 obj <> endobj 66 0 obj <> endobj 363 0 obj <>stream +H‰\ÝjÄ …ï}Š¹Ü½XL, +([ +¹èMûF'©Ð¨LÌEÞ¾£»l¡*Ã9ßpyîŸúà3ÈwŠvÀ “ŽpY„gD«Ày›¯]½íb’ ûšqéÃ…Ö ?X\3ípxtqÄ£oä|˜áðuŽ ‡-¥\0dh ëÀáă^Lz5 ‚¬Ø©w¬û¼Ÿ˜ùs|î AÕ¾½„±ÑᚌE2aF¡®ô3W'0¸ººPãd¿ ýpÏ^Õ´w]!U!ëSÈ«§Ìà¯Â- Ýˆ8[ÝG Uâø€·•¥˜€©rįZÒqä endstream endobj 362 0 obj <>stream +H‰bd`ab`dd”õ õ +÷pÓöÍÌËÌÏÓ NÍÍLÊÏIñ,IÌÉL)Pþ!ÍøCŠ¥ž‡é·Òï¾_ß~žd•e`˜r˜÷{*ÿ÷ Áõß;…@Êêó *‹2Ó3J4’5 -- t@¤‘‚cJ~RªBpeqIjn±‚g^r~QA~QbIjŠž‚‚cNŽBHW±BPjqjQPâ…Ìb…D…’¢Ä”ÔÜÄ¢l…ü4|&1A>##‹Ì÷4¾ß#Ž3öý˜Â<ëûÑzÖlÓ³òÕÌú)7ëwõôïnsÏw³}ožô§f:»ÜçJñÿ<œ;¹>q÷ðð–½dï endstream endobj 349 0 obj <> endobj xref 0 407 0000000003 65535 f +0000000016 00000 n +0000024323 00000 n +0000000004 00001 f +0000000005 00000 f +0000000006 00001 f +0000000008 00001 f +0000024445 00000 n +0000000009 00001 f +0000000010 00001 f +0000000011 00001 f +0000000013 00001 f +0000138717 00000 n +0000000014 00001 f +0000000015 00001 f +0000000016 00001 f +0000000017 00001 f +0000000018 00001 f +0000000019 00001 f +0000000020 00001 f +0000000021 00001 f +0000000022 00001 f +0000000023 00001 f +0000000024 00001 f +0000000025 00001 f +0000000026 00001 f +0000000027 00001 f +0000000028 00001 f +0000000029 00001 f +0000000030 00001 f +0000000031 00001 f +0000000032 00001 f +0000000033 00001 f +0000000034 00001 f +0000000035 00001 f +0000000036 00001 f +0000000037 00001 f +0000000038 00001 f +0000000039 00001 f +0000000040 00001 f +0000000041 00001 f +0000000042 00001 f +0000000043 00001 f +0000000044 00001 f +0000000045 00001 f +0000000046 00001 f +0000000047 00001 f +0000000048 00001 f +0000000049 00001 f +0000000050 00001 f +0000000051 00001 f +0000000056 00001 f +0000165105 00000 n +0000182194 00000 n +0000164536 00000 n +0000187269 00000 n +0000000069 00001 f +0000165533 00000 n +0000174804 00000 n +0000195546 00000 n +0000561297 00000 n +0000573423 00000 n +0000573753 00000 n +0000573905 00000 n +0000574158 00000 n +0000810366 00000 n +0000810553 00000 n +0000195732 00000 n +0000138828 00000 n +0000000072 00001 f +0000806794 00000 n +0000024831 00000 n +0000000073 00001 f +0000000074 00001 f +0000000075 00001 f +0000000076 00001 f +0000000077 00001 f +0000000078 00001 f +0000000079 00001 f +0000000080 00001 f +0000000081 00001 f +0000000082 00001 f +0000000083 00001 f +0000000084 00001 f +0000000085 00001 f +0000000086 00001 f +0000000087 00001 f +0000000088 00001 f +0000000090 00001 f +0000773703 00000 n +0000000095 00001 f +0000801823 00000 n +0000805497 00000 n +0000802129 00000 n +0000802501 00000 n +0000000098 00001 f +0000767969 00000 n +0000025269 00000 n +0000000099 00001 f +0000000100 00001 f +0000000101 00001 f +0000000102 00001 f +0000000103 00001 f +0000000104 00001 f +0000000105 00001 f +0000000106 00001 f +0000000107 00001 f +0000000108 00001 f +0000000109 00001 f +0000000110 00001 f +0000000111 00001 f +0000000112 00001 f +0000000114 00001 f +0000712938 00000 n +0000000115 00001 f +0000000117 00001 f +0000687704 00000 n +0000000118 00001 f +0000000120 00001 f +0000668808 00000 n +0000000149 00001 f +0000600704 00000 n +0000610492 00000 n +0000740694 00000 n +0000751689 00000 n +0000741054 00000 n +0000748677 00000 n +0000741428 00000 n +0000748008 00000 n +0000741591 00000 n +0000747339 00000 n +0000741764 00000 n +0000744803 00000 n +0000742175 00000 n +0000742535 00000 n +0000738446 00000 n +0000765751 00000 n +0000738806 00000 n +0000765082 00000 n +0000738969 00000 n +0000764413 00000 n +0000739142 00000 n +0000761898 00000 n +0000739551 00000 n +0000759549 00000 n +0000739954 00000 n +0000756329 00000 n +0000740328 00000 n +0000753876 00000 n +0000000152 00001 f +0000660788 00000 n +0000025924 00000 n +0000000153 00001 f +0000000154 00001 f +0000000155 00001 f +0000000156 00001 f +0000000157 00001 f +0000000158 00001 f +0000000159 00001 f +0000000160 00001 f +0000000161 00001 f +0000000162 00001 f +0000000163 00001 f +0000000164 00001 f +0000000165 00001 f +0000000166 00001 f +0000000167 00001 f +0000000169 00001 f +0000626397 00000 n +0000000174 00001 f +0000655168 00000 n +0000658571 00000 n +0000655392 00000 n +0000655762 00000 n +0000000175 00001 f +0000000176 00001 f +0000000177 00001 f +0000000178 00001 f +0000000181 00001 f +0000620083 00000 n +0000026380 00000 n +0000000182 00001 f +0000000183 00001 f +0000000184 00001 f +0000000185 00001 f +0000000186 00001 f +0000000187 00001 f +0000000188 00001 f +0000000189 00001 f +0000000190 00001 f +0000000191 00001 f +0000000192 00001 f +0000000193 00001 f +0000000194 00001 f +0000000195 00001 f +0000000196 00001 f +0000000197 00001 f +0000000198 00001 f +0000000201 00001 f +0000601179 00000 n +0000605916 00000 n +0000000202 00001 f +0000000203 00001 f +0000000204 00001 f +0000000205 00001 f +0000000206 00001 f +0000000207 00001 f +0000000208 00001 f +0000000209 00001 f +0000000210 00001 f +0000000211 00001 f +0000000212 00001 f +0000000213 00001 f +0000000214 00001 f +0000000217 00001 f +0000618700 00000 n +0000026747 00000 n +0000000218 00001 f +0000000219 00001 f +0000000220 00001 f +0000000221 00001 f +0000000222 00001 f +0000000225 00001 f +0000614894 00000 n +0000027138 00000 n +0000000226 00001 f +0000000227 00001 f +0000000228 00001 f +0000000229 00001 f +0000000230 00001 f +0000000231 00001 f +0000000232 00001 f +0000000234 00001 f +0000577031 00000 n +0000000239 00001 f +0000601603 00000 n +0000603822 00000 n +0000601988 00000 n +0000602286 00000 n +0000000242 00001 f +0000574643 00000 n +0000027559 00000 n +0000000243 00001 f +0000000244 00001 f +0000000245 00001 f +0000000246 00001 f +0000000247 00001 f +0000000248 00001 f +0000000249 00001 f +0000000250 00001 f +0000000251 00001 f +0000000252 00001 f +0000000253 00001 f +0000000254 00001 f +0000000255 00001 f +0000000256 00001 f +0000000257 00001 f +0000000258 00001 f +0000000259 00001 f +0000000260 00001 f +0000000261 00001 f +0000000262 00001 f +0000000263 00001 f +0000000265 00001 f +0000526140 00000 n +0000000275 00001 f +0000561434 00000 n +0000572191 00000 n +0000572519 00000 n +0000572671 00000 n +0000572938 00000 n +0000561577 00000 n +0000568747 00000 n +0000561965 00000 n +0000565693 00000 n +0000000278 00001 f +0000562352 00000 n +0000562732 00000 n +0000000279 00001 f +0000000280 00001 f +0000000281 00001 f +0000000282 00001 f +0000000285 00001 f +0000506173 00000 n +0000028028 00000 n +0000000286 00001 f +0000000287 00001 f +0000000288 00001 f +0000000289 00001 f +0000000290 00001 f +0000000291 00001 f +0000000293 00001 f +0000457874 00000 n +0000000294 00001 f +0000000296 00001 f +0000427865 00000 n +0000000297 00001 f +0000000299 00001 f +0000396945 00000 n +0000000318 00001 f +0000483761 00000 n +0000499707 00000 n +0000484137 00000 n +0000496507 00000 n +0000484511 00000 n +0000494748 00000 n +0000484862 00000 n +0000492252 00000 n +0000485230 00000 n +0000491204 00000 n +0000485420 00000 n +0000488660 00000 n +0000485794 00000 n +0000486160 00000 n +0000483197 00000 n +0000505250 00000 n +0000483381 00000 n +0000502543 00000 n +0000000319 00001 f +0000000320 00001 f +0000000323 00001 f +0000195845 00000 n +0000028602 00000 n +0000000324 00001 f +0000000325 00001 f +0000000326 00001 f +0000000327 00001 f +0000000328 00001 f +0000000329 00001 f +0000000330 00001 f +0000000331 00001 f +0000000332 00001 f +0000000334 00001 f +0000138941 00000 n +0000000343 00001 f +0000166058 00000 n +0000172891 00000 n +0000166317 00000 n +0000169587 00000 n +0000166697 00000 n +0000168701 00000 n +0000166875 00000 n +0000167231 00000 n +0000000344 00001 f +0000000345 00001 f +0000000346 00001 f +0000000000 00001 f +0000029059 00000 n +0000000131 00000 n +0000811464 00000 n +0000182946 00000 n +0000188174 00000 n +0000175626 00000 n +0000565948 00000 n +0000183030 00000 n +0000182451 00000 n +0000574227 00000 n +0000573448 00000 n +0000188267 00000 n +0000187523 00000 n +0000175713 00000 n +0000175059 00000 n +0000811123 00000 n +0000810816 00000 n +0000805769 00000 n +0000802761 00000 n +0000611297 00000 n +0000610763 00000 n +0000751950 00000 n +0000748933 00000 n +0000748261 00000 n +0000747616 00000 n +0000745076 00000 n +0000742796 00000 n +0000766007 00000 n +0000765335 00000 n +0000764690 00000 n +0000762171 00000 n +0000759822 00000 n +0000756585 00000 n +0000754137 00000 n +0000658827 00000 n +0000656023 00000 n +0000606630 00000 n +0000606182 00000 n +0000604095 00000 n +0000602542 00000 n +0000573008 00000 n +0000572218 00000 n +0000569008 00000 n +0000566035 00000 n +0000562988 00000 n +0000499968 00000 n +0000496763 00000 n +0000495003 00000 n +0000492513 00000 n +0000491459 00000 n +0000488916 00000 n +0000486421 00000 n +0000505505 00000 n +0000502799 00000 n +0000173505 00000 n +0000173154 00000 n +0000169848 00000 n +0000168956 00000 n +0000167487 00000 n +0000000175 00000 n +trailer <]>> startxref 811639 %%EOF \ No newline at end of file diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java new file mode 100644 index 000000000..55ac177f8 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java @@ -0,0 +1,475 @@ +public class RedBlackBST, Value> +{ + private static final int BST = 0; + private static final int TD234 = 1; + private static final int BU23 = 2; + private static final boolean RED = true; + private static final boolean BLACK = false; + + private Node root; // root of the BST + private int k; // ordinal for drawing + private final int species; // species kind of tree for insert + private int heightBLACK; // black height of tree + + RedBlackBST(int species) + { this.species = species; } + + private class Node + { + Key key; // key + Value value; // associated data + Node left, right; // left and right subtrees + boolean color; // color of parent link + private int N; // number of nodes in tree rooted here + private int height; // height of tree rooted here + private double xc, yc; // for drawing + + Node(Key key, Value value) + { + this.key = key; + this.value = value; + this.color = RED; + this.N = 1; + this.height = 1; + } + } + + public int size() + { return size(root); } + + private int size(Node x) + { + if (x == null) return 0; + else return x.N; + } + + public int rootRank() + { + if (root == null) return 0; + else return size(root.left); + } + + public int height() + { return height(root); } + + public int heightB() + { return heightBLACK; } + + private int height(Node x) + { + if (x == null) return 0; + else return x.height; + } + + public boolean contains(Key key) + { return (get(key) != null); } + + public Value get(Key key) + { return get(root, key); } + + private Value get(Node x, Key key) + { + if (x == null) return null; + if (eq (key, x.key)) return x.value; + if (less(key, x.key)) return get(x.left, key); + else return get(x.right, key); + } + + public Key min() + { + if (root == null) return null; + else return min(root); + } + + private Key min(Node x) + { + if (x.left == null) return x.key; + else return min(x.left); + } + + public Key max() + { + if (root == null) return null; + else return max(root); + } + + private Key max(Node x) + { + if (x.right == null) return x.key; + else return max(x.right); + } + + public void put(Key key, Value value) + { + root = insert(root, key, value); + if (isRed(root)) heightBLACK++; + root.color = BLACK; + } + + private Node insert(Node h, Key key, Value value) + { + if (h == null) + return new Node(key, value); + + if (species == TD234) + if (isRed(h.left) && isRed(h.right)) + colorFlip(h); + + if (eq(key, h.key)) + h.value = value; + else if (less(key, h.key)) + h.left = insert(h.left, key, value); + else + h.right = insert(h.right, key, value); + + if (species == BST) return setN(h); + + if (isRed(h.right)) + h = rotateLeft(h); + + if (isRed(h.left) && isRed(h.left.left)) + h = rotateRight(h); + + if (species == BU23) + if (isRed(h.left) && isRed(h.right)) + colorFlip(h); + + return setN(h); + } + + public void deleteMin() + { + root = deleteMin(root); + root.color = BLACK; + } + + private Node deleteMin(Node h) + { + if (h.left == null) + return null; + + if (!isRed(h.left) && !isRed(h.left.left)) + h = moveRedLeft(h); + + h.left = deleteMin(h.left); + + return fixUp(h); + } + + public void deleteMax() + { + root = deleteMax(root); + root.color = BLACK; + } + + private Node deleteMax(Node h) + { + // if (h.right == null) + // { + // if (h.left != null) + // h.left.color = BLACK; + // return h.left; + // } + + if (isRed(h.left)) + h = rotateRight(h); + + if (h.right == null) + return null; + + if (!isRed(h.right) && !isRed(h.right.left)) + h = moveRedRight(h); + + h.right = deleteMax(h.right); + + return fixUp(h); + } + + public void delete(Key key) + { + root = delete(root, key); + root.color = BLACK; + } + + private Node delete(Node h, Key key) + { + if (less(key, h.key)) + { + if (!isRed(h.left) && !isRed(h.left.left)) + h = moveRedLeft(h); + h.left = delete(h.left, key); + } + else + { + if (isRed(h.left)) + h = rotateRight(h); + if (eq(key, h.key) && (h.right == null)) + return null; + if (!isRed(h.right) && !isRed(h.right.left)) + h = moveRedRight(h); + if (eq(key, h.key)) + { + h.value = get(h.right, min(h.right)); + h.key = min(h.right); + h.right = deleteMin(h.right); + } + else h.right = delete(h.right, key); + } + + return fixUp(h); + } + +// Helper methods + + private boolean less(Key a, Key b) { return a.compareTo(b) < 0; } + private boolean eq (Key a, Key b) { return a.compareTo(b) == 0; } + + private boolean isRed(Node x) + { + if (x == null) return false; + return (x.color == RED); + } + + private void colorFlip(Node h) + { + h.color = !h.color; + h.left.color = !h.left.color; + h.right.color = !h.right.color; + } + + private Node rotateLeft(Node h) + { // Make a right-leaning 3-node lean to the left. + Node x = h.right; + h.right = x.left; + x.left = setN(h); + x.color = x.left.color; + x.left.color = RED; + return setN(x); + } + + private Node rotateRight(Node h) + { // Make a left-leaning 3-node lean to the right. + Node x = h.left; + h.left = x.right; + x.right = setN(h); + x.color = x.right.color; + x.right.color = RED; + return setN(x); + } + + private Node moveRedLeft(Node h) + { // Assuming that h is red and both h.left and h.left.left + // are black, make h.left or one of its children red. + colorFlip(h); + if (isRed(h.right.left)) + { + h.right = rotateRight(h.right); + h = rotateLeft(h); + colorFlip(h); + } + return h; + } + + private Node moveRedRight(Node h) + { // Assuming that h is red and both h.right and h.right.left + // are black, make h.right or one of its children red. + colorFlip(h); + if (isRed(h.left.left)) + { + h = rotateRight(h); + colorFlip(h); + } + return h; + } + + private Node fixUp(Node h) + { + if (isRed(h.right)) + h = rotateLeft(h); + + if (isRed(h.left) && isRed(h.left.left)) + h = rotateRight(h); + + if (isRed(h.left) && isRed(h.right)) + colorFlip(h); + + return setN(h); + } + + private Node setN(Node h) + { + h.N = size(h.left) + size(h.right) + 1; + if (height(h.left) > height(h.right)) h.height = height(h.left) + 1; + else h.height = height(h.right) + 1; + return h; + } + + public String toString() + { + if (root == null) return ""; + else return heightB() + " " + toString(root); + } + + public String toString(Node x) + { + String s = "("; + if (x.left == null) s += "("; else s += toString(x.left); + if (isRed(x)) s += "*"; + if (x.right == null) s += ")"; else s += toString(x.right); + return s + ")"; + } + +// Methods for tree drawing + + public void draw(double y, double lineWidth, double nodeSize) + { + k = 0; + setcoords(root, y); + StdDraw.setPenColor(StdDraw.BLACK); + StdDraw.setPenRadius(lineWidth); + drawlines(root); + StdDraw.setPenColor(StdDraw.WHITE); + drawnodes(root, nodeSize); + } + + public void setcoords(Node x, double d) + { + if (x == null) return; + setcoords(x.left, d-.04); + x.xc = (0.5 + k++)/size(); x.yc = d - .04; + setcoords(x.right, d-.04); + } + + public void drawlines(Node x) + { + if (x == null) return; + drawlines(x.left); + if (x.left != null) + { + if (x.left.color == RED) StdDraw.setPenColor(StdDraw.RED); + else StdDraw.setPenColor(StdDraw.BLACK); + StdDraw.line(x.xc, x.yc, x.left.xc, x.left.yc); + } + if (x.right != null) + { + if (x.right.color == RED) StdDraw.setPenColor(StdDraw.RED); + else StdDraw.setPenColor(StdDraw.BLACK); + StdDraw.line(x.xc, x.yc, x.right.xc, x.right.yc); + } + drawlines(x.right); + } + + public void drawnodes(Node x, double nodeSize) + { + if (x == null) return; + drawnodes(x.left, nodeSize); + StdDraw.filledCircle(x.xc, x.yc, nodeSize); + drawnodes(x.right, nodeSize); + } + + public void mark(Key key) + { + StdDraw.setPenColor(StdDraw.BLACK); + marknodes(key, root); + } + + public void marknodes(Key key, Node x) + { + if (x == null) return; + marknodes(key, x.left); + if (eq(key, x.key)) + StdDraw.filledCircle(x.xc, x.yc, .004); + marknodes(key, x.right); + } + + public int ipl() + { return ipl(root); } + + public int ipl(Node x) + { + if (x == null) return 0; + return size(x) - 1 + ipl(x.left) + ipl(x.right); + } + + public int sizeRed() + { return sizeRed(root); } + + public int sizeRed(Node x) + { + if (x == null) return 0; + if (isRed(x)) return 1 + sizeRed(x.left) + sizeRed(x.right); + else return sizeRed(x.left) + sizeRed(x.right); + } + +// Integrity checks + + public boolean check() + { // Is this tree a red-black tree? + return isBST() && is234() && isBalanced(); + } + + private boolean isBST() + { // Is this tree a BST? + return isBST(root, min(), max()); + } + + private boolean isBST(Node x, Key min, Key max) + { // Are all the values in the BST rooted at x between min and max, + // and does the same property hold for both subtrees? + if (x == null) return true; + if (less(x.key, min) || less(max, x.key)) return false; + return isBST(x.left, min, x.key) && isBST(x.right, x.key, max); + } + + private boolean is234() { return is234(root); } + private boolean is234(Node x) + { // Does the tree have no red right links, and at most two (left) + // red links in a row on any path? + if (x == null) return true; + if (isRed(x.right)) return false; + if (isRed(x)) + if (isRed(x.left)) + if (isRed(x.left.left)) return false; + return is234(x.left) && is234(x.right); + } + + private boolean isBalanced() + { // Do all paths from root to leaf have same number of black edges? + int black = 0; // number of black links on path from root to min + Node x = root; + while (x != null) + { + if (!isRed(x)) black++; + x = x.left; + } + return isBalanced(root, black); + } + + private boolean isBalanced(Node x, int black) + { // Does every path from the root to a leaf have the given number + // of black links? + if (x == null && black == 0) return true; + else if (x == null && black != 0) return false; + if (!isRed(x)) black--; + return isBalanced(x.left, black) && isBalanced(x.right, black); + } + + + public static void main(String[] args) + { + StdDraw.setPenRadius(.0025); + int species = Integer.parseInt(args[0]); + RedBlackBST st; + st = new RedBlackBST(species); + int[] a = { 3, 1, 4, 2, 5, 9, 6, 8, 7 }; + for (int i = 0; i < a.length; i++) + st.put(a[i], i); + StdOut.println(st); + StdDraw.clear(StdDraw.LIGHT_GRAY); + st.draw(.95, .0025, .008); + StdOut.println(st.min() + " " + st.max() + " " + st.check()); + StdOut.println(st.ipl()); + StdOut.println(st.heightB()); + } + +} diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf new file mode 100644 index 000000000..07861abed Binary files /dev/null and b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf differ diff --git a/vendor/github.com/petar/GoLLRB/example/ex1.go b/vendor/github.com/petar/GoLLRB/example/ex1.go new file mode 100644 index 000000000..6ebe4a686 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/example/ex1.go @@ -0,0 +1,26 @@ +package main + +import ( + "fmt" + "github.com/petar/GoLLRB/llrb" +) + +func lessInt(a, b interface{}) bool { return a.(int) < b.(int) } + +func main() { + tree := llrb.New(lessInt) + tree.ReplaceOrInsert(1) + tree.ReplaceOrInsert(2) + tree.ReplaceOrInsert(3) + tree.ReplaceOrInsert(4) + tree.DeleteMin() + tree.Delete(4) + c := tree.IterAscend() + for { + u := <-c + if u == nil { + break + } + fmt.Printf("%d\n", int(u.(int))) + } +} diff --git a/vendor/github.com/petar/GoLLRB/llrb/avgvar.go b/vendor/github.com/petar/GoLLRB/llrb/avgvar.go new file mode 100644 index 000000000..2d7e2a326 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/llrb/avgvar.go @@ -0,0 +1,39 @@ +// Copyright 2010 Petar Maymounkov. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package llrb + +import "math" + +// avgVar maintains the average and variance of a stream of numbers +// in a space-efficient manner. +type avgVar struct { + count int64 + sum, sumsq float64 +} + +func (av *avgVar) Init() { + av.count = 0 + av.sum = 0.0 + av.sumsq = 0.0 +} + +func (av *avgVar) Add(sample float64) { + av.count++ + av.sum += sample + av.sumsq += sample * sample +} + +func (av *avgVar) GetCount() int64 { return av.count } + +func (av *avgVar) GetAvg() float64 { return av.sum / float64(av.count) } + +func (av *avgVar) GetTotal() float64 { return av.sum } + +func (av *avgVar) GetVar() float64 { + a := av.GetAvg() + return av.sumsq/float64(av.count) - a*a +} + +func (av *avgVar) GetStdDev() float64 { return math.Sqrt(av.GetVar()) } diff --git a/vendor/github.com/petar/GoLLRB/llrb/iterator.go b/vendor/github.com/petar/GoLLRB/llrb/iterator.go new file mode 100644 index 000000000..ee7b27f44 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/llrb/iterator.go @@ -0,0 +1,93 @@ +package llrb + +type ItemIterator func(i Item) bool + +//func (t *Tree) Ascend(iterator ItemIterator) { +// t.AscendGreaterOrEqual(Inf(-1), iterator) +//} + +func (t *LLRB) AscendRange(greaterOrEqual, lessThan Item, iterator ItemIterator) { + t.ascendRange(t.root, greaterOrEqual, lessThan, iterator) +} + +func (t *LLRB) ascendRange(h *Node, inf, sup Item, iterator ItemIterator) bool { + if h == nil { + return true + } + if !less(h.Item, sup) { + return t.ascendRange(h.Left, inf, sup, iterator) + } + if less(h.Item, inf) { + return t.ascendRange(h.Right, inf, sup, iterator) + } + + if !t.ascendRange(h.Left, inf, sup, iterator) { + return false + } + if !iterator(h.Item) { + return false + } + return t.ascendRange(h.Right, inf, sup, iterator) +} + +// AscendGreaterOrEqual will call iterator once for each element greater or equal to +// pivot in ascending order. It will stop whenever the iterator returns false. +func (t *LLRB) AscendGreaterOrEqual(pivot Item, iterator ItemIterator) { + t.ascendGreaterOrEqual(t.root, pivot, iterator) +} + +func (t *LLRB) ascendGreaterOrEqual(h *Node, pivot Item, iterator ItemIterator) bool { + if h == nil { + return true + } + if !less(h.Item, pivot) { + if !t.ascendGreaterOrEqual(h.Left, pivot, iterator) { + return false + } + if !iterator(h.Item) { + return false + } + } + return t.ascendGreaterOrEqual(h.Right, pivot, iterator) +} + +func (t *LLRB) AscendLessThan(pivot Item, iterator ItemIterator) { + t.ascendLessThan(t.root, pivot, iterator) +} + +func (t *LLRB) ascendLessThan(h *Node, pivot Item, iterator ItemIterator) bool { + if h == nil { + return true + } + if !t.ascendLessThan(h.Left, pivot, iterator) { + return false + } + if !iterator(h.Item) { + return false + } + if less(h.Item, pivot) { + return t.ascendLessThan(h.Left, pivot, iterator) + } + return true +} + +// DescendLessOrEqual will call iterator once for each element less than the +// pivot in descending order. It will stop whenever the iterator returns false. +func (t *LLRB) DescendLessOrEqual(pivot Item, iterator ItemIterator) { + t.descendLessOrEqual(t.root, pivot, iterator) +} + +func (t *LLRB) descendLessOrEqual(h *Node, pivot Item, iterator ItemIterator) bool { + if h == nil { + return true + } + if less(h.Item, pivot) || !less(pivot, h.Item) { + if !t.descendLessOrEqual(h.Right, pivot, iterator) { + return false + } + if !iterator(h.Item) { + return false + } + } + return t.descendLessOrEqual(h.Left, pivot, iterator) +} diff --git a/vendor/github.com/petar/GoLLRB/llrb/iterator_test.go b/vendor/github.com/petar/GoLLRB/llrb/iterator_test.go new file mode 100644 index 000000000..db5e12c92 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/llrb/iterator_test.go @@ -0,0 +1,76 @@ +package llrb + +import ( + "reflect" + "testing" +) + +func TestAscendGreaterOrEqual(t *testing.T) { + tree := New() + tree.InsertNoReplace(Int(4)) + tree.InsertNoReplace(Int(6)) + tree.InsertNoReplace(Int(1)) + tree.InsertNoReplace(Int(3)) + var ary []Item + tree.AscendGreaterOrEqual(Int(-1), func(i Item) bool { + ary = append(ary, i) + return true + }) + expected := []Item{Int(1), Int(3), Int(4), Int(6)} + if !reflect.DeepEqual(ary, expected) { + t.Errorf("expected %v but got %v", expected, ary) + } + ary = nil + tree.AscendGreaterOrEqual(Int(3), func(i Item) bool { + ary = append(ary, i) + return true + }) + expected = []Item{Int(3), Int(4), Int(6)} + if !reflect.DeepEqual(ary, expected) { + t.Errorf("expected %v but got %v", expected, ary) + } + ary = nil + tree.AscendGreaterOrEqual(Int(2), func(i Item) bool { + ary = append(ary, i) + return true + }) + expected = []Item{Int(3), Int(4), Int(6)} + if !reflect.DeepEqual(ary, expected) { + t.Errorf("expected %v but got %v", expected, ary) + } +} + +func TestDescendLessOrEqual(t *testing.T) { + tree := New() + tree.InsertNoReplace(Int(4)) + tree.InsertNoReplace(Int(6)) + tree.InsertNoReplace(Int(1)) + tree.InsertNoReplace(Int(3)) + var ary []Item + tree.DescendLessOrEqual(Int(10), func(i Item) bool { + ary = append(ary, i) + return true + }) + expected := []Item{Int(6), Int(4), Int(3), Int(1)} + if !reflect.DeepEqual(ary, expected) { + t.Errorf("expected %v but got %v", expected, ary) + } + ary = nil + tree.DescendLessOrEqual(Int(4), func(i Item) bool { + ary = append(ary, i) + return true + }) + expected = []Item{Int(4), Int(3), Int(1)} + if !reflect.DeepEqual(ary, expected) { + t.Errorf("expected %v but got %v", expected, ary) + } + ary = nil + tree.DescendLessOrEqual(Int(5), func(i Item) bool { + ary = append(ary, i) + return true + }) + expected = []Item{Int(4), Int(3), Int(1)} + if !reflect.DeepEqual(ary, expected) { + t.Errorf("expected %v but got %v", expected, ary) + } +} diff --git a/vendor/github.com/petar/GoLLRB/llrb/llrb-stats.go b/vendor/github.com/petar/GoLLRB/llrb/llrb-stats.go new file mode 100644 index 000000000..47126a3be --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/llrb/llrb-stats.go @@ -0,0 +1,46 @@ +// Copyright 2010 Petar Maymounkov. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package llrb + +// GetHeight() returns an item in the tree with key @key, and it's height in the tree +func (t *LLRB) GetHeight(key Item) (result Item, depth int) { + return t.getHeight(t.root, key) +} + +func (t *LLRB) getHeight(h *Node, item Item) (Item, int) { + if h == nil { + return nil, 0 + } + if less(item, h.Item) { + result, depth := t.getHeight(h.Left, item) + return result, depth + 1 + } + if less(h.Item, item) { + result, depth := t.getHeight(h.Right, item) + return result, depth + 1 + } + return h.Item, 0 +} + +// HeightStats() returns the average and standard deviation of the height +// of elements in the tree +func (t *LLRB) HeightStats() (avg, stddev float64) { + av := &avgVar{} + heightStats(t.root, 0, av) + return av.GetAvg(), av.GetStdDev() +} + +func heightStats(h *Node, d int, av *avgVar) { + if h == nil { + return + } + av.Add(float64(d)) + if h.Left != nil { + heightStats(h.Left, d+1, av) + } + if h.Right != nil { + heightStats(h.Right, d+1, av) + } +} diff --git a/vendor/github.com/petar/GoLLRB/llrb/llrb.go b/vendor/github.com/petar/GoLLRB/llrb/llrb.go new file mode 100644 index 000000000..81373fbfd --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/llrb/llrb.go @@ -0,0 +1,456 @@ +// Copyright 2010 Petar Maymounkov. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// A Left-Leaning Red-Black (LLRB) implementation of 2-3 balanced binary search trees, +// based on the following work: +// +// http://www.cs.princeton.edu/~rs/talks/LLRB/08Penn.pdf +// http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf +// http://www.cs.princeton.edu/~rs/talks/LLRB/Java/RedBlackBST.java +// +// 2-3 trees (and the run-time equivalent 2-3-4 trees) are the de facto standard BST +// algoritms found in implementations of Python, Java, and other libraries. The LLRB +// implementation of 2-3 trees is a recent improvement on the traditional implementation, +// observed and documented by Robert Sedgewick. +// +package llrb + +// Tree is a Left-Leaning Red-Black (LLRB) implementation of 2-3 trees +type LLRB struct { + count int + root *Node +} + +type Node struct { + Item + Left, Right *Node // Pointers to left and right child nodes + Black bool // If set, the color of the link (incoming from the parent) is black + // In the LLRB, new nodes are always red, hence the zero-value for node +} + +type Item interface { + Less(than Item) bool +} + +// +func less(x, y Item) bool { + if x == pinf { + return false + } + if x == ninf { + return true + } + return x.Less(y) +} + +// Inf returns an Item that is "bigger than" any other item, if sign is positive. +// Otherwise it returns an Item that is "smaller than" any other item. +func Inf(sign int) Item { + if sign == 0 { + panic("sign") + } + if sign > 0 { + return pinf + } + return ninf +} + +var ( + ninf = nInf{} + pinf = pInf{} +) + +type nInf struct{} + +func (nInf) Less(Item) bool { + return true +} + +type pInf struct{} + +func (pInf) Less(Item) bool { + return false +} + +// New() allocates a new tree +func New() *LLRB { + return &LLRB{} +} + +// SetRoot sets the root node of the tree. +// It is intended to be used by functions that deserialize the tree. +func (t *LLRB) SetRoot(r *Node) { + t.root = r +} + +// Root returns the root node of the tree. +// It is intended to be used by functions that serialize the tree. +func (t *LLRB) Root() *Node { + return t.root +} + +// Len returns the number of nodes in the tree. +func (t *LLRB) Len() int { return t.count } + +// Has returns true if the tree contains an element whose order is the same as that of key. +func (t *LLRB) Has(key Item) bool { + return t.Get(key) != nil +} + +// Get retrieves an element from the tree whose order is the same as that of key. +func (t *LLRB) Get(key Item) Item { + h := t.root + for h != nil { + switch { + case less(key, h.Item): + h = h.Left + case less(h.Item, key): + h = h.Right + default: + return h.Item + } + } + return nil +} + +// Min returns the minimum element in the tree. +func (t *LLRB) Min() Item { + h := t.root + if h == nil { + return nil + } + for h.Left != nil { + h = h.Left + } + return h.Item +} + +// Max returns the maximum element in the tree. +func (t *LLRB) Max() Item { + h := t.root + if h == nil { + return nil + } + for h.Right != nil { + h = h.Right + } + return h.Item +} + +func (t *LLRB) ReplaceOrInsertBulk(items ...Item) { + for _, i := range items { + t.ReplaceOrInsert(i) + } +} + +func (t *LLRB) InsertNoReplaceBulk(items ...Item) { + for _, i := range items { + t.InsertNoReplace(i) + } +} + +// ReplaceOrInsert inserts item into the tree. If an existing +// element has the same order, it is removed from the tree and returned. +func (t *LLRB) ReplaceOrInsert(item Item) Item { + if item == nil { + panic("inserting nil item") + } + var replaced Item + t.root, replaced = t.replaceOrInsert(t.root, item) + t.root.Black = true + if replaced == nil { + t.count++ + } + return replaced +} + +func (t *LLRB) replaceOrInsert(h *Node, item Item) (*Node, Item) { + if h == nil { + return newNode(item), nil + } + + h = walkDownRot23(h) + + var replaced Item + if less(item, h.Item) { // BUG + h.Left, replaced = t.replaceOrInsert(h.Left, item) + } else if less(h.Item, item) { + h.Right, replaced = t.replaceOrInsert(h.Right, item) + } else { + replaced, h.Item = h.Item, item + } + + h = walkUpRot23(h) + + return h, replaced +} + +// InsertNoReplace inserts item into the tree. If an existing +// element has the same order, both elements remain in the tree. +func (t *LLRB) InsertNoReplace(item Item) { + if item == nil { + panic("inserting nil item") + } + t.root = t.insertNoReplace(t.root, item) + t.root.Black = true + t.count++ +} + +func (t *LLRB) insertNoReplace(h *Node, item Item) *Node { + if h == nil { + return newNode(item) + } + + h = walkDownRot23(h) + + if less(item, h.Item) { + h.Left = t.insertNoReplace(h.Left, item) + } else { + h.Right = t.insertNoReplace(h.Right, item) + } + + return walkUpRot23(h) +} + +// Rotation driver routines for 2-3 algorithm + +func walkDownRot23(h *Node) *Node { return h } + +func walkUpRot23(h *Node) *Node { + if isRed(h.Right) && !isRed(h.Left) { + h = rotateLeft(h) + } + + if isRed(h.Left) && isRed(h.Left.Left) { + h = rotateRight(h) + } + + if isRed(h.Left) && isRed(h.Right) { + flip(h) + } + + return h +} + +// Rotation driver routines for 2-3-4 algorithm + +func walkDownRot234(h *Node) *Node { + if isRed(h.Left) && isRed(h.Right) { + flip(h) + } + + return h +} + +func walkUpRot234(h *Node) *Node { + if isRed(h.Right) && !isRed(h.Left) { + h = rotateLeft(h) + } + + if isRed(h.Left) && isRed(h.Left.Left) { + h = rotateRight(h) + } + + return h +} + +// DeleteMin deletes the minimum element in the tree and returns the +// deleted item or nil otherwise. +func (t *LLRB) DeleteMin() Item { + var deleted Item + t.root, deleted = deleteMin(t.root) + if t.root != nil { + t.root.Black = true + } + if deleted != nil { + t.count-- + } + return deleted +} + +// deleteMin code for LLRB 2-3 trees +func deleteMin(h *Node) (*Node, Item) { + if h == nil { + return nil, nil + } + if h.Left == nil { + return nil, h.Item + } + + if !isRed(h.Left) && !isRed(h.Left.Left) { + h = moveRedLeft(h) + } + + var deleted Item + h.Left, deleted = deleteMin(h.Left) + + return fixUp(h), deleted +} + +// DeleteMax deletes the maximum element in the tree and returns +// the deleted item or nil otherwise +func (t *LLRB) DeleteMax() Item { + var deleted Item + t.root, deleted = deleteMax(t.root) + if t.root != nil { + t.root.Black = true + } + if deleted != nil { + t.count-- + } + return deleted +} + +func deleteMax(h *Node) (*Node, Item) { + if h == nil { + return nil, nil + } + if isRed(h.Left) { + h = rotateRight(h) + } + if h.Right == nil { + return nil, h.Item + } + if !isRed(h.Right) && !isRed(h.Right.Left) { + h = moveRedRight(h) + } + var deleted Item + h.Right, deleted = deleteMax(h.Right) + + return fixUp(h), deleted +} + +// Delete deletes an item from the tree whose key equals key. +// The deleted item is return, otherwise nil is returned. +func (t *LLRB) Delete(key Item) Item { + var deleted Item + t.root, deleted = t.delete(t.root, key) + if t.root != nil { + t.root.Black = true + } + if deleted != nil { + t.count-- + } + return deleted +} + +func (t *LLRB) delete(h *Node, item Item) (*Node, Item) { + var deleted Item + if h == nil { + return nil, nil + } + if less(item, h.Item) { + if h.Left == nil { // item not present. Nothing to delete + return h, nil + } + if !isRed(h.Left) && !isRed(h.Left.Left) { + h = moveRedLeft(h) + } + h.Left, deleted = t.delete(h.Left, item) + } else { + if isRed(h.Left) { + h = rotateRight(h) + } + // If @item equals @h.Item and no right children at @h + if !less(h.Item, item) && h.Right == nil { + return nil, h.Item + } + // PETAR: Added 'h.Right != nil' below + if h.Right != nil && !isRed(h.Right) && !isRed(h.Right.Left) { + h = moveRedRight(h) + } + // If @item equals @h.Item, and (from above) 'h.Right != nil' + if !less(h.Item, item) { + var subDeleted Item + h.Right, subDeleted = deleteMin(h.Right) + if subDeleted == nil { + panic("logic") + } + deleted, h.Item = h.Item, subDeleted + } else { // Else, @item is bigger than @h.Item + h.Right, deleted = t.delete(h.Right, item) + } + } + + return fixUp(h), deleted +} + +// Internal node manipulation routines + +func newNode(item Item) *Node { return &Node{Item: item} } + +func isRed(h *Node) bool { + if h == nil { + return false + } + return !h.Black +} + +func rotateLeft(h *Node) *Node { + x := h.Right + if x.Black { + panic("rotating a black link") + } + h.Right = x.Left + x.Left = h + x.Black = h.Black + h.Black = false + return x +} + +func rotateRight(h *Node) *Node { + x := h.Left + if x.Black { + panic("rotating a black link") + } + h.Left = x.Right + x.Right = h + x.Black = h.Black + h.Black = false + return x +} + +// REQUIRE: Left and Right children must be present +func flip(h *Node) { + h.Black = !h.Black + h.Left.Black = !h.Left.Black + h.Right.Black = !h.Right.Black +} + +// REQUIRE: Left and Right children must be present +func moveRedLeft(h *Node) *Node { + flip(h) + if isRed(h.Right.Left) { + h.Right = rotateRight(h.Right) + h = rotateLeft(h) + flip(h) + } + return h +} + +// REQUIRE: Left and Right children must be present +func moveRedRight(h *Node) *Node { + flip(h) + if isRed(h.Left.Left) { + h = rotateRight(h) + flip(h) + } + return h +} + +func fixUp(h *Node) *Node { + if isRed(h.Right) { + h = rotateLeft(h) + } + + if isRed(h.Left) && isRed(h.Left.Left) { + h = rotateRight(h) + } + + if isRed(h.Left) && isRed(h.Right) { + flip(h) + } + + return h +} diff --git a/vendor/github.com/petar/GoLLRB/llrb/llrb_test.go b/vendor/github.com/petar/GoLLRB/llrb/llrb_test.go new file mode 100644 index 000000000..b7bc97800 --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/llrb/llrb_test.go @@ -0,0 +1,239 @@ +// Copyright 2010 Petar Maymounkov. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package llrb + +import ( + "math" + "math/rand" + "testing" +) + +func TestCases(t *testing.T) { + tree := New() + tree.ReplaceOrInsert(Int(1)) + tree.ReplaceOrInsert(Int(1)) + if tree.Len() != 1 { + t.Errorf("expecting len 1") + } + if !tree.Has(Int(1)) { + t.Errorf("expecting to find key=1") + } + + tree.Delete(Int(1)) + if tree.Len() != 0 { + t.Errorf("expecting len 0") + } + if tree.Has(Int(1)) { + t.Errorf("not expecting to find key=1") + } + + tree.Delete(Int(1)) + if tree.Len() != 0 { + t.Errorf("expecting len 0") + } + if tree.Has(Int(1)) { + t.Errorf("not expecting to find key=1") + } +} + +func TestReverseInsertOrder(t *testing.T) { + tree := New() + n := 100 + for i := 0; i < n; i++ { + tree.ReplaceOrInsert(Int(n - i)) + } + i := 0 + tree.AscendGreaterOrEqual(Int(0), func(item Item) bool { + i++ + if item.(Int) != Int(i) { + t.Errorf("bad order: got %d, expect %d", item.(Int), i) + } + return true + }) +} + +func TestRange(t *testing.T) { + tree := New() + order := []String{ + "ab", "aba", "abc", "a", "aa", "aaa", "b", "a-", "a!", + } + for _, i := range order { + tree.ReplaceOrInsert(i) + } + k := 0 + tree.AscendRange(String("ab"), String("ac"), func(item Item) bool { + if k > 3 { + t.Fatalf("returned more items than expected") + } + i1 := order[k] + i2 := item.(String) + if i1 != i2 { + t.Errorf("expecting %s, got %s", i1, i2) + } + k++ + return true + }) +} + +func TestRandomInsertOrder(t *testing.T) { + tree := New() + n := 1000 + perm := rand.Perm(n) + for i := 0; i < n; i++ { + tree.ReplaceOrInsert(Int(perm[i])) + } + j := 0 + tree.AscendGreaterOrEqual(Int(0), func(item Item) bool { + if item.(Int) != Int(j) { + t.Fatalf("bad order") + } + j++ + return true + }) +} + +func TestRandomReplace(t *testing.T) { + tree := New() + n := 100 + perm := rand.Perm(n) + for i := 0; i < n; i++ { + tree.ReplaceOrInsert(Int(perm[i])) + } + perm = rand.Perm(n) + for i := 0; i < n; i++ { + if replaced := tree.ReplaceOrInsert(Int(perm[i])); replaced == nil || replaced.(Int) != Int(perm[i]) { + t.Errorf("error replacing") + } + } +} + +func TestRandomInsertSequentialDelete(t *testing.T) { + tree := New() + n := 1000 + perm := rand.Perm(n) + for i := 0; i < n; i++ { + tree.ReplaceOrInsert(Int(perm[i])) + } + for i := 0; i < n; i++ { + tree.Delete(Int(i)) + } +} + +func TestRandomInsertDeleteNonExistent(t *testing.T) { + tree := New() + n := 100 + perm := rand.Perm(n) + for i := 0; i < n; i++ { + tree.ReplaceOrInsert(Int(perm[i])) + } + if tree.Delete(Int(200)) != nil { + t.Errorf("deleted non-existent item") + } + if tree.Delete(Int(-2)) != nil { + t.Errorf("deleted non-existent item") + } + for i := 0; i < n; i++ { + if u := tree.Delete(Int(i)); u == nil || u.(Int) != Int(i) { + t.Errorf("delete failed") + } + } + if tree.Delete(Int(200)) != nil { + t.Errorf("deleted non-existent item") + } + if tree.Delete(Int(-2)) != nil { + t.Errorf("deleted non-existent item") + } +} + +func TestRandomInsertPartialDeleteOrder(t *testing.T) { + tree := New() + n := 100 + perm := rand.Perm(n) + for i := 0; i < n; i++ { + tree.ReplaceOrInsert(Int(perm[i])) + } + for i := 1; i < n-1; i++ { + tree.Delete(Int(i)) + } + j := 0 + tree.AscendGreaterOrEqual(Int(0), func(item Item) bool { + switch j { + case 0: + if item.(Int) != Int(0) { + t.Errorf("expecting 0") + } + case 1: + if item.(Int) != Int(n-1) { + t.Errorf("expecting %d", n-1) + } + } + j++ + return true + }) +} + +func TestRandomInsertStats(t *testing.T) { + tree := New() + n := 100000 + perm := rand.Perm(n) + for i := 0; i < n; i++ { + tree.ReplaceOrInsert(Int(perm[i])) + } + avg, _ := tree.HeightStats() + expAvg := math.Log2(float64(n)) - 1.5 + if math.Abs(avg-expAvg) >= 2.0 { + t.Errorf("too much deviation from expected average height") + } +} + +func BenchmarkInsert(b *testing.B) { + tree := New() + for i := 0; i < b.N; i++ { + tree.ReplaceOrInsert(Int(b.N - i)) + } +} + +func BenchmarkDelete(b *testing.B) { + b.StopTimer() + tree := New() + for i := 0; i < b.N; i++ { + tree.ReplaceOrInsert(Int(b.N - i)) + } + b.StartTimer() + for i := 0; i < b.N; i++ { + tree.Delete(Int(i)) + } +} + +func BenchmarkDeleteMin(b *testing.B) { + b.StopTimer() + tree := New() + for i := 0; i < b.N; i++ { + tree.ReplaceOrInsert(Int(b.N - i)) + } + b.StartTimer() + for i := 0; i < b.N; i++ { + tree.DeleteMin() + } +} + +func TestInsertNoReplace(t *testing.T) { + tree := New() + n := 1000 + for q := 0; q < 2; q++ { + perm := rand.Perm(n) + for i := 0; i < n; i++ { + tree.InsertNoReplace(Int(perm[i])) + } + } + j := 0 + tree.AscendGreaterOrEqual(Int(0), func(item Item) bool { + if item.(Int) != Int(j/2) { + t.Fatalf("bad order") + } + j++ + return true + }) +} diff --git a/vendor/github.com/petar/GoLLRB/llrb/util.go b/vendor/github.com/petar/GoLLRB/llrb/util.go new file mode 100644 index 000000000..63dbdb2df --- /dev/null +++ b/vendor/github.com/petar/GoLLRB/llrb/util.go @@ -0,0 +1,17 @@ +// Copyright 2010 Petar Maymounkov. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package llrb + +type Int int + +func (x Int) Less(than Item) bool { + return x < than.(Int) +} + +type String string + +func (x String) Less(than Item) bool { + return x < than.(String) +} diff --git a/vendor/github.com/peterbourgon/diskv/LICENSE b/vendor/github.com/peterbourgon/diskv/LICENSE new file mode 100644 index 000000000..41ce7f16e --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-2012 Peter Bourgon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/peterbourgon/diskv/README.md b/vendor/github.com/peterbourgon/diskv/README.md new file mode 100644 index 000000000..3474739ed --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/README.md @@ -0,0 +1,141 @@ +# What is diskv? + +Diskv (disk-vee) is a simple, persistent key-value store written in the Go +language. It starts with an incredibly simple API for storing arbitrary data on +a filesystem by key, and builds several layers of performance-enhancing +abstraction on top. The end result is a conceptually simple, but highly +performant, disk-backed storage system. + +[![Build Status][1]][2] + +[1]: https://drone.io/github.com/peterbourgon/diskv/status.png +[2]: https://drone.io/github.com/peterbourgon/diskv/latest + + +# Installing + +Install [Go 1][3], either [from source][4] or [with a prepackaged binary][5]. +Then, + +```bash +$ go get github.com/peterbourgon/diskv +``` + +[3]: http://golang.org +[4]: http://golang.org/doc/install/source +[5]: http://golang.org/doc/install + + +# Usage + +```go +package main + +import ( + "fmt" + "github.com/peterbourgon/diskv" +) + +func main() { + // Simplest transform function: put all the data files into the base dir. + flatTransform := func(s string) []string { return []string{} } + + // Initialize a new diskv store, rooted at "my-data-dir", with a 1MB cache. + d := diskv.New(diskv.Options{ + BasePath: "my-data-dir", + Transform: flatTransform, + CacheSizeMax: 1024 * 1024, + }) + + // Write three bytes to the key "alpha". + key := "alpha" + d.Write(key, []byte{'1', '2', '3'}) + + // Read the value back out of the store. + value, _ := d.Read(key) + fmt.Printf("%v\n", value) + + // Erase the key+value from the store (and the disk). + d.Erase(key) +} +``` + +More complex examples can be found in the "examples" subdirectory. + + +# Theory + +## Basic idea + +At its core, diskv is a map of a key (`string`) to arbitrary data (`[]byte`). +The data is written to a single file on disk, with the same name as the key. +The key determines where that file will be stored, via a user-provided +`TransformFunc`, which takes a key and returns a slice (`[]string`) +corresponding to a path list where the key file will be stored. The simplest +TransformFunc, + +```go +func SimpleTransform (key string) []string { + return []string{} +} +``` + +will place all keys in the same, base directory. The design is inspired by +[Redis diskstore][6]; a TransformFunc which emulates the default diskstore +behavior is available in the content-addressable-storage example. + +[6]: http://groups.google.com/group/redis-db/browse_thread/thread/d444bc786689bde9?pli=1 + +**Note** that your TransformFunc should ensure that one valid key doesn't +transform to a subset of another valid key. That is, it shouldn't be possible +to construct valid keys that resolve to directory names. As a concrete example, +if your TransformFunc splits on every 3 characters, then + +```go +d.Write("abcabc", val) // OK: written to /abc/abc/abcabc +d.Write("abc", val) // Error: attempted write to /abc/abc, but it's a directory +``` + +This will be addressed in an upcoming version of diskv. + +Probably the most important design principle behind diskv is that your data is +always flatly available on the disk. diskv will never do anything that would +prevent you from accessing, copying, backing up, or otherwise interacting with +your data via common UNIX commandline tools. + +## Adding a cache + +An in-memory caching layer is provided by combining the BasicStore +functionality with a simple map structure, and keeping it up-to-date as +appropriate. Since the map structure in Go is not threadsafe, it's combined +with a RWMutex to provide safe concurrent access. + +## Adding order + +diskv is a key-value store and therefore inherently unordered. An ordering +system can be injected into the store by passing something which satisfies the +diskv.Index interface. (A default implementation, using Google's +[btree][7] package, is provided.) Basically, diskv keeps an ordered (by a +user-provided Less function) index of the keys, which can be queried. + +[7]: https://github.com/google/btree + +## Adding compression + +Something which implements the diskv.Compression interface may be passed +during store creation, so that all Writes and Reads are filtered through +a compression/decompression pipeline. Several default implementations, +using stdlib compression algorithms, are provided. Note that data is cached +compressed; the cost of decompression is borne with each Read. + +## Streaming + +diskv also now provides ReadStream and WriteStream methods, to allow very large +data to be handled efficiently. + + +# Future plans + + * Needs plenty of robust testing: huge datasets, etc... + * More thorough benchmarking + * Your suggestions for use-cases I haven't thought of diff --git a/vendor/github.com/peterbourgon/diskv/basic_test.go b/vendor/github.com/peterbourgon/diskv/basic_test.go new file mode 100644 index 000000000..0ef0b17fe --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/basic_test.go @@ -0,0 +1,336 @@ +package diskv + +import ( + "bytes" + "errors" + "testing" + "time" +) + +func cmpBytes(a, b []byte) bool { + if len(a) != len(b) { + return false + } + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + return false + } + } + return true +} + +func (d *Diskv) isCached(key string) bool { + d.mu.RLock() + defer d.mu.RUnlock() + _, ok := d.cache[key] + return ok +} + +func TestWriteReadErase(t *testing.T) { + d := New(Options{ + BasePath: "test-data", + CacheSizeMax: 1024, + }) + defer d.EraseAll() + k, v := "a", []byte{'b'} + if err := d.Write(k, v); err != nil { + t.Fatalf("write: %s", err) + } + if readVal, err := d.Read(k); err != nil { + t.Fatalf("read: %s", err) + } else if bytes.Compare(v, readVal) != 0 { + t.Fatalf("read: expected %s, got %s", v, readVal) + } + if err := d.Erase(k); err != nil { + t.Fatalf("erase: %s", err) + } +} + +func TestWRECache(t *testing.T) { + d := New(Options{ + BasePath: "test-data", + CacheSizeMax: 1024, + }) + defer d.EraseAll() + k, v := "xxx", []byte{' ', ' ', ' '} + if d.isCached(k) { + t.Fatalf("key cached before Write and Read") + } + if err := d.Write(k, v); err != nil { + t.Fatalf("write: %s", err) + } + if d.isCached(k) { + t.Fatalf("key cached before Read") + } + if readVal, err := d.Read(k); err != nil { + t.Fatalf("read: %s", err) + } else if bytes.Compare(v, readVal) != 0 { + t.Fatalf("read: expected %s, got %s", v, readVal) + } + for i := 0; i < 10 && !d.isCached(k); i++ { + time.Sleep(10 * time.Millisecond) + } + if !d.isCached(k) { + t.Fatalf("key not cached after Read") + } + if err := d.Erase(k); err != nil { + t.Fatalf("erase: %s", err) + } + if d.isCached(k) { + t.Fatalf("key cached after Erase") + } +} + +func TestStrings(t *testing.T) { + d := New(Options{ + BasePath: "test-data", + CacheSizeMax: 1024, + }) + defer d.EraseAll() + + keys := map[string]bool{"a": false, "b": false, "c": false, "d": false} + v := []byte{'1'} + for k := range keys { + if err := d.Write(k, v); err != nil { + t.Fatalf("write: %s: %s", k, err) + } + } + + for k := range d.Keys(nil) { + if _, present := keys[k]; present { + t.Logf("got: %s", k) + keys[k] = true + } else { + t.Fatalf("strings() returns unknown key: %s", k) + } + } + + for k, found := range keys { + if !found { + t.Errorf("never got %s", k) + } + } +} + +func TestZeroByteCache(t *testing.T) { + d := New(Options{ + BasePath: "test-data", + CacheSizeMax: 0, + }) + defer d.EraseAll() + + k, v := "a", []byte{'1', '2', '3'} + if err := d.Write(k, v); err != nil { + t.Fatalf("Write: %s", err) + } + + if d.isCached(k) { + t.Fatalf("key cached, expected not-cached") + } + + if _, err := d.Read(k); err != nil { + t.Fatalf("Read: %s", err) + } + + if d.isCached(k) { + t.Fatalf("key cached, expected not-cached") + } +} + +func TestOneByteCache(t *testing.T) { + d := New(Options{ + BasePath: "test-data", + CacheSizeMax: 1, + }) + defer d.EraseAll() + + k1, k2, v1, v2 := "a", "b", []byte{'1'}, []byte{'1', '2'} + if err := d.Write(k1, v1); err != nil { + t.Fatal(err) + } + + if v, err := d.Read(k1); err != nil { + t.Fatal(err) + } else if !cmpBytes(v, v1) { + t.Fatalf("Read: expected %s, got %s", string(v1), string(v)) + } + + for i := 0; i < 10 && !d.isCached(k1); i++ { + time.Sleep(10 * time.Millisecond) + } + if !d.isCached(k1) { + t.Fatalf("expected 1-byte value to be cached, but it wasn't") + } + + if err := d.Write(k2, v2); err != nil { + t.Fatal(err) + } + if _, err := d.Read(k2); err != nil { + t.Fatalf("--> %s", err) + } + + for i := 0; i < 10 && (!d.isCached(k1) || d.isCached(k2)); i++ { + time.Sleep(10 * time.Millisecond) // just wait for lazy-cache + } + if !d.isCached(k1) { + t.Fatalf("1-byte value was uncached for no reason") + } + + if d.isCached(k2) { + t.Fatalf("2-byte value was cached, but cache max size is 1") + } +} + +func TestStaleCache(t *testing.T) { + d := New(Options{ + BasePath: "test-data", + CacheSizeMax: 1, + }) + defer d.EraseAll() + + k, first, second := "a", "first", "second" + if err := d.Write(k, []byte(first)); err != nil { + t.Fatal(err) + } + + v, err := d.Read(k) + if err != nil { + t.Fatal(err) + } + if string(v) != first { + t.Errorf("expected '%s', got '%s'", first, v) + } + + if err := d.Write(k, []byte(second)); err != nil { + t.Fatal(err) + } + + v, err = d.Read(k) + if err != nil { + t.Fatal(err) + } + + if string(v) != second { + t.Errorf("expected '%s', got '%s'", second, v) + } +} + +func TestHas(t *testing.T) { + d := New(Options{ + BasePath: "test-data", + CacheSizeMax: 1024, + }) + defer d.EraseAll() + + for k, v := range map[string]string{ + "a": "1", + "foo": "2", + "012345": "3", + } { + d.Write(k, []byte(v)) + } + + d.Read("foo") // cache one of them + if !d.isCached("foo") { + t.Errorf("'foo' didn't get cached") + } + + for _, tuple := range []struct { + key string + expected bool + }{ + {"a", true}, + {"b", false}, + {"foo", true}, + {"bar", false}, + {"01234", false}, + {"012345", true}, + {"0123456", false}, + } { + if expected, got := tuple.expected, d.Has(tuple.key); expected != got { + t.Errorf("Has(%s): expected %v, got %v", tuple.key, expected, got) + } + } +} + +type BrokenReader struct{} + +func (BrokenReader) Read(p []byte) (n int, err error) { + return 0, errors.New("failed to read") +} + +func TestRemovesIncompleteFiles(t *testing.T) { + opts := Options{ + BasePath: "test-data", + CacheSizeMax: 1024, + } + d := New(opts) + defer d.EraseAll() + + key, stream, sync := "key", BrokenReader{}, false + + if err := d.WriteStream(key, stream, sync); err == nil { + t.Fatalf("Expected i/o copy error, none received.") + } + + if _, err := d.Read(key); err == nil { + t.Fatal("Could read the key, but it shouldn't exist") + } +} + +func TestTempDir(t *testing.T) { + opts := Options{ + BasePath: "test-data", + TempDir: "test-data-temp", + CacheSizeMax: 1024, + } + d := New(opts) + defer d.EraseAll() + + k, v := "a", []byte{'b'} + if err := d.Write(k, v); err != nil { + t.Fatalf("write: %s", err) + } + if readVal, err := d.Read(k); err != nil { + t.Fatalf("read: %s", err) + } else if bytes.Compare(v, readVal) != 0 { + t.Fatalf("read: expected %s, got %s", v, readVal) + } + if err := d.Erase(k); err != nil { + t.Fatalf("erase: %s", err) + } +} + +type CrashingReader struct{} + +func (CrashingReader) Read(p []byte) (n int, err error) { + panic("System has crashed while reading the stream") +} + +func TestAtomicWrite(t *testing.T) { + opts := Options{ + BasePath: "test-data", + // Test would fail if TempDir is not set here. + TempDir: "test-data-temp", + CacheSizeMax: 1024, + } + d := New(opts) + defer d.EraseAll() + + key := "key" + func() { + defer func() { + recover() // Ignore panicking error + }() + + stream := CrashingReader{} + d.WriteStream(key, stream, false) + }() + + if d.Has(key) { + t.Fatal("Has key, but it shouldn't exist") + } + if _, ok := <-d.Keys(nil); ok { + t.Fatal("Store isn't empty") + } +} diff --git a/vendor/github.com/peterbourgon/diskv/compression.go b/vendor/github.com/peterbourgon/diskv/compression.go new file mode 100644 index 000000000..5192b0273 --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/compression.go @@ -0,0 +1,64 @@ +package diskv + +import ( + "compress/flate" + "compress/gzip" + "compress/zlib" + "io" +) + +// Compression is an interface that Diskv uses to implement compression of +// data. Writer takes a destination io.Writer and returns a WriteCloser that +// compresses all data written through it. Reader takes a source io.Reader and +// returns a ReadCloser that decompresses all data read through it. You may +// define these methods on your own type, or use one of the NewCompression +// helpers. +type Compression interface { + Writer(dst io.Writer) (io.WriteCloser, error) + Reader(src io.Reader) (io.ReadCloser, error) +} + +// NewGzipCompression returns a Gzip-based Compression. +func NewGzipCompression() Compression { + return NewGzipCompressionLevel(flate.DefaultCompression) +} + +// NewGzipCompressionLevel returns a Gzip-based Compression with the given level. +func NewGzipCompressionLevel(level int) Compression { + return &genericCompression{ + wf: func(w io.Writer) (io.WriteCloser, error) { return gzip.NewWriterLevel(w, level) }, + rf: func(r io.Reader) (io.ReadCloser, error) { return gzip.NewReader(r) }, + } +} + +// NewZlibCompression returns a Zlib-based Compression. +func NewZlibCompression() Compression { + return NewZlibCompressionLevel(flate.DefaultCompression) +} + +// NewZlibCompressionLevel returns a Zlib-based Compression with the given level. +func NewZlibCompressionLevel(level int) Compression { + return NewZlibCompressionLevelDict(level, nil) +} + +// NewZlibCompressionLevelDict returns a Zlib-based Compression with the given +// level, based on the given dictionary. +func NewZlibCompressionLevelDict(level int, dict []byte) Compression { + return &genericCompression{ + func(w io.Writer) (io.WriteCloser, error) { return zlib.NewWriterLevelDict(w, level, dict) }, + func(r io.Reader) (io.ReadCloser, error) { return zlib.NewReaderDict(r, dict) }, + } +} + +type genericCompression struct { + wf func(w io.Writer) (io.WriteCloser, error) + rf func(r io.Reader) (io.ReadCloser, error) +} + +func (g *genericCompression) Writer(dst io.Writer) (io.WriteCloser, error) { + return g.wf(dst) +} + +func (g *genericCompression) Reader(src io.Reader) (io.ReadCloser, error) { + return g.rf(src) +} diff --git a/vendor/github.com/peterbourgon/diskv/compression_test.go b/vendor/github.com/peterbourgon/diskv/compression_test.go new file mode 100644 index 000000000..2d6142037 --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/compression_test.go @@ -0,0 +1,72 @@ +package diskv + +import ( + "compress/flate" + "fmt" + "math/rand" + "os" + "testing" + "time" +) + +func init() { + rand.Seed(time.Now().UnixNano()) +} + +func testCompressionWith(t *testing.T, c Compression, name string) { + d := New(Options{ + BasePath: "compression-test", + CacheSizeMax: 0, + Compression: c, + }) + defer d.EraseAll() + + sz := 4096 + val := make([]byte, sz) + for i := 0; i < sz; i++ { + val[i] = byte('a' + rand.Intn(26)) // {a-z}; should compress some + } + + key := "a" + if err := d.Write(key, val); err != nil { + t.Fatalf("write failed: %s", err) + } + + targetFile := fmt.Sprintf("%s%c%s", d.BasePath, os.PathSeparator, key) + fi, err := os.Stat(targetFile) + if err != nil { + t.Fatalf("%s: %s", targetFile, err) + } + + if fi.Size() >= int64(sz) { + t.Fatalf("%s: size=%d, expected smaller", targetFile, fi.Size()) + } + t.Logf("%s compressed %d to %d", name, sz, fi.Size()) + + readVal, err := d.Read(key) + if len(readVal) != sz { + t.Fatalf("read: expected size=%d, got size=%d", sz, len(readVal)) + } + + for i := 0; i < sz; i++ { + if readVal[i] != val[i] { + t.Fatalf("i=%d: expected %v, got %v", i, val[i], readVal[i]) + } + } +} + +func TestGzipDefault(t *testing.T) { + testCompressionWith(t, NewGzipCompression(), "gzip") +} + +func TestGzipBestCompression(t *testing.T) { + testCompressionWith(t, NewGzipCompressionLevel(flate.BestCompression), "gzip-max") +} + +func TestGzipBestSpeed(t *testing.T) { + testCompressionWith(t, NewGzipCompressionLevel(flate.BestSpeed), "gzip-min") +} + +func TestZlib(t *testing.T) { + testCompressionWith(t, NewZlibCompression(), "zlib") +} diff --git a/vendor/github.com/peterbourgon/diskv/diskv.go b/vendor/github.com/peterbourgon/diskv/diskv.go new file mode 100644 index 000000000..524dc0a6e --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/diskv.go @@ -0,0 +1,624 @@ +// Diskv (disk-vee) is a simple, persistent, key-value store. +// It stores all data flatly on the filesystem. + +package diskv + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "sync" + "syscall" +) + +const ( + defaultBasePath = "diskv" + defaultFilePerm os.FileMode = 0666 + defaultPathPerm os.FileMode = 0777 +) + +var ( + defaultTransform = func(s string) []string { return []string{} } + errCanceled = errors.New("canceled") + errEmptyKey = errors.New("empty key") + errBadKey = errors.New("bad key") + errImportDirectory = errors.New("can't import a directory") +) + +// TransformFunction transforms a key into a slice of strings, with each +// element in the slice representing a directory in the file path where the +// key's entry will eventually be stored. +// +// For example, if TransformFunc transforms "abcdef" to ["ab", "cde", "f"], +// the final location of the data file will be /ab/cde/f/abcdef +type TransformFunction func(s string) []string + +// Options define a set of properties that dictate Diskv behavior. +// All values are optional. +type Options struct { + BasePath string + Transform TransformFunction + CacheSizeMax uint64 // bytes + PathPerm os.FileMode + FilePerm os.FileMode + // If TempDir is set, it will enable filesystem atomic writes by + // writing temporary files to that location before being moved + // to BasePath. + // Note that TempDir MUST be on the same device/partition as + // BasePath. + TempDir string + + Index Index + IndexLess LessFunction + + Compression Compression +} + +// Diskv implements the Diskv interface. You shouldn't construct Diskv +// structures directly; instead, use the New constructor. +type Diskv struct { + Options + mu sync.RWMutex + cache map[string][]byte + cacheSize uint64 +} + +// New returns an initialized Diskv structure, ready to use. +// If the path identified by baseDir already contains data, +// it will be accessible, but not yet cached. +func New(o Options) *Diskv { + if o.BasePath == "" { + o.BasePath = defaultBasePath + } + if o.Transform == nil { + o.Transform = defaultTransform + } + if o.PathPerm == 0 { + o.PathPerm = defaultPathPerm + } + if o.FilePerm == 0 { + o.FilePerm = defaultFilePerm + } + + d := &Diskv{ + Options: o, + cache: map[string][]byte{}, + cacheSize: 0, + } + + if d.Index != nil && d.IndexLess != nil { + d.Index.Initialize(d.IndexLess, d.Keys(nil)) + } + + return d +} + +// Write synchronously writes the key-value pair to disk, making it immediately +// available for reads. Write relies on the filesystem to perform an eventual +// sync to physical media. If you need stronger guarantees, see WriteStream. +func (d *Diskv) Write(key string, val []byte) error { + return d.WriteStream(key, bytes.NewBuffer(val), false) +} + +// WriteStream writes the data represented by the io.Reader to the disk, under +// the provided key. If sync is true, WriteStream performs an explicit sync on +// the file as soon as it's written. +// +// bytes.Buffer provides io.Reader semantics for basic data types. +func (d *Diskv) WriteStream(key string, r io.Reader, sync bool) error { + if len(key) <= 0 { + return errEmptyKey + } + + d.mu.Lock() + defer d.mu.Unlock() + + return d.writeStreamWithLock(key, r, sync) +} + +// createKeyFileWithLock either creates the key file directly, or +// creates a temporary file in TempDir if it is set. +func (d *Diskv) createKeyFileWithLock(key string) (*os.File, error) { + if d.TempDir != "" { + if err := os.MkdirAll(d.TempDir, d.PathPerm); err != nil { + return nil, fmt.Errorf("temp mkdir: %s", err) + } + f, err := ioutil.TempFile(d.TempDir, "") + if err != nil { + return nil, fmt.Errorf("temp file: %s", err) + } + + if err := f.Chmod(d.FilePerm); err != nil { + f.Close() // error deliberately ignored + os.Remove(f.Name()) // error deliberately ignored + return nil, fmt.Errorf("chmod: %s", err) + } + return f, nil + } + + mode := os.O_WRONLY | os.O_CREATE | os.O_TRUNC // overwrite if exists + f, err := os.OpenFile(d.completeFilename(key), mode, d.FilePerm) + if err != nil { + return nil, fmt.Errorf("open file: %s", err) + } + return f, nil +} + +// writeStream does no input validation checking. +func (d *Diskv) writeStreamWithLock(key string, r io.Reader, sync bool) error { + if err := d.ensurePathWithLock(key); err != nil { + return fmt.Errorf("ensure path: %s", err) + } + + f, err := d.createKeyFileWithLock(key) + if err != nil { + return fmt.Errorf("create key file: %s", err) + } + + wc := io.WriteCloser(&nopWriteCloser{f}) + if d.Compression != nil { + wc, err = d.Compression.Writer(f) + if err != nil { + f.Close() // error deliberately ignored + os.Remove(f.Name()) // error deliberately ignored + return fmt.Errorf("compression writer: %s", err) + } + } + + if _, err := io.Copy(wc, r); err != nil { + f.Close() // error deliberately ignored + os.Remove(f.Name()) // error deliberately ignored + return fmt.Errorf("i/o copy: %s", err) + } + + if err := wc.Close(); err != nil { + f.Close() // error deliberately ignored + os.Remove(f.Name()) // error deliberately ignored + return fmt.Errorf("compression close: %s", err) + } + + if sync { + if err := f.Sync(); err != nil { + f.Close() // error deliberately ignored + os.Remove(f.Name()) // error deliberately ignored + return fmt.Errorf("file sync: %s", err) + } + } + + if err := f.Close(); err != nil { + return fmt.Errorf("file close: %s", err) + } + + if f.Name() != d.completeFilename(key) { + if err := os.Rename(f.Name(), d.completeFilename(key)); err != nil { + os.Remove(f.Name()) // error deliberately ignored + return fmt.Errorf("rename: %s", err) + } + } + + if d.Index != nil { + d.Index.Insert(key) + } + + d.bustCacheWithLock(key) // cache only on read + + return nil +} + +// Import imports the source file into diskv under the destination key. If the +// destination key already exists, it's overwritten. If move is true, the +// source file is removed after a successful import. +func (d *Diskv) Import(srcFilename, dstKey string, move bool) (err error) { + if dstKey == "" { + return errEmptyKey + } + + if fi, err := os.Stat(srcFilename); err != nil { + return err + } else if fi.IsDir() { + return errImportDirectory + } + + d.mu.Lock() + defer d.mu.Unlock() + + if err := d.ensurePathWithLock(dstKey); err != nil { + return fmt.Errorf("ensure path: %s", err) + } + + if move { + if err := syscall.Rename(srcFilename, d.completeFilename(dstKey)); err == nil { + d.bustCacheWithLock(dstKey) + return nil + } else if err != syscall.EXDEV { + // If it failed due to being on a different device, fall back to copying + return err + } + } + + f, err := os.Open(srcFilename) + if err != nil { + return err + } + defer f.Close() + err = d.writeStreamWithLock(dstKey, f, false) + if err == nil && move { + err = os.Remove(srcFilename) + } + return err +} + +// Read reads the key and returns the value. +// If the key is available in the cache, Read won't touch the disk. +// If the key is not in the cache, Read will have the side-effect of +// lazily caching the value. +func (d *Diskv) Read(key string) ([]byte, error) { + rc, err := d.ReadStream(key, false) + if err != nil { + return []byte{}, err + } + defer rc.Close() + return ioutil.ReadAll(rc) +} + +// ReadStream reads the key and returns the value (data) as an io.ReadCloser. +// If the value is cached from a previous read, and direct is false, +// ReadStream will use the cached value. Otherwise, it will return a handle to +// the file on disk, and cache the data on read. +// +// If direct is true, ReadStream will lazily delete any cached value for the +// key, and return a direct handle to the file on disk. +// +// If compression is enabled, ReadStream taps into the io.Reader stream prior +// to decompression, and caches the compressed data. +func (d *Diskv) ReadStream(key string, direct bool) (io.ReadCloser, error) { + d.mu.RLock() + defer d.mu.RUnlock() + + if val, ok := d.cache[key]; ok { + if !direct { + buf := bytes.NewBuffer(val) + if d.Compression != nil { + return d.Compression.Reader(buf) + } + return ioutil.NopCloser(buf), nil + } + + go func() { + d.mu.Lock() + defer d.mu.Unlock() + d.uncacheWithLock(key, uint64(len(val))) + }() + } + + return d.readWithRLock(key) +} + +// read ignores the cache, and returns an io.ReadCloser representing the +// decompressed data for the given key, streamed from the disk. Clients should +// acquire a read lock on the Diskv and check the cache themselves before +// calling read. +func (d *Diskv) readWithRLock(key string) (io.ReadCloser, error) { + filename := d.completeFilename(key) + + fi, err := os.Stat(filename) + if err != nil { + return nil, err + } + if fi.IsDir() { + return nil, os.ErrNotExist + } + + f, err := os.Open(filename) + if err != nil { + return nil, err + } + + var r io.Reader + if d.CacheSizeMax > 0 { + r = newSiphon(f, d, key) + } else { + r = &closingReader{f} + } + + var rc = io.ReadCloser(ioutil.NopCloser(r)) + if d.Compression != nil { + rc, err = d.Compression.Reader(r) + if err != nil { + return nil, err + } + } + + return rc, nil +} + +// closingReader provides a Reader that automatically closes the +// embedded ReadCloser when it reaches EOF +type closingReader struct { + rc io.ReadCloser +} + +func (cr closingReader) Read(p []byte) (int, error) { + n, err := cr.rc.Read(p) + if err == io.EOF { + if closeErr := cr.rc.Close(); closeErr != nil { + return n, closeErr // close must succeed for Read to succeed + } + } + return n, err +} + +// siphon is like a TeeReader: it copies all data read through it to an +// internal buffer, and moves that buffer to the cache at EOF. +type siphon struct { + f *os.File + d *Diskv + key string + buf *bytes.Buffer +} + +// newSiphon constructs a siphoning reader that represents the passed file. +// When a successful series of reads ends in an EOF, the siphon will write +// the buffered data to Diskv's cache under the given key. +func newSiphon(f *os.File, d *Diskv, key string) io.Reader { + return &siphon{ + f: f, + d: d, + key: key, + buf: &bytes.Buffer{}, + } +} + +// Read implements the io.Reader interface for siphon. +func (s *siphon) Read(p []byte) (int, error) { + n, err := s.f.Read(p) + + if err == nil { + return s.buf.Write(p[0:n]) // Write must succeed for Read to succeed + } + + if err == io.EOF { + s.d.cacheWithoutLock(s.key, s.buf.Bytes()) // cache may fail + if closeErr := s.f.Close(); closeErr != nil { + return n, closeErr // close must succeed for Read to succeed + } + return n, err + } + + return n, err +} + +// Erase synchronously erases the given key from the disk and the cache. +func (d *Diskv) Erase(key string) error { + d.mu.Lock() + defer d.mu.Unlock() + + d.bustCacheWithLock(key) + + // erase from index + if d.Index != nil { + d.Index.Delete(key) + } + + // erase from disk + filename := d.completeFilename(key) + if s, err := os.Stat(filename); err == nil { + if s.IsDir() { + return errBadKey + } + if err = os.Remove(filename); err != nil { + return err + } + } else { + // Return err as-is so caller can do os.IsNotExist(err). + return err + } + + // clean up and return + d.pruneDirsWithLock(key) + return nil +} + +// EraseAll will delete all of the data from the store, both in the cache and on +// the disk. Note that EraseAll doesn't distinguish diskv-related data from non- +// diskv-related data. Care should be taken to always specify a diskv base +// directory that is exclusively for diskv data. +func (d *Diskv) EraseAll() error { + d.mu.Lock() + defer d.mu.Unlock() + d.cache = make(map[string][]byte) + d.cacheSize = 0 + if d.TempDir != "" { + os.RemoveAll(d.TempDir) // errors ignored + } + return os.RemoveAll(d.BasePath) +} + +// Has returns true if the given key exists. +func (d *Diskv) Has(key string) bool { + d.mu.Lock() + defer d.mu.Unlock() + + if _, ok := d.cache[key]; ok { + return true + } + + filename := d.completeFilename(key) + s, err := os.Stat(filename) + if err != nil { + return false + } + if s.IsDir() { + return false + } + + return true +} + +// Keys returns a channel that will yield every key accessible by the store, +// in undefined order. If a cancel channel is provided, closing it will +// terminate and close the keys channel. +func (d *Diskv) Keys(cancel <-chan struct{}) <-chan string { + return d.KeysPrefix("", cancel) +} + +// KeysPrefix returns a channel that will yield every key accessible by the +// store with the given prefix, in undefined order. If a cancel channel is +// provided, closing it will terminate and close the keys channel. If the +// provided prefix is the empty string, all keys will be yielded. +func (d *Diskv) KeysPrefix(prefix string, cancel <-chan struct{}) <-chan string { + var prepath string + if prefix == "" { + prepath = d.BasePath + } else { + prepath = d.pathFor(prefix) + } + c := make(chan string) + go func() { + filepath.Walk(prepath, walker(c, prefix, cancel)) + close(c) + }() + return c +} + +// walker returns a function which satisfies the filepath.WalkFunc interface. +// It sends every non-directory file entry down the channel c. +func walker(c chan<- string, prefix string, cancel <-chan struct{}) filepath.WalkFunc { + return func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if info.IsDir() || !strings.HasPrefix(info.Name(), prefix) { + return nil // "pass" + } + + select { + case c <- info.Name(): + case <-cancel: + return errCanceled + } + + return nil + } +} + +// pathFor returns the absolute path for location on the filesystem where the +// data for the given key will be stored. +func (d *Diskv) pathFor(key string) string { + return filepath.Join(d.BasePath, filepath.Join(d.Transform(key)...)) +} + +// ensurePathWithLock is a helper function that generates all necessary +// directories on the filesystem for the given key. +func (d *Diskv) ensurePathWithLock(key string) error { + return os.MkdirAll(d.pathFor(key), d.PathPerm) +} + +// completeFilename returns the absolute path to the file for the given key. +func (d *Diskv) completeFilename(key string) string { + return filepath.Join(d.pathFor(key), key) +} + +// cacheWithLock attempts to cache the given key-value pair in the store's +// cache. It can fail if the value is larger than the cache's maximum size. +func (d *Diskv) cacheWithLock(key string, val []byte) error { + valueSize := uint64(len(val)) + if err := d.ensureCacheSpaceWithLock(valueSize); err != nil { + return fmt.Errorf("%s; not caching", err) + } + + // be very strict about memory guarantees + if (d.cacheSize + valueSize) > d.CacheSizeMax { + panic(fmt.Sprintf("failed to make room for value (%d/%d)", valueSize, d.CacheSizeMax)) + } + + d.cache[key] = val + d.cacheSize += valueSize + return nil +} + +// cacheWithoutLock acquires the store's (write) mutex and calls cacheWithLock. +func (d *Diskv) cacheWithoutLock(key string, val []byte) error { + d.mu.Lock() + defer d.mu.Unlock() + return d.cacheWithLock(key, val) +} + +func (d *Diskv) bustCacheWithLock(key string) { + if val, ok := d.cache[key]; ok { + d.uncacheWithLock(key, uint64(len(val))) + } +} + +func (d *Diskv) uncacheWithLock(key string, sz uint64) { + d.cacheSize -= sz + delete(d.cache, key) +} + +// pruneDirsWithLock deletes empty directories in the path walk leading to the +// key k. Typically this function is called after an Erase is made. +func (d *Diskv) pruneDirsWithLock(key string) error { + pathlist := d.Transform(key) + for i := range pathlist { + dir := filepath.Join(d.BasePath, filepath.Join(pathlist[:len(pathlist)-i]...)) + + // thanks to Steven Blenkinsop for this snippet + switch fi, err := os.Stat(dir); true { + case err != nil: + return err + case !fi.IsDir(): + panic(fmt.Sprintf("corrupt dirstate at %s", dir)) + } + + nlinks, err := filepath.Glob(filepath.Join(dir, "*")) + if err != nil { + return err + } else if len(nlinks) > 0 { + return nil // has subdirs -- do not prune + } + if err = os.Remove(dir); err != nil { + return err + } + } + + return nil +} + +// ensureCacheSpaceWithLock deletes entries from the cache in arbitrary order +// until the cache has at least valueSize bytes available. +func (d *Diskv) ensureCacheSpaceWithLock(valueSize uint64) error { + if valueSize > d.CacheSizeMax { + return fmt.Errorf("value size (%d bytes) too large for cache (%d bytes)", valueSize, d.CacheSizeMax) + } + + safe := func() bool { return (d.cacheSize + valueSize) <= d.CacheSizeMax } + + for key, val := range d.cache { + if safe() { + break + } + + d.uncacheWithLock(key, uint64(len(val))) + } + + if !safe() { + panic(fmt.Sprintf("%d bytes still won't fit in the cache! (max %d bytes)", valueSize, d.CacheSizeMax)) + } + + return nil +} + +// nopWriteCloser wraps an io.Writer and provides a no-op Close method to +// satisfy the io.WriteCloser interface. +type nopWriteCloser struct { + io.Writer +} + +func (wc *nopWriteCloser) Write(p []byte) (int, error) { return wc.Writer.Write(p) } +func (wc *nopWriteCloser) Close() error { return nil } diff --git a/vendor/github.com/peterbourgon/diskv/examples/content-addressable-store/cas.go b/vendor/github.com/peterbourgon/diskv/examples/content-addressable-store/cas.go new file mode 100644 index 000000000..a3abaaf77 --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/examples/content-addressable-store/cas.go @@ -0,0 +1,63 @@ +package main + +import ( + "crypto/md5" + "fmt" + "io" + + "github.com/peterbourgon/diskv" +) + +const transformBlockSize = 2 // grouping of chars per directory depth + +func blockTransform(s string) []string { + var ( + sliceSize = len(s) / transformBlockSize + pathSlice = make([]string, sliceSize) + ) + for i := 0; i < sliceSize; i++ { + from, to := i*transformBlockSize, (i*transformBlockSize)+transformBlockSize + pathSlice[i] = s[from:to] + } + return pathSlice +} + +func main() { + d := diskv.New(diskv.Options{ + BasePath: "data", + Transform: blockTransform, + CacheSizeMax: 1024 * 1024, // 1MB + }) + + for _, valueStr := range []string{ + "I am the very model of a modern Major-General", + "I've information vegetable, animal, and mineral", + "I know the kings of England, and I quote the fights historical", + "From Marathon to Waterloo, in order categorical", + "I'm very well acquainted, too, with matters mathematical", + "I understand equations, both the simple and quadratical", + "About binomial theorem I'm teeming with a lot o' news", + "With many cheerful facts about the square of the hypotenuse", + } { + d.Write(md5sum(valueStr), []byte(valueStr)) + } + + var keyCount int + for key := range d.Keys(nil) { + val, err := d.Read(key) + if err != nil { + panic(fmt.Sprintf("key %s had no value", key)) + } + fmt.Printf("%s: %s\n", key, val) + keyCount++ + } + fmt.Printf("%d total keys\n", keyCount) + + // d.EraseAll() // leave it commented out to see how data is kept on disk +} + +func md5sum(s string) string { + h := md5.New() + io.WriteString(h, s) + return fmt.Sprintf("%x", h.Sum(nil)) +} diff --git a/vendor/github.com/peterbourgon/diskv/examples/super-simple-store/super-simple-store.go b/vendor/github.com/peterbourgon/diskv/examples/super-simple-store/super-simple-store.go new file mode 100644 index 000000000..b5da11d64 --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/examples/super-simple-store/super-simple-store.go @@ -0,0 +1,30 @@ +package main + +import ( + "fmt" + + "github.com/peterbourgon/diskv" +) + +func main() { + d := diskv.New(diskv.Options{ + BasePath: "my-diskv-data-directory", + Transform: func(s string) []string { return []string{} }, + CacheSizeMax: 1024 * 1024, // 1MB + }) + + key := "alpha" + if err := d.Write(key, []byte{'1', '2', '3'}); err != nil { + panic(err) + } + + value, err := d.Read(key) + if err != nil { + panic(err) + } + fmt.Printf("%v\n", value) + + if err := d.Erase(key); err != nil { + panic(err) + } +} diff --git a/vendor/github.com/peterbourgon/diskv/import_test.go b/vendor/github.com/peterbourgon/diskv/import_test.go new file mode 100644 index 000000000..a08ac7c70 --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/import_test.go @@ -0,0 +1,76 @@ +package diskv_test + +import ( + "bytes" + "io/ioutil" + "os" + + "github.com/peterbourgon/diskv" + + "testing" +) + +func TestImportMove(t *testing.T) { + b := []byte(`0123456789`) + f, err := ioutil.TempFile("", "temp-test") + if err != nil { + t.Fatal(err) + } + if _, err := f.Write(b); err != nil { + t.Fatal(err) + } + f.Close() + + d := diskv.New(diskv.Options{ + BasePath: "test-import-move", + }) + defer d.EraseAll() + + key := "key" + + if err := d.Write(key, []byte(`TBD`)); err != nil { + t.Fatal(err) + } + + if err := d.Import(f.Name(), key, true); err != nil { + t.Fatal(err) + } + + if _, err := os.Stat(f.Name()); err == nil || !os.IsNotExist(err) { + t.Errorf("expected temp file to be gone, but err = %v", err) + } + + if !d.Has(key) { + t.Errorf("%q not present", key) + } + + if buf, err := d.Read(key); err != nil || bytes.Compare(b, buf) != 0 { + t.Errorf("want %q, have %q (err = %v)", string(b), string(buf), err) + } +} + +func TestImportCopy(t *testing.T) { + b := []byte(`¡åéîòü!`) + + f, err := ioutil.TempFile("", "temp-test") + if err != nil { + t.Fatal(err) + } + if _, err := f.Write(b); err != nil { + t.Fatal(err) + } + f.Close() + + d := diskv.New(diskv.Options{ + BasePath: "test-import-copy", + }) + defer d.EraseAll() + + if err := d.Import(f.Name(), "key", false); err != nil { + t.Fatal(err) + } + + if _, err := os.Stat(f.Name()); err != nil { + t.Errorf("expected temp file to remain, but got err = %v", err) + } +} diff --git a/vendor/github.com/peterbourgon/diskv/index.go b/vendor/github.com/peterbourgon/diskv/index.go new file mode 100644 index 000000000..96fee5152 --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/index.go @@ -0,0 +1,115 @@ +package diskv + +import ( + "sync" + + "github.com/google/btree" +) + +// Index is a generic interface for things that can +// provide an ordered list of keys. +type Index interface { + Initialize(less LessFunction, keys <-chan string) + Insert(key string) + Delete(key string) + Keys(from string, n int) []string +} + +// LessFunction is used to initialize an Index of keys in a specific order. +type LessFunction func(string, string) bool + +// btreeString is a custom data type that satisfies the BTree Less interface, +// making the strings it wraps sortable by the BTree package. +type btreeString struct { + s string + l LessFunction +} + +// Less satisfies the BTree.Less interface using the btreeString's LessFunction. +func (s btreeString) Less(i btree.Item) bool { + return s.l(s.s, i.(btreeString).s) +} + +// BTreeIndex is an implementation of the Index interface using google/btree. +type BTreeIndex struct { + sync.RWMutex + LessFunction + *btree.BTree +} + +// Initialize populates the BTree tree with data from the keys channel, +// according to the passed less function. It's destructive to the BTreeIndex. +func (i *BTreeIndex) Initialize(less LessFunction, keys <-chan string) { + i.Lock() + defer i.Unlock() + i.LessFunction = less + i.BTree = rebuild(less, keys) +} + +// Insert inserts the given key (only) into the BTree tree. +func (i *BTreeIndex) Insert(key string) { + i.Lock() + defer i.Unlock() + if i.BTree == nil || i.LessFunction == nil { + panic("uninitialized index") + } + i.BTree.ReplaceOrInsert(btreeString{s: key, l: i.LessFunction}) +} + +// Delete removes the given key (only) from the BTree tree. +func (i *BTreeIndex) Delete(key string) { + i.Lock() + defer i.Unlock() + if i.BTree == nil || i.LessFunction == nil { + panic("uninitialized index") + } + i.BTree.Delete(btreeString{s: key, l: i.LessFunction}) +} + +// Keys yields a maximum of n keys in order. If the passed 'from' key is empty, +// Keys will return the first n keys. If the passed 'from' key is non-empty, the +// first key in the returned slice will be the key that immediately follows the +// passed key, in key order. +func (i *BTreeIndex) Keys(from string, n int) []string { + i.RLock() + defer i.RUnlock() + + if i.BTree == nil || i.LessFunction == nil { + panic("uninitialized index") + } + + if i.BTree.Len() <= 0 { + return []string{} + } + + btreeFrom := btreeString{s: from, l: i.LessFunction} + skipFirst := true + if len(from) <= 0 || !i.BTree.Has(btreeFrom) { + // no such key, so fabricate an always-smallest item + btreeFrom = btreeString{s: "", l: func(string, string) bool { return true }} + skipFirst = false + } + + keys := []string{} + iterator := func(i btree.Item) bool { + keys = append(keys, i.(btreeString).s) + return len(keys) < n + } + i.BTree.AscendGreaterOrEqual(btreeFrom, iterator) + + if skipFirst && len(keys) > 0 { + keys = keys[1:] + } + + return keys +} + +// rebuildIndex does the work of regenerating the index +// with the given keys. +func rebuild(less LessFunction, keys <-chan string) *btree.BTree { + tree := btree.New(2) + for key := range keys { + tree.ReplaceOrInsert(btreeString{s: key, l: less}) + } + return tree +} diff --git a/vendor/github.com/peterbourgon/diskv/index_test.go b/vendor/github.com/peterbourgon/diskv/index_test.go new file mode 100644 index 000000000..72f52a9ff --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/index_test.go @@ -0,0 +1,148 @@ +package diskv + +import ( + "bytes" + "reflect" + "testing" + "time" +) + +func strLess(a, b string) bool { return a < b } + +func cmpStrings(a, b []string) bool { + if len(a) != len(b) { + return false + } + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + return false + } + } + return true +} + +func (d *Diskv) isIndexed(key string) bool { + if d.Index == nil { + return false + } + + for _, got := range d.Index.Keys("", 1000) { + if got == key { + return true + } + } + return false +} + +func TestIndexOrder(t *testing.T) { + d := New(Options{ + BasePath: "index-test", + Transform: func(string) []string { return []string{} }, + CacheSizeMax: 1024, + Index: &BTreeIndex{}, + IndexLess: strLess, + }) + defer d.EraseAll() + + v := []byte{'1', '2', '3'} + d.Write("a", v) + if !d.isIndexed("a") { + t.Fatalf("'a' not indexed after write") + } + d.Write("1", v) + d.Write("m", v) + d.Write("-", v) + d.Write("A", v) + + expectedKeys := []string{"-", "1", "A", "a", "m"} + keys := []string{} + for _, key := range d.Index.Keys("", 100) { + keys = append(keys, key) + } + + if !cmpStrings(keys, expectedKeys) { + t.Fatalf("got %s, expected %s", keys, expectedKeys) + } +} + +func TestIndexLoad(t *testing.T) { + d1 := New(Options{ + BasePath: "index-test", + Transform: func(string) []string { return []string{} }, + CacheSizeMax: 1024, + }) + defer d1.EraseAll() + + val := []byte{'1', '2', '3'} + keys := []string{"a", "b", "c", "d", "e", "f", "g"} + for _, key := range keys { + d1.Write(key, val) + } + + d2 := New(Options{ + BasePath: "index-test", + Transform: func(string) []string { return []string{} }, + CacheSizeMax: 1024, + Index: &BTreeIndex{}, + IndexLess: strLess, + }) + defer d2.EraseAll() + + // check d2 has properly loaded existing d1 data + for _, key := range keys { + if !d2.isIndexed(key) { + t.Fatalf("key '%s' not indexed on secondary", key) + } + } + + // cache one + if readValue, err := d2.Read(keys[0]); err != nil { + t.Fatalf("%s", err) + } else if bytes.Compare(val, readValue) != 0 { + t.Fatalf("%s: got %s, expected %s", keys[0], readValue, val) + } + + // make sure it got cached + for i := 0; i < 10 && !d2.isCached(keys[0]); i++ { + time.Sleep(10 * time.Millisecond) + } + if !d2.isCached(keys[0]) { + t.Fatalf("key '%s' not cached", keys[0]) + } + + // kill the disk + d1.EraseAll() + + // cached value should still be there in the second + if readValue, err := d2.Read(keys[0]); err != nil { + t.Fatalf("%s", err) + } else if bytes.Compare(val, readValue) != 0 { + t.Fatalf("%s: got %s, expected %s", keys[0], readValue, val) + } + + // but not in the original + if _, err := d1.Read(keys[0]); err == nil { + t.Fatalf("expected error reading from flushed store") + } +} + +func TestIndexKeysEmptyFrom(t *testing.T) { + d := New(Options{ + BasePath: "index-test", + Transform: func(string) []string { return []string{} }, + CacheSizeMax: 1024, + Index: &BTreeIndex{}, + IndexLess: strLess, + }) + defer d.EraseAll() + + for _, k := range []string{"a", "c", "z", "b", "x", "b", "y"} { + d.Write(k, []byte("1")) + } + + want := []string{"a", "b", "c", "x", "y", "z"} + have := d.Index.Keys("", 99) + if !reflect.DeepEqual(want, have) { + t.Errorf("want %v, have %v", want, have) + } +} diff --git a/vendor/github.com/peterbourgon/diskv/issues_test.go b/vendor/github.com/peterbourgon/diskv/issues_test.go new file mode 100644 index 000000000..0b0b10908 --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/issues_test.go @@ -0,0 +1,121 @@ +package diskv + +import ( + "bytes" + "io/ioutil" + "sync" + "testing" + "time" +) + +// ReadStream from cache shouldn't panic on a nil dereference from a nonexistent +// Compression :) +func TestIssue2A(t *testing.T) { + d := New(Options{ + BasePath: "test-issue-2a", + Transform: func(string) []string { return []string{} }, + CacheSizeMax: 1024, + }) + defer d.EraseAll() + + input := "abcdefghijklmnopqrstuvwxy" + key, writeBuf, sync := "a", bytes.NewBufferString(input), false + if err := d.WriteStream(key, writeBuf, sync); err != nil { + t.Fatal(err) + } + + for i := 0; i < 2; i++ { + began := time.Now() + rc, err := d.ReadStream(key, false) + if err != nil { + t.Fatal(err) + } + buf, err := ioutil.ReadAll(rc) + if err != nil { + t.Fatal(err) + } + if !cmpBytes(buf, []byte(input)) { + t.Fatalf("read #%d: '%s' != '%s'", i+1, string(buf), input) + } + rc.Close() + t.Logf("read #%d in %s", i+1, time.Since(began)) + } +} + +// ReadStream on a key that resolves to a directory should return an error. +func TestIssue2B(t *testing.T) { + blockTransform := func(s string) []string { + transformBlockSize := 3 + sliceSize := len(s) / transformBlockSize + pathSlice := make([]string, sliceSize) + for i := 0; i < sliceSize; i++ { + from, to := i*transformBlockSize, (i*transformBlockSize)+transformBlockSize + pathSlice[i] = s[from:to] + } + return pathSlice + } + + d := New(Options{ + BasePath: "test-issue-2b", + Transform: blockTransform, + CacheSizeMax: 0, + }) + defer d.EraseAll() + + v := []byte{'1', '2', '3'} + if err := d.Write("abcabc", v); err != nil { + t.Fatal(err) + } + + _, err := d.ReadStream("abc", false) + if err == nil { + t.Fatal("ReadStream('abc') should return error") + } + t.Logf("ReadStream('abc') returned error: %v", err) +} + +// Ensure ReadStream with direct=true isn't racy. +func TestIssue17(t *testing.T) { + var ( + basePath = "test-data" + ) + + dWrite := New(Options{ + BasePath: basePath, + CacheSizeMax: 0, + }) + defer dWrite.EraseAll() + + dRead := New(Options{ + BasePath: basePath, + CacheSizeMax: 50, + }) + + cases := map[string]string{ + "a": `1234567890`, + "b": `2345678901`, + "c": `3456789012`, + "d": `4567890123`, + "e": `5678901234`, + } + + for k, v := range cases { + if err := dWrite.Write(k, []byte(v)); err != nil { + t.Fatalf("during write: %s", err) + } + dRead.Read(k) // ensure it's added to cache + } + + var wg sync.WaitGroup + start := make(chan struct{}) + for k, v := range cases { + wg.Add(1) + go func(k, v string) { + <-start + dRead.ReadStream(k, true) + wg.Done() + }(k, v) + } + close(start) + wg.Wait() +} diff --git a/vendor/github.com/peterbourgon/diskv/keys_test.go b/vendor/github.com/peterbourgon/diskv/keys_test.go new file mode 100644 index 000000000..222e1c444 --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/keys_test.go @@ -0,0 +1,231 @@ +package diskv_test + +import ( + "reflect" + "runtime" + "strings" + "testing" + + "github.com/peterbourgon/diskv" +) + +var ( + keysTestData = map[string]string{ + "ab01cd01": "When we started building CoreOS", + "ab01cd02": "we looked at all the various components available to us", + "ab01cd03": "re-using the best tools", + "ef01gh04": "and building the ones that did not exist", + "ef02gh05": "We believe strongly in the Unix philosophy", + "xxxxxxxx": "tools should be independently useful", + } + + prefixes = []string{ + "", // all + "a", + "ab", + "ab0", + "ab01", + "ab01cd0", + "ab01cd01", + "ab01cd01x", // none + "b", // none + "b0", // none + "0", // none + "01", // none + "e", + "ef", + "efx", // none + "ef01gh0", + "ef01gh04", + "ef01gh05", + "ef01gh06", // none + } +) + +func TestKeysFlat(t *testing.T) { + transform := func(s string) []string { + if s == "" { + t.Fatalf(`transform should not be called with ""`) + } + return []string{} + } + d := diskv.New(diskv.Options{ + BasePath: "test-data", + Transform: transform, + }) + defer d.EraseAll() + + for k, v := range keysTestData { + d.Write(k, []byte(v)) + } + + checkKeys(t, d.Keys(nil), keysTestData) +} + +func TestKeysNested(t *testing.T) { + d := diskv.New(diskv.Options{ + BasePath: "test-data", + Transform: blockTransform(2), + }) + defer d.EraseAll() + + for k, v := range keysTestData { + d.Write(k, []byte(v)) + } + + checkKeys(t, d.Keys(nil), keysTestData) +} + +func TestKeysPrefixFlat(t *testing.T) { + d := diskv.New(diskv.Options{ + BasePath: "test-data", + }) + defer d.EraseAll() + + for k, v := range keysTestData { + d.Write(k, []byte(v)) + } + + for _, prefix := range prefixes { + checkKeys(t, d.KeysPrefix(prefix, nil), filterPrefix(keysTestData, prefix)) + } +} + +func TestKeysPrefixNested(t *testing.T) { + d := diskv.New(diskv.Options{ + BasePath: "test-data", + Transform: blockTransform(2), + }) + defer d.EraseAll() + + for k, v := range keysTestData { + d.Write(k, []byte(v)) + } + + for _, prefix := range prefixes { + checkKeys(t, d.KeysPrefix(prefix, nil), filterPrefix(keysTestData, prefix)) + } +} + +func TestKeysCancel(t *testing.T) { + d := diskv.New(diskv.Options{ + BasePath: "test-data", + }) + defer d.EraseAll() + + for k, v := range keysTestData { + d.Write(k, []byte(v)) + } + + var ( + cancel = make(chan struct{}) + received = 0 + cancelAfter = len(keysTestData) / 2 + ) + + for key := range d.Keys(cancel) { + received++ + + if received >= cancelAfter { + close(cancel) + runtime.Gosched() // allow walker to detect cancel + } + + t.Logf("received %d: %q", received, key) + } + + if want, have := cancelAfter, received; want != have { + t.Errorf("want %d, have %d") + } +} + +func checkKeys(t *testing.T, c <-chan string, want map[string]string) { + for k := range c { + if _, ok := want[k]; !ok { + t.Errorf("%q yielded but not expected", k) + continue + } + + delete(want, k) + t.Logf("%q yielded OK", k) + } + + if len(want) != 0 { + t.Errorf("%d expected key(s) not yielded: %s", len(want), strings.Join(flattenKeys(want), ", ")) + } +} + +func blockTransform(blockSize int) func(string) []string { + return func(s string) []string { + var ( + sliceSize = len(s) / blockSize + pathSlice = make([]string, sliceSize) + ) + for i := 0; i < sliceSize; i++ { + from, to := i*blockSize, (i*blockSize)+blockSize + pathSlice[i] = s[from:to] + } + return pathSlice + } +} + +func filterPrefix(in map[string]string, prefix string) map[string]string { + out := map[string]string{} + for k, v := range in { + if strings.HasPrefix(k, prefix) { + out[k] = v + } + } + return out +} + +func TestFilterPrefix(t *testing.T) { + input := map[string]string{ + "all": "", + "and": "", + "at": "", + "available": "", + "best": "", + "building": "", + "components": "", + "coreos": "", + "did": "", + "exist": "", + "looked": "", + "not": "", + "ones": "", + "re-using": "", + "started": "", + "that": "", + "the": "", + "to": "", + "tools": "", + "us": "", + "various": "", + "we": "", + "when": "", + } + + for prefix, want := range map[string]map[string]string{ + "a": map[string]string{"all": "", "and": "", "at": "", "available": ""}, + "al": map[string]string{"all": ""}, + "all": map[string]string{"all": ""}, + "alll": map[string]string{}, + "c": map[string]string{"components": "", "coreos": ""}, + "co": map[string]string{"components": "", "coreos": ""}, + "com": map[string]string{"components": ""}, + } { + have := filterPrefix(input, prefix) + if !reflect.DeepEqual(want, have) { + t.Errorf("%q: want %v, have %v", prefix, flattenKeys(want), flattenKeys(have)) + } + } +} + +func flattenKeys(m map[string]string) []string { + a := make([]string, 0, len(m)) + for k := range m { + a = append(a, k) + } + return a +} diff --git a/vendor/github.com/peterbourgon/diskv/speed_test.go b/vendor/github.com/peterbourgon/diskv/speed_test.go new file mode 100644 index 000000000..67d05ff27 --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/speed_test.go @@ -0,0 +1,153 @@ +package diskv + +import ( + "fmt" + "math/rand" + "testing" +) + +func shuffle(keys []string) { + ints := rand.Perm(len(keys)) + for i := range keys { + keys[i], keys[ints[i]] = keys[ints[i]], keys[i] + } +} + +func genValue(size int) []byte { + v := make([]byte, size) + for i := 0; i < size; i++ { + v[i] = uint8((rand.Int() % 26) + 97) // a-z + } + return v +} + +const ( + keyCount = 1000 +) + +func genKeys() []string { + keys := make([]string, keyCount) + for i := 0; i < keyCount; i++ { + keys[i] = fmt.Sprintf("%d", i) + } + return keys +} + +func (d *Diskv) load(keys []string, val []byte) { + for _, key := range keys { + d.Write(key, val) + } +} + +func benchRead(b *testing.B, size, cachesz int) { + b.StopTimer() + d := New(Options{ + BasePath: "speed-test", + Transform: func(string) []string { return []string{} }, + CacheSizeMax: uint64(cachesz), + }) + defer d.EraseAll() + + keys := genKeys() + value := genValue(size) + d.load(keys, value) + shuffle(keys) + b.SetBytes(int64(size)) + + b.StartTimer() + for i := 0; i < b.N; i++ { + _, _ = d.Read(keys[i%len(keys)]) + } + b.StopTimer() +} + +func benchWrite(b *testing.B, size int, withIndex bool) { + b.StopTimer() + + options := Options{ + BasePath: "speed-test", + Transform: func(string) []string { return []string{} }, + CacheSizeMax: 0, + } + if withIndex { + options.Index = &BTreeIndex{} + options.IndexLess = strLess + } + + d := New(options) + defer d.EraseAll() + keys := genKeys() + value := genValue(size) + shuffle(keys) + b.SetBytes(int64(size)) + + b.StartTimer() + for i := 0; i < b.N; i++ { + d.Write(keys[i%len(keys)], value) + } + b.StopTimer() +} + +func BenchmarkWrite__32B_NoIndex(b *testing.B) { + benchWrite(b, 32, false) +} + +func BenchmarkWrite__1KB_NoIndex(b *testing.B) { + benchWrite(b, 1024, false) +} + +func BenchmarkWrite__4KB_NoIndex(b *testing.B) { + benchWrite(b, 4096, false) +} + +func BenchmarkWrite_10KB_NoIndex(b *testing.B) { + benchWrite(b, 10240, false) +} + +func BenchmarkWrite__32B_WithIndex(b *testing.B) { + benchWrite(b, 32, true) +} + +func BenchmarkWrite__1KB_WithIndex(b *testing.B) { + benchWrite(b, 1024, true) +} + +func BenchmarkWrite__4KB_WithIndex(b *testing.B) { + benchWrite(b, 4096, true) +} + +func BenchmarkWrite_10KB_WithIndex(b *testing.B) { + benchWrite(b, 10240, true) +} + +func BenchmarkRead__32B_NoCache(b *testing.B) { + benchRead(b, 32, 0) +} + +func BenchmarkRead__1KB_NoCache(b *testing.B) { + benchRead(b, 1024, 0) +} + +func BenchmarkRead__4KB_NoCache(b *testing.B) { + benchRead(b, 4096, 0) +} + +func BenchmarkRead_10KB_NoCache(b *testing.B) { + benchRead(b, 10240, 0) +} + +func BenchmarkRead__32B_WithCache(b *testing.B) { + benchRead(b, 32, keyCount*32*2) +} + +func BenchmarkRead__1KB_WithCache(b *testing.B) { + benchRead(b, 1024, keyCount*1024*2) +} + +func BenchmarkRead__4KB_WithCache(b *testing.B) { + benchRead(b, 4096, keyCount*4096*2) +} + +func BenchmarkRead_10KB_WithCache(b *testing.B) { + benchRead(b, 10240, keyCount*4096*2) +} diff --git a/vendor/github.com/peterbourgon/diskv/stream_test.go b/vendor/github.com/peterbourgon/diskv/stream_test.go new file mode 100644 index 000000000..7991dbff2 --- /dev/null +++ b/vendor/github.com/peterbourgon/diskv/stream_test.go @@ -0,0 +1,117 @@ +package diskv + +import ( + "bytes" + "io/ioutil" + "testing" +) + +func TestBasicStreamCaching(t *testing.T) { + d := New(Options{ + BasePath: "test-data", + CacheSizeMax: 1024, + }) + defer d.EraseAll() + + input := "a1b2c3" + key, writeBuf, sync := "a", bytes.NewBufferString(input), true + if err := d.WriteStream(key, writeBuf, sync); err != nil { + t.Fatal(err) + } + + if d.isCached(key) { + t.Fatalf("'%s' cached, but shouldn't be (yet)", key) + } + + rc, err := d.ReadStream(key, false) + if err != nil { + t.Fatal(err) + } + + readBuf, err := ioutil.ReadAll(rc) + if err != nil { + t.Fatal(err) + } + + if !cmpBytes(readBuf, []byte(input)) { + t.Fatalf("'%s' != '%s'", string(readBuf), input) + } + + if !d.isCached(key) { + t.Fatalf("'%s' isn't cached, but should be", key) + } +} + +func TestReadStreamDirect(t *testing.T) { + var ( + basePath = "test-data" + ) + dWrite := New(Options{ + BasePath: basePath, + CacheSizeMax: 0, + }) + defer dWrite.EraseAll() + dRead := New(Options{ + BasePath: basePath, + CacheSizeMax: 1024, + }) + + // Write + key, val1, val2 := "a", []byte(`1234567890`), []byte(`aaaaaaaaaa`) + if err := dWrite.Write(key, val1); err != nil { + t.Fatalf("during first write: %s", err) + } + + // First, caching read. + val, err := dRead.Read(key) + if err != nil { + t.Fatalf("during initial read: %s", err) + } + t.Logf("read 1: %s => %s", key, string(val)) + if !cmpBytes(val1, val) { + t.Errorf("expected %q, got %q", string(val1), string(val)) + } + if !dRead.isCached(key) { + t.Errorf("%q should be cached, but isn't", key) + } + + // Write a different value. + if err := dWrite.Write(key, val2); err != nil { + t.Fatalf("during second write: %s", err) + } + + // Second read, should hit cache and get the old value. + val, err = dRead.Read(key) + if err != nil { + t.Fatalf("during second (cache-hit) read: %s", err) + } + t.Logf("read 2: %s => %s", key, string(val)) + if !cmpBytes(val1, val) { + t.Errorf("expected %q, got %q", string(val1), string(val)) + } + + // Third, direct read, should get the updated value. + rc, err := dRead.ReadStream(key, true) + if err != nil { + t.Fatalf("during third (direct) read, ReadStream: %s", err) + } + defer rc.Close() + val, err = ioutil.ReadAll(rc) + if err != nil { + t.Fatalf("during third (direct) read, ReadAll: %s", err) + } + t.Logf("read 3: %s => %s", key, string(val)) + if !cmpBytes(val2, val) { + t.Errorf("expected %q, got %q", string(val1), string(val)) + } + + // Fourth read, should hit cache and get the new value. + val, err = dRead.Read(key) + if err != nil { + t.Fatalf("during fourth (cache-hit) read: %s", err) + } + t.Logf("read 4: %s => %s", key, string(val)) + if !cmpBytes(val2, val) { + t.Errorf("expected %q, got %q", string(val1), string(val)) + } +} diff --git a/vendor/k8s.io/api/Godeps/Godeps.json b/vendor/k8s.io/api/Godeps/Godeps.json index 21f3babad..efd82dc39 100644 --- a/vendor/k8s.io/api/Godeps/Godeps.json +++ b/vendor/k8s.io/api/Godeps/Godeps.json @@ -1,170 +1,278 @@ { - "ImportPath": "k8s.io/api", - "GoVersion": "go1.9", - "GodepVersion": "v79", - "Packages": [ - "./..." - ], - "Deps": [ - { - "ImportPath": "github.com/gogo/protobuf/proto", - "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" - }, - { - "ImportPath": "github.com/gogo/protobuf/sortkeys", - "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" - }, - { - "ImportPath": "github.com/golang/glog", - "Rev": "44145f04b68cf362d9c4df2182967c2275eaefed" - }, - { - "ImportPath": "github.com/google/gofuzz", - "Rev": "44d81051d367757e1c7c6a5a86423ece9afcf63c" - }, - { - "ImportPath": "github.com/spf13/pflag", - "Rev": "4c012f6dcd9546820e378d0bdda4d8fc772cdfea" - }, - { - "ImportPath": "golang.org/x/net/http2", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/idna", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/transform", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "gopkg.in/inf.v0", - "Rev": "3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - } - ] + "ImportPath": "k8s.io/api", + "GoVersion": "go1.10", + "GodepVersion": "v80", + "Packages": [ + "./..." + ], + "Deps": [ + { + "ImportPath": "github.com/davecgh/go-spew/spew", + "Rev": "782f4967f2dc4564575ca782fe2d04090b5faca8" + }, + { + "ImportPath": "github.com/ghodss/yaml", + "Rev": "73d445a93680fa1a78ae23a5839bad48f32ba1ee" + }, + { + "ImportPath": "github.com/gogo/protobuf/proto", + "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" + }, + { + "ImportPath": "github.com/gogo/protobuf/sortkeys", + "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" + }, + { + "ImportPath": "github.com/golang/glog", + "Rev": "44145f04b68cf362d9c4df2182967c2275eaefed" + }, + { + "ImportPath": "github.com/golang/protobuf/proto", + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" + }, + { + "ImportPath": "github.com/google/gofuzz", + "Rev": "44d81051d367757e1c7c6a5a86423ece9afcf63c" + }, + { + "ImportPath": "github.com/json-iterator/go", + "Rev": "2ddf6d758266fcb080a4f9e054b9f292c85e6798" + }, + { + "ImportPath": "github.com/modern-go/concurrent", + "Rev": "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" + }, + { + "ImportPath": "github.com/modern-go/reflect2", + "Rev": "05fbef0ca5da472bbf96c9322b84a53edc03c9fd" + }, + { + "ImportPath": "github.com/spf13/pflag", + "Rev": "583c0c0531f06d5278b7d917446061adc344b5cd" + }, + { + "ImportPath": "golang.org/x/net/http2", + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" + }, + { + "ImportPath": "golang.org/x/net/http2/hpack", + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" + }, + { + "ImportPath": "golang.org/x/net/idna", + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" + }, + { + "ImportPath": "golang.org/x/net/lex/httplex", + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" + }, + { + "ImportPath": "golang.org/x/text/secure/bidirule", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/transform", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/unicode/bidi", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/unicode/norm", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "gopkg.in/inf.v0", + "Rev": "3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4" + }, + { + "ImportPath": "gopkg.in/yaml.v2", + "Rev": "670d4cfef0544295bc27a114dbac37980d83185a" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/api/equality", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/api/meta", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/api/resource", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/api/testing", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/api/testing/fuzzer", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/conversion", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/fields", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/labels", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/runtime", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/selection", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/types", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/diff", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/errors", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/framer", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/json", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/net", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/sets", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/validation", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/wait", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/watch", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/api/resource", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/api/testing/fuzzer", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/api/testing/roundtrip", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/runtime", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/types", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + }, + { + "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" + } + ] } diff --git a/vendor/k8s.io/api/SECURITY_CONTACTS b/vendor/k8s.io/api/SECURITY_CONTACTS new file mode 100644 index 000000000..0648a8ebf --- /dev/null +++ b/vendor/k8s.io/api/SECURITY_CONTACTS @@ -0,0 +1,17 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +cjcullen +jessfraz +liggitt +philips +tallclair diff --git a/vendor/k8s.io/api/admission/v1beta1/BUILD b/vendor/k8s.io/api/admission/v1beta1/BUILD deleted file mode 100644 index fd69b9170..000000000 --- a/vendor/k8s.io/api/admission/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/admission/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/admission/v1beta1/generated.pb.go b/vendor/k8s.io/api/admission/v1beta1/generated.pb.go index f56a0f063..ebd627cfc 100644 --- a/vendor/k8s.io/api/admission/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/admission/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/admission/v1beta1/generated.proto b/vendor/k8s.io/api/admission/v1beta1/generated.proto index a4e4ca266..aa2a4dd4d 100644 --- a/vendor/k8s.io/api/admission/v1beta1/generated.proto +++ b/vendor/k8s.io/api/admission/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/admission/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/admission/v1beta1/types_swagger_doc_generated.go index 1f5313517..c22e3f63c 100644 --- a/vendor/k8s.io/api/admission/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/admission/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_AdmissionRequest = map[string]string{ "": "AdmissionRequest describes the admission.Attributes for the admission request.", "uid": "UID is an identifier for the individual request/response. It allows us to distinguish instances of requests which are otherwise identical (parallel requests, requests when earlier requests did not modify etc) The UID is meant to track the round trip (request/response) between the KAS and the WebHook, not the user request. It is suitable for correlating log entries between the webhook and apiserver, for either auditing or debugging.", diff --git a/vendor/k8s.io/api/admission/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/admission/v1beta1/zz_generated.deepcopy.go index fc60e1909..e3bcc03a1 100644 --- a/vendor/k8s.io/api/admission/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/admission/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/admissionregistration/v1alpha1/BUILD b/vendor/k8s.io/api/admissionregistration/v1alpha1/BUILD deleted file mode 100644 index 417eab39f..000000000 --- a/vendor/k8s.io/api/admissionregistration/v1alpha1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/admissionregistration/v1alpha1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go b/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go index f5d4941d3..542d8268a 100644 --- a/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto b/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto index 11de02ff4..4f0e400e7 100644 --- a/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go index e2494e5d7..69e4b7c64 100644 --- a/vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1alpha1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_Initializer = map[string]string{ "": "Initializer describes the name and the failure policy of an initializer, and what resources it applies to.", "name": "Name is the identifier of the initializer. It will be added to the object that needs to be initialized. Name should be fully qualified, e.g., alwayspullimages.kubernetes.io, where \"alwayspullimages\" is the name of the webhook, and kubernetes.io is the name of the organization. Required", diff --git a/vendor/k8s.io/api/admissionregistration/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/admissionregistration/v1alpha1/zz_generated.deepcopy.go index 2ca492946..9f636b484 100644 --- a/vendor/k8s.io/api/admissionregistration/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/admissionregistration/v1alpha1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/api/admissionregistration/v1beta1/BUILD deleted file mode 100644 index dbcfadd2b..000000000 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/admissionregistration/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go index 51e5762a8..af35e1e25 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto index 3d6cbc1e6..118be06f8 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -250,9 +250,7 @@ message WebhookClientConfig { // // If the webhook is running within the cluster, then you should use `service`. // - // If there is only one port open for the service, that port will be - // used. If there are multiple ports open, port 443 will be used if it - // is open, otherwise it is an error. + // Port 443 will be used if it is open, otherwise it is an error. // // +optional optional ServiceReference service = 1; diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/types.go b/vendor/k8s.io/api/admissionregistration/v1beta1/types.go index 9a4a1ddb4..f209e7acc 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/types.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/types.go @@ -254,9 +254,7 @@ type WebhookClientConfig struct { // // If the webhook is running within the cluster, then you should use `service`. // - // If there is only one port open for the service, that port will be - // used. If there are multiple ports open, port 443 will be used if it - // is open, otherwise it is an error. + // Port 443 will be used if it is open, otherwise it is an error. // // +optional Service *ServiceReference `json:"service" protobuf:"bytes,1,opt,name=service"` diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go index b32051424..e90bdc911 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_MutatingWebhookConfiguration = map[string]string{ "": "MutatingWebhookConfiguration describes the configuration of and admission webhook that accept or reject and may change the object.", "metadata": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata.", @@ -114,7 +114,7 @@ func (Webhook) SwaggerDoc() map[string]string { var map_WebhookClientConfig = map[string]string{ "": "WebhookClientConfig contains the information to make a TLS connection with the webhook", "url": "`url` gives the location of the webhook, in standard URL form (`[scheme://]host:port/path`). Exactly one of `url` or `service` must be specified.\n\nThe `host` should not refer to a service running in the cluster; use the `service` field instead. The host might be resolved via external DNS in some apiservers (e.g., `kube-apiserver` cannot resolve in-cluster DNS as that would be a layering violation). `host` may also be an IP address.\n\nPlease note that using `localhost` or `127.0.0.1` as a `host` is risky unless you take great care to run this webhook on all hosts which run an apiserver which might need to make calls to this webhook. Such installs are likely to be non-portable, i.e., not easy to turn up in a new cluster.\n\nThe scheme must be \"https\"; the URL must begin with \"https://\".\n\nA path is optional, and if present may be any string permissible in a URL. You may use the path to pass an arbitrary string to the webhook, for example, a cluster identifier.\n\nAttempting to use a user or basic auth e.g. \"user:password@\" is not allowed. Fragments (\"#...\") and query parameters (\"?...\") are not allowed, either.", - "service": "`service` is a reference to the service for this webhook. Either `service` or `url` must be specified.\n\nIf the webhook is running within the cluster, then you should use `service`.\n\nIf there is only one port open for the service, that port will be used. If there are multiple ports open, port 443 will be used if it is open, otherwise it is an error.", + "service": "`service` is a reference to the service for this webhook. Either `service` or `url` must be specified.\n\nIf the webhook is running within the cluster, then you should use `service`.\n\nPort 443 will be used if it is open, otherwise it is an error.", "caBundle": "`caBundle` is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. Required.", } diff --git a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go index d8345d209..d8c1e4f62 100644 --- a/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/apps/v1/BUILD b/vendor/k8s.io/api/apps/v1/BUILD deleted file mode 100644 index 7902387f5..000000000 --- a/vendor/k8s.io/api/apps/v1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/apps/v1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/apps/v1/generated.pb.go b/vendor/k8s.io/api/apps/v1/generated.pb.go index 02123859b..1823a8440 100644 --- a/vendor/k8s.io/api/apps/v1/generated.pb.go +++ b/vendor/k8s.io/api/apps/v1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/apps/v1/generated.proto b/vendor/k8s.io/api/apps/v1/generated.proto index 46473baa8..38d7c08cc 100644 --- a/vendor/k8s.io/api/apps/v1/generated.proto +++ b/vendor/k8s.io/api/apps/v1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -501,9 +501,9 @@ message RollingUpdateDeployment { // Absolute number is calculated from percentage by rounding down. // This can not be 0 if MaxSurge is 0. // Defaults to 25%. - // Example: when this is set to 30%, the old RC can be scaled down to 70% of desired pods - // immediately when the rolling update starts. Once new pods are ready, old RC - // can be scaled down further, followed by scaling up the new RC, ensuring + // Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods + // immediately when the rolling update starts. Once new pods are ready, old ReplicaSet + // can be scaled down further, followed by scaling up the new ReplicaSet, ensuring // that the total number of pods available at all times during the update is at // least 70% of desired pods. // +optional @@ -515,10 +515,10 @@ message RollingUpdateDeployment { // This can not be 0 if MaxUnavailable is 0. // Absolute number is calculated from percentage by rounding up. // Defaults to 25%. - // Example: when this is set to 30%, the new RC can be scaled up immediately when + // Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when // the rolling update starts, such that the total number of old and new pods do not exceed // 130% of desired pods. Once old pods have been killed, - // new RC can be scaled up further, ensuring that total number of pods running + // new ReplicaSet can be scaled up further, ensuring that total number of pods running // at any time during the update is at most 130% of desired pods. // +optional optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxSurge = 2; diff --git a/vendor/k8s.io/api/apps/v1/types.go b/vendor/k8s.io/api/apps/v1/types.go index b5df22c6f..4431ca2c3 100644 --- a/vendor/k8s.io/api/apps/v1/types.go +++ b/vendor/k8s.io/api/apps/v1/types.go @@ -307,8 +307,8 @@ type DeploymentSpec struct { const ( // DefaultDeploymentUniqueLabelKey is the default key of the selector that is added - // to existing RCs (and label key that is added to its pods) to prevent the existing RCs - // to select new pods (and old pods being select by new RC). + // to existing ReplicaSets (and label key that is added to its pods) to prevent the existing ReplicaSets + // to select new pods (and old pods being select by new ReplicaSet). DefaultDeploymentUniqueLabelKey string = "pod-template-hash" ) @@ -333,7 +333,7 @@ const ( // Kill all existing pods before creating new ones. RecreateDeploymentStrategyType DeploymentStrategyType = "Recreate" - // Replace the old RCs by new one using rolling update i.e gradually scale down the old RCs and scale up the new one. + // Replace the old ReplicaSets by new one using rolling update i.e gradually scale down the old ReplicaSets and scale up the new one. RollingUpdateDeploymentStrategyType DeploymentStrategyType = "RollingUpdate" ) @@ -344,9 +344,9 @@ type RollingUpdateDeployment struct { // Absolute number is calculated from percentage by rounding down. // This can not be 0 if MaxSurge is 0. // Defaults to 25%. - // Example: when this is set to 30%, the old RC can be scaled down to 70% of desired pods - // immediately when the rolling update starts. Once new pods are ready, old RC - // can be scaled down further, followed by scaling up the new RC, ensuring + // Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods + // immediately when the rolling update starts. Once new pods are ready, old ReplicaSet + // can be scaled down further, followed by scaling up the new ReplicaSet, ensuring // that the total number of pods available at all times during the update is at // least 70% of desired pods. // +optional @@ -358,10 +358,10 @@ type RollingUpdateDeployment struct { // This can not be 0 if MaxUnavailable is 0. // Absolute number is calculated from percentage by rounding up. // Defaults to 25%. - // Example: when this is set to 30%, the new RC can be scaled up immediately when + // Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when // the rolling update starts, such that the total number of old and new pods do not exceed // 130% of desired pods. Once old pods have been killed, - // new RC can be scaled up further, ensuring that total number of pods running + // new ReplicaSet can be scaled up further, ensuring that total number of pods running // at any time during the update is at most 130% of desired pods. // +optional MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty" protobuf:"bytes,2,opt,name=maxSurge"` diff --git a/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go index 4dec6f2f8..85fb159dd 100644 --- a/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_ControllerRevision = map[string]string{ "": "ControllerRevision implements an immutable snapshot of state data. Clients are responsible for serializing and deserializing the objects that contain their internal state. Once a ControllerRevision has been successfully created, it can not be updated. The API Server will fail validation of all requests that attempt to mutate the Data field. ControllerRevisions may, however, be deleted. Note that, due to its use by both the DaemonSet and StatefulSet controllers for update and rollback, this object is beta. However, it may be subject to name and representation changes in future releases, and clients should not depend on its stability. It is primarily for internal use by controllers.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", @@ -271,8 +271,8 @@ func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { var map_RollingUpdateDeployment = map[string]string{ "": "Spec to control the desired behavior of rolling update.", - "maxUnavailable": "The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old RC can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old RC can be scaled down further, followed by scaling up the new RC, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods.", - "maxSurge": "The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new RC can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new RC can be scaled up further, ensuring that total number of pods running at any time during the update is at most 130% of desired pods.", + "maxUnavailable": "The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old ReplicaSet can be scaled down further, followed by scaling up the new ReplicaSet, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods.", + "maxSurge": "The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new ReplicaSet can be scaled up further, ensuring that total number of pods running at any time during the update is at most 130% of desired pods.", } func (RollingUpdateDeployment) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/apps/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/apps/v1/zz_generated.deepcopy.go index 62984cb89..ccbb29061 100644 --- a/vendor/k8s.io/api/apps/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/apps/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/apps/v1beta1/BUILD b/vendor/k8s.io/api/apps/v1beta1/BUILD deleted file mode 100644 index f40a41e3e..000000000 --- a/vendor/k8s.io/api/apps/v1beta1/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/apps/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/apps/v1beta1/generated.pb.go b/vendor/k8s.io/api/apps/v1beta1/generated.pb.go index 04183fc2d..608308259 100644 --- a/vendor/k8s.io/api/apps/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/apps/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/apps/v1beta1/generated.proto b/vendor/k8s.io/api/apps/v1beta1/generated.proto index da160922d..ba6134d53 100644 --- a/vendor/k8s.io/api/apps/v1beta1/generated.proto +++ b/vendor/k8s.io/api/apps/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -245,9 +245,9 @@ message RollingUpdateDeployment { // Absolute number is calculated from percentage by rounding down. // This can not be 0 if MaxSurge is 0. // Defaults to 25%. - // Example: when this is set to 30%, the old RC can be scaled down to 70% of desired pods - // immediately when the rolling update starts. Once new pods are ready, old RC - // can be scaled down further, followed by scaling up the new RC, ensuring + // Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods + // immediately when the rolling update starts. Once new pods are ready, old ReplicaSet + // can be scaled down further, followed by scaling up the new ReplicaSet, ensuring // that the total number of pods available at all times during the update is at // least 70% of desired pods. // +optional @@ -259,10 +259,10 @@ message RollingUpdateDeployment { // This can not be 0 if MaxUnavailable is 0. // Absolute number is calculated from percentage by rounding up. // Defaults to 25%. - // Example: when this is set to 30%, the new RC can be scaled up immediately when + // Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when // the rolling update starts, such that the total number of old and new pods do not exceed // 130% of desired pods. Once old pods have been killed, - // new RC can be scaled up further, ensuring that total number of pods running + // new ReplicaSet can be scaled up further, ensuring that total number of pods running // at any time during the update is atmost 130% of desired pods. // +optional optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxSurge = 2; diff --git a/vendor/k8s.io/api/apps/v1beta1/types.go b/vendor/k8s.io/api/apps/v1beta1/types.go index dd9e97e10..d462604d7 100644 --- a/vendor/k8s.io/api/apps/v1beta1/types.go +++ b/vendor/k8s.io/api/apps/v1beta1/types.go @@ -379,8 +379,8 @@ type RollbackConfig struct { const ( // DefaultDeploymentUniqueLabelKey is the default key of the selector that is added - // to existing RCs (and label key that is added to its pods) to prevent the existing RCs - // to select new pods (and old pods being select by new RC). + // to existing ReplicaSets (and label key that is added to its pods) to prevent the existing ReplicaSets + // to select new pods (and old pods being select by new ReplicaSet). DefaultDeploymentUniqueLabelKey string = "pod-template-hash" ) @@ -405,7 +405,7 @@ const ( // Kill all existing pods before creating new ones. RecreateDeploymentStrategyType DeploymentStrategyType = "Recreate" - // Replace the old RCs by new one using rolling update i.e gradually scale down the old RCs and scale up the new one. + // Replace the old ReplicaSets by new one using rolling update i.e gradually scale down the old ReplicaSets and scale up the new one. RollingUpdateDeploymentStrategyType DeploymentStrategyType = "RollingUpdate" ) @@ -416,9 +416,9 @@ type RollingUpdateDeployment struct { // Absolute number is calculated from percentage by rounding down. // This can not be 0 if MaxSurge is 0. // Defaults to 25%. - // Example: when this is set to 30%, the old RC can be scaled down to 70% of desired pods - // immediately when the rolling update starts. Once new pods are ready, old RC - // can be scaled down further, followed by scaling up the new RC, ensuring + // Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods + // immediately when the rolling update starts. Once new pods are ready, old ReplicaSet + // can be scaled down further, followed by scaling up the new ReplicaSet, ensuring // that the total number of pods available at all times during the update is at // least 70% of desired pods. // +optional @@ -430,10 +430,10 @@ type RollingUpdateDeployment struct { // This can not be 0 if MaxUnavailable is 0. // Absolute number is calculated from percentage by rounding up. // Defaults to 25%. - // Example: when this is set to 30%, the new RC can be scaled up immediately when + // Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when // the rolling update starts, such that the total number of old and new pods do not exceed // 130% of desired pods. Once old pods have been killed, - // new RC can be scaled up further, ensuring that total number of pods running + // new ReplicaSet can be scaled up further, ensuring that total number of pods running // at any time during the update is atmost 130% of desired pods. // +optional MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty" protobuf:"bytes,2,opt,name=maxSurge"` diff --git a/vendor/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go index d12baf39f..68ebef348 100644 --- a/vendor/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_ControllerRevision = map[string]string{ "": "DEPRECATED - This group version of ControllerRevision is deprecated by apps/v1beta2/ControllerRevision. See the release notes for more information. ControllerRevision implements an immutable snapshot of state data. Clients are responsible for serializing and deserializing the objects that contain their internal state. Once a ControllerRevision has been successfully created, it can not be updated. The API Server will fail validation of all requests that attempt to mutate the Data field. ControllerRevisions may, however, be deleted. Note that, due to its use by both the DaemonSet and StatefulSet controllers for update and rollback, this object is beta. However, it may be subject to name and representation changes in future releases, and clients should not depend on its stability. It is primarily for internal use by controllers.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", @@ -148,8 +148,8 @@ func (RollbackConfig) SwaggerDoc() map[string]string { var map_RollingUpdateDeployment = map[string]string{ "": "Spec to control the desired behavior of rolling update.", - "maxUnavailable": "The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old RC can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old RC can be scaled down further, followed by scaling up the new RC, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods.", - "maxSurge": "The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new RC can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new RC can be scaled up further, ensuring that total number of pods running at any time during the update is atmost 130% of desired pods.", + "maxUnavailable": "The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old ReplicaSet can be scaled down further, followed by scaling up the new ReplicaSet, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods.", + "maxSurge": "The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new ReplicaSet can be scaled up further, ensuring that total number of pods running at any time during the update is atmost 130% of desired pods.", } func (RollingUpdateDeployment) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go index b06032e1e..dd37f8dd8 100644 --- a/vendor/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/apps/v1beta2/BUILD b/vendor/k8s.io/api/apps/v1beta2/BUILD deleted file mode 100644 index c13a6ff57..000000000 --- a/vendor/k8s.io/api/apps/v1beta2/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/apps/v1beta2", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/apps/v1beta2/generated.pb.go b/vendor/k8s.io/api/apps/v1beta2/generated.pb.go index cfd422edb..49f9f8771 100644 --- a/vendor/k8s.io/api/apps/v1beta2/generated.pb.go +++ b/vendor/k8s.io/api/apps/v1beta2/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/apps/v1beta2/generated.proto b/vendor/k8s.io/api/apps/v1beta2/generated.proto index 4a8b28c15..7327c3369 100644 --- a/vendor/k8s.io/api/apps/v1beta2/generated.proto +++ b/vendor/k8s.io/api/apps/v1beta2/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -509,9 +509,9 @@ message RollingUpdateDeployment { // Absolute number is calculated from percentage by rounding down. // This can not be 0 if MaxSurge is 0. // Defaults to 25%. - // Example: when this is set to 30%, the old RC can be scaled down to 70% of desired pods - // immediately when the rolling update starts. Once new pods are ready, old RC - // can be scaled down further, followed by scaling up the new RC, ensuring + // Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods + // immediately when the rolling update starts. Once new pods are ready, old ReplicaSet + // can be scaled down further, followed by scaling up the new ReplicaSet, ensuring // that the total number of pods available at all times during the update is at // least 70% of desired pods. // +optional @@ -523,10 +523,10 @@ message RollingUpdateDeployment { // This can not be 0 if MaxUnavailable is 0. // Absolute number is calculated from percentage by rounding up. // Defaults to 25%. - // Example: when this is set to 30%, the new RC can be scaled up immediately when + // Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when // the rolling update starts, such that the total number of old and new pods do not exceed // 130% of desired pods. Once old pods have been killed, - // new RC can be scaled up further, ensuring that total number of pods running + // new ReplicaSet can be scaled up further, ensuring that total number of pods running // at any time during the update is atmost 130% of desired pods. // +optional optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxSurge = 2; diff --git a/vendor/k8s.io/api/apps/v1beta2/types.go b/vendor/k8s.io/api/apps/v1beta2/types.go index c8be2aaca..e5525222a 100644 --- a/vendor/k8s.io/api/apps/v1beta2/types.go +++ b/vendor/k8s.io/api/apps/v1beta2/types.go @@ -359,8 +359,8 @@ type DeploymentSpec struct { const ( // DefaultDeploymentUniqueLabelKey is the default key of the selector that is added - // to existing RCs (and label key that is added to its pods) to prevent the existing RCs - // to select new pods (and old pods being select by new RC). + // to existing ReplicaSets (and label key that is added to its pods) to prevent the existing ReplicaSets + // to select new pods (and old pods being select by new ReplicaSet). DefaultDeploymentUniqueLabelKey string = "pod-template-hash" ) @@ -385,7 +385,7 @@ const ( // Kill all existing pods before creating new ones. RecreateDeploymentStrategyType DeploymentStrategyType = "Recreate" - // Replace the old RCs by new one using rolling update i.e gradually scale down the old RCs and scale up the new one. + // Replace the old ReplicaSets by new one using rolling update i.e gradually scale down the old ReplicaSets and scale up the new one. RollingUpdateDeploymentStrategyType DeploymentStrategyType = "RollingUpdate" ) @@ -396,9 +396,9 @@ type RollingUpdateDeployment struct { // Absolute number is calculated from percentage by rounding down. // This can not be 0 if MaxSurge is 0. // Defaults to 25%. - // Example: when this is set to 30%, the old RC can be scaled down to 70% of desired pods - // immediately when the rolling update starts. Once new pods are ready, old RC - // can be scaled down further, followed by scaling up the new RC, ensuring + // Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods + // immediately when the rolling update starts. Once new pods are ready, old ReplicaSet + // can be scaled down further, followed by scaling up the new ReplicaSet, ensuring // that the total number of pods available at all times during the update is at // least 70% of desired pods. // +optional @@ -410,10 +410,10 @@ type RollingUpdateDeployment struct { // This can not be 0 if MaxUnavailable is 0. // Absolute number is calculated from percentage by rounding up. // Defaults to 25%. - // Example: when this is set to 30%, the new RC can be scaled up immediately when + // Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when // the rolling update starts, such that the total number of old and new pods do not exceed // 130% of desired pods. Once old pods have been killed, - // new RC can be scaled up further, ensuring that total number of pods running + // new ReplicaSet can be scaled up further, ensuring that total number of pods running // at any time during the update is atmost 130% of desired pods. // +optional MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty" protobuf:"bytes,2,opt,name=maxSurge"` diff --git a/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go b/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go index e2f133b51..627df3ab7 100644 --- a/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta2 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_ControllerRevision = map[string]string{ "": "DEPRECATED - This group version of ControllerRevision is deprecated by apps/v1/ControllerRevision. See the release notes for more information. ControllerRevision implements an immutable snapshot of state data. Clients are responsible for serializing and deserializing the objects that contain their internal state. Once a ControllerRevision has been successfully created, it can not be updated. The API Server will fail validation of all requests that attempt to mutate the Data field. ControllerRevisions may, however, be deleted. Note that, due to its use by both the DaemonSet and StatefulSet controllers for update and rollback, this object is beta. However, it may be subject to name and representation changes in future releases, and clients should not depend on its stability. It is primarily for internal use by controllers.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", @@ -271,8 +271,8 @@ func (RollingUpdateDaemonSet) SwaggerDoc() map[string]string { var map_RollingUpdateDeployment = map[string]string{ "": "Spec to control the desired behavior of rolling update.", - "maxUnavailable": "The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old RC can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old RC can be scaled down further, followed by scaling up the new RC, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods.", - "maxSurge": "The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new RC can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new RC can be scaled up further, ensuring that total number of pods running at any time during the update is atmost 130% of desired pods.", + "maxUnavailable": "The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old ReplicaSet can be scaled down further, followed by scaling up the new ReplicaSet, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods.", + "maxSurge": "The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new ReplicaSet can be scaled up further, ensuring that total number of pods running at any time during the update is atmost 130% of desired pods.", } func (RollingUpdateDeployment) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go b/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go index 3db38527d..a3bd8afdc 100644 --- a/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authentication/v1/BUILD b/vendor/k8s.io/api/authentication/v1/BUILD deleted file mode 100644 index 26e557e46..000000000 --- a/vendor/k8s.io/api/authentication/v1/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/authentication/v1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/authentication/v1/generated.pb.go b/vendor/k8s.io/api/authentication/v1/generated.pb.go index d090ce579..29697280a 100644 --- a/vendor/k8s.io/api/authentication/v1/generated.pb.go +++ b/vendor/k8s.io/api/authentication/v1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authentication/v1/generated.proto b/vendor/k8s.io/api/authentication/v1/generated.proto index 1fd432a70..d20887f82 100644 --- a/vendor/k8s.io/api/authentication/v1/generated.proto +++ b/vendor/k8s.io/api/authentication/v1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go index 68ecea8ea..6632a5dd5 100644 --- a/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_BoundObjectReference = map[string]string{ "": "BoundObjectReference is a reference to an object that a token is bound to.", "kind": "Kind of the referent. Valid kinds are 'Pod' and 'Secret'.", diff --git a/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go index ad0df8ff4..4b9b94105 100644 --- a/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authentication/v1beta1/BUILD b/vendor/k8s.io/api/authentication/v1beta1/BUILD deleted file mode 100644 index 998d793fe..000000000 --- a/vendor/k8s.io/api/authentication/v1beta1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/authentication/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go b/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go index 86e362b87..0efd6bf57 100644 --- a/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/authentication/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authentication/v1beta1/generated.proto b/vendor/k8s.io/api/authentication/v1beta1/generated.proto index 3d0abd15d..4fb6448f7 100644 --- a/vendor/k8s.io/api/authentication/v1beta1/generated.proto +++ b/vendor/k8s.io/api/authentication/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authentication/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/authentication/v1beta1/types_swagger_doc_generated.go index f910bea6f..968999d1e 100644 --- a/vendor/k8s.io/api/authentication/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/authentication/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_TokenReview = map[string]string{ "": "TokenReview attempts to authenticate a token to a known user. Note: TokenReview requests may be cached by the webhook token authenticator plugin in the kube-apiserver.", "spec": "Spec holds information about the request being evaluated", diff --git a/vendor/k8s.io/api/authentication/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/authentication/v1beta1/zz_generated.deepcopy.go index 57d878e9a..bb552ff63 100644 --- a/vendor/k8s.io/api/authentication/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/authentication/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authorization/v1/BUILD b/vendor/k8s.io/api/authorization/v1/BUILD deleted file mode 100644 index af9e74a63..000000000 --- a/vendor/k8s.io/api/authorization/v1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/authorization/v1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/authorization/v1/generated.pb.go b/vendor/k8s.io/api/authorization/v1/generated.pb.go index bdb606c0b..508c58f1b 100644 --- a/vendor/k8s.io/api/authorization/v1/generated.pb.go +++ b/vendor/k8s.io/api/authorization/v1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authorization/v1/generated.proto b/vendor/k8s.io/api/authorization/v1/generated.proto index 2cd4af0c0..d87b03dbf 100644 --- a/vendor/k8s.io/api/authorization/v1/generated.proto +++ b/vendor/k8s.io/api/authorization/v1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go index 85503660c..8445f7116 100644 --- a/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_LocalSubjectAccessReview = map[string]string{ "": "LocalSubjectAccessReview checks whether or not a user or group can perform an action in a given namespace. Having a namespace scoped resource makes it much easier to grant namespace scoped policy that includes permissions checking.", "spec": "Spec holds information about the request being evaluated. spec.namespace must be equal to the namespace you made the request against. If empty, it is defaulted.", diff --git a/vendor/k8s.io/api/authorization/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/authorization/v1/zz_generated.deepcopy.go index 3df85934a..999933d74 100644 --- a/vendor/k8s.io/api/authorization/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/authorization/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authorization/v1beta1/BUILD b/vendor/k8s.io/api/authorization/v1beta1/BUILD deleted file mode 100644 index 06c953f2a..000000000 --- a/vendor/k8s.io/api/authorization/v1beta1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/authorization/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go b/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go index a9a8116b3..1f8abde4f 100644 --- a/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/authorization/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authorization/v1beta1/generated.proto b/vendor/k8s.io/api/authorization/v1beta1/generated.proto index b64c0642c..98656fbac 100644 --- a/vendor/k8s.io/api/authorization/v1beta1/generated.proto +++ b/vendor/k8s.io/api/authorization/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/authorization/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/authorization/v1beta1/types_swagger_doc_generated.go index 2371b21c6..3ae6e7206 100644 --- a/vendor/k8s.io/api/authorization/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/authorization/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_LocalSubjectAccessReview = map[string]string{ "": "LocalSubjectAccessReview checks whether or not a user or group can perform an action in a given namespace. Having a namespace scoped resource makes it much easier to grant namespace scoped policy that includes permissions checking.", "spec": "Spec holds information about the request being evaluated. spec.namespace must be equal to the namespace you made the request against. If empty, it is defaulted.", diff --git a/vendor/k8s.io/api/authorization/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/authorization/v1beta1/zz_generated.deepcopy.go index 7c76b183b..eb14973cd 100644 --- a/vendor/k8s.io/api/authorization/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/authorization/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/autoscaling/v1/BUILD b/vendor/k8s.io/api/autoscaling/v1/BUILD deleted file mode 100644 index ccf587be0..000000000 --- a/vendor/k8s.io/api/autoscaling/v1/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/autoscaling/v1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/autoscaling/v1/generated.pb.go b/vendor/k8s.io/api/autoscaling/v1/generated.pb.go index 9e2b235eb..84c40a9f4 100644 --- a/vendor/k8s.io/api/autoscaling/v1/generated.pb.go +++ b/vendor/k8s.io/api/autoscaling/v1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/autoscaling/v1/generated.proto b/vendor/k8s.io/api/autoscaling/v1/generated.proto index 64f01f477..2ff7f9e28 100644 --- a/vendor/k8s.io/api/autoscaling/v1/generated.proto +++ b/vendor/k8s.io/api/autoscaling/v1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/autoscaling/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/autoscaling/v1/types_swagger_doc_generated.go index ec364f53e..e84909269 100644 --- a/vendor/k8s.io/api/autoscaling/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/autoscaling/v1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_CrossVersionObjectReference = map[string]string{ "": "CrossVersionObjectReference contains enough information to let you identify the referred resource.", "kind": "Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds\"", diff --git a/vendor/k8s.io/api/autoscaling/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/autoscaling/v1/zz_generated.deepcopy.go index 011275be4..ee9ac01de 100644 --- a/vendor/k8s.io/api/autoscaling/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/autoscaling/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/BUILD b/vendor/k8s.io/api/autoscaling/v2beta1/BUILD deleted file mode 100644 index 32fc333eb..000000000 --- a/vendor/k8s.io/api/autoscaling/v2beta1/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/autoscaling/v2beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go b/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go index 784e4be2b..467345d32 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go +++ b/vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ limitations under the License. k8s.io/kubernetes/vendor/k8s.io/api/autoscaling/v2beta1/generated.proto It has these top-level messages: + ContainerResourcePolicy CrossVersionObjectReference ExternalMetricSource ExternalMetricStatus @@ -37,10 +38,19 @@ limitations under the License. MetricStatus ObjectMetricSource ObjectMetricStatus + PodResourcePolicy + PodUpdatePolicy PodsMetricSource PodsMetricStatus + RecommendedContainerResources + RecommendedPodResources ResourceMetricSource ResourceMetricStatus + VerticalPodAutoscaler + VerticalPodAutoscalerCondition + VerticalPodAutoscalerList + VerticalPodAutoscalerSpec + VerticalPodAutoscalerStatus */ package v2beta1 @@ -53,6 +63,8 @@ import k8s_io_apimachinery_pkg_apis_meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v import k8s_io_api_core_v1 "k8s.io/api/core/v1" +import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" + import strings "strings" import reflect "reflect" @@ -69,81 +81,134 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package +func (m *ContainerResourcePolicy) Reset() { *m = ContainerResourcePolicy{} } +func (*ContainerResourcePolicy) ProtoMessage() {} +func (*ContainerResourcePolicy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } + func (m *CrossVersionObjectReference) Reset() { *m = CrossVersionObjectReference{} } func (*CrossVersionObjectReference) ProtoMessage() {} func (*CrossVersionObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{0} + return fileDescriptorGenerated, []int{1} } func (m *ExternalMetricSource) Reset() { *m = ExternalMetricSource{} } func (*ExternalMetricSource) ProtoMessage() {} -func (*ExternalMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } +func (*ExternalMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} } func (m *ExternalMetricStatus) Reset() { *m = ExternalMetricStatus{} } func (*ExternalMetricStatus) ProtoMessage() {} -func (*ExternalMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} } +func (*ExternalMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{3} } func (m *HorizontalPodAutoscaler) Reset() { *m = HorizontalPodAutoscaler{} } func (*HorizontalPodAutoscaler) ProtoMessage() {} -func (*HorizontalPodAutoscaler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{3} } +func (*HorizontalPodAutoscaler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} } func (m *HorizontalPodAutoscalerCondition) Reset() { *m = HorizontalPodAutoscalerCondition{} } func (*HorizontalPodAutoscalerCondition) ProtoMessage() {} func (*HorizontalPodAutoscalerCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{4} + return fileDescriptorGenerated, []int{5} } func (m *HorizontalPodAutoscalerList) Reset() { *m = HorizontalPodAutoscalerList{} } func (*HorizontalPodAutoscalerList) ProtoMessage() {} func (*HorizontalPodAutoscalerList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{5} + return fileDescriptorGenerated, []int{6} } func (m *HorizontalPodAutoscalerSpec) Reset() { *m = HorizontalPodAutoscalerSpec{} } func (*HorizontalPodAutoscalerSpec) ProtoMessage() {} func (*HorizontalPodAutoscalerSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{6} + return fileDescriptorGenerated, []int{7} } func (m *HorizontalPodAutoscalerStatus) Reset() { *m = HorizontalPodAutoscalerStatus{} } func (*HorizontalPodAutoscalerStatus) ProtoMessage() {} func (*HorizontalPodAutoscalerStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{7} + return fileDescriptorGenerated, []int{8} } func (m *MetricSpec) Reset() { *m = MetricSpec{} } func (*MetricSpec) ProtoMessage() {} -func (*MetricSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } +func (*MetricSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } func (m *MetricStatus) Reset() { *m = MetricStatus{} } func (*MetricStatus) ProtoMessage() {} -func (*MetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } +func (*MetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } func (m *ObjectMetricSource) Reset() { *m = ObjectMetricSource{} } func (*ObjectMetricSource) ProtoMessage() {} -func (*ObjectMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } +func (*ObjectMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } func (m *ObjectMetricStatus) Reset() { *m = ObjectMetricStatus{} } func (*ObjectMetricStatus) ProtoMessage() {} -func (*ObjectMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } +func (*ObjectMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } + +func (m *PodResourcePolicy) Reset() { *m = PodResourcePolicy{} } +func (*PodResourcePolicy) ProtoMessage() {} +func (*PodResourcePolicy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } + +func (m *PodUpdatePolicy) Reset() { *m = PodUpdatePolicy{} } +func (*PodUpdatePolicy) ProtoMessage() {} +func (*PodUpdatePolicy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } func (m *PodsMetricSource) Reset() { *m = PodsMetricSource{} } func (*PodsMetricSource) ProtoMessage() {} -func (*PodsMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } +func (*PodsMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } func (m *PodsMetricStatus) Reset() { *m = PodsMetricStatus{} } func (*PodsMetricStatus) ProtoMessage() {} -func (*PodsMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } +func (*PodsMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } + +func (m *RecommendedContainerResources) Reset() { *m = RecommendedContainerResources{} } +func (*RecommendedContainerResources) ProtoMessage() {} +func (*RecommendedContainerResources) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{17} +} + +func (m *RecommendedPodResources) Reset() { *m = RecommendedPodResources{} } +func (*RecommendedPodResources) ProtoMessage() {} +func (*RecommendedPodResources) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{18} +} func (m *ResourceMetricSource) Reset() { *m = ResourceMetricSource{} } func (*ResourceMetricSource) ProtoMessage() {} -func (*ResourceMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } +func (*ResourceMetricSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } func (m *ResourceMetricStatus) Reset() { *m = ResourceMetricStatus{} } func (*ResourceMetricStatus) ProtoMessage() {} -func (*ResourceMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } +func (*ResourceMetricStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } + +func (m *VerticalPodAutoscaler) Reset() { *m = VerticalPodAutoscaler{} } +func (*VerticalPodAutoscaler) ProtoMessage() {} +func (*VerticalPodAutoscaler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } + +func (m *VerticalPodAutoscalerCondition) Reset() { *m = VerticalPodAutoscalerCondition{} } +func (*VerticalPodAutoscalerCondition) ProtoMessage() {} +func (*VerticalPodAutoscalerCondition) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{22} +} + +func (m *VerticalPodAutoscalerList) Reset() { *m = VerticalPodAutoscalerList{} } +func (*VerticalPodAutoscalerList) ProtoMessage() {} +func (*VerticalPodAutoscalerList) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{23} +} + +func (m *VerticalPodAutoscalerSpec) Reset() { *m = VerticalPodAutoscalerSpec{} } +func (*VerticalPodAutoscalerSpec) ProtoMessage() {} +func (*VerticalPodAutoscalerSpec) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{24} +} + +func (m *VerticalPodAutoscalerStatus) Reset() { *m = VerticalPodAutoscalerStatus{} } +func (*VerticalPodAutoscalerStatus) ProtoMessage() {} +func (*VerticalPodAutoscalerStatus) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{25} +} func init() { + proto.RegisterType((*ContainerResourcePolicy)(nil), "k8s.io.api.autoscaling.v2beta1.ContainerResourcePolicy") proto.RegisterType((*CrossVersionObjectReference)(nil), "k8s.io.api.autoscaling.v2beta1.CrossVersionObjectReference") proto.RegisterType((*ExternalMetricSource)(nil), "k8s.io.api.autoscaling.v2beta1.ExternalMetricSource") proto.RegisterType((*ExternalMetricStatus)(nil), "k8s.io.api.autoscaling.v2beta1.ExternalMetricStatus") @@ -156,11 +221,110 @@ func init() { proto.RegisterType((*MetricStatus)(nil), "k8s.io.api.autoscaling.v2beta1.MetricStatus") proto.RegisterType((*ObjectMetricSource)(nil), "k8s.io.api.autoscaling.v2beta1.ObjectMetricSource") proto.RegisterType((*ObjectMetricStatus)(nil), "k8s.io.api.autoscaling.v2beta1.ObjectMetricStatus") + proto.RegisterType((*PodResourcePolicy)(nil), "k8s.io.api.autoscaling.v2beta1.PodResourcePolicy") + proto.RegisterType((*PodUpdatePolicy)(nil), "k8s.io.api.autoscaling.v2beta1.PodUpdatePolicy") proto.RegisterType((*PodsMetricSource)(nil), "k8s.io.api.autoscaling.v2beta1.PodsMetricSource") proto.RegisterType((*PodsMetricStatus)(nil), "k8s.io.api.autoscaling.v2beta1.PodsMetricStatus") + proto.RegisterType((*RecommendedContainerResources)(nil), "k8s.io.api.autoscaling.v2beta1.RecommendedContainerResources") + proto.RegisterType((*RecommendedPodResources)(nil), "k8s.io.api.autoscaling.v2beta1.RecommendedPodResources") proto.RegisterType((*ResourceMetricSource)(nil), "k8s.io.api.autoscaling.v2beta1.ResourceMetricSource") proto.RegisterType((*ResourceMetricStatus)(nil), "k8s.io.api.autoscaling.v2beta1.ResourceMetricStatus") + proto.RegisterType((*VerticalPodAutoscaler)(nil), "k8s.io.api.autoscaling.v2beta1.VerticalPodAutoscaler") + proto.RegisterType((*VerticalPodAutoscalerCondition)(nil), "k8s.io.api.autoscaling.v2beta1.VerticalPodAutoscalerCondition") + proto.RegisterType((*VerticalPodAutoscalerList)(nil), "k8s.io.api.autoscaling.v2beta1.VerticalPodAutoscalerList") + proto.RegisterType((*VerticalPodAutoscalerSpec)(nil), "k8s.io.api.autoscaling.v2beta1.VerticalPodAutoscalerSpec") + proto.RegisterType((*VerticalPodAutoscalerStatus)(nil), "k8s.io.api.autoscaling.v2beta1.VerticalPodAutoscalerStatus") } +func (m *ContainerResourcePolicy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerResourcePolicy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ContainerName))) + i += copy(dAtA[i:], m.ContainerName) + if m.Mode != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.Mode))) + i += copy(dAtA[i:], *m.Mode) + } + if len(m.MinAllowed) > 0 { + keysForMinAllowed := make([]string, 0, len(m.MinAllowed)) + for k := range m.MinAllowed { + keysForMinAllowed = append(keysForMinAllowed, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMinAllowed) + for _, k := range keysForMinAllowed { + dAtA[i] = 0x1a + i++ + v := m.MinAllowed[k8s_io_api_core_v1.ResourceName(k)] + msgSize := 0 + if (&v) != nil { + msgSize = (&v).Size() + msgSize += 1 + sovGenerated(uint64(msgSize)) + } + mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + msgSize + i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(k))) + i += copy(dAtA[i:], k) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) + n1, err := (&v).MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + } + if len(m.MaxAllowed) > 0 { + keysForMaxAllowed := make([]string, 0, len(m.MaxAllowed)) + for k := range m.MaxAllowed { + keysForMaxAllowed = append(keysForMaxAllowed, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMaxAllowed) + for _, k := range keysForMaxAllowed { + dAtA[i] = 0x22 + i++ + v := m.MaxAllowed[k8s_io_api_core_v1.ResourceName(k)] + msgSize := 0 + if (&v) != nil { + msgSize = (&v).Size() + msgSize += 1 + sovGenerated(uint64(msgSize)) + } + mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + msgSize + i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(k))) + i += copy(dAtA[i:], k) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) + n2, err := (&v).MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + } + return i, nil +} + func (m *CrossVersionObjectReference) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -214,31 +378,31 @@ func (m *ExternalMetricSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.MetricSelector.Size())) - n1, err := m.MetricSelector.MarshalTo(dAtA[i:]) + n3, err := m.MetricSelector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n1 + i += n3 } if m.TargetValue != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetValue.Size())) - n2, err := m.TargetValue.MarshalTo(dAtA[i:]) + n4, err := m.TargetValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n2 + i += n4 } if m.TargetAverageValue != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetAverageValue.Size())) - n3, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) + n5, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n3 + i += n5 } return i, nil } @@ -266,30 +430,30 @@ func (m *ExternalMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.MetricSelector.Size())) - n4, err := m.MetricSelector.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n4 - } - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentValue.Size())) - n5, err := m.CurrentValue.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n5 - if m.CurrentAverageValue != nil { - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentAverageValue.Size())) - n6, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) + n6, err := m.MetricSelector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n6 } + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentValue.Size())) + n7, err := m.CurrentValue.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + if m.CurrentAverageValue != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentAverageValue.Size())) + n8, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + } return i, nil } @@ -311,27 +475,27 @@ func (m *HorizontalPodAutoscaler) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n7, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n7 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n8, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n8 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n9, err := m.Status.MarshalTo(dAtA[i:]) + n9, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n9 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n10, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n10 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n11, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n11 return i, nil } @@ -361,11 +525,11 @@ func (m *HorizontalPodAutoscalerCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n10, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n12, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n10 + i += n12 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -395,11 +559,11 @@ func (m *HorizontalPodAutoscalerList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n11, err := m.ListMeta.MarshalTo(dAtA[i:]) + n13, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n11 + i += n13 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -433,11 +597,11 @@ func (m *HorizontalPodAutoscalerSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleTargetRef.Size())) - n12, err := m.ScaleTargetRef.MarshalTo(dAtA[i:]) + n14, err := m.ScaleTargetRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n12 + i += n14 if m.MinReplicas != nil { dAtA[i] = 0x10 i++ @@ -485,11 +649,11 @@ func (m *HorizontalPodAutoscalerStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastScaleTime.Size())) - n13, err := m.LastScaleTime.MarshalTo(dAtA[i:]) + n15, err := m.LastScaleTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n13 + i += n15 } dAtA[i] = 0x18 i++ @@ -547,42 +711,42 @@ func (m *MetricSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Object.Size())) - n14, err := m.Object.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n14 - } - if m.Pods != nil { - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Pods.Size())) - n15, err := m.Pods.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n15 - } - if m.Resource != nil { - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Resource.Size())) - n16, err := m.Resource.MarshalTo(dAtA[i:]) + n16, err := m.Object.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n16 } - if m.External != nil { - dAtA[i] = 0x2a + if m.Pods != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.External.Size())) - n17, err := m.External.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Pods.Size())) + n17, err := m.Pods.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n17 } + if m.Resource != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Resource.Size())) + n18, err := m.Resource.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n18 + } + if m.External != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.External.Size())) + n19, err := m.External.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n19 + } return i, nil } @@ -609,42 +773,42 @@ func (m *MetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Object.Size())) - n18, err := m.Object.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n18 - } - if m.Pods != nil { - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Pods.Size())) - n19, err := m.Pods.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n19 - } - if m.Resource != nil { - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Resource.Size())) - n20, err := m.Resource.MarshalTo(dAtA[i:]) + n20, err := m.Object.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n20 } - if m.External != nil { - dAtA[i] = 0x2a + if m.Pods != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.External.Size())) - n21, err := m.External.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Pods.Size())) + n21, err := m.Pods.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n21 } + if m.Resource != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Resource.Size())) + n22, err := m.Resource.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n22 + } + if m.External != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.External.Size())) + n23, err := m.External.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n23 + } return i, nil } @@ -666,11 +830,11 @@ func (m *ObjectMetricSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Target.Size())) - n22, err := m.Target.MarshalTo(dAtA[i:]) + n24, err := m.Target.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n22 + i += n24 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.MetricName))) @@ -678,11 +842,11 @@ func (m *ObjectMetricSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetValue.Size())) - n23, err := m.TargetValue.MarshalTo(dAtA[i:]) + n25, err := m.TargetValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n23 + i += n25 return i, nil } @@ -704,11 +868,11 @@ func (m *ObjectMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Target.Size())) - n24, err := m.Target.MarshalTo(dAtA[i:]) + n26, err := m.Target.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n24 + i += n26 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.MetricName))) @@ -716,11 +880,65 @@ func (m *ObjectMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentValue.Size())) - n25, err := m.CurrentValue.MarshalTo(dAtA[i:]) + n27, err := m.CurrentValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n27 + return i, nil +} + +func (m *PodResourcePolicy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodResourcePolicy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.ContainerPolicies) > 0 { + for _, msg := range m.ContainerPolicies { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *PodUpdatePolicy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodUpdatePolicy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.UpdateMode != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.UpdateMode))) + i += copy(dAtA[i:], *m.UpdateMode) + } return i, nil } @@ -746,11 +964,11 @@ func (m *PodsMetricSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetAverageValue.Size())) - n26, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) + n28, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n28 return i, nil } @@ -776,11 +994,156 @@ func (m *PodsMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentAverageValue.Size())) - n27, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) + n29, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n29 + return i, nil +} + +func (m *RecommendedContainerResources) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RecommendedContainerResources) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ContainerName))) + i += copy(dAtA[i:], m.ContainerName) + if len(m.Target) > 0 { + keysForTarget := make([]string, 0, len(m.Target)) + for k := range m.Target { + keysForTarget = append(keysForTarget, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForTarget) + for _, k := range keysForTarget { + dAtA[i] = 0x12 + i++ + v := m.Target[k8s_io_api_core_v1.ResourceName(k)] + msgSize := 0 + if (&v) != nil { + msgSize = (&v).Size() + msgSize += 1 + sovGenerated(uint64(msgSize)) + } + mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + msgSize + i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(k))) + i += copy(dAtA[i:], k) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) + n30, err := (&v).MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n30 + } + } + if len(m.LowerBound) > 0 { + keysForLowerBound := make([]string, 0, len(m.LowerBound)) + for k := range m.LowerBound { + keysForLowerBound = append(keysForLowerBound, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForLowerBound) + for _, k := range keysForLowerBound { + dAtA[i] = 0x1a + i++ + v := m.LowerBound[k8s_io_api_core_v1.ResourceName(k)] + msgSize := 0 + if (&v) != nil { + msgSize = (&v).Size() + msgSize += 1 + sovGenerated(uint64(msgSize)) + } + mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + msgSize + i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(k))) + i += copy(dAtA[i:], k) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) + n31, err := (&v).MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n31 + } + } + if len(m.UpperBound) > 0 { + keysForUpperBound := make([]string, 0, len(m.UpperBound)) + for k := range m.UpperBound { + keysForUpperBound = append(keysForUpperBound, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForUpperBound) + for _, k := range keysForUpperBound { + dAtA[i] = 0x22 + i++ + v := m.UpperBound[k8s_io_api_core_v1.ResourceName(k)] + msgSize := 0 + if (&v) != nil { + msgSize = (&v).Size() + msgSize += 1 + sovGenerated(uint64(msgSize)) + } + mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + msgSize + i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(k))) + i += copy(dAtA[i:], k) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) + n32, err := (&v).MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n32 + } + } + return i, nil +} + +func (m *RecommendedPodResources) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RecommendedPodResources) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.ContainerRecommendations) > 0 { + for _, msg := range m.ContainerRecommendations { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -812,11 +1175,11 @@ func (m *ResourceMetricSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetAverageValue.Size())) - n28, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) + n33, err := m.TargetAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n33 } return i, nil } @@ -848,11 +1211,221 @@ func (m *ResourceMetricStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CurrentAverageValue.Size())) - n29, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) + n34, err := m.CurrentAverageValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n34 + return i, nil +} + +func (m *VerticalPodAutoscaler) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VerticalPodAutoscaler) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) + n35, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n35 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n36, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n36 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n37, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n37 + return i, nil +} + +func (m *VerticalPodAutoscalerCondition) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VerticalPodAutoscalerCondition) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) + n38, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n38 + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) + i += copy(dAtA[i:], m.Reason) + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) + i += copy(dAtA[i:], m.Message) + return i, nil +} + +func (m *VerticalPodAutoscalerList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VerticalPodAutoscalerList) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) + n39, err := m.ListMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n39 + if len(m.Items) > 0 { + for _, msg := range m.Items { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *VerticalPodAutoscalerSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VerticalPodAutoscalerSpec) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Selector != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) + n40, err := m.Selector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n40 + } + if m.UpdatePolicy != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.UpdatePolicy.Size())) + n41, err := m.UpdatePolicy.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n41 + } + if m.ResourcePolicy != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ResourcePolicy.Size())) + n42, err := m.ResourcePolicy.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n42 + } + return i, nil +} + +func (m *VerticalPodAutoscalerStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *VerticalPodAutoscalerStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Recommendation != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Recommendation.Size())) + n43, err := m.Recommendation.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n43 + } + if len(m.Conditions) > 0 { + for _, msg := range m.Conditions { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -883,6 +1456,36 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return offset + 1 } +func (m *ContainerResourcePolicy) Size() (n int) { + var l int + _ = l + l = len(m.ContainerName) + n += 1 + l + sovGenerated(uint64(l)) + if m.Mode != nil { + l = len(*m.Mode) + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.MinAllowed) > 0 { + for k, v := range m.MinAllowed { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if len(m.MaxAllowed) > 0 { + for k, v := range m.MaxAllowed { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + func (m *CrossVersionObjectReference) Size() (n int) { var l int _ = l @@ -1092,6 +1695,28 @@ func (m *ObjectMetricStatus) Size() (n int) { return n } +func (m *PodResourcePolicy) Size() (n int) { + var l int + _ = l + if len(m.ContainerPolicies) > 0 { + for _, e := range m.ContainerPolicies { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *PodUpdatePolicy) Size() (n int) { + var l int + _ = l + if m.UpdateMode != nil { + l = len(*m.UpdateMode) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *PodsMetricSource) Size() (n int) { var l int _ = l @@ -1112,6 +1737,53 @@ func (m *PodsMetricStatus) Size() (n int) { return n } +func (m *RecommendedContainerResources) Size() (n int) { + var l int + _ = l + l = len(m.ContainerName) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Target) > 0 { + for k, v := range m.Target { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if len(m.LowerBound) > 0 { + for k, v := range m.LowerBound { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if len(m.UpperBound) > 0 { + for k, v := range m.UpperBound { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *RecommendedPodResources) Size() (n int) { + var l int + _ = l + if len(m.ContainerRecommendations) > 0 { + for _, e := range m.ContainerRecommendations { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *ResourceMetricSource) Size() (n int) { var l int _ = l @@ -1140,6 +1812,82 @@ func (m *ResourceMetricStatus) Size() (n int) { return n } +func (m *VerticalPodAutoscaler) Size() (n int) { + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *VerticalPodAutoscalerCondition) Size() (n int) { + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Status) + n += 1 + l + sovGenerated(uint64(l)) + l = m.LastTransitionTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Message) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *VerticalPodAutoscalerList) Size() (n int) { + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *VerticalPodAutoscalerSpec) Size() (n int) { + var l int + _ = l + if m.Selector != nil { + l = m.Selector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.UpdatePolicy != nil { + l = m.UpdatePolicy.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ResourcePolicy != nil { + l = m.ResourcePolicy.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *VerticalPodAutoscalerStatus) Size() (n int) { + var l int + _ = l + if m.Recommendation != nil { + l = m.Recommendation.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func sovGenerated(x uint64) (n int) { for { n++ @@ -1153,6 +1901,39 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *ContainerResourcePolicy) String() string { + if this == nil { + return "nil" + } + keysForMinAllowed := make([]string, 0, len(this.MinAllowed)) + for k := range this.MinAllowed { + keysForMinAllowed = append(keysForMinAllowed, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMinAllowed) + mapStringForMinAllowed := "k8s_io_api_core_v1.ResourceList{" + for _, k := range keysForMinAllowed { + mapStringForMinAllowed += fmt.Sprintf("%v: %v,", k, this.MinAllowed[k8s_io_api_core_v1.ResourceName(k)]) + } + mapStringForMinAllowed += "}" + keysForMaxAllowed := make([]string, 0, len(this.MaxAllowed)) + for k := range this.MaxAllowed { + keysForMaxAllowed = append(keysForMaxAllowed, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMaxAllowed) + mapStringForMaxAllowed := "k8s_io_api_core_v1.ResourceList{" + for _, k := range keysForMaxAllowed { + mapStringForMaxAllowed += fmt.Sprintf("%v: %v,", k, this.MaxAllowed[k8s_io_api_core_v1.ResourceName(k)]) + } + mapStringForMaxAllowed += "}" + s := strings.Join([]string{`&ContainerResourcePolicy{`, + `ContainerName:` + fmt.Sprintf("%v", this.ContainerName) + `,`, + `Mode:` + valueToStringGenerated(this.Mode) + `,`, + `MinAllowed:` + mapStringForMinAllowed + `,`, + `MaxAllowed:` + mapStringForMaxAllowed + `,`, + `}`, + }, "") + return s +} func (this *CrossVersionObjectReference) String() string { if this == nil { return "nil" @@ -1308,6 +2089,26 @@ func (this *ObjectMetricStatus) String() string { }, "") return s } +func (this *PodResourcePolicy) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodResourcePolicy{`, + `ContainerPolicies:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ContainerPolicies), "ContainerResourcePolicy", "ContainerResourcePolicy", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *PodUpdatePolicy) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodUpdatePolicy{`, + `UpdateMode:` + valueToStringGenerated(this.UpdateMode) + `,`, + `}`, + }, "") + return s +} func (this *PodsMetricSource) String() string { if this == nil { return "nil" @@ -1330,6 +2131,59 @@ func (this *PodsMetricStatus) String() string { }, "") return s } +func (this *RecommendedContainerResources) String() string { + if this == nil { + return "nil" + } + keysForTarget := make([]string, 0, len(this.Target)) + for k := range this.Target { + keysForTarget = append(keysForTarget, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForTarget) + mapStringForTarget := "k8s_io_api_core_v1.ResourceList{" + for _, k := range keysForTarget { + mapStringForTarget += fmt.Sprintf("%v: %v,", k, this.Target[k8s_io_api_core_v1.ResourceName(k)]) + } + mapStringForTarget += "}" + keysForLowerBound := make([]string, 0, len(this.LowerBound)) + for k := range this.LowerBound { + keysForLowerBound = append(keysForLowerBound, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForLowerBound) + mapStringForLowerBound := "k8s_io_api_core_v1.ResourceList{" + for _, k := range keysForLowerBound { + mapStringForLowerBound += fmt.Sprintf("%v: %v,", k, this.LowerBound[k8s_io_api_core_v1.ResourceName(k)]) + } + mapStringForLowerBound += "}" + keysForUpperBound := make([]string, 0, len(this.UpperBound)) + for k := range this.UpperBound { + keysForUpperBound = append(keysForUpperBound, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForUpperBound) + mapStringForUpperBound := "k8s_io_api_core_v1.ResourceList{" + for _, k := range keysForUpperBound { + mapStringForUpperBound += fmt.Sprintf("%v: %v,", k, this.UpperBound[k8s_io_api_core_v1.ResourceName(k)]) + } + mapStringForUpperBound += "}" + s := strings.Join([]string{`&RecommendedContainerResources{`, + `ContainerName:` + fmt.Sprintf("%v", this.ContainerName) + `,`, + `Target:` + mapStringForTarget + `,`, + `LowerBound:` + mapStringForLowerBound + `,`, + `UpperBound:` + mapStringForUpperBound + `,`, + `}`, + }, "") + return s +} +func (this *RecommendedPodResources) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&RecommendedPodResources{`, + `ContainerRecommendations:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ContainerRecommendations), "RecommendedContainerResources", "RecommendedContainerResources", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} func (this *ResourceMetricSource) String() string { if this == nil { return "nil" @@ -1354,6 +2208,66 @@ func (this *ResourceMetricStatus) String() string { }, "") return s } +func (this *VerticalPodAutoscaler) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&VerticalPodAutoscaler{`, + `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "VerticalPodAutoscalerSpec", "VerticalPodAutoscalerSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "VerticalPodAutoscalerStatus", "VerticalPodAutoscalerStatus", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *VerticalPodAutoscalerCondition) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&VerticalPodAutoscalerCondition{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Status:` + fmt.Sprintf("%v", this.Status) + `,`, + `LastTransitionTime:` + strings.Replace(strings.Replace(this.LastTransitionTime.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`, + `Reason:` + fmt.Sprintf("%v", this.Reason) + `,`, + `Message:` + fmt.Sprintf("%v", this.Message) + `,`, + `}`, + }, "") + return s +} +func (this *VerticalPodAutoscalerList) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&VerticalPodAutoscalerList{`, + `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "VerticalPodAutoscaler", "VerticalPodAutoscaler", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *VerticalPodAutoscalerSpec) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&VerticalPodAutoscalerSpec{`, + `Selector:` + strings.Replace(fmt.Sprintf("%v", this.Selector), "LabelSelector", "k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector", 1) + `,`, + `UpdatePolicy:` + strings.Replace(fmt.Sprintf("%v", this.UpdatePolicy), "PodUpdatePolicy", "PodUpdatePolicy", 1) + `,`, + `ResourcePolicy:` + strings.Replace(fmt.Sprintf("%v", this.ResourcePolicy), "PodResourcePolicy", "PodResourcePolicy", 1) + `,`, + `}`, + }, "") + return s +} +func (this *VerticalPodAutoscalerStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&VerticalPodAutoscalerStatus{`, + `Recommendation:` + strings.Replace(fmt.Sprintf("%v", this.Recommendation), "RecommendedPodResources", "RecommendedPodResources", 1) + `,`, + `Conditions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Conditions), "VerticalPodAutoscalerCondition", "VerticalPodAutoscalerCondition", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} func valueToStringGenerated(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -1362,6 +2276,357 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *ContainerResourcePolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContainerResourcePolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContainerResourcePolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContainerName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Mode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := ContainerScalingMode(dAtA[iNdEx:postIndex]) + m.Mode = &s + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinAllowed", 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 > l { + return io.ErrUnexpectedEOF + } + var keykey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + keykey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey := k8s_io_api_core_v1.ResourceName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + if m.MinAllowed == nil { + m.MinAllowed = make(k8s_io_api_core_v1.ResourceList) + } + if iNdEx < postIndex { + var valuekey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + valuekey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue := &k8s_io_apimachinery_pkg_api_resource.Quantity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + m.MinAllowed[k8s_io_api_core_v1.ResourceName(mapkey)] = *mapvalue + } else { + var mapvalue k8s_io_apimachinery_pkg_api_resource.Quantity + m.MinAllowed[k8s_io_api_core_v1.ResourceName(mapkey)] = mapvalue + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxAllowed", 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 > l { + return io.ErrUnexpectedEOF + } + var keykey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + keykey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey := k8s_io_api_core_v1.ResourceName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + if m.MaxAllowed == nil { + m.MaxAllowed = make(k8s_io_api_core_v1.ResourceList) + } + if iNdEx < postIndex { + var valuekey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + valuekey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue := &k8s_io_apimachinery_pkg_api_resource.Quantity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + m.MaxAllowed[k8s_io_api_core_v1.ResourceName(mapkey)] = *mapvalue + } else { + var mapvalue k8s_io_apimachinery_pkg_api_resource.Quantity + m.MaxAllowed[k8s_io_api_core_v1.ResourceName(mapkey)] = mapvalue + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CrossVersionObjectReference) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3352,6 +4617,167 @@ func (m *ObjectMetricStatus) Unmarshal(dAtA []byte) error { } return nil } +func (m *PodResourcePolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodResourcePolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodResourcePolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerPolicies", 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 > l { + return io.ErrUnexpectedEOF + } + m.ContainerPolicies = append(m.ContainerPolicies, ContainerResourcePolicy{}) + if err := m.ContainerPolicies[len(m.ContainerPolicies)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PodUpdatePolicy) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodUpdatePolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodUpdatePolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdateMode", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := UpdateMode(dAtA[iNdEx:postIndex]) + m.UpdateMode = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *PodsMetricSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3570,6 +4996,529 @@ func (m *PodsMetricStatus) Unmarshal(dAtA []byte) error { } return nil } +func (m *RecommendedContainerResources) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RecommendedContainerResources: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RecommendedContainerResources: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContainerName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", 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 > l { + return io.ErrUnexpectedEOF + } + var keykey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + keykey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey := k8s_io_api_core_v1.ResourceName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + if m.Target == nil { + m.Target = make(k8s_io_api_core_v1.ResourceList) + } + if iNdEx < postIndex { + var valuekey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + valuekey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue := &k8s_io_apimachinery_pkg_api_resource.Quantity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + m.Target[k8s_io_api_core_v1.ResourceName(mapkey)] = *mapvalue + } else { + var mapvalue k8s_io_apimachinery_pkg_api_resource.Quantity + m.Target[k8s_io_api_core_v1.ResourceName(mapkey)] = mapvalue + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LowerBound", 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 > l { + return io.ErrUnexpectedEOF + } + var keykey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + keykey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey := k8s_io_api_core_v1.ResourceName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + if m.LowerBound == nil { + m.LowerBound = make(k8s_io_api_core_v1.ResourceList) + } + if iNdEx < postIndex { + var valuekey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + valuekey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue := &k8s_io_apimachinery_pkg_api_resource.Quantity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + m.LowerBound[k8s_io_api_core_v1.ResourceName(mapkey)] = *mapvalue + } else { + var mapvalue k8s_io_apimachinery_pkg_api_resource.Quantity + m.LowerBound[k8s_io_api_core_v1.ResourceName(mapkey)] = mapvalue + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpperBound", 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 > l { + return io.ErrUnexpectedEOF + } + var keykey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + keykey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey := k8s_io_api_core_v1.ResourceName(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + if m.UpperBound == nil { + m.UpperBound = make(k8s_io_api_core_v1.ResourceList) + } + if iNdEx < postIndex { + var valuekey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + valuekey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue := &k8s_io_apimachinery_pkg_api_resource.Quantity{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + m.UpperBound[k8s_io_api_core_v1.ResourceName(mapkey)] = *mapvalue + } else { + var mapvalue k8s_io_apimachinery_pkg_api_resource.Quantity + m.UpperBound[k8s_io_api_core_v1.ResourceName(mapkey)] = mapvalue + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RecommendedPodResources) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RecommendedPodResources: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RecommendedPodResources: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerRecommendations", 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 > l { + return io.ErrUnexpectedEOF + } + m.ContainerRecommendations = append(m.ContainerRecommendations, RecommendedContainerResources{}) + if err := m.ContainerRecommendations[len(m.ContainerRecommendations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ResourceMetricSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3831,6 +5780,716 @@ func (m *ResourceMetricStatus) Unmarshal(dAtA []byte) error { } return nil } +func (m *VerticalPodAutoscaler) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VerticalPodAutoscaler: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VerticalPodAutoscaler: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", 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 > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", 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 > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", 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 > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *VerticalPodAutoscalerCondition) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VerticalPodAutoscalerCondition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VerticalPodAutoscalerCondition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = VerticalPodAutoscalerConditionType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = k8s_io_api_core_v1.ConditionStatus(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastTransitionTime", 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 > l { + return io.ErrUnexpectedEOF + } + if err := m.LastTransitionTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Reason = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *VerticalPodAutoscalerList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VerticalPodAutoscalerList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VerticalPodAutoscalerList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", 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 > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", 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 > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, VerticalPodAutoscaler{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *VerticalPodAutoscalerSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VerticalPodAutoscalerSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VerticalPodAutoscalerSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Selector", 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 > l { + return io.ErrUnexpectedEOF + } + if m.Selector == nil { + m.Selector = &k8s_io_apimachinery_pkg_apis_meta_v1.LabelSelector{} + } + if err := m.Selector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdatePolicy", 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 > l { + return io.ErrUnexpectedEOF + } + if m.UpdatePolicy == nil { + m.UpdatePolicy = &PodUpdatePolicy{} + } + if err := m.UpdatePolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourcePolicy", 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 > l { + return io.ErrUnexpectedEOF + } + if m.ResourcePolicy == nil { + m.ResourcePolicy = &PodResourcePolicy{} + } + if err := m.ResourcePolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *VerticalPodAutoscalerStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: VerticalPodAutoscalerStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: VerticalPodAutoscalerStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Recommendation", 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 > l { + return io.ErrUnexpectedEOF + } + if m.Recommendation == nil { + m.Recommendation = &RecommendedPodResources{} + } + if err := m.Recommendation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", 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 > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, VerticalPodAutoscalerCondition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipGenerated(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 @@ -3941,96 +6600,133 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1441 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xcd, 0x8f, 0x1b, 0xc5, - 0x12, 0x5f, 0x7f, 0xec, 0x66, 0xd3, 0xde, 0xec, 0xe6, 0x75, 0xa2, 0xc4, 0xd9, 0xbc, 0xd8, 0xab, - 0xd1, 0xd3, 0x53, 0x88, 0xc8, 0x4c, 0xe2, 0x2c, 0x1f, 0x12, 0x42, 0x62, 0x6d, 0x20, 0x89, 0x58, - 0x27, 0xa1, 0x77, 0x13, 0x21, 0x08, 0x88, 0xf6, 0xb8, 0xe3, 0x6d, 0xd6, 0x33, 0x63, 0x75, 0xb7, - 0xad, 0x6c, 0x10, 0x12, 0x17, 0xee, 0x1c, 0xf8, 0xb8, 0x72, 0x46, 0x70, 0x85, 0x33, 0x48, 0x48, - 0x39, 0xe6, 0x18, 0x84, 0x64, 0x91, 0xe1, 0xbf, 0xc8, 0x09, 0x4d, 0x77, 0xcf, 0x78, 0xc6, 0xf6, - 0xac, 0x1d, 0xb3, 0x09, 0x70, 0x9b, 0xee, 0xaa, 0xfa, 0x55, 0x75, 0x55, 0x75, 0x75, 0xd5, 0x80, - 0xcb, 0xbb, 0x2f, 0x73, 0x93, 0x7a, 0xd6, 0x6e, 0xb7, 0x41, 0x98, 0x4b, 0x04, 0xe1, 0x56, 0x8f, - 0xb8, 0x4d, 0x8f, 0x59, 0x9a, 0x80, 0x3b, 0xd4, 0xc2, 0x5d, 0xe1, 0x71, 0x1b, 0xb7, 0xa9, 0xdb, - 0xb2, 0x7a, 0x95, 0x06, 0x11, 0xf8, 0xa2, 0xd5, 0x22, 0x2e, 0x61, 0x58, 0x90, 0xa6, 0xd9, 0x61, - 0x9e, 0xf0, 0x60, 0x49, 0xf1, 0x9b, 0xb8, 0x43, 0xcd, 0x18, 0xbf, 0xa9, 0xf9, 0x57, 0xcf, 0xb7, - 0xa8, 0xd8, 0xe9, 0x36, 0x4c, 0xdb, 0x73, 0xac, 0x96, 0xd7, 0xf2, 0x2c, 0x29, 0xd6, 0xe8, 0xde, - 0x91, 0x2b, 0xb9, 0x90, 0x5f, 0x0a, 0x6e, 0xd5, 0x88, 0xa9, 0xb7, 0x3d, 0x46, 0xac, 0xde, 0x88, - 0xca, 0xd5, 0xf5, 0x01, 0x8f, 0x83, 0xed, 0x1d, 0xea, 0x12, 0xb6, 0x67, 0x75, 0x76, 0x5b, 0x52, - 0x88, 0x11, 0xee, 0x75, 0x99, 0x4d, 0x9e, 0x48, 0x8a, 0x5b, 0x0e, 0x11, 0x78, 0x9c, 0x2e, 0x2b, - 0x4d, 0x8a, 0x75, 0x5d, 0x41, 0x9d, 0x51, 0x35, 0x2f, 0x4e, 0x12, 0xe0, 0xf6, 0x0e, 0x71, 0xf0, - 0x88, 0xdc, 0xa5, 0x34, 0xb9, 0xae, 0xa0, 0x6d, 0x8b, 0xba, 0x82, 0x0b, 0x36, 0x2c, 0x64, 0x7c, - 0x99, 0x01, 0xa7, 0x6b, 0xcc, 0xe3, 0xfc, 0x16, 0x61, 0x9c, 0x7a, 0xee, 0xf5, 0xc6, 0x47, 0xc4, - 0x16, 0x88, 0xdc, 0x21, 0x8c, 0xb8, 0x36, 0x81, 0x6b, 0x20, 0xbf, 0x4b, 0xdd, 0x66, 0x31, 0xb3, - 0x96, 0x39, 0x7b, 0xb8, 0xba, 0x74, 0xbf, 0x5f, 0x9e, 0xf3, 0xfb, 0xe5, 0xfc, 0x5b, 0xd4, 0x6d, - 0x22, 0x49, 0x09, 0x38, 0x5c, 0xec, 0x90, 0x62, 0x36, 0xc9, 0x71, 0x0d, 0x3b, 0x04, 0x49, 0x0a, - 0xac, 0x00, 0x80, 0x3b, 0x54, 0x2b, 0x28, 0xe6, 0x24, 0x1f, 0xd4, 0x7c, 0x60, 0xe3, 0xc6, 0x55, - 0x4d, 0x41, 0x31, 0x2e, 0xe3, 0xab, 0x1c, 0x38, 0xfe, 0xc6, 0x5d, 0x41, 0x98, 0x8b, 0xdb, 0x75, - 0x22, 0x18, 0xb5, 0xb7, 0x64, 0x50, 0x02, 0x30, 0x47, 0xae, 0x03, 0x05, 0xda, 0xac, 0x08, 0xac, - 0x1e, 0x51, 0x50, 0x8c, 0x0b, 0x7a, 0x60, 0x59, 0xad, 0xb6, 0x48, 0x9b, 0xd8, 0xc2, 0x63, 0xd2, - 0xd8, 0x42, 0xe5, 0x92, 0x39, 0x48, 0xbd, 0xc8, 0x65, 0x66, 0x67, 0xb7, 0x15, 0x6c, 0x70, 0x33, - 0x88, 0xa8, 0xd9, 0xbb, 0x68, 0x6e, 0xe2, 0x06, 0x69, 0x87, 0xa2, 0x55, 0xe8, 0xf7, 0xcb, 0xcb, - 0xf5, 0x04, 0x1c, 0x1a, 0x82, 0x87, 0x18, 0x14, 0x04, 0x66, 0x2d, 0x22, 0x6e, 0xe1, 0x76, 0x97, - 0xc8, 0x23, 0x17, 0x2a, 0xe6, 0x7e, 0xda, 0xcc, 0x30, 0xeb, 0xcc, 0xb7, 0xbb, 0xd8, 0x15, 0x54, - 0xec, 0x55, 0x57, 0xfc, 0x7e, 0xb9, 0xb0, 0x3d, 0x80, 0x41, 0x71, 0x4c, 0xd8, 0x03, 0x50, 0x2d, - 0x37, 0x7a, 0x84, 0xe1, 0x16, 0x51, 0x9a, 0xf2, 0x33, 0x69, 0x3a, 0xe1, 0xf7, 0xcb, 0x70, 0x7b, - 0x04, 0x0d, 0x8d, 0xd1, 0x60, 0x7c, 0x33, 0x1a, 0x18, 0x81, 0x45, 0x97, 0xff, 0x3b, 0x02, 0xb3, - 0x03, 0x96, 0xec, 0x2e, 0x63, 0xc4, 0xfd, 0x4b, 0x91, 0x39, 0xae, 0x8f, 0xb5, 0x54, 0x8b, 0x61, - 0xa1, 0x04, 0x32, 0xdc, 0x03, 0xc7, 0xf4, 0xfa, 0x00, 0x02, 0x74, 0xd2, 0xef, 0x97, 0x8f, 0xd5, - 0x46, 0xe1, 0xd0, 0x38, 0x1d, 0xc6, 0x4f, 0x59, 0x70, 0xf2, 0x8a, 0xc7, 0xe8, 0x3d, 0xcf, 0x15, - 0xb8, 0x7d, 0xc3, 0x6b, 0x6e, 0xe8, 0xaa, 0x4a, 0x18, 0xfc, 0x10, 0x2c, 0x06, 0xde, 0x6b, 0x62, - 0x81, 0x65, 0x8c, 0x0a, 0x95, 0x0b, 0xd3, 0xf9, 0x5a, 0x15, 0x86, 0x3a, 0x11, 0x78, 0x10, 0xd5, - 0xc1, 0x1e, 0x8a, 0x50, 0xe1, 0xfb, 0x20, 0xcf, 0x3b, 0xc4, 0xd6, 0x91, 0x7c, 0xc5, 0xdc, 0xbf, - 0xba, 0x9b, 0x29, 0x86, 0x6e, 0x75, 0x88, 0x3d, 0x28, 0x26, 0xc1, 0x0a, 0x49, 0x58, 0x48, 0xc0, - 0x02, 0x97, 0x09, 0xa7, 0x63, 0xf7, 0xea, 0xac, 0x0a, 0x24, 0x48, 0x75, 0x59, 0xab, 0x58, 0x50, - 0x6b, 0xa4, 0xc1, 0x8d, 0xcf, 0x72, 0x60, 0x2d, 0x45, 0xb2, 0xe6, 0xb9, 0x4d, 0x2a, 0xa8, 0xe7, - 0xc2, 0x2b, 0x20, 0x2f, 0xf6, 0x3a, 0x61, 0xb2, 0xaf, 0x87, 0xd6, 0x6e, 0xef, 0x75, 0xc8, 0xe3, - 0x7e, 0xf9, 0x7f, 0x93, 0xe4, 0x03, 0x3e, 0x24, 0x11, 0xe0, 0x66, 0x74, 0xaa, 0x6c, 0x02, 0x4b, - 0x9b, 0xf5, 0xb8, 0x5f, 0x1e, 0xf3, 0xac, 0x99, 0x11, 0x52, 0xd2, 0xf8, 0xa0, 0x36, 0xb4, 0x31, - 0x17, 0xdb, 0x0c, 0xbb, 0x5c, 0x69, 0xa2, 0x4e, 0x98, 0xeb, 0xe7, 0xa6, 0x0b, 0x77, 0x20, 0x51, - 0x5d, 0xd5, 0x56, 0xc0, 0xcd, 0x11, 0x34, 0x34, 0x46, 0x03, 0xfc, 0x3f, 0x58, 0x60, 0x04, 0x73, - 0xcf, 0x95, 0x69, 0x7e, 0x78, 0xe0, 0x5c, 0x24, 0x77, 0x91, 0xa6, 0xc2, 0xe7, 0xc0, 0x21, 0x87, - 0x70, 0x8e, 0x5b, 0xa4, 0x38, 0x2f, 0x19, 0x57, 0x34, 0xe3, 0xa1, 0xba, 0xda, 0x46, 0x21, 0xdd, - 0xf8, 0x35, 0x03, 0x4e, 0xa7, 0xf8, 0x71, 0x93, 0x72, 0x01, 0x6f, 0x8f, 0xe4, 0xb3, 0x39, 0x65, - 0xed, 0xa0, 0x5c, 0x65, 0xf3, 0x51, 0xad, 0x7b, 0x31, 0xdc, 0x89, 0xe5, 0xf2, 0x6d, 0x30, 0x4f, - 0x05, 0x71, 0x82, 0xa8, 0xe4, 0xce, 0x16, 0x2a, 0x2f, 0xcd, 0x98, 0x6b, 0xd5, 0x23, 0x5a, 0xc7, - 0xfc, 0xd5, 0x00, 0x0d, 0x29, 0x50, 0xe3, 0xb7, 0x6c, 0xea, 0xd9, 0x82, 0x84, 0x87, 0x1f, 0x83, - 0x65, 0xb9, 0x52, 0x95, 0x19, 0x91, 0x3b, 0xfa, 0x84, 0x13, 0xef, 0xd4, 0x3e, 0x0f, 0x7a, 0xf5, - 0x84, 0x36, 0x65, 0x79, 0x2b, 0x01, 0x8d, 0x86, 0x54, 0xc1, 0x8b, 0xa0, 0xe0, 0x50, 0x17, 0x91, - 0x4e, 0x9b, 0xda, 0x58, 0xa5, 0xe5, 0xbc, 0x7a, 0x92, 0xea, 0x83, 0x6d, 0x14, 0xe7, 0x81, 0x2f, - 0x80, 0x82, 0x83, 0xef, 0x46, 0x22, 0x39, 0x29, 0x72, 0x4c, 0xeb, 0x2b, 0xd4, 0x07, 0x24, 0x14, - 0xe7, 0x83, 0x37, 0x83, 0x6c, 0x08, 0xaa, 0x34, 0x2f, 0xe6, 0xa5, 0x9b, 0xcf, 0x4d, 0x3a, 0x9f, - 0x2e, 0xf2, 0x41, 0x89, 0x88, 0x65, 0x8e, 0x84, 0x40, 0x21, 0x96, 0xf1, 0x43, 0x1e, 0x9c, 0xd9, - 0xf7, 0xee, 0xc3, 0x37, 0x01, 0xf4, 0x1a, 0x9c, 0xb0, 0x1e, 0x69, 0x5e, 0x56, 0x6d, 0x51, 0xd0, - 0x9f, 0x04, 0x3e, 0xce, 0xa9, 0x27, 0xf1, 0xfa, 0x08, 0x15, 0x8d, 0x91, 0x80, 0x36, 0x38, 0x12, - 0x5c, 0x06, 0xe5, 0x50, 0xaa, 0x5b, 0xa1, 0x27, 0xbb, 0x69, 0xff, 0xf1, 0xfb, 0xe5, 0x23, 0x9b, - 0x71, 0x10, 0x94, 0xc4, 0x84, 0x1b, 0x60, 0x45, 0xd7, 0xfa, 0x21, 0x07, 0x9f, 0xd4, 0x1e, 0x58, - 0xa9, 0x25, 0xc9, 0x68, 0x98, 0x3f, 0x80, 0x68, 0x12, 0x4e, 0x19, 0x69, 0x46, 0x10, 0xf9, 0x24, - 0xc4, 0xeb, 0x49, 0x32, 0x1a, 0xe6, 0x87, 0x6d, 0xb0, 0xac, 0x51, 0xb5, 0xbf, 0x8b, 0xf3, 0x32, - 0x64, 0xcf, 0x4f, 0x19, 0x32, 0x55, 0x74, 0xa3, 0x1c, 0xac, 0x25, 0xb0, 0xd0, 0x10, 0x36, 0x14, - 0x00, 0xd8, 0x61, 0x89, 0xe3, 0xc5, 0x05, 0xa9, 0xe9, 0xb5, 0x19, 0xef, 0x60, 0x54, 0x2b, 0x07, - 0xcf, 0x57, 0xb4, 0xc5, 0x51, 0x4c, 0x8f, 0xf1, 0x6d, 0x0e, 0x80, 0x41, 0x86, 0xc1, 0xf5, 0x44, - 0x91, 0x5f, 0x1b, 0x2a, 0xf2, 0x47, 0xe3, 0xcd, 0x69, 0xac, 0xa0, 0xdf, 0x02, 0x0b, 0x9e, 0xbc, - 0x79, 0x3a, 0x19, 0x2a, 0x93, 0xcc, 0x8e, 0xde, 0xd2, 0x08, 0xad, 0x0a, 0x82, 0xd2, 0xa9, 0xef, - 0xaf, 0x46, 0x83, 0xd7, 0x40, 0xbe, 0xe3, 0x35, 0xc3, 0xc7, 0xef, 0xc2, 0x24, 0xd4, 0x1b, 0x5e, - 0x93, 0x27, 0x30, 0x17, 0x03, 0xdb, 0x83, 0x5d, 0x24, 0x71, 0xe0, 0x07, 0x60, 0x31, 0x6c, 0x37, - 0x74, 0x6f, 0xb2, 0x3e, 0x09, 0x13, 0x69, 0xfe, 0x04, 0xee, 0x52, 0x50, 0x41, 0x43, 0x0a, 0x8a, - 0x30, 0x03, 0x7c, 0xa2, 0xbb, 0x45, 0x59, 0xeb, 0xa7, 0xc0, 0x1f, 0xd7, 0xf6, 0x2b, 0xfc, 0x90, - 0x82, 0x22, 0x4c, 0xe3, 0xbb, 0x1c, 0x58, 0x4a, 0xb4, 0xa1, 0x7f, 0x47, 0xb8, 0x54, 0x56, 0x1f, - 0x6c, 0xb8, 0x14, 0xe6, 0xc1, 0x87, 0x4b, 0xe1, 0x3e, 0xbd, 0x70, 0xc5, 0xf0, 0xc7, 0x84, 0xeb, - 0x8b, 0x2c, 0x80, 0xa3, 0x99, 0x0e, 0x6d, 0xb0, 0xa0, 0x46, 0x8d, 0x83, 0x78, 0xe1, 0xa2, 0xae, - 0x43, 0x3f, 0x66, 0x1a, 0x7a, 0x68, 0x40, 0xc9, 0x4e, 0x35, 0xa0, 0x90, 0x83, 0x18, 0xe4, 0xa2, - 0x27, 0x30, 0x6d, 0x98, 0x33, 0xbe, 0x1e, 0x76, 0x8b, 0xca, 0xe5, 0x7f, 0xac, 0x5b, 0x9e, 0xd9, - 0x18, 0x65, 0xfc, 0x9c, 0x01, 0x47, 0x87, 0x8b, 0xd8, 0x4c, 0xa3, 0xe6, 0xbd, 0xb1, 0xf3, 0x72, - 0x76, 0x26, 0xc3, 0xa3, 0xbe, 0x78, 0xca, 0x99, 0xf9, 0x97, 0xe4, 0x21, 0x66, 0x9f, 0x97, 0x3f, - 0x19, 0x3f, 0x54, 0xce, 0x76, 0x8a, 0xd3, 0x5a, 0xd9, 0xf4, 0x83, 0xe5, 0xf7, 0x59, 0x70, 0x7c, - 0x5c, 0xf5, 0x87, 0x35, 0xfd, 0x0f, 0x48, 0x9d, 0xc2, 0x8a, 0xff, 0x03, 0x7a, 0xdc, 0x2f, 0x97, - 0xc7, 0x8c, 0x2e, 0x21, 0x4c, 0xec, 0x37, 0xd1, 0x3b, 0xa0, 0x98, 0xf0, 0xdd, 0x4d, 0x41, 0xdb, - 0xf4, 0x9e, 0x6a, 0xca, 0x54, 0xfb, 0xf9, 0x5f, 0xbf, 0x5f, 0x2e, 0x6e, 0xa7, 0xf0, 0xa0, 0x54, - 0xe9, 0x94, 0x7f, 0x25, 0xb9, 0xa7, 0xfe, 0xaf, 0xe4, 0xc7, 0x51, 0x7f, 0xa9, 0xd8, 0x1f, 0x88, - 0xbf, 0xde, 0x03, 0xa7, 0x92, 0x41, 0x1a, 0x75, 0xd8, 0x19, 0xbf, 0x5f, 0x3e, 0x55, 0x4b, 0x63, - 0x42, 0xe9, 0xf2, 0x69, 0x99, 0x96, 0x7b, 0x36, 0x99, 0x56, 0x3d, 0x7f, 0xff, 0x51, 0x69, 0xee, - 0xc1, 0xa3, 0xd2, 0xdc, 0xc3, 0x47, 0xa5, 0xb9, 0x4f, 0xfd, 0x52, 0xe6, 0xbe, 0x5f, 0xca, 0x3c, - 0xf0, 0x4b, 0x99, 0x87, 0x7e, 0x29, 0xf3, 0xbb, 0x5f, 0xca, 0x7c, 0xfe, 0x47, 0x69, 0xee, 0xdd, - 0x43, 0xba, 0xee, 0xfd, 0x19, 0x00, 0x00, 0xff, 0xff, 0x91, 0x09, 0xa9, 0x38, 0x8c, 0x16, 0x00, - 0x00, + // 2044 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0xdd, 0x6f, 0x1c, 0x57, + 0x15, 0xf7, 0xec, 0xae, 0x1d, 0xf7, 0xd8, 0xb1, 0x9d, 0x9b, 0xb4, 0xde, 0x38, 0x64, 0xd7, 0x1a, + 0x21, 0x54, 0x2a, 0x3a, 0xdb, 0xb8, 0x29, 0x2d, 0x84, 0x22, 0xbc, 0xdb, 0x36, 0x8d, 0xf0, 0x36, + 0xe6, 0xda, 0x8e, 0xaa, 0x7e, 0x20, 0xc6, 0x33, 0x37, 0x9b, 0xc1, 0x3b, 0x73, 0x57, 0x33, 0x77, + 0xdd, 0x38, 0x08, 0xa9, 0x20, 0xc1, 0x33, 0x0f, 0x50, 0x1e, 0x78, 0xe1, 0x19, 0xc1, 0x2b, 0x79, + 0xe0, 0xa9, 0x48, 0x88, 0x3c, 0xe6, 0x05, 0xa9, 0x08, 0x69, 0x21, 0xcb, 0x7f, 0x00, 0x6f, 0x79, + 0x42, 0xf7, 0x63, 0x3e, 0x77, 0xc7, 0xbb, 0x59, 0xaf, 0x03, 0x48, 0x7d, 0xdb, 0xb9, 0xf7, 0x9c, + 0xdf, 0xf9, 0xbc, 0xe7, 0xde, 0x73, 0x16, 0xae, 0x1f, 0xbc, 0x16, 0x18, 0x0e, 0xad, 0x1d, 0x74, + 0xf7, 0x89, 0xef, 0x11, 0x46, 0x82, 0xda, 0x21, 0xf1, 0x6c, 0xea, 0xd7, 0xd4, 0x86, 0xd9, 0x71, + 0x6a, 0x66, 0x97, 0xd1, 0xc0, 0x32, 0xdb, 0x8e, 0xd7, 0xaa, 0x1d, 0x6e, 0xec, 0x13, 0x66, 0x5e, + 0xa9, 0xb5, 0x88, 0x47, 0x7c, 0x93, 0x11, 0xdb, 0xe8, 0xf8, 0x94, 0x51, 0x54, 0x91, 0xf4, 0x86, + 0xd9, 0x71, 0x8c, 0x04, 0xbd, 0xa1, 0xe8, 0xd7, 0x5e, 0x6c, 0x39, 0xec, 0x4e, 0x77, 0xdf, 0xb0, + 0xa8, 0x5b, 0x6b, 0xd1, 0x16, 0xad, 0x09, 0xb6, 0xfd, 0xee, 0x6d, 0xf1, 0x25, 0x3e, 0xc4, 0x2f, + 0x09, 0xb7, 0xa6, 0x27, 0xc4, 0x5b, 0xd4, 0x27, 0xb5, 0xc3, 0x01, 0x91, 0x6b, 0x57, 0x63, 0x1a, + 0xd7, 0xb4, 0xee, 0x38, 0x1e, 0xf1, 0x8f, 0x6a, 0x9d, 0x83, 0x96, 0x60, 0xf2, 0x49, 0x40, 0xbb, + 0xbe, 0x45, 0x9e, 0x88, 0x2b, 0xa8, 0xb9, 0x84, 0x99, 0xc3, 0x64, 0xd5, 0xf2, 0xb8, 0xfc, 0xae, + 0xc7, 0x1c, 0x77, 0x50, 0xcc, 0x57, 0x47, 0x31, 0x04, 0xd6, 0x1d, 0xe2, 0x9a, 0x03, 0x7c, 0x2f, + 0xe7, 0xf1, 0x75, 0x99, 0xd3, 0xae, 0x39, 0x1e, 0x0b, 0x98, 0x9f, 0x65, 0xd2, 0xff, 0x35, 0x0b, + 0xab, 0x0d, 0xea, 0x31, 0x93, 0x93, 0x63, 0x65, 0xf9, 0x36, 0x6d, 0x3b, 0xd6, 0x11, 0xba, 0x06, + 0x67, 0xad, 0x70, 0xeb, 0x1d, 0xd3, 0x25, 0x65, 0x6d, 0x5d, 0x7b, 0xfe, 0x99, 0xfa, 0xb3, 0x0f, + 0x7a, 0xd5, 0x99, 0x7e, 0xaf, 0x7a, 0xb6, 0x91, 0xdc, 0xc4, 0x69, 0x5a, 0x74, 0x15, 0x4a, 0x2e, + 0xb5, 0x49, 0xb9, 0x20, 0x78, 0xd6, 0xfb, 0xbd, 0x6a, 0xa9, 0x49, 0x6d, 0xf2, 0xb8, 0x57, 0xbd, + 0x10, 0xf1, 0xed, 0xc8, 0x48, 0xf3, 0x75, 0x2c, 0xa8, 0xd1, 0xa7, 0x1a, 0x80, 0xeb, 0x78, 0x9b, + 0xed, 0x36, 0xfd, 0x88, 0xd8, 0xe5, 0xe2, 0x7a, 0xf1, 0xf9, 0x85, 0x8d, 0xeb, 0xc6, 0xf1, 0x19, + 0x62, 0xe4, 0x18, 0x60, 0x34, 0x23, 0xa4, 0x37, 0x3d, 0xe6, 0x1f, 0xd5, 0xdf, 0x55, 0x9a, 0x43, + 0xbc, 0xf1, 0xb8, 0x57, 0xad, 0x0e, 0x26, 0x8c, 0x11, 0x02, 0x6d, 0x39, 0x01, 0xfb, 0xf1, 0xdf, + 0x8f, 0x25, 0x11, 0xc6, 0x27, 0x94, 0x96, 0x36, 0x98, 0x77, 0x43, 0x1b, 0x4a, 0x27, 0xb4, 0x21, + 0x42, 0xca, 0xda, 0x10, 0x6d, 0x4c, 0xcd, 0x86, 0x08, 0x71, 0xcd, 0x85, 0xe5, 0x8c, 0xf3, 0xd0, + 0x0a, 0x14, 0x0f, 0xc8, 0x91, 0xcc, 0x01, 0xcc, 0x7f, 0xa2, 0x37, 0x60, 0xf6, 0xd0, 0x6c, 0x77, + 0x65, 0x8c, 0x17, 0x36, 0x8c, 0x84, 0x89, 0x51, 0x02, 0x1a, 0x9d, 0x83, 0x96, 0xb0, 0x39, 0x3c, + 0x55, 0xc6, 0x77, 0xba, 0xa6, 0xc7, 0x1c, 0x76, 0x84, 0x25, 0xf3, 0xd7, 0x0b, 0xaf, 0x69, 0x42, + 0x5c, 0xda, 0xce, 0xd3, 0x14, 0xa7, 0xff, 0x42, 0x83, 0x4b, 0x0d, 0x9f, 0x06, 0xc1, 0x2d, 0xe2, + 0x07, 0x0e, 0xf5, 0x6e, 0xee, 0x7f, 0x9f, 0x58, 0x0c, 0x93, 0xdb, 0xc4, 0x27, 0x9e, 0x45, 0xd0, + 0x3a, 0x94, 0x0e, 0x1c, 0xcf, 0x56, 0xf9, 0xbe, 0xa8, 0x3c, 0x5e, 0xfa, 0xb6, 0xe3, 0xd9, 0x58, + 0xec, 0x70, 0x0a, 0x8f, 0x9f, 0x88, 0x42, 0x9a, 0x42, 0xf8, 0x51, 0xec, 0xa0, 0x0d, 0x00, 0xb3, + 0xe3, 0x28, 0x01, 0xe5, 0xa2, 0xa0, 0x43, 0x61, 0xec, 0x36, 0xb7, 0x6f, 0xa8, 0x1d, 0x9c, 0xa0, + 0xd2, 0x3f, 0x29, 0xc2, 0x85, 0x37, 0xef, 0x32, 0xe2, 0x7b, 0x66, 0xbb, 0x49, 0x98, 0xef, 0x58, + 0x3b, 0xc2, 0x08, 0x0e, 0xe6, 0x8a, 0xef, 0xc4, 0x31, 0x8c, 0xc0, 0x9a, 0xd1, 0x0e, 0x4e, 0x50, + 0x21, 0x0a, 0x4b, 0xf2, 0x6b, 0x87, 0xb4, 0x89, 0xc5, 0xa8, 0xaf, 0xfc, 0xf6, 0xf2, 0x71, 0x7e, + 0x0b, 0x0c, 0x5e, 0xc6, 0x8c, 0xc3, 0x2b, 0xc6, 0x96, 0xb9, 0x4f, 0xda, 0x21, 0x6b, 0x1d, 0xf5, + 0x7b, 0xd5, 0xa5, 0x66, 0x0a, 0x0e, 0x67, 0xe0, 0x91, 0x09, 0x0b, 0xcc, 0xf4, 0x5b, 0x84, 0xdd, + 0x12, 0x51, 0x2a, 0x4e, 0x12, 0xa5, 0xfa, 0x72, 0xbf, 0x57, 0x5d, 0xd8, 0x8d, 0x61, 0x70, 0x12, + 0x13, 0x1d, 0x02, 0x92, 0x9f, 0x9b, 0x87, 0xc4, 0x37, 0x5b, 0x44, 0x4a, 0x2a, 0x4d, 0x24, 0xe9, + 0xb9, 0x7e, 0xaf, 0x8a, 0x76, 0x07, 0xd0, 0xf0, 0x10, 0x09, 0xfa, 0xaf, 0x07, 0x03, 0xc3, 0x4c, + 0xd6, 0x0d, 0xfe, 0x3f, 0x02, 0x73, 0x07, 0x16, 0xad, 0xae, 0xef, 0x13, 0xef, 0x44, 0x91, 0xb9, + 0xa0, 0xcc, 0x5a, 0x6c, 0x24, 0xb0, 0x70, 0x0a, 0x19, 0x1d, 0xc1, 0x79, 0xf5, 0x3d, 0x85, 0x00, + 0xad, 0xf6, 0x7b, 0xd5, 0xf3, 0x8d, 0x41, 0x38, 0x3c, 0x4c, 0x86, 0xfe, 0x69, 0x01, 0x56, 0xdf, + 0xa6, 0xbe, 0x73, 0x8f, 0xd7, 0xd1, 0xf6, 0x36, 0xb5, 0x37, 0x55, 0x91, 0x25, 0x3e, 0xfa, 0x1e, + 0xcc, 0x73, 0xef, 0xd9, 0x26, 0x33, 0x45, 0x8c, 0x16, 0x36, 0x5e, 0x1a, 0xcf, 0xd7, 0xb2, 0x30, + 0x34, 0x09, 0x33, 0xe3, 0xa8, 0xc6, 0x6b, 0x38, 0x42, 0x45, 0x1f, 0x42, 0x29, 0xe8, 0x10, 0x4b, + 0x45, 0xf2, 0xda, 0xa8, 0x62, 0x9f, 0xa3, 0xe8, 0x4e, 0x87, 0x58, 0x71, 0x31, 0xe1, 0x5f, 0x58, + 0xc0, 0x22, 0x02, 0x73, 0x81, 0x48, 0x38, 0x15, 0xbb, 0xd7, 0x27, 0x15, 0x20, 0x40, 0xea, 0x4b, + 0x4a, 0xc4, 0x9c, 0xfc, 0xc6, 0x0a, 0x5c, 0xff, 0x49, 0x11, 0xd6, 0x73, 0x38, 0x1b, 0xd4, 0xb3, + 0x1d, 0xe6, 0x50, 0x0f, 0xbd, 0x0d, 0x25, 0x76, 0xd4, 0x09, 0x93, 0xfd, 0x6a, 0xa8, 0xed, 0xee, + 0x51, 0x87, 0x5f, 0xee, 0x5f, 0x1c, 0xc5, 0xcf, 0xe9, 0xb0, 0x40, 0x40, 0x5b, 0x91, 0x55, 0x85, + 0x14, 0x96, 0x52, 0xeb, 0x71, 0xaf, 0x3a, 0xe4, 0x2d, 0x67, 0x44, 0x48, 0x69, 0xe5, 0x79, 0x6d, + 0x68, 0x9b, 0x01, 0xdb, 0xf5, 0x4d, 0x2f, 0x90, 0x92, 0x1c, 0x37, 0xcc, 0xf5, 0x17, 0xc6, 0x0b, + 0x37, 0xe7, 0xa8, 0xaf, 0x29, 0x2d, 0xd0, 0xd6, 0x00, 0x1a, 0x1e, 0x22, 0x01, 0x7d, 0x09, 0xe6, + 0x7c, 0x62, 0x06, 0xd4, 0x13, 0x69, 0xfe, 0x4c, 0xec, 0x5c, 0x2c, 0x56, 0xb1, 0xda, 0x45, 0x5f, + 0x86, 0x33, 0x2e, 0x09, 0x02, 0xb3, 0x45, 0xca, 0xb3, 0x82, 0x70, 0x59, 0x11, 0x9e, 0x69, 0xca, + 0x65, 0x1c, 0xee, 0xeb, 0x7f, 0xd5, 0xe0, 0x52, 0x8e, 0x1f, 0xf9, 0x65, 0x8e, 0x3e, 0x18, 0xc8, + 0x67, 0x63, 0xcc, 0xda, 0xe1, 0x04, 0x32, 0x9b, 0x57, 0x94, 0xec, 0xf9, 0x70, 0x25, 0x91, 0xcb, + 0x1f, 0xc0, 0xac, 0xc3, 0x88, 0xcb, 0xa3, 0xc2, 0x5f, 0x2e, 0xaf, 0x4e, 0x98, 0x6b, 0xf5, 0xb3, + 0x4a, 0xc6, 0xec, 0x0d, 0x8e, 0x86, 0x25, 0xa8, 0xfe, 0xb7, 0x42, 0xae, 0x6d, 0x3c, 0xe1, 0xd1, + 0x0f, 0x60, 0x49, 0x7c, 0xc9, 0xca, 0x8c, 0xc9, 0x6d, 0x65, 0xe1, 0xc8, 0x33, 0x75, 0xcc, 0x85, + 0x5e, 0x7f, 0x4e, 0xa9, 0xb2, 0xb4, 0x93, 0x82, 0xc6, 0x19, 0x51, 0xe8, 0x0a, 0x2c, 0xb8, 0x8e, + 0x87, 0x49, 0xa7, 0xed, 0x58, 0xa6, 0x4c, 0xcb, 0x59, 0x79, 0x25, 0x35, 0xe3, 0x65, 0x9c, 0xa4, + 0x41, 0xaf, 0xc0, 0x82, 0x6b, 0xde, 0x8d, 0x58, 0x8a, 0x82, 0xe5, 0xbc, 0x92, 0xb7, 0xd0, 0x8c, + 0xb7, 0x70, 0x92, 0x0e, 0xed, 0xf1, 0x6c, 0xe0, 0x55, 0x3a, 0x50, 0x0f, 0xc4, 0x17, 0x46, 0xd9, + 0xa7, 0x8a, 0x3c, 0x2f, 0x11, 0x89, 0xcc, 0x11, 0x10, 0x38, 0xc4, 0xd2, 0x7f, 0x5f, 0x82, 0xcb, + 0xc7, 0x9e, 0x7d, 0xf4, 0x16, 0x20, 0xba, 0x1f, 0x10, 0xff, 0x90, 0xd8, 0xd7, 0x65, 0x2f, 0xc0, + 0xdf, 0x27, 0xdc, 0xc7, 0x45, 0x79, 0x25, 0xde, 0x1c, 0xd8, 0xc5, 0x43, 0x38, 0x90, 0x05, 0x67, + 0xf9, 0x61, 0x90, 0x0e, 0x75, 0xdc, 0xf0, 0x55, 0xf6, 0x24, 0x27, 0xed, 0x1c, 0x6f, 0x22, 0xb6, + 0x92, 0x20, 0x38, 0x8d, 0x89, 0x36, 0x61, 0x59, 0xd5, 0xfa, 0x8c, 0x83, 0x57, 0x95, 0x07, 0x96, + 0x1b, 0xe9, 0x6d, 0x9c, 0xa5, 0xe7, 0x10, 0x36, 0x09, 0x1c, 0x9f, 0xd8, 0x11, 0x44, 0x29, 0x0d, + 0xf1, 0x46, 0x7a, 0x1b, 0x67, 0xe9, 0x51, 0x1b, 0x96, 0x14, 0xaa, 0xf2, 0x77, 0x79, 0x56, 0x84, + 0xec, 0x2b, 0x63, 0x86, 0x4c, 0x16, 0xdd, 0x28, 0x07, 0x1b, 0x29, 0x2c, 0x9c, 0xc1, 0x46, 0x0c, + 0xc0, 0x0a, 0x4b, 0x5c, 0x50, 0x9e, 0x13, 0x92, 0xbe, 0x35, 0xe1, 0x19, 0x8c, 0x6a, 0x65, 0x7c, + 0x7d, 0x45, 0x4b, 0x01, 0x4e, 0xc8, 0xd1, 0x7f, 0x53, 0x04, 0x88, 0x33, 0x8c, 0x77, 0x6f, 0x89, + 0x22, 0xbf, 0x9e, 0x29, 0xf2, 0x2b, 0xc9, 0xc7, 0x69, 0xa2, 0xa0, 0xdf, 0x82, 0x39, 0x2a, 0x4e, + 0x9e, 0x4a, 0x86, 0x8d, 0x51, 0x6a, 0x47, 0x77, 0x69, 0x84, 0x56, 0x07, 0x5e, 0x3a, 0xd5, 0xf9, + 0x55, 0x68, 0xe8, 0x1d, 0x28, 0x75, 0xa8, 0x1d, 0x5e, 0x7e, 0x2f, 0x8d, 0x42, 0xdd, 0xa6, 0x76, + 0x90, 0xc2, 0x9c, 0xe7, 0xba, 0xf3, 0x55, 0x2c, 0x70, 0xd0, 0x77, 0x61, 0x3e, 0x7c, 0x6e, 0xa8, + 0xb7, 0xc9, 0xd5, 0x51, 0x98, 0x61, 0xa7, 0x94, 0xc2, 0x5d, 0xe4, 0x15, 0x34, 0xdc, 0xc1, 0x11, + 0x26, 0xc7, 0x27, 0xea, 0xb5, 0x28, 0x6a, 0xfd, 0x18, 0xf8, 0xc3, 0x9e, 0xfd, 0x12, 0x3f, 0xdc, + 0xc1, 0x11, 0xa6, 0xfe, 0xdb, 0x22, 0x2c, 0xa6, 0x9e, 0xa1, 0xff, 0x8d, 0x70, 0xc9, 0xac, 0x9e, + 0x6e, 0xb8, 0x24, 0xe6, 0xf4, 0xc3, 0x25, 0x71, 0x4f, 0x2f, 0x5c, 0x09, 0xfc, 0x21, 0xe1, 0xfa, + 0x79, 0x01, 0xd0, 0x60, 0xa6, 0x23, 0x0b, 0xe6, 0x64, 0xab, 0x31, 0x8d, 0x1b, 0x2e, 0x7a, 0x75, + 0xa8, 0xcb, 0x4c, 0x41, 0x67, 0x1a, 0x94, 0xc2, 0x58, 0x0d, 0x0a, 0x99, 0x46, 0x23, 0x17, 0x5d, + 0x81, 0x79, 0xcd, 0x9c, 0xfe, 0xcb, 0xac, 0x5b, 0x64, 0x2e, 0xff, 0xcf, 0xba, 0xe5, 0xa9, 0xb5, + 0x51, 0xfa, 0x27, 0x1a, 0x9c, 0xdb, 0xa6, 0x76, 0x66, 0x1c, 0xf7, 0xb1, 0x06, 0xe7, 0xa2, 0x19, + 0x9b, 0x58, 0x73, 0x48, 0x50, 0xd6, 0xc6, 0x7b, 0xa4, 0xe5, 0x8c, 0x97, 0xea, 0x17, 0x95, 0x3a, + 0xe7, 0x1a, 0x59, 0x64, 0x3c, 0x28, 0x4c, 0xbf, 0x09, 0xcb, 0xdb, 0xd4, 0xde, 0xeb, 0xd8, 0x26, + 0x0b, 0xb5, 0xfa, 0x06, 0x40, 0x57, 0x7c, 0x37, 0xa9, 0x1d, 0x16, 0xa0, 0x2f, 0x70, 0x2f, 0xee, + 0x45, 0xab, 0x8f, 0x53, 0x5f, 0x38, 0x41, 0xaf, 0xff, 0x51, 0x83, 0x95, 0x6c, 0xb9, 0x9e, 0xa8, + 0xa9, 0xbe, 0x37, 0x74, 0x32, 0x30, 0xd1, 0xa4, 0x28, 0xee, 0x00, 0xc6, 0x9c, 0x0e, 0xfc, 0x29, + 0x6d, 0xc4, 0xe4, 0x93, 0x81, 0x1f, 0x0e, 0x6f, 0x9f, 0x27, 0xb3, 0xe2, 0x92, 0x12, 0x36, 0x7e, + 0x0b, 0xfd, 0xef, 0x33, 0x70, 0x19, 0x13, 0x8b, 0xba, 0x2e, 0xf1, 0x6c, 0x62, 0x0f, 0xa4, 0x4c, + 0x70, 0xb2, 0x89, 0xf0, 0x7d, 0x2d, 0x3a, 0xd9, 0xb2, 0xb3, 0xb8, 0x31, 0xba, 0x8a, 0x1f, 0xa3, + 0x8c, 0x21, 0xa3, 0x23, 0xa7, 0xa2, 0xbb, 0xe9, 0x73, 0x3e, 0xa5, 0x89, 0x68, 0x58, 0x2d, 0xfe, + 0xac, 0x01, 0xb4, 0xe9, 0x47, 0xc4, 0xaf, 0xd3, 0xae, 0x17, 0x4e, 0xa5, 0x9b, 0x27, 0xd3, 0x7e, + 0x2b, 0xc2, 0xcb, 0xcc, 0x75, 0xe3, 0x8d, 0x69, 0xcd, 0x75, 0x63, 0xd5, 0x85, 0x25, 0xdd, 0x4e, + 0x27, 0xb4, 0xa4, 0x34, 0x0d, 0x4b, 0xf6, 0x22, 0xbc, 0x8c, 0x25, 0xf1, 0xc6, 0xb4, 0x2c, 0x89, + 0x55, 0x5f, 0x73, 0x60, 0x21, 0x91, 0x00, 0xa7, 0x3d, 0x9d, 0xce, 0x44, 0xeb, 0xb4, 0xc5, 0x65, + 0x5c, 0x7a, 0xaa, 0xc3, 0xf0, 0xfb, 0x1a, 0xac, 0x26, 0x02, 0x9c, 0xb8, 0x77, 0x02, 0xf4, 0x2b, + 0x0d, 0xca, 0x56, 0x1c, 0x71, 0x45, 0x64, 0xca, 0xd6, 0x44, 0xde, 0x3c, 0xaf, 0x9f, 0x28, 0x79, + 0xa2, 0xb7, 0x6a, 0xb9, 0x91, 0x23, 0x06, 0xe7, 0x2a, 0xa0, 0xff, 0xae, 0x00, 0x17, 0x86, 0xbd, + 0xcb, 0x51, 0x43, 0x4d, 0xe7, 0x65, 0x75, 0xaa, 0x25, 0xa7, 0xf3, 0x23, 0x32, 0x31, 0x31, 0xc0, + 0x7f, 0x17, 0xca, 0xa9, 0x5a, 0xbf, 0xc7, 0x9c, 0xb6, 0x73, 0x4f, 0xb6, 0xcb, 0x72, 0x30, 0xc0, + 0xaf, 0xb9, 0xf2, 0x6e, 0x0e, 0x0d, 0xce, 0xe5, 0xce, 0x99, 0x62, 0x17, 0x4f, 0x7d, 0x8a, 0x7d, + 0x7f, 0xd0, 0x5f, 0xf2, 0xae, 0x9a, 0x8a, 0xbf, 0xde, 0x87, 0x8b, 0xe9, 0x4b, 0x65, 0xd0, 0x61, + 0x97, 0xfb, 0xbd, 0xea, 0xc5, 0x46, 0x1e, 0x11, 0xce, 0xe7, 0xcf, 0xbb, 0x19, 0x8b, 0x4f, 0xe9, + 0x66, 0xfc, 0x43, 0x01, 0x9e, 0xbd, 0x45, 0x7c, 0xe6, 0x58, 0x4f, 0x7f, 0xb4, 0xfc, 0x7e, 0x6a, + 0xb4, 0xfc, 0xb5, 0x51, 0xc7, 0x6d, 0xa8, 0x9a, 0xb9, 0x83, 0x65, 0x2b, 0x33, 0x58, 0xbe, 0x36, + 0x19, 0xfc, 0xf1, 0x63, 0xe5, 0x1f, 0x15, 0xa1, 0x32, 0x94, 0x2f, 0x1e, 0x2a, 0xbf, 0x95, 0x6a, + 0x60, 0x37, 0x32, 0x0d, 0xac, 0x7e, 0x3c, 0xf7, 0xe7, 0x23, 0xe5, 0xd1, 0x23, 0xe5, 0xbf, 0x68, + 0x70, 0x71, 0xa8, 0x17, 0x9f, 0xc2, 0x40, 0xf9, 0xbd, 0xf4, 0x40, 0xf9, 0x95, 0x89, 0x72, 0x2c, + 0x67, 0x9c, 0xfc, 0xb0, 0x90, 0x63, 0x97, 0x18, 0x63, 0x7d, 0x08, 0xf3, 0x41, 0xf8, 0x27, 0x9b, + 0x36, 0xf9, 0x9f, 0x6c, 0xa2, 0xb1, 0x8f, 0xfe, 0x5e, 0x8b, 0x20, 0x11, 0x81, 0xc5, 0x6e, 0xa2, + 0x17, 0x52, 0x47, 0xb4, 0x36, 0xc6, 0xc0, 0x23, 0xd9, 0x42, 0xd5, 0x57, 0x78, 0x3b, 0x98, 0x5c, + 0xc1, 0x29, 0x58, 0xe4, 0xc2, 0x92, 0x9f, 0xea, 0xda, 0x54, 0x0a, 0x5e, 0x19, 0x43, 0x50, 0xa6, + 0xdd, 0x13, 0x7f, 0x17, 0xa6, 0xd7, 0x70, 0x06, 0x5c, 0xff, 0x69, 0x01, 0x2e, 0x1d, 0x73, 0xcc, + 0x51, 0xc0, 0xd5, 0x49, 0xde, 0xc4, 0xca, 0xb5, 0xaf, 0x3e, 0xc1, 0x4b, 0x20, 0xf9, 0xca, 0x08, + 0x95, 0x4a, 0x42, 0xe2, 0x8c, 0x08, 0xe4, 0xa7, 0xa6, 0xa2, 0x32, 0x91, 0xbe, 0x39, 0x51, 0x22, + 0x8d, 0x3d, 0x13, 0xad, 0xbf, 0xf8, 0xe0, 0x51, 0x65, 0xe6, 0xe1, 0xa3, 0xca, 0xcc, 0x67, 0x8f, + 0x2a, 0x33, 0x1f, 0xf7, 0x2b, 0xda, 0x83, 0x7e, 0x45, 0x7b, 0xd8, 0xaf, 0x68, 0x9f, 0xf5, 0x2b, + 0xda, 0x3f, 0xfa, 0x15, 0xed, 0x67, 0xff, 0xac, 0xcc, 0xbc, 0x77, 0x46, 0x49, 0xfb, 0x4f, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x58, 0x06, 0x79, 0x35, 0x11, 0x25, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/generated.proto b/vendor/k8s.io/api/autoscaling/v2beta1/generated.proto index b565920c3..5e5c491a4 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/generated.proto +++ b/vendor/k8s.io/api/autoscaling/v2beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -31,6 +31,29 @@ import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v2beta1"; +// ContainerResourcePolicy controls how autoscaler computes the recommended +// resources for a specific container. +message ContainerResourcePolicy { + // Name of the container or DefaultContainerResourcePolicy, in which + // case the policy is used by the containers that don't have their own + // policy specified. + optional string containerName = 1; + + // Whether autoscaler is enabled for the container. The default is "Auto". + // +optional + optional string mode = 2; + + // Specifies the minimal amount of resources that will be recommended + // for the container. The default is no minimum. + // +optional + map minAllowed = 3; + + // Specifies the maximum amount of resources that will be recommended + // for the container. The default is no maximum. + // +optional + map maxAllowed = 4; +} + // CrossVersionObjectReference contains enough information to let you identify the referred resource. message CrossVersionObjectReference { // Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" @@ -289,6 +312,26 @@ message ObjectMetricStatus { optional k8s.io.apimachinery.pkg.api.resource.Quantity currentValue = 3; } +// PodResourcePolicy controls how autoscaler computes the recommended resources +// for containers belonging to the pod. There can be at most one entry for every +// named container and optionally a single wildcard entry with `containerName` = '*', +// which handles all containers that don't have individual policies. +message PodResourcePolicy { + // Per-container resource policies. + // +optional + // +patchMergeKey=containerName + // +patchStrategy=merge + repeated ContainerResourcePolicy containerPolicies = 1; +} + +// PodUpdatePolicy describes the rules on how changes are applied to the pods. +message PodUpdatePolicy { + // Controls when autoscaler applies changes to the pod resources. + // The default is 'Auto'. + // +optional + optional string updateMode = 1; +} + // PodsMetricSource indicates how to scale on a metric describing each pod in // the current scale target (for example, transactions-processed-per-second). // The values will be averaged together before being compared to the target @@ -313,6 +356,39 @@ message PodsMetricStatus { optional k8s.io.apimachinery.pkg.api.resource.Quantity currentAverageValue = 2; } +// RecommendedContainerResources is the recommendation of resources computed by +// autoscaler for a specific container. Respects the container resource policy +// if present in the spec. In particular the recommendation is not produced for +// containers with `ContainerScalingMode` set to 'Off'. +message RecommendedContainerResources { + // Name of the container. + optional string containerName = 1; + + // Recommended amount of resources. + map target = 2; + + // Minimum recommended amount of resources. + // This amount is not guaranteed to be sufficient for the application to operate in a stable way, however + // running with less resources is likely to have significant impact on performance/availability. + // +optional + map lowerBound = 3; + + // Maximum recommended amount of resources. + // Any resources allocated beyond this value are likely wasted. This value may be larger than the maximum + // amount of application is actually capable of consuming. + // +optional + map upperBound = 4; +} + +// RecommendedPodResources is the recommendation of resources computed by +// autoscaler. It contains a recommendation for each container in the pod +// (except for those with `ContainerScalingMode` set to 'Off'). +message RecommendedPodResources { + // Resources recommended by the autoscaler for each container. + // +optional + repeated RecommendedContainerResources containerRecommendations = 1; +} + // ResourceMetricSource indicates how to scale on a resource metric known to // Kubernetes, as specified in requests and limits, describing each pod in the // current scale target (e.g. CPU or memory). The values will be averaged @@ -361,3 +437,89 @@ message ResourceMetricStatus { optional k8s.io.apimachinery.pkg.api.resource.Quantity currentAverageValue = 3; } +// VerticalPodAutoscaler is the configuration for a vertical pod +// autoscaler, which automatically manages pod resources based on historical and +// real time resource utilization. +message VerticalPodAutoscaler { + // Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // Specification of the behavior of the autoscaler. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status. + optional VerticalPodAutoscalerSpec spec = 2; + + // Current information about the autoscaler. + // +optional + optional VerticalPodAutoscalerStatus status = 3; +} + +// VerticalPodAutoscalerCondition describes the state of +// a VerticalPodAutoscaler at a certain point. +message VerticalPodAutoscalerCondition { + // type describes the current condition + optional string type = 1; + + // status is the status of the condition (True, False, Unknown) + optional string status = 2; + + // lastTransitionTime is the last time the condition transitioned from + // one status to another + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastTransitionTime = 3; + + // reason is the reason for the condition's last transition. + // +optional + optional string reason = 4; + + // message is a human-readable explanation containing details about + // the transition + // +optional + optional string message = 5; +} + +// VerticalPodAutoscalerList is a list of VerticalPodAutoscaler objects. +message VerticalPodAutoscalerList { + // metadata is the standard list metadata. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // items is the list of vertical pod autoscaler objects. + repeated VerticalPodAutoscaler items = 2; +} + +// VerticalPodAutoscalerSpec is the specification of the behavior of the autoscaler. +message VerticalPodAutoscalerSpec { + // A label query that determines the set of pods controlled by the Autoscaler. + // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors + optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector selector = 1; + + // Describes the rules on how changes are applied to the pods. + // If not specified, all fields in the `PodUpdatePolicy` are set to their + // default values. + // +optional + optional PodUpdatePolicy updatePolicy = 2; + + // Controls how the autoscaler computes recommended resources. + // The resource policy may be used to set constraints on the recommendations + // for individual containers. If not specified, the autoscaler computes recommended + // resources for all containers in the pod, without additional constraints. + // +optional + optional PodResourcePolicy resourcePolicy = 3; +} + +// VerticalPodAutoscalerStatus describes the runtime state of the autoscaler. +message VerticalPodAutoscalerStatus { + // The most recently computed amount of resources recommended by the + // autoscaler for the controlled pods. + // +optional + optional RecommendedPodResources recommendation = 1; + + // Conditions is the set of conditions required for this autoscaler to scale its target, + // and indicates whether or not those conditions are met. + // +optional + // +patchMergeKey=type + // +patchStrategy=merge + repeated VerticalPodAutoscalerCondition conditions = 2; +} + diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/types.go b/vendor/k8s.io/api/autoscaling/v2beta1/types.go index f842cc342..450bbc5cf 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/types.go +++ b/vendor/k8s.io/api/autoscaling/v2beta1/types.go @@ -22,6 +22,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +// ** Horizontal Pod Autoscaler types start here ** + // CrossVersionObjectReference contains enough information to let you identify the referred resource. type CrossVersionObjectReference struct { // Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" @@ -370,3 +372,212 @@ type HorizontalPodAutoscalerList struct { // items is the list of horizontal pod autoscaler objects. Items []HorizontalPodAutoscaler `json:"items" protobuf:"bytes,2,rep,name=items"` } + +// ** Vertical Pod Autoscaler types start here ** + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// VerticalPodAutoscalerList is a list of VerticalPodAutoscaler objects. +type VerticalPodAutoscalerList struct { + metav1.TypeMeta `json:",inline"` + // metadata is the standard list metadata. + // +optional + metav1.ListMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"` + + // items is the list of vertical pod autoscaler objects. + Items []VerticalPodAutoscaler `json:"items" protobuf:"bytes,2,rep,name=items"` +} + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// VerticalPodAutoscaler is the configuration for a vertical pod +// autoscaler, which automatically manages pod resources based on historical and +// real time resource utilization. +type VerticalPodAutoscaler struct { + metav1.TypeMeta `json:",inline"` + // Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Specification of the behavior of the autoscaler. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status. + Spec VerticalPodAutoscalerSpec `json:"spec" protobuf:"bytes,2,name=spec"` + + // Current information about the autoscaler. + // +optional + Status VerticalPodAutoscalerStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` +} + +// VerticalPodAutoscalerSpec is the specification of the behavior of the autoscaler. +type VerticalPodAutoscalerSpec struct { + // A label query that determines the set of pods controlled by the Autoscaler. + // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors + Selector *metav1.LabelSelector `json:"selector" protobuf:"bytes,1,name=selector"` + + // Describes the rules on how changes are applied to the pods. + // If not specified, all fields in the `PodUpdatePolicy` are set to their + // default values. + // +optional + UpdatePolicy *PodUpdatePolicy `json:"updatePolicy,omitempty" protobuf:"bytes,2,opt,name=updatePolicy"` + + // Controls how the autoscaler computes recommended resources. + // The resource policy may be used to set constraints on the recommendations + // for individual containers. If not specified, the autoscaler computes recommended + // resources for all containers in the pod, without additional constraints. + // +optional + ResourcePolicy *PodResourcePolicy `json:"resourcePolicy,omitempty" protobuf:"bytes,3,opt,name=resourcePolicy"` +} + +// PodUpdatePolicy describes the rules on how changes are applied to the pods. +type PodUpdatePolicy struct { + // Controls when autoscaler applies changes to the pod resources. + // The default is 'Auto'. + // +optional + UpdateMode *UpdateMode `json:"updateMode,omitempty" protobuf:"bytes,1,opt,name=updateMode"` +} + +// UpdateMode controls when autoscaler applies changes to the pod resoures. +type UpdateMode string + +const ( + // UpdateModeOff means that autoscaler never changes Pod resources. + // The recommender still sets the recommended resources in the + // VerticalPodAutoscaler object. This can be used for a "dry run". + UpdateModeOff UpdateMode = "Off" + // UpdateModeInitial means that autoscaler only assigns resources on pod + // creation and does not change them during the lifetime of the pod. + UpdateModeInitial UpdateMode = "Initial" + // UpdateModeRecreate means that autoscaler assigns resources on pod + // creation and additionally can update them during the lifetime of the + // pod by deleting and recreating the pod. + UpdateModeRecreate UpdateMode = "Recreate" + // UpdateModeAuto means that autoscaler assigns resources on pod creation + // and additionally can update them during the lifetime of the pod, + // using any available update method. Currently this is equivalent to + // Recreate, which is the only available update method. + UpdateModeAuto UpdateMode = "Auto" +) + +// PodResourcePolicy controls how autoscaler computes the recommended resources +// for containers belonging to the pod. There can be at most one entry for every +// named container and optionally a single wildcard entry with `containerName` = '*', +// which handles all containers that don't have individual policies. +type PodResourcePolicy struct { + // Per-container resource policies. + // +optional + // +patchMergeKey=containerName + // +patchStrategy=merge + ContainerPolicies []ContainerResourcePolicy `json:"containerPolicies,omitempty" patchStrategy:"merge" patchMergeKey:"containerName" protobuf:"bytes,1,rep,name=containerPolicies"` +} + +// ContainerResourcePolicy controls how autoscaler computes the recommended +// resources for a specific container. +type ContainerResourcePolicy struct { + // Name of the container or DefaultContainerResourcePolicy, in which + // case the policy is used by the containers that don't have their own + // policy specified. + ContainerName string `json:"containerName,omitempty" protobuf:"bytes,1,opt,name=containerName"` + // Whether autoscaler is enabled for the container. The default is "Auto". + // +optional + Mode *ContainerScalingMode `json:"mode,omitempty" protobuf:"bytes,2,opt,name=mode"` + // Specifies the minimal amount of resources that will be recommended + // for the container. The default is no minimum. + // +optional + MinAllowed v1.ResourceList `json:"minAllowed,omitempty" protobuf:"bytes,3,rep,name=minAllowed,casttype=ResourceList,castkey=ResourceName"` + // Specifies the maximum amount of resources that will be recommended + // for the container. The default is no maximum. + // +optional + MaxAllowed v1.ResourceList `json:"maxAllowed,omitempty" protobuf:"bytes,4,rep,name=maxAllowed,casttype=ResourceList,castkey=ResourceName"` +} + +const ( + // DefaultContainerResourcePolicy can be passed as + // ContainerResourcePolicy.ContainerName to specify the default policy. + DefaultContainerResourcePolicy = "*" +) + +// ContainerScalingMode controls whether autoscaler is enabled for a specific +// container. +type ContainerScalingMode string + +const ( + // ContainerScalingModeAuto means autoscaling is enabled for a container. + ContainerScalingModeAuto ContainerScalingMode = "Auto" + // ContainerScalingModeOff means autoscaling is disabled for a container. + ContainerScalingModeOff ContainerScalingMode = "Off" +) + +// VerticalPodAutoscalerStatus describes the runtime state of the autoscaler. +type VerticalPodAutoscalerStatus struct { + // The most recently computed amount of resources recommended by the + // autoscaler for the controlled pods. + // +optional + Recommendation *RecommendedPodResources `json:"recommendation,omitempty" protobuf:"bytes,1,opt,name=recommendation"` + + // Conditions is the set of conditions required for this autoscaler to scale its target, + // and indicates whether or not those conditions are met. + // +optional + // +patchMergeKey=type + // +patchStrategy=merge + Conditions []VerticalPodAutoscalerCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,2,rep,name=conditions"` +} + +// RecommendedPodResources is the recommendation of resources computed by +// autoscaler. It contains a recommendation for each container in the pod +// (except for those with `ContainerScalingMode` set to 'Off'). +type RecommendedPodResources struct { + // Resources recommended by the autoscaler for each container. + // +optional + ContainerRecommendations []RecommendedContainerResources `json:"containerRecommendations,omitempty" protobuf:"bytes,1,rep,name=containerRecommendations"` +} + +// RecommendedContainerResources is the recommendation of resources computed by +// autoscaler for a specific container. Respects the container resource policy +// if present in the spec. In particular the recommendation is not produced for +// containers with `ContainerScalingMode` set to 'Off'. +type RecommendedContainerResources struct { + // Name of the container. + ContainerName string `json:"containerName,omitempty" protobuf:"bytes,1,opt,name=containerName"` + // Recommended amount of resources. + Target v1.ResourceList `json:"target" protobuf:"bytes,2,rep,name=target,casttype=ResourceList,castkey=ResourceName"` + // Minimum recommended amount of resources. + // This amount is not guaranteed to be sufficient for the application to operate in a stable way, however + // running with less resources is likely to have significant impact on performance/availability. + // +optional + LowerBound v1.ResourceList `json:"lowerBound,omitempty" protobuf:"bytes,3,rep,name=lowerBound,casttype=ResourceList,castkey=ResourceName"` + // Maximum recommended amount of resources. + // Any resources allocated beyond this value are likely wasted. This value may be larger than the maximum + // amount of application is actually capable of consuming. + // +optional + UpperBound v1.ResourceList `json:"upperBound,omitempty" protobuf:"bytes,4,rep,name=upperBound,casttype=ResourceList,castkey=ResourceName"` +} + +// VerticalPodAutoscalerConditionType are the valid conditions of +// a VerticalPodAutoscaler. +type VerticalPodAutoscalerConditionType string + +var ( + // RecommendationProvided indicates whether the VPA recommender was able to calculate a recommendation. + RecommendationProvided VerticalPodAutoscalerConditionType = "RecommendationProvided" +) + +// VerticalPodAutoscalerCondition describes the state of +// a VerticalPodAutoscaler at a certain point. +type VerticalPodAutoscalerCondition struct { + // type describes the current condition + Type VerticalPodAutoscalerConditionType `json:"type" protobuf:"bytes,1,name=type"` + // status is the status of the condition (True, False, Unknown) + Status v1.ConditionStatus `json:"status" protobuf:"bytes,2,name=status"` + // lastTransitionTime is the last time the condition transitioned from + // one status to another + // +optional + LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty" protobuf:"bytes,3,opt,name=lastTransitionTime"` + // reason is the reason for the condition's last transition. + // +optional + Reason string `json:"reason,omitempty" protobuf:"bytes,4,opt,name=reason"` + // message is a human-readable explanation containing details about + // the transition + // +optional + Message string `json:"message,omitempty" protobuf:"bytes,5,opt,name=message"` +} diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go index 12cfa7649..fe67bb1b4 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,19 @@ package v2beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_ContainerResourcePolicy = map[string]string{ + "": "ContainerResourcePolicy controls how autoscaler computes the recommended resources for a specific container.", + "containerName": "Name of the container or DefaultContainerResourcePolicy, in which case the policy is used by the containers that don't have their own policy specified.", + "mode": "Whether autoscaler is enabled for the container. The default is \"Auto\".", + "minAllowed": "Specifies the minimal amount of resources that will be recommended for the container. The default is no minimum.", + "maxAllowed": "Specifies the maximum amount of resources that will be recommended for the container. The default is no maximum.", +} + +func (ContainerResourcePolicy) SwaggerDoc() map[string]string { + return map_ContainerResourcePolicy +} + var map_CrossVersionObjectReference = map[string]string{ "": "CrossVersionObjectReference contains enough information to let you identify the referred resource.", "kind": "Kind of the referent; More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds\"", @@ -170,6 +182,24 @@ func (ObjectMetricStatus) SwaggerDoc() map[string]string { return map_ObjectMetricStatus } +var map_PodResourcePolicy = map[string]string{ + "": "PodResourcePolicy controls how autoscaler computes the recommended resources for containers belonging to the pod. There can be at most one entry for every named container and optionally a single wildcard entry with `containerName` = '*', which handles all containers that don't have individual policies.", + "containerPolicies": "Per-container resource policies.", +} + +func (PodResourcePolicy) SwaggerDoc() map[string]string { + return map_PodResourcePolicy +} + +var map_PodUpdatePolicy = map[string]string{ + "": "PodUpdatePolicy describes the rules on how changes are applied to the pods.", + "updateMode": "Controls when autoscaler applies changes to the pod resources. The default is 'Auto'.", +} + +func (PodUpdatePolicy) SwaggerDoc() map[string]string { + return map_PodUpdatePolicy +} + var map_PodsMetricSource = map[string]string{ "": "PodsMetricSource indicates how to scale on a metric describing each pod in the current scale target (for example, transactions-processed-per-second). The values will be averaged together before being compared to the target value.", "metricName": "metricName is the name of the metric in question", @@ -190,6 +220,27 @@ func (PodsMetricStatus) SwaggerDoc() map[string]string { return map_PodsMetricStatus } +var map_RecommendedContainerResources = map[string]string{ + "": "RecommendedContainerResources is the recommendation of resources computed by autoscaler for a specific container. Respects the container resource policy if present in the spec. In particular the recommendation is not produced for containers with `ContainerScalingMode` set to 'Off'.", + "containerName": "Name of the container.", + "target": "Recommended amount of resources.", + "lowerBound": "Minimum recommended amount of resources. This amount is not guaranteed to be sufficient for the application to operate in a stable way, however running with less resources is likely to have significant impact on performance/availability.", + "upperBound": "Maximum recommended amount of resources. Any resources allocated beyond this value are likely wasted. This value may be larger than the maximum amount of application is actually capable of consuming.", +} + +func (RecommendedContainerResources) SwaggerDoc() map[string]string { + return map_RecommendedContainerResources +} + +var map_RecommendedPodResources = map[string]string{ + "": "RecommendedPodResources is the recommendation of resources computed by autoscaler. It contains a recommendation for each container in the pod (except for those with `ContainerScalingMode` set to 'Off').", + "containerRecommendations": "Resources recommended by the autoscaler for each container.", +} + +func (RecommendedPodResources) SwaggerDoc() map[string]string { + return map_RecommendedPodResources +} + var map_ResourceMetricSource = map[string]string{ "": "ResourceMetricSource indicates how to scale on a resource metric known to Kubernetes, as specified in requests and limits, describing each pod in the current scale target (e.g. CPU or memory). The values will be averaged together before being compared to the target. Such metrics are built in to Kubernetes, and have special scaling options on top of those available to normal per-pod metrics using the \"pods\" source. Only one \"target\" type should be set.", "name": "name is the name of the resource in question.", @@ -212,4 +263,59 @@ func (ResourceMetricStatus) SwaggerDoc() map[string]string { return map_ResourceMetricStatus } +var map_VerticalPodAutoscaler = map[string]string{ + "": "VerticalPodAutoscaler is the configuration for a vertical pod autoscaler, which automatically manages pod resources based on historical and real time resource utilization.", + "metadata": "Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", + "spec": "Specification of the behavior of the autoscaler. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status.", + "status": "Current information about the autoscaler.", +} + +func (VerticalPodAutoscaler) SwaggerDoc() map[string]string { + return map_VerticalPodAutoscaler +} + +var map_VerticalPodAutoscalerCondition = map[string]string{ + "": "VerticalPodAutoscalerCondition describes the state of a VerticalPodAutoscaler at a certain point.", + "type": "type describes the current condition", + "status": "status is the status of the condition (True, False, Unknown)", + "lastTransitionTime": "lastTransitionTime is the last time the condition transitioned from one status to another", + "reason": "reason is the reason for the condition's last transition.", + "message": "message is a human-readable explanation containing details about the transition", +} + +func (VerticalPodAutoscalerCondition) SwaggerDoc() map[string]string { + return map_VerticalPodAutoscalerCondition +} + +var map_VerticalPodAutoscalerList = map[string]string{ + "": "VerticalPodAutoscalerList is a list of VerticalPodAutoscaler objects.", + "metadata": "metadata is the standard list metadata.", + "items": "items is the list of vertical pod autoscaler objects.", +} + +func (VerticalPodAutoscalerList) SwaggerDoc() map[string]string { + return map_VerticalPodAutoscalerList +} + +var map_VerticalPodAutoscalerSpec = map[string]string{ + "": "VerticalPodAutoscalerSpec is the specification of the behavior of the autoscaler.", + "selector": "A label query that determines the set of pods controlled by the Autoscaler. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors", + "updatePolicy": "Describes the rules on how changes are applied to the pods. If not specified, all fields in the `PodUpdatePolicy` are set to their default values.", + "resourcePolicy": "Controls how the autoscaler computes recommended resources. The resource policy may be used to set constraints on the recommendations for individual containers. If not specified, the autoscaler computes recommended resources for all containers in the pod, without additional constraints.", +} + +func (VerticalPodAutoscalerSpec) SwaggerDoc() map[string]string { + return map_VerticalPodAutoscalerSpec +} + +var map_VerticalPodAutoscalerStatus = map[string]string{ + "": "VerticalPodAutoscalerStatus describes the runtime state of the autoscaler.", + "recommendation": "The most recently computed amount of resources recommended by the autoscaler for the controlled pods.", + "conditions": "Conditions is the set of conditions required for this autoscaler to scale its target, and indicates whether or not those conditions are met.", +} + +func (VerticalPodAutoscalerStatus) SwaggerDoc() map[string]string { + return map_VerticalPodAutoscalerStatus +} + // AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go index dc59dc2d3..56fa1cec5 100644 --- a/vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -21,10 +21,50 @@ limitations under the License. package v2beta1 import ( - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "k8s.io/api/core/v1" + meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ContainerResourcePolicy) DeepCopyInto(out *ContainerResourcePolicy) { + *out = *in + if in.Mode != nil { + in, out := &in.Mode, &out.Mode + if *in == nil { + *out = nil + } else { + *out = new(ContainerScalingMode) + **out = **in + } + } + if in.MinAllowed != nil { + in, out := &in.MinAllowed, &out.MinAllowed + *out = make(v1.ResourceList, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } + } + if in.MaxAllowed != nil { + in, out := &in.MaxAllowed, &out.MaxAllowed + *out = make(v1.ResourceList, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ContainerResourcePolicy. +func (in *ContainerResourcePolicy) DeepCopy() *ContainerResourcePolicy { + if in == nil { + return nil + } + out := new(ContainerResourcePolicy) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CrossVersionObjectReference) DeepCopyInto(out *CrossVersionObjectReference) { *out = *in @@ -49,7 +89,7 @@ func (in *ExternalMetricSource) DeepCopyInto(out *ExternalMetricSource) { if *in == nil { *out = nil } else { - *out = new(v1.LabelSelector) + *out = new(meta_v1.LabelSelector) (*in).DeepCopyInto(*out) } } @@ -92,7 +132,7 @@ func (in *ExternalMetricStatus) DeepCopyInto(out *ExternalMetricStatus) { if *in == nil { *out = nil } else { - *out = new(v1.LabelSelector) + *out = new(meta_v1.LabelSelector) (*in).DeepCopyInto(*out) } } @@ -417,6 +457,54 @@ func (in *ObjectMetricStatus) DeepCopy() *ObjectMetricStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodResourcePolicy) DeepCopyInto(out *PodResourcePolicy) { + *out = *in + if in.ContainerPolicies != nil { + in, out := &in.ContainerPolicies, &out.ContainerPolicies + *out = make([]ContainerResourcePolicy, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodResourcePolicy. +func (in *PodResourcePolicy) DeepCopy() *PodResourcePolicy { + if in == nil { + return nil + } + out := new(PodResourcePolicy) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodUpdatePolicy) DeepCopyInto(out *PodUpdatePolicy) { + *out = *in + if in.UpdateMode != nil { + in, out := &in.UpdateMode, &out.UpdateMode + if *in == nil { + *out = nil + } else { + *out = new(UpdateMode) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodUpdatePolicy. +func (in *PodUpdatePolicy) DeepCopy() *PodUpdatePolicy { + if in == nil { + return nil + } + out := new(PodUpdatePolicy) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PodsMetricSource) DeepCopyInto(out *PodsMetricSource) { *out = *in @@ -451,6 +539,66 @@ func (in *PodsMetricStatus) DeepCopy() *PodsMetricStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RecommendedContainerResources) DeepCopyInto(out *RecommendedContainerResources) { + *out = *in + if in.Target != nil { + in, out := &in.Target, &out.Target + *out = make(v1.ResourceList, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } + } + if in.LowerBound != nil { + in, out := &in.LowerBound, &out.LowerBound + *out = make(v1.ResourceList, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } + } + if in.UpperBound != nil { + in, out := &in.UpperBound, &out.UpperBound + *out = make(v1.ResourceList, len(*in)) + for key, val := range *in { + (*out)[key] = val.DeepCopy() + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RecommendedContainerResources. +func (in *RecommendedContainerResources) DeepCopy() *RecommendedContainerResources { + if in == nil { + return nil + } + out := new(RecommendedContainerResources) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RecommendedPodResources) DeepCopyInto(out *RecommendedPodResources) { + *out = *in + if in.ContainerRecommendations != nil { + in, out := &in.ContainerRecommendations, &out.ContainerRecommendations + *out = make([]RecommendedContainerResources, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RecommendedPodResources. +func (in *RecommendedPodResources) DeepCopy() *RecommendedPodResources { + if in == nil { + return nil + } + out := new(RecommendedPodResources) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ResourceMetricSource) DeepCopyInto(out *ResourceMetricSource) { *out = *in @@ -510,3 +658,156 @@ func (in *ResourceMetricStatus) DeepCopy() *ResourceMetricStatus { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VerticalPodAutoscaler) DeepCopyInto(out *VerticalPodAutoscaler) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VerticalPodAutoscaler. +func (in *VerticalPodAutoscaler) DeepCopy() *VerticalPodAutoscaler { + if in == nil { + return nil + } + out := new(VerticalPodAutoscaler) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VerticalPodAutoscaler) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VerticalPodAutoscalerCondition) DeepCopyInto(out *VerticalPodAutoscalerCondition) { + *out = *in + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VerticalPodAutoscalerCondition. +func (in *VerticalPodAutoscalerCondition) DeepCopy() *VerticalPodAutoscalerCondition { + if in == nil { + return nil + } + out := new(VerticalPodAutoscalerCondition) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VerticalPodAutoscalerList) DeepCopyInto(out *VerticalPodAutoscalerList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]VerticalPodAutoscaler, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VerticalPodAutoscalerList. +func (in *VerticalPodAutoscalerList) DeepCopy() *VerticalPodAutoscalerList { + if in == nil { + return nil + } + out := new(VerticalPodAutoscalerList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *VerticalPodAutoscalerList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VerticalPodAutoscalerSpec) DeepCopyInto(out *VerticalPodAutoscalerSpec) { + *out = *in + if in.Selector != nil { + in, out := &in.Selector, &out.Selector + if *in == nil { + *out = nil + } else { + *out = new(meta_v1.LabelSelector) + (*in).DeepCopyInto(*out) + } + } + if in.UpdatePolicy != nil { + in, out := &in.UpdatePolicy, &out.UpdatePolicy + if *in == nil { + *out = nil + } else { + *out = new(PodUpdatePolicy) + (*in).DeepCopyInto(*out) + } + } + if in.ResourcePolicy != nil { + in, out := &in.ResourcePolicy, &out.ResourcePolicy + if *in == nil { + *out = nil + } else { + *out = new(PodResourcePolicy) + (*in).DeepCopyInto(*out) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VerticalPodAutoscalerSpec. +func (in *VerticalPodAutoscalerSpec) DeepCopy() *VerticalPodAutoscalerSpec { + if in == nil { + return nil + } + out := new(VerticalPodAutoscalerSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *VerticalPodAutoscalerStatus) DeepCopyInto(out *VerticalPodAutoscalerStatus) { + *out = *in + if in.Recommendation != nil { + in, out := &in.Recommendation, &out.Recommendation + if *in == nil { + *out = nil + } else { + *out = new(RecommendedPodResources) + (*in).DeepCopyInto(*out) + } + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]VerticalPodAutoscalerCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VerticalPodAutoscalerStatus. +func (in *VerticalPodAutoscalerStatus) DeepCopy() *VerticalPodAutoscalerStatus { + if in == nil { + return nil + } + out := new(VerticalPodAutoscalerStatus) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/api/batch/v1/BUILD b/vendor/k8s.io/api/batch/v1/BUILD deleted file mode 100644 index a7ca7a232..000000000 --- a/vendor/k8s.io/api/batch/v1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/batch/v1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/batch/v1/generated.pb.go b/vendor/k8s.io/api/batch/v1/generated.pb.go index 8599b6733..176567acf 100644 --- a/vendor/k8s.io/api/batch/v1/generated.pb.go +++ b/vendor/k8s.io/api/batch/v1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/batch/v1/generated.proto b/vendor/k8s.io/api/batch/v1/generated.proto index b0306f3bc..c4797a16b 100644 --- a/vendor/k8s.io/api/batch/v1/generated.proto +++ b/vendor/k8s.io/api/batch/v1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go index 0ddf4b116..2bb794a5f 100644 --- a/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_Job = map[string]string{ "": "Job represents the configuration of a single job.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", diff --git a/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go index a7179849b..3e5250f37 100644 --- a/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/batch/v1beta1/BUILD b/vendor/k8s.io/api/batch/v1beta1/BUILD deleted file mode 100644 index 3f0197b9c..000000000 --- a/vendor/k8s.io/api/batch/v1beta1/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/batch/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/batch/v1beta1/generated.pb.go b/vendor/k8s.io/api/batch/v1beta1/generated.pb.go index 6544184db..4edf11868 100644 --- a/vendor/k8s.io/api/batch/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/batch/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/batch/v1beta1/generated.proto b/vendor/k8s.io/api/batch/v1beta1/generated.proto index 9278a3d9b..f19af65e6 100644 --- a/vendor/k8s.io/api/batch/v1beta1/generated.proto +++ b/vendor/k8s.io/api/batch/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go index 3b53ac08a..abbdfec01 100644 --- a/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_CronJob = map[string]string{ "": "CronJob represents the configuration of a single cron job.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", diff --git a/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go index 78e361aba..a33f4ffcf 100644 --- a/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/batch/v2alpha1/BUILD b/vendor/k8s.io/api/batch/v2alpha1/BUILD deleted file mode 100644 index 0fc0ab57a..000000000 --- a/vendor/k8s.io/api/batch/v2alpha1/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/batch/v2alpha1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/batch/v2alpha1/generated.pb.go b/vendor/k8s.io/api/batch/v2alpha1/generated.pb.go index 2560953eb..3fcbf3425 100644 --- a/vendor/k8s.io/api/batch/v2alpha1/generated.pb.go +++ b/vendor/k8s.io/api/batch/v2alpha1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/batch/v2alpha1/generated.proto b/vendor/k8s.io/api/batch/v2alpha1/generated.proto index e4de3644c..1fe17ff21 100644 --- a/vendor/k8s.io/api/batch/v2alpha1/generated.proto +++ b/vendor/k8s.io/api/batch/v2alpha1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/batch/v2alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/batch/v2alpha1/types_swagger_doc_generated.go index d166b807f..f448a92cf 100644 --- a/vendor/k8s.io/api/batch/v2alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/batch/v2alpha1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v2alpha1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_CronJob = map[string]string{ "": "CronJob represents the configuration of a single cron job.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", diff --git a/vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go index d8352bfbe..bf0da8bf4 100644 --- a/vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/certificates/v1beta1/BUILD b/vendor/k8s.io/api/certificates/v1beta1/BUILD deleted file mode 100644 index 4c94dd064..000000000 --- a/vendor/k8s.io/api/certificates/v1beta1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/certificates/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go b/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go index 7f704bf82..5de4ade7e 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/certificates/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/certificates/v1beta1/generated.proto b/vendor/k8s.io/api/certificates/v1beta1/generated.proto index e3cd9000f..1d79767ed 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/generated.proto +++ b/vendor/k8s.io/api/certificates/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/certificates/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/certificates/v1beta1/types_swagger_doc_generated.go index 4fd91df06..f6a7e16ac 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/certificates/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_CertificateSigningRequest = map[string]string{ "": "Describes a certificate signing request", "spec": "The certificate request itself and any additional information.", diff --git a/vendor/k8s.io/api/certificates/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/certificates/v1beta1/zz_generated.deepcopy.go index 5848a255b..ffd24c30f 100644 --- a/vendor/k8s.io/api/certificates/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/certificates/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/core/v1/BUILD b/vendor/k8s.io/api/core/v1/BUILD deleted file mode 100644 index 560ff5bd7..000000000 --- a/vendor/k8s.io/api/core/v1/BUILD +++ /dev/null @@ -1,64 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "taint_test.go", - "toleration_test.go", - ], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "annotation_key_constants.go", - "doc.go", - "generated.pb.go", - "meta.go", - "objectreference.go", - "register.go", - "resource.go", - "taint.go", - "toleration.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/core/v1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/core/v1/annotation_key_constants.go b/vendor/k8s.io/api/core/v1/annotation_key_constants.go index de4e3cee4..16a0cfced 100644 --- a/vendor/k8s.io/api/core/v1/annotation_key_constants.go +++ b/vendor/k8s.io/api/core/v1/annotation_key_constants.go @@ -45,24 +45,17 @@ const ( // to one container of a pod. SeccompContainerAnnotationKeyPrefix string = "container.seccomp.security.alpha.kubernetes.io/" + // SeccompProfileRuntimeDefault represents the default seccomp profile used by container runtime. + SeccompProfileRuntimeDefault string = "runtime/default" + + // DeprecatedSeccompProfileDockerDefault represents the default seccomp profile used by docker. + // This is now deprecated and should be replaced by SeccompProfileRuntimeDefault. + DeprecatedSeccompProfileDockerDefault string = "docker/default" + // PreferAvoidPodsAnnotationKey represents the key of preferAvoidPods data (json serialized) // in the Annotations of a Node. PreferAvoidPodsAnnotationKey string = "scheduler.alpha.kubernetes.io/preferAvoidPods" - // SysctlsPodAnnotationKey represents the key of sysctls which are set for the infrastructure - // container of a pod. The annotation value is a comma separated list of sysctl_name=value - // key-value pairs. Only a limited set of whitelisted and isolated sysctls is supported by - // the kubelet. Pods with other sysctls will fail to launch. - SysctlsPodAnnotationKey string = "security.alpha.kubernetes.io/sysctls" - - // UnsafeSysctlsPodAnnotationKey represents the key of sysctls which are set for the infrastructure - // container of a pod. The annotation value is a comma separated list of sysctl_name=value - // key-value pairs. Unsafe sysctls must be explicitly enabled for a kubelet. They are properly - // namespaced to a pod or a container, but their isolation is usually unclear or weak. Their use - // is at-your-own-risk. Pods that attempt to set an unsafe sysctl that is not enabled for a kubelet - // will fail to launch. - UnsafeSysctlsPodAnnotationKey string = "security.alpha.kubernetes.io/unsafe-sysctls" - // ObjectTTLAnnotations represents a suggestion for kubelet for how long it can cache // an object (e.g. secret, config map) before fetching it again from apiserver. // This annotation can be attached to node. diff --git a/vendor/k8s.io/api/core/v1/generated.pb.go b/vendor/k8s.io/api/core/v1/generated.pb.go index 85c7b634b..48b5a3c5b 100644 --- a/vendor/k8s.io/api/core/v1/generated.pb.go +++ b/vendor/k8s.io/api/core/v1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -37,6 +37,7 @@ limitations under the License. Capabilities CephFSPersistentVolumeSource CephFSVolumeSource + CinderPersistentVolumeSource CinderVolumeSource ClientIPConfig ComponentCondition @@ -46,6 +47,7 @@ limitations under the License. ConfigMapEnvSource ConfigMapKeySelector ConfigMapList + ConfigMapNodeConfigSource ConfigMapProjection ConfigMapVolumeSource Container @@ -57,7 +59,6 @@ limitations under the License. ContainerStateWaiting ContainerStatus DaemonEndpoint - DeleteOptions DownwardAPIProjection DownwardAPIVolumeFile DownwardAPIVolumeSource @@ -96,7 +97,6 @@ limitations under the License. LimitRangeList LimitRangeSpec List - ListOptions LoadBalancerIngress LoadBalancerStatus LocalObjectReference @@ -111,6 +111,7 @@ limitations under the License. NodeAffinity NodeCondition NodeConfigSource + NodeConfigStatus NodeDaemonEndpoints NodeList NodeProxyOptions @@ -122,7 +123,6 @@ limitations under the License. NodeStatus NodeSystemInfo ObjectFieldSelector - ObjectMeta ObjectReference PersistentVolume PersistentVolumeClaim @@ -149,6 +149,7 @@ limitations under the License. PodLogOptions PodPortForwardOptions PodProxyOptions + PodReadinessGate PodSecurityContext PodSignature PodSpec @@ -181,6 +182,8 @@ limitations under the License. SELinuxOptions ScaleIOPersistentVolumeSource ScaleIOVolumeSource + ScopeSelector + ScopedResourceSelectorRequirement Secret SecretEnvSource SecretKeySelector @@ -193,6 +196,7 @@ limitations under the License. Service ServiceAccount ServiceAccountList + ServiceAccountTokenProjection ServiceList ServicePort ServiceProxyOptions @@ -205,6 +209,8 @@ limitations under the License. TCPSocketAction Taint Toleration + TopologySelectorLabelRequirement + TopologySelectorTerm Volume VolumeDevice VolumeMount @@ -300,255 +306,259 @@ func (m *CephFSVolumeSource) Reset() { *m = CephFSVolumeSourc func (*CephFSVolumeSource) ProtoMessage() {} func (*CephFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } +func (m *CinderPersistentVolumeSource) Reset() { *m = CinderPersistentVolumeSource{} } +func (*CinderPersistentVolumeSource) ProtoMessage() {} +func (*CinderPersistentVolumeSource) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{12} +} + func (m *CinderVolumeSource) Reset() { *m = CinderVolumeSource{} } func (*CinderVolumeSource) ProtoMessage() {} -func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } +func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } func (m *ClientIPConfig) Reset() { *m = ClientIPConfig{} } func (*ClientIPConfig) ProtoMessage() {} -func (*ClientIPConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } +func (*ClientIPConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } func (m *ComponentCondition) Reset() { *m = ComponentCondition{} } func (*ComponentCondition) ProtoMessage() {} -func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } +func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } func (m *ComponentStatus) Reset() { *m = ComponentStatus{} } func (*ComponentStatus) ProtoMessage() {} -func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } +func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } func (m *ComponentStatusList) Reset() { *m = ComponentStatusList{} } func (*ComponentStatusList) ProtoMessage() {} -func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } +func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } func (m *ConfigMap) Reset() { *m = ConfigMap{} } func (*ConfigMap) ProtoMessage() {} -func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} } +func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } func (m *ConfigMapEnvSource) Reset() { *m = ConfigMapEnvSource{} } func (*ConfigMapEnvSource) ProtoMessage() {} -func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} } +func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } func (m *ConfigMapKeySelector) Reset() { *m = ConfigMapKeySelector{} } func (*ConfigMapKeySelector) ProtoMessage() {} -func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} } +func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } func (m *ConfigMapList) Reset() { *m = ConfigMapList{} } func (*ConfigMapList) ProtoMessage() {} -func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } +func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } + +func (m *ConfigMapNodeConfigSource) Reset() { *m = ConfigMapNodeConfigSource{} } +func (*ConfigMapNodeConfigSource) ProtoMessage() {} +func (*ConfigMapNodeConfigSource) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{22} +} func (m *ConfigMapProjection) Reset() { *m = ConfigMapProjection{} } func (*ConfigMapProjection) ProtoMessage() {} -func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } +func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (m *ConfigMapVolumeSource) Reset() { *m = ConfigMapVolumeSource{} } func (*ConfigMapVolumeSource) ProtoMessage() {} -func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } +func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } func (m *Container) Reset() { *m = Container{} } func (*Container) ProtoMessage() {} -func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } +func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (m *ContainerImage) Reset() { *m = ContainerImage{} } func (*ContainerImage) ProtoMessage() {} -func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } +func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } func (m *ContainerPort) Reset() { *m = ContainerPort{} } func (*ContainerPort) ProtoMessage() {} -func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } +func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } func (m *ContainerState) Reset() { *m = ContainerState{} } func (*ContainerState) ProtoMessage() {} -func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } +func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } func (m *ContainerStateRunning) Reset() { *m = ContainerStateRunning{} } func (*ContainerStateRunning) ProtoMessage() {} -func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } +func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } func (m *ContainerStateTerminated) Reset() { *m = ContainerStateTerminated{} } func (*ContainerStateTerminated) ProtoMessage() {} func (*ContainerStateTerminated) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{28} + return fileDescriptorGenerated, []int{30} } func (m *ContainerStateWaiting) Reset() { *m = ContainerStateWaiting{} } func (*ContainerStateWaiting) ProtoMessage() {} -func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } +func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } func (m *ContainerStatus) Reset() { *m = ContainerStatus{} } func (*ContainerStatus) ProtoMessage() {} -func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } +func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } func (m *DaemonEndpoint) Reset() { *m = DaemonEndpoint{} } func (*DaemonEndpoint) ProtoMessage() {} -func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } - -func (m *DeleteOptions) Reset() { *m = DeleteOptions{} } -func (*DeleteOptions) ProtoMessage() {} -func (*DeleteOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } +func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } func (m *DownwardAPIProjection) Reset() { *m = DownwardAPIProjection{} } func (*DownwardAPIProjection) ProtoMessage() {} -func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } +func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } func (m *DownwardAPIVolumeFile) Reset() { *m = DownwardAPIVolumeFile{} } func (*DownwardAPIVolumeFile) ProtoMessage() {} -func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } +func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} } func (m *DownwardAPIVolumeSource) Reset() { *m = DownwardAPIVolumeSource{} } func (*DownwardAPIVolumeSource) ProtoMessage() {} func (*DownwardAPIVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{35} + return fileDescriptorGenerated, []int{36} } func (m *EmptyDirVolumeSource) Reset() { *m = EmptyDirVolumeSource{} } func (*EmptyDirVolumeSource) ProtoMessage() {} -func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} } +func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } func (m *EndpointAddress) Reset() { *m = EndpointAddress{} } func (*EndpointAddress) ProtoMessage() {} -func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} } +func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } func (m *EndpointPort) Reset() { *m = EndpointPort{} } func (*EndpointPort) ProtoMessage() {} -func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} } +func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } func (m *EndpointSubset) Reset() { *m = EndpointSubset{} } func (*EndpointSubset) ProtoMessage() {} -func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} } +func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } func (m *Endpoints) Reset() { *m = Endpoints{} } func (*Endpoints) ProtoMessage() {} -func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} } +func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } func (m *EndpointsList) Reset() { *m = EndpointsList{} } func (*EndpointsList) ProtoMessage() {} -func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} } +func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } func (m *EnvFromSource) Reset() { *m = EnvFromSource{} } func (*EnvFromSource) ProtoMessage() {} -func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} } +func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } func (m *EnvVar) Reset() { *m = EnvVar{} } func (*EnvVar) ProtoMessage() {} -func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} } +func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } func (m *EnvVarSource) Reset() { *m = EnvVarSource{} } func (*EnvVarSource) ProtoMessage() {} -func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} } +func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} } +func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } func (m *EventList) Reset() { *m = EventList{} } func (*EventList) ProtoMessage() {} -func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} } +func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } func (m *EventSeries) Reset() { *m = EventSeries{} } func (*EventSeries) ProtoMessage() {} -func (*EventSeries) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} } +func (*EventSeries) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } func (m *EventSource) Reset() { *m = EventSource{} } func (*EventSource) ProtoMessage() {} -func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} } +func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } func (m *ExecAction) Reset() { *m = ExecAction{} } func (*ExecAction) ProtoMessage() {} -func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} } +func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } func (m *FCVolumeSource) Reset() { *m = FCVolumeSource{} } func (*FCVolumeSource) ProtoMessage() {} -func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} } +func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} } func (m *FlexPersistentVolumeSource) Reset() { *m = FlexPersistentVolumeSource{} } func (*FlexPersistentVolumeSource) ProtoMessage() {} func (*FlexPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{51} + return fileDescriptorGenerated, []int{52} } func (m *FlexVolumeSource) Reset() { *m = FlexVolumeSource{} } func (*FlexVolumeSource) ProtoMessage() {} -func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} } +func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } func (m *FlockerVolumeSource) Reset() { *m = FlockerVolumeSource{} } func (*FlockerVolumeSource) ProtoMessage() {} -func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} } +func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} } func (m *GCEPersistentDiskVolumeSource) Reset() { *m = GCEPersistentDiskVolumeSource{} } func (*GCEPersistentDiskVolumeSource) ProtoMessage() {} func (*GCEPersistentDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{54} + return fileDescriptorGenerated, []int{55} } func (m *GitRepoVolumeSource) Reset() { *m = GitRepoVolumeSource{} } func (*GitRepoVolumeSource) ProtoMessage() {} -func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} } +func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } func (m *GlusterfsVolumeSource) Reset() { *m = GlusterfsVolumeSource{} } func (*GlusterfsVolumeSource) ProtoMessage() {} -func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} } +func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } func (m *HTTPGetAction) Reset() { *m = HTTPGetAction{} } func (*HTTPGetAction) ProtoMessage() {} -func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} } +func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } func (m *HTTPHeader) Reset() { *m = HTTPHeader{} } func (*HTTPHeader) ProtoMessage() {} -func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} } +func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } func (m *Handler) Reset() { *m = Handler{} } func (*Handler) ProtoMessage() {} -func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} } +func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } func (m *HostAlias) Reset() { *m = HostAlias{} } func (*HostAlias) ProtoMessage() {} -func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} } +func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } func (m *HostPathVolumeSource) Reset() { *m = HostPathVolumeSource{} } func (*HostPathVolumeSource) ProtoMessage() {} -func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} } +func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} } func (m *ISCSIPersistentVolumeSource) Reset() { *m = ISCSIPersistentVolumeSource{} } func (*ISCSIPersistentVolumeSource) ProtoMessage() {} func (*ISCSIPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{62} + return fileDescriptorGenerated, []int{63} } func (m *ISCSIVolumeSource) Reset() { *m = ISCSIVolumeSource{} } func (*ISCSIVolumeSource) ProtoMessage() {} -func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} } +func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } func (m *KeyToPath) Reset() { *m = KeyToPath{} } func (*KeyToPath) ProtoMessage() {} -func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} } +func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } func (m *Lifecycle) Reset() { *m = Lifecycle{} } func (*Lifecycle) ProtoMessage() {} -func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} } +func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } func (m *LimitRange) Reset() { *m = LimitRange{} } func (*LimitRange) ProtoMessage() {} -func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} } +func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } func (m *LimitRangeItem) Reset() { *m = LimitRangeItem{} } func (*LimitRangeItem) ProtoMessage() {} -func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} } +func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } func (m *LimitRangeList) Reset() { *m = LimitRangeList{} } func (*LimitRangeList) ProtoMessage() {} -func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} } +func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } func (m *LimitRangeSpec) Reset() { *m = LimitRangeSpec{} } func (*LimitRangeSpec) ProtoMessage() {} -func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} } +func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } func (m *List) Reset() { *m = List{} } func (*List) ProtoMessage() {} -func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} } - -func (m *ListOptions) Reset() { *m = ListOptions{} } -func (*ListOptions) ProtoMessage() {} -func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } +func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} } func (m *LoadBalancerIngress) Reset() { *m = LoadBalancerIngress{} } func (*LoadBalancerIngress) ProtoMessage() {} @@ -606,55 +616,55 @@ func (m *NodeConfigSource) Reset() { *m = NodeConfigSource{} func (*NodeConfigSource) ProtoMessage() {} func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} } +func (m *NodeConfigStatus) Reset() { *m = NodeConfigStatus{} } +func (*NodeConfigStatus) ProtoMessage() {} +func (*NodeConfigStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } + func (m *NodeDaemonEndpoints) Reset() { *m = NodeDaemonEndpoints{} } func (*NodeDaemonEndpoints) ProtoMessage() {} -func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} } +func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } func (m *NodeList) Reset() { *m = NodeList{} } func (*NodeList) ProtoMessage() {} -func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} } +func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } func (m *NodeProxyOptions) Reset() { *m = NodeProxyOptions{} } func (*NodeProxyOptions) ProtoMessage() {} -func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} } +func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } func (m *NodeResources) Reset() { *m = NodeResources{} } func (*NodeResources) ProtoMessage() {} -func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} } +func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } func (m *NodeSelector) Reset() { *m = NodeSelector{} } func (*NodeSelector) ProtoMessage() {} -func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} } +func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} } func (m *NodeSelectorRequirement) Reset() { *m = NodeSelectorRequirement{} } func (*NodeSelectorRequirement) ProtoMessage() {} func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{91} + return fileDescriptorGenerated, []int{92} } func (m *NodeSelectorTerm) Reset() { *m = NodeSelectorTerm{} } func (*NodeSelectorTerm) ProtoMessage() {} -func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} } +func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } func (m *NodeSpec) Reset() { *m = NodeSpec{} } func (*NodeSpec) ProtoMessage() {} -func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} } +func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} } func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} -func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} } +func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} } func (m *NodeSystemInfo) Reset() { *m = NodeSystemInfo{} } func (*NodeSystemInfo) ProtoMessage() {} -func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} } +func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} } func (m *ObjectFieldSelector) Reset() { *m = ObjectFieldSelector{} } func (*ObjectFieldSelector) ProtoMessage() {} -func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} } - -func (m *ObjectMeta) Reset() { *m = ObjectMeta{} } -func (*ObjectMeta) ProtoMessage() {} -func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{97} } +func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{97} } func (m *ObjectReference) Reset() { *m = ObjectReference{} } func (*ObjectReference) ProtoMessage() {} @@ -776,280 +786,310 @@ func (m *PodProxyOptions) Reset() { *m = PodProxyOptions{} } func (*PodProxyOptions) ProtoMessage() {} func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} } +func (m *PodReadinessGate) Reset() { *m = PodReadinessGate{} } +func (*PodReadinessGate) ProtoMessage() {} +func (*PodReadinessGate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } + func (m *PodSecurityContext) Reset() { *m = PodSecurityContext{} } func (*PodSecurityContext) ProtoMessage() {} -func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} } +func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } func (m *PodSignature) Reset() { *m = PodSignature{} } func (*PodSignature) ProtoMessage() {} -func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} } +func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } func (m *PodSpec) Reset() { *m = PodSpec{} } func (*PodSpec) ProtoMessage() {} -func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } +func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } func (m *PodStatus) Reset() { *m = PodStatus{} } func (*PodStatus) ProtoMessage() {} -func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } +func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } func (m *PodStatusResult) Reset() { *m = PodStatusResult{} } func (*PodStatusResult) ProtoMessage() {} -func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } +func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } func (m *PodTemplate) Reset() { *m = PodTemplate{} } func (*PodTemplate) ProtoMessage() {} -func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } +func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } func (m *PodTemplateList) Reset() { *m = PodTemplateList{} } func (*PodTemplateList) ProtoMessage() {} -func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } +func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } func (m *PodTemplateSpec) Reset() { *m = PodTemplateSpec{} } func (*PodTemplateSpec) ProtoMessage() {} -func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } +func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } func (m *PortworxVolumeSource) Reset() { *m = PortworxVolumeSource{} } func (*PortworxVolumeSource) ProtoMessage() {} -func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} } +func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} } func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} -func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} } +func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} } func (m *PreferAvoidPodsEntry) Reset() { *m = PreferAvoidPodsEntry{} } func (*PreferAvoidPodsEntry) ProtoMessage() {} -func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} } +func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} } func (m *PreferredSchedulingTerm) Reset() { *m = PreferredSchedulingTerm{} } func (*PreferredSchedulingTerm) ProtoMessage() {} func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{135} + return fileDescriptorGenerated, []int{136} } func (m *Probe) Reset() { *m = Probe{} } func (*Probe) ProtoMessage() {} -func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} } +func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolumeSource{} } func (*ProjectedVolumeSource) ProtoMessage() {} -func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } +func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} -func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } +func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } func (m *RBDPersistentVolumeSource) Reset() { *m = RBDPersistentVolumeSource{} } func (*RBDPersistentVolumeSource) ProtoMessage() {} func (*RBDPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{139} + return fileDescriptorGenerated, []int{140} } func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} -func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } +func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} -func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } +func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} -func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } +func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{143} + return fileDescriptorGenerated, []int{144} } func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{144} + return fileDescriptorGenerated, []int{145} } func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{145} + return fileDescriptorGenerated, []int{146} } func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{146} + return fileDescriptorGenerated, []int{147} } func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} -func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } +func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} -func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } +func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} -func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } +func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} -func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } +func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} -func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } +func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} -func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } +func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} -func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } +func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } func (m *ScaleIOPersistentVolumeSource) Reset() { *m = ScaleIOPersistentVolumeSource{} } func (*ScaleIOPersistentVolumeSource) ProtoMessage() {} func (*ScaleIOPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{154} + return fileDescriptorGenerated, []int{155} } func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} -func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } +func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } + +func (m *ScopeSelector) Reset() { *m = ScopeSelector{} } +func (*ScopeSelector) ProtoMessage() {} +func (*ScopeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } + +func (m *ScopedResourceSelectorRequirement) Reset() { *m = ScopedResourceSelectorRequirement{} } +func (*ScopedResourceSelectorRequirement) ProtoMessage() {} +func (*ScopedResourceSelectorRequirement) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{158} +} func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} -func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} -func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } +func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } + +func (m *ServiceAccountTokenProjection) Reset() { *m = ServiceAccountTokenProjection{} } +func (*ServiceAccountTokenProjection) ProtoMessage() {} +func (*ServiceAccountTokenProjection) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{171} +} func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{171} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{176} } func (m *SessionAffinityConfig) Reset() { *m = SessionAffinityConfig{} } func (*SessionAffinityConfig) ProtoMessage() {} -func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} } +func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} } func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{174} + return fileDescriptorGenerated, []int{178} } func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} -func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} } +func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{179} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{176} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{180} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{181} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{178} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{182} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{179} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{183} } + +func (m *TopologySelectorLabelRequirement) Reset() { *m = TopologySelectorLabelRequirement{} } +func (*TopologySelectorLabelRequirement) ProtoMessage() {} +func (*TopologySelectorLabelRequirement) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{184} +} + +func (m *TopologySelectorTerm) Reset() { *m = TopologySelectorTerm{} } +func (*TopologySelectorTerm) ProtoMessage() {} +func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{185} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{180} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{186} } func (m *VolumeDevice) Reset() { *m = VolumeDevice{} } func (*VolumeDevice) ProtoMessage() {} -func (*VolumeDevice) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{181} } +func (*VolumeDevice) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{187} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{182} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{188} } func (m *VolumeNodeAffinity) Reset() { *m = VolumeNodeAffinity{} } func (*VolumeNodeAffinity) ProtoMessage() {} -func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{183} } +func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{189} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{184} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{190} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{185} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{191} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{186} + return fileDescriptorGenerated, []int{192} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{187} + return fileDescriptorGenerated, []int{193} } func init() { @@ -1065,6 +1105,7 @@ func init() { proto.RegisterType((*Capabilities)(nil), "k8s.io.api.core.v1.Capabilities") proto.RegisterType((*CephFSPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CephFSPersistentVolumeSource") proto.RegisterType((*CephFSVolumeSource)(nil), "k8s.io.api.core.v1.CephFSVolumeSource") + proto.RegisterType((*CinderPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CinderPersistentVolumeSource") proto.RegisterType((*CinderVolumeSource)(nil), "k8s.io.api.core.v1.CinderVolumeSource") proto.RegisterType((*ClientIPConfig)(nil), "k8s.io.api.core.v1.ClientIPConfig") proto.RegisterType((*ComponentCondition)(nil), "k8s.io.api.core.v1.ComponentCondition") @@ -1074,6 +1115,7 @@ func init() { proto.RegisterType((*ConfigMapEnvSource)(nil), "k8s.io.api.core.v1.ConfigMapEnvSource") proto.RegisterType((*ConfigMapKeySelector)(nil), "k8s.io.api.core.v1.ConfigMapKeySelector") proto.RegisterType((*ConfigMapList)(nil), "k8s.io.api.core.v1.ConfigMapList") + proto.RegisterType((*ConfigMapNodeConfigSource)(nil), "k8s.io.api.core.v1.ConfigMapNodeConfigSource") proto.RegisterType((*ConfigMapProjection)(nil), "k8s.io.api.core.v1.ConfigMapProjection") proto.RegisterType((*ConfigMapVolumeSource)(nil), "k8s.io.api.core.v1.ConfigMapVolumeSource") proto.RegisterType((*Container)(nil), "k8s.io.api.core.v1.Container") @@ -1085,7 +1127,6 @@ func init() { proto.RegisterType((*ContainerStateWaiting)(nil), "k8s.io.api.core.v1.ContainerStateWaiting") proto.RegisterType((*ContainerStatus)(nil), "k8s.io.api.core.v1.ContainerStatus") proto.RegisterType((*DaemonEndpoint)(nil), "k8s.io.api.core.v1.DaemonEndpoint") - proto.RegisterType((*DeleteOptions)(nil), "k8s.io.api.core.v1.DeleteOptions") proto.RegisterType((*DownwardAPIProjection)(nil), "k8s.io.api.core.v1.DownwardAPIProjection") proto.RegisterType((*DownwardAPIVolumeFile)(nil), "k8s.io.api.core.v1.DownwardAPIVolumeFile") proto.RegisterType((*DownwardAPIVolumeSource)(nil), "k8s.io.api.core.v1.DownwardAPIVolumeSource") @@ -1124,7 +1165,6 @@ func init() { proto.RegisterType((*LimitRangeList)(nil), "k8s.io.api.core.v1.LimitRangeList") proto.RegisterType((*LimitRangeSpec)(nil), "k8s.io.api.core.v1.LimitRangeSpec") proto.RegisterType((*List)(nil), "k8s.io.api.core.v1.List") - proto.RegisterType((*ListOptions)(nil), "k8s.io.api.core.v1.ListOptions") proto.RegisterType((*LoadBalancerIngress)(nil), "k8s.io.api.core.v1.LoadBalancerIngress") proto.RegisterType((*LoadBalancerStatus)(nil), "k8s.io.api.core.v1.LoadBalancerStatus") proto.RegisterType((*LocalObjectReference)(nil), "k8s.io.api.core.v1.LocalObjectReference") @@ -1139,6 +1179,7 @@ func init() { proto.RegisterType((*NodeAffinity)(nil), "k8s.io.api.core.v1.NodeAffinity") proto.RegisterType((*NodeCondition)(nil), "k8s.io.api.core.v1.NodeCondition") proto.RegisterType((*NodeConfigSource)(nil), "k8s.io.api.core.v1.NodeConfigSource") + proto.RegisterType((*NodeConfigStatus)(nil), "k8s.io.api.core.v1.NodeConfigStatus") proto.RegisterType((*NodeDaemonEndpoints)(nil), "k8s.io.api.core.v1.NodeDaemonEndpoints") proto.RegisterType((*NodeList)(nil), "k8s.io.api.core.v1.NodeList") proto.RegisterType((*NodeProxyOptions)(nil), "k8s.io.api.core.v1.NodeProxyOptions") @@ -1150,7 +1191,6 @@ func init() { proto.RegisterType((*NodeStatus)(nil), "k8s.io.api.core.v1.NodeStatus") proto.RegisterType((*NodeSystemInfo)(nil), "k8s.io.api.core.v1.NodeSystemInfo") proto.RegisterType((*ObjectFieldSelector)(nil), "k8s.io.api.core.v1.ObjectFieldSelector") - proto.RegisterType((*ObjectMeta)(nil), "k8s.io.api.core.v1.ObjectMeta") proto.RegisterType((*ObjectReference)(nil), "k8s.io.api.core.v1.ObjectReference") proto.RegisterType((*PersistentVolume)(nil), "k8s.io.api.core.v1.PersistentVolume") proto.RegisterType((*PersistentVolumeClaim)(nil), "k8s.io.api.core.v1.PersistentVolumeClaim") @@ -1177,6 +1217,7 @@ func init() { proto.RegisterType((*PodLogOptions)(nil), "k8s.io.api.core.v1.PodLogOptions") proto.RegisterType((*PodPortForwardOptions)(nil), "k8s.io.api.core.v1.PodPortForwardOptions") proto.RegisterType((*PodProxyOptions)(nil), "k8s.io.api.core.v1.PodProxyOptions") + proto.RegisterType((*PodReadinessGate)(nil), "k8s.io.api.core.v1.PodReadinessGate") proto.RegisterType((*PodSecurityContext)(nil), "k8s.io.api.core.v1.PodSecurityContext") proto.RegisterType((*PodSignature)(nil), "k8s.io.api.core.v1.PodSignature") proto.RegisterType((*PodSpec)(nil), "k8s.io.api.core.v1.PodSpec") @@ -1209,6 +1250,8 @@ func init() { proto.RegisterType((*SELinuxOptions)(nil), "k8s.io.api.core.v1.SELinuxOptions") proto.RegisterType((*ScaleIOPersistentVolumeSource)(nil), "k8s.io.api.core.v1.ScaleIOPersistentVolumeSource") proto.RegisterType((*ScaleIOVolumeSource)(nil), "k8s.io.api.core.v1.ScaleIOVolumeSource") + proto.RegisterType((*ScopeSelector)(nil), "k8s.io.api.core.v1.ScopeSelector") + proto.RegisterType((*ScopedResourceSelectorRequirement)(nil), "k8s.io.api.core.v1.ScopedResourceSelectorRequirement") proto.RegisterType((*Secret)(nil), "k8s.io.api.core.v1.Secret") proto.RegisterType((*SecretEnvSource)(nil), "k8s.io.api.core.v1.SecretEnvSource") proto.RegisterType((*SecretKeySelector)(nil), "k8s.io.api.core.v1.SecretKeySelector") @@ -1221,6 +1264,7 @@ func init() { proto.RegisterType((*Service)(nil), "k8s.io.api.core.v1.Service") proto.RegisterType((*ServiceAccount)(nil), "k8s.io.api.core.v1.ServiceAccount") proto.RegisterType((*ServiceAccountList)(nil), "k8s.io.api.core.v1.ServiceAccountList") + proto.RegisterType((*ServiceAccountTokenProjection)(nil), "k8s.io.api.core.v1.ServiceAccountTokenProjection") proto.RegisterType((*ServiceList)(nil), "k8s.io.api.core.v1.ServiceList") proto.RegisterType((*ServicePort)(nil), "k8s.io.api.core.v1.ServicePort") proto.RegisterType((*ServiceProxyOptions)(nil), "k8s.io.api.core.v1.ServiceProxyOptions") @@ -1233,6 +1277,8 @@ func init() { proto.RegisterType((*TCPSocketAction)(nil), "k8s.io.api.core.v1.TCPSocketAction") proto.RegisterType((*Taint)(nil), "k8s.io.api.core.v1.Taint") proto.RegisterType((*Toleration)(nil), "k8s.io.api.core.v1.Toleration") + proto.RegisterType((*TopologySelectorLabelRequirement)(nil), "k8s.io.api.core.v1.TopologySelectorLabelRequirement") + proto.RegisterType((*TopologySelectorTerm)(nil), "k8s.io.api.core.v1.TopologySelectorTerm") proto.RegisterType((*Volume)(nil), "k8s.io.api.core.v1.Volume") proto.RegisterType((*VolumeDevice)(nil), "k8s.io.api.core.v1.VolumeDevice") proto.RegisterType((*VolumeMount)(nil), "k8s.io.api.core.v1.VolumeMount") @@ -1809,6 +1855,50 @@ func (m *CephFSVolumeSource) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *CinderPersistentVolumeSource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CinderPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.VolumeID))) + i += copy(dAtA[i:], m.VolumeID) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.FSType))) + i += copy(dAtA[i:], m.FSType) + dAtA[i] = 0x18 + i++ + if m.ReadOnly { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + if m.SecretRef != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) + n11, err := m.SecretRef.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n11 + } + return i, nil +} + func (m *CinderVolumeSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1840,6 +1930,16 @@ func (m *CinderVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0 } i++ + if m.SecretRef != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) + n12, err := m.SecretRef.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n12 + } return i, nil } @@ -1918,11 +2018,11 @@ func (m *ComponentStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n11, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n13, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n11 + i += n13 if len(m.Conditions) > 0 { for _, msg := range m.Conditions { dAtA[i] = 0x12 @@ -1956,11 +2056,11 @@ func (m *ComponentStatusList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n12, err := m.ListMeta.MarshalTo(dAtA[i:]) + n14, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n12 + i += n14 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -1994,11 +2094,11 @@ func (m *ConfigMap) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n13, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n15, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n13 + i += n15 if len(m.Data) > 0 { keysForData := make([]string, 0, len(m.Data)) for k := range m.Data { @@ -2070,11 +2170,11 @@ func (m *ConfigMapEnvSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n14, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n16, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n14 + i += n16 if m.Optional != nil { dAtA[i] = 0x10 i++ @@ -2106,11 +2206,11 @@ func (m *ConfigMapKeySelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n15, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n17, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n15 + i += n17 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) @@ -2146,11 +2246,11 @@ func (m *ConfigMapList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n16, err := m.ListMeta.MarshalTo(dAtA[i:]) + n18, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n16 + i += n18 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -2166,6 +2266,44 @@ func (m *ConfigMapList) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *ConfigMapNodeConfigSource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConfigMapNodeConfigSource) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) + i += copy(dAtA[i:], m.Namespace) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.UID))) + i += copy(dAtA[i:], m.UID) + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceVersion))) + i += copy(dAtA[i:], m.ResourceVersion) + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.KubeletConfigKey))) + i += copy(dAtA[i:], m.KubeletConfigKey) + return i, nil +} + func (m *ConfigMapProjection) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2184,11 +2322,11 @@ func (m *ConfigMapProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n17, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n19, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n17 + i += n19 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -2232,11 +2370,11 @@ func (m *ConfigMapVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n18, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n20, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n18 + i += n20 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -2351,11 +2489,11 @@ func (m *Container) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Resources.Size())) - n19, err := m.Resources.MarshalTo(dAtA[i:]) + n21, err := m.Resources.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n19 + i += n21 if len(m.VolumeMounts) > 0 { for _, msg := range m.VolumeMounts { dAtA[i] = 0x4a @@ -2372,31 +2510,31 @@ func (m *Container) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LivenessProbe.Size())) - n20, err := m.LivenessProbe.MarshalTo(dAtA[i:]) + n22, err := m.LivenessProbe.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n20 + i += n22 } if m.ReadinessProbe != nil { dAtA[i] = 0x5a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ReadinessProbe.Size())) - n21, err := m.ReadinessProbe.MarshalTo(dAtA[i:]) + n23, err := m.ReadinessProbe.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n21 + i += n23 } if m.Lifecycle != nil { dAtA[i] = 0x62 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Lifecycle.Size())) - n22, err := m.Lifecycle.MarshalTo(dAtA[i:]) + n24, err := m.Lifecycle.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n22 + i += n24 } dAtA[i] = 0x6a i++ @@ -2410,11 +2548,11 @@ func (m *Container) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x7a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecurityContext.Size())) - n23, err := m.SecurityContext.MarshalTo(dAtA[i:]) + n25, err := m.SecurityContext.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n23 + i += n25 } dAtA[i] = 0x80 i++ @@ -2574,31 +2712,31 @@ func (m *ContainerState) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Waiting.Size())) - n24, err := m.Waiting.MarshalTo(dAtA[i:]) + n26, err := m.Waiting.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n24 + i += n26 } if m.Running != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Running.Size())) - n25, err := m.Running.MarshalTo(dAtA[i:]) + n27, err := m.Running.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n27 } if m.Terminated != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Terminated.Size())) - n26, err := m.Terminated.MarshalTo(dAtA[i:]) + n28, err := m.Terminated.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n28 } return i, nil } @@ -2621,11 +2759,11 @@ func (m *ContainerStateRunning) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n27, err := m.StartedAt.MarshalTo(dAtA[i:]) + n29, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n29 return i, nil } @@ -2661,19 +2799,19 @@ func (m *ContainerStateTerminated) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n28, err := m.StartedAt.MarshalTo(dAtA[i:]) + n30, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n30 dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FinishedAt.Size())) - n29, err := m.FinishedAt.MarshalTo(dAtA[i:]) + n31, err := m.FinishedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n31 dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.ContainerID))) @@ -2729,19 +2867,19 @@ func (m *ContainerStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.State.Size())) - n30, err := m.State.MarshalTo(dAtA[i:]) + n32, err := m.State.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n30 + i += n32 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTerminationState.Size())) - n31, err := m.LastTerminationState.MarshalTo(dAtA[i:]) + n33, err := m.LastTerminationState.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n31 + i += n33 dAtA[i] = 0x20 i++ if m.Ready { @@ -2789,55 +2927,6 @@ func (m *DaemonEndpoint) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *DeleteOptions) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *DeleteOptions) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - if m.GracePeriodSeconds != nil { - dAtA[i] = 0x8 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(*m.GracePeriodSeconds)) - } - if m.Preconditions != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Preconditions.Size())) - n32, err := m.Preconditions.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n32 - } - if m.OrphanDependents != nil { - dAtA[i] = 0x18 - i++ - if *m.OrphanDependents { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - } - if m.PropagationPolicy != nil { - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PropagationPolicy))) - i += copy(dAtA[i:], *m.PropagationPolicy) - } - return i, nil -} - func (m *DownwardAPIProjection) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2891,21 +2980,21 @@ func (m *DownwardAPIVolumeFile) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FieldRef.Size())) - n33, err := m.FieldRef.MarshalTo(dAtA[i:]) + n34, err := m.FieldRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n33 + i += n34 } if m.ResourceFieldRef != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ResourceFieldRef.Size())) - n34, err := m.ResourceFieldRef.MarshalTo(dAtA[i:]) + n35, err := m.ResourceFieldRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n34 + i += n35 } if m.Mode != nil { dAtA[i] = 0x20 @@ -2973,11 +3062,11 @@ func (m *EmptyDirVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SizeLimit.Size())) - n35, err := m.SizeLimit.MarshalTo(dAtA[i:]) + n36, err := m.SizeLimit.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n35 + i += n36 } return i, nil } @@ -3005,11 +3094,11 @@ func (m *EndpointAddress) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetRef.Size())) - n36, err := m.TargetRef.MarshalTo(dAtA[i:]) + n37, err := m.TargetRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n36 + i += n37 } dAtA[i] = 0x1a i++ @@ -3125,11 +3214,11 @@ func (m *Endpoints) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n37, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n38, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n37 + i += n38 if len(m.Subsets) > 0 { for _, msg := range m.Subsets { dAtA[i] = 0x12 @@ -3163,11 +3252,11 @@ func (m *EndpointsList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n38, err := m.ListMeta.MarshalTo(dAtA[i:]) + n39, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n38 + i += n39 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -3206,21 +3295,21 @@ func (m *EnvFromSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMapRef.Size())) - n39, err := m.ConfigMapRef.MarshalTo(dAtA[i:]) + n40, err := m.ConfigMapRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n39 + i += n40 } if m.SecretRef != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n40, err := m.SecretRef.MarshalTo(dAtA[i:]) + n41, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n40 + i += n41 } return i, nil } @@ -3252,11 +3341,11 @@ func (m *EnvVar) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ValueFrom.Size())) - n41, err := m.ValueFrom.MarshalTo(dAtA[i:]) + n42, err := m.ValueFrom.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n41 + i += n42 } return i, nil } @@ -3280,42 +3369,42 @@ func (m *EnvVarSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FieldRef.Size())) - n42, err := m.FieldRef.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n42 - } - if m.ResourceFieldRef != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ResourceFieldRef.Size())) - n43, err := m.ResourceFieldRef.MarshalTo(dAtA[i:]) + n43, err := m.FieldRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n43 } - if m.ConfigMapKeyRef != nil { - dAtA[i] = 0x1a + if m.ResourceFieldRef != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMapKeyRef.Size())) - n44, err := m.ConfigMapKeyRef.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.ResourceFieldRef.Size())) + n44, err := m.ResourceFieldRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n44 } - if m.SecretKeyRef != nil { - dAtA[i] = 0x22 + if m.ConfigMapKeyRef != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.SecretKeyRef.Size())) - n45, err := m.SecretKeyRef.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMapKeyRef.Size())) + n45, err := m.ConfigMapKeyRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n45 } + if m.SecretKeyRef != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.SecretKeyRef.Size())) + n46, err := m.SecretKeyRef.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n46 + } return i, nil } @@ -3337,19 +3426,19 @@ func (m *Event) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n46, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n46 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.InvolvedObject.Size())) - n47, err := m.InvolvedObject.MarshalTo(dAtA[i:]) + n47, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n47 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.InvolvedObject.Size())) + n48, err := m.InvolvedObject.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n48 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -3361,27 +3450,27 @@ func (m *Event) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size())) - n48, err := m.Source.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n48 - dAtA[i] = 0x32 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.FirstTimestamp.Size())) - n49, err := m.FirstTimestamp.MarshalTo(dAtA[i:]) + n49, err := m.Source.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n49 - dAtA[i] = 0x3a + dAtA[i] = 0x32 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.LastTimestamp.Size())) - n50, err := m.LastTimestamp.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.FirstTimestamp.Size())) + n50, err := m.FirstTimestamp.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n50 + dAtA[i] = 0x3a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.LastTimestamp.Size())) + n51, err := m.LastTimestamp.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n51 dAtA[i] = 0x40 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Count)) @@ -3392,20 +3481,20 @@ func (m *Event) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EventTime.Size())) - n51, err := m.EventTime.MarshalTo(dAtA[i:]) + n52, err := m.EventTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n51 + i += n52 if m.Series != nil { dAtA[i] = 0x5a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Series.Size())) - n52, err := m.Series.MarshalTo(dAtA[i:]) + n53, err := m.Series.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n52 + i += n53 } dAtA[i] = 0x62 i++ @@ -3415,11 +3504,11 @@ func (m *Event) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x6a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Related.Size())) - n53, err := m.Related.MarshalTo(dAtA[i:]) + n54, err := m.Related.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n53 + i += n54 } dAtA[i] = 0x72 i++ @@ -3450,11 +3539,11 @@ func (m *EventList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n54, err := m.ListMeta.MarshalTo(dAtA[i:]) + n55, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n54 + i += n55 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -3491,11 +3580,11 @@ func (m *EventSeries) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastObservedTime.Size())) - n55, err := m.LastObservedTime.MarshalTo(dAtA[i:]) + n56, err := m.LastObservedTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n55 + i += n56 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.State))) @@ -3654,11 +3743,11 @@ func (m *FlexPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n56, err := m.SecretRef.MarshalTo(dAtA[i:]) + n57, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n56 + i += n57 } dAtA[i] = 0x20 i++ @@ -3720,11 +3809,11 @@ func (m *FlexVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n57, err := m.SecretRef.MarshalTo(dAtA[i:]) + n58, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n57 + i += n58 } dAtA[i] = 0x20 i++ @@ -3908,11 +3997,11 @@ func (m *HTTPGetAction) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n58, err := m.Port.MarshalTo(dAtA[i:]) + n59, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n58 + i += n59 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) @@ -3981,32 +4070,32 @@ func (m *Handler) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Exec.Size())) - n59, err := m.Exec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n59 - } - if m.HTTPGet != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.HTTPGet.Size())) - n60, err := m.HTTPGet.MarshalTo(dAtA[i:]) + n60, err := m.Exec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n60 } - if m.TCPSocket != nil { - dAtA[i] = 0x1a + if m.HTTPGet != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.TCPSocket.Size())) - n61, err := m.TCPSocket.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.HTTPGet.Size())) + n61, err := m.HTTPGet.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n61 } + if m.TCPSocket != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.TCPSocket.Size())) + n62, err := m.TCPSocket.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n62 + } return i, nil } @@ -4144,11 +4233,11 @@ func (m *ISCSIPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n62, err := m.SecretRef.MarshalTo(dAtA[i:]) + n63, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n62 + i += n63 } dAtA[i] = 0x58 i++ @@ -4236,11 +4325,11 @@ func (m *ISCSIVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n63, err := m.SecretRef.MarshalTo(dAtA[i:]) + n64, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n63 + i += n64 } dAtA[i] = 0x58 i++ @@ -4309,21 +4398,21 @@ func (m *Lifecycle) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PostStart.Size())) - n64, err := m.PostStart.MarshalTo(dAtA[i:]) + n65, err := m.PostStart.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n64 + i += n65 } if m.PreStop != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PreStop.Size())) - n65, err := m.PreStop.MarshalTo(dAtA[i:]) + n66, err := m.PreStop.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n65 + i += n66 } return i, nil } @@ -4346,19 +4435,19 @@ func (m *LimitRange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n66, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n66 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n67, err := m.Spec.MarshalTo(dAtA[i:]) + n67, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n67 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n68, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n68 return i, nil } @@ -4405,11 +4494,11 @@ func (m *LimitRangeItem) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n68, err := (&v).MarshalTo(dAtA[i:]) + n69, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n68 + i += n69 } } if len(m.Min) > 0 { @@ -4436,11 +4525,11 @@ func (m *LimitRangeItem) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n69, err := (&v).MarshalTo(dAtA[i:]) + n70, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n69 + i += n70 } } if len(m.Default) > 0 { @@ -4467,11 +4556,11 @@ func (m *LimitRangeItem) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n70, err := (&v).MarshalTo(dAtA[i:]) + n71, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n70 + i += n71 } } if len(m.DefaultRequest) > 0 { @@ -4498,11 +4587,11 @@ func (m *LimitRangeItem) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n71, err := (&v).MarshalTo(dAtA[i:]) + n72, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n71 + i += n72 } } if len(m.MaxLimitRequestRatio) > 0 { @@ -4529,11 +4618,11 @@ func (m *LimitRangeItem) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n72, err := (&v).MarshalTo(dAtA[i:]) + n73, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n72 + i += n73 } } return i, nil @@ -4557,11 +4646,11 @@ func (m *LimitRangeList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n73, err := m.ListMeta.MarshalTo(dAtA[i:]) + n74, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n73 + i += n74 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -4625,11 +4714,11 @@ func (m *List) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n74, err := m.ListMeta.MarshalTo(dAtA[i:]) + n75, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n74 + i += n75 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -4645,57 +4734,6 @@ func (m *List) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *ListOptions) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListOptions) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.LabelSelector))) - i += copy(dAtA[i:], m.LabelSelector) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.FieldSelector))) - i += copy(dAtA[i:], m.FieldSelector) - dAtA[i] = 0x18 - i++ - if m.Watch { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceVersion))) - i += copy(dAtA[i:], m.ResourceVersion) - if m.TimeoutSeconds != nil { - dAtA[i] = 0x28 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(*m.TimeoutSeconds)) - } - dAtA[i] = 0x30 - i++ - if m.IncludeUninitialized { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - return i, nil -} - func (m *LoadBalancerIngress) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -4848,27 +4886,27 @@ func (m *Namespace) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n75, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n75 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n76, err := m.Spec.MarshalTo(dAtA[i:]) + n76, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n76 - dAtA[i] = 0x1a + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n77, err := m.Status.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n77, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n77 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n78, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n78 return i, nil } @@ -4890,11 +4928,11 @@ func (m *NamespaceList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n78, err := m.ListMeta.MarshalTo(dAtA[i:]) + n79, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n78 + i += n79 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -4983,27 +5021,27 @@ func (m *Node) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n79, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n79 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n80, err := m.Spec.MarshalTo(dAtA[i:]) + n80, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n80 - dAtA[i] = 0x1a + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n81, err := m.Status.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n81, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n81 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n82, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n82 return i, nil } @@ -5052,11 +5090,11 @@ func (m *NodeAffinity) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RequiredDuringSchedulingIgnoredDuringExecution.Size())) - n82, err := m.RequiredDuringSchedulingIgnoredDuringExecution.MarshalTo(dAtA[i:]) + n83, err := m.RequiredDuringSchedulingIgnoredDuringExecution.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n82 + i += n83 } if len(m.PreferredDuringSchedulingIgnoredDuringExecution) > 0 { for _, msg := range m.PreferredDuringSchedulingIgnoredDuringExecution { @@ -5099,19 +5137,19 @@ func (m *NodeCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastHeartbeatTime.Size())) - n83, err := m.LastHeartbeatTime.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n83 - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n84, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n84, err := m.LastHeartbeatTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n84 + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) + n85, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n85 dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -5138,19 +5176,71 @@ func (m *NodeConfigSource) MarshalTo(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.ConfigMapRef != nil { - dAtA[i] = 0xa + if m.ConfigMap != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMapRef.Size())) - n85, err := m.ConfigMapRef.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) + n86, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n85 + i += n86 } return i, nil } +func (m *NodeConfigStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NodeConfigStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Assigned != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Assigned.Size())) + n87, err := m.Assigned.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n87 + } + if m.Active != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Active.Size())) + n88, err := m.Active.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n88 + } + if m.LastKnownGood != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.LastKnownGood.Size())) + n89, err := m.LastKnownGood.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n89 + } + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Error))) + i += copy(dAtA[i:], m.Error) + return i, nil +} + func (m *NodeDaemonEndpoints) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5169,11 +5259,11 @@ func (m *NodeDaemonEndpoints) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.KubeletEndpoint.Size())) - n86, err := m.KubeletEndpoint.MarshalTo(dAtA[i:]) + n90, err := m.KubeletEndpoint.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n86 + i += n90 return i, nil } @@ -5195,11 +5285,11 @@ func (m *NodeList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n87, err := m.ListMeta.MarshalTo(dAtA[i:]) + n91, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n87 + i += n91 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -5276,11 +5366,11 @@ func (m *NodeResources) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n88, err := (&v).MarshalTo(dAtA[i:]) + n92, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n88 + i += n92 } } return i, nil @@ -5384,6 +5474,18 @@ func (m *NodeSelectorTerm) MarshalTo(dAtA []byte) (int, error) { i += n } } + if len(m.MatchFields) > 0 { + for _, msg := range m.MatchFields { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -5408,8 +5510,8 @@ func (m *NodeSpec) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.PodCIDR) dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ExternalID))) - i += copy(dAtA[i:], m.ExternalID) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.DoNotUse_ExternalID))) + i += copy(dAtA[i:], m.DoNotUse_ExternalID) dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.ProviderID))) @@ -5438,11 +5540,11 @@ func (m *NodeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigSource.Size())) - n89, err := m.ConfigSource.MarshalTo(dAtA[i:]) + n93, err := m.ConfigSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n89 + i += n93 } return i, nil } @@ -5486,11 +5588,11 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n90, err := (&v).MarshalTo(dAtA[i:]) + n94, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n90 + i += n94 } } if len(m.Allocatable) > 0 { @@ -5517,11 +5619,11 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n91, err := (&v).MarshalTo(dAtA[i:]) + n95, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n91 + i += n95 } } dAtA[i] = 0x1a @@ -5555,19 +5657,19 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DaemonEndpoints.Size())) - n92, err := m.DaemonEndpoints.MarshalTo(dAtA[i:]) + n96, err := m.DaemonEndpoints.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n92 + i += n96 dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodeInfo.Size())) - n93, err := m.NodeInfo.MarshalTo(dAtA[i:]) + n97, err := m.NodeInfo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n93 + i += n97 if len(m.Images) > 0 { for _, msg := range m.Images { dAtA[i] = 0x42 @@ -5607,6 +5709,16 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { i += n } } + if m.Config != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Config.Size())) + n98, err := m.Config.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n98 + } return i, nil } @@ -5694,161 +5806,6 @@ func (m *ObjectFieldSelector) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *ObjectMeta) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ObjectMeta) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.GenerateName))) - i += copy(dAtA[i:], m.GenerateName) - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) - i += copy(dAtA[i:], m.Namespace) - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.SelfLink))) - i += copy(dAtA[i:], m.SelfLink) - dAtA[i] = 0x2a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.UID))) - i += copy(dAtA[i:], m.UID) - dAtA[i] = 0x32 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceVersion))) - i += copy(dAtA[i:], m.ResourceVersion) - dAtA[i] = 0x38 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Generation)) - dAtA[i] = 0x42 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.CreationTimestamp.Size())) - n94, err := m.CreationTimestamp.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n94 - if m.DeletionTimestamp != nil { - dAtA[i] = 0x4a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.DeletionTimestamp.Size())) - n95, err := m.DeletionTimestamp.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n95 - } - if m.DeletionGracePeriodSeconds != nil { - dAtA[i] = 0x50 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(*m.DeletionGracePeriodSeconds)) - } - if len(m.Labels) > 0 { - keysForLabels := make([]string, 0, len(m.Labels)) - for k := range m.Labels { - keysForLabels = append(keysForLabels, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForLabels) - for _, k := range keysForLabels { - dAtA[i] = 0x5a - i++ - v := m.Labels[string(k)] - mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(k))) - i += copy(dAtA[i:], k) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(v))) - i += copy(dAtA[i:], v) - } - } - if len(m.Annotations) > 0 { - keysForAnnotations := make([]string, 0, len(m.Annotations)) - for k := range m.Annotations { - keysForAnnotations = append(keysForAnnotations, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForAnnotations) - for _, k := range keysForAnnotations { - dAtA[i] = 0x62 - i++ - v := m.Annotations[string(k)] - mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(k))) - i += copy(dAtA[i:], k) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(v))) - i += copy(dAtA[i:], v) - } - } - if len(m.OwnerReferences) > 0 { - for _, msg := range m.OwnerReferences { - dAtA[i] = 0x6a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - if len(m.Finalizers) > 0 { - for _, s := range m.Finalizers { - dAtA[i] = 0x72 - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } - } - dAtA[i] = 0x7a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ClusterName))) - i += copy(dAtA[i:], m.ClusterName) - if m.Initializers != nil { - dAtA[i] = 0x82 - i++ - dAtA[i] = 0x1 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Initializers.Size())) - n96, err := m.Initializers.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n96 - } - return i, nil -} - func (m *ObjectReference) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -5913,27 +5870,27 @@ func (m *PersistentVolume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n97, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n97 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n98, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n98 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n99, err := m.Status.MarshalTo(dAtA[i:]) + n99, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n99 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n100, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n100 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n101, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n101 return i, nil } @@ -5955,27 +5912,27 @@ func (m *PersistentVolumeClaim) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n100, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n100 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n101, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n101 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n102, err := m.Status.MarshalTo(dAtA[i:]) + n102, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n102 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n103, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n103 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n104, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n104 return i, nil } @@ -6005,19 +5962,19 @@ func (m *PersistentVolumeClaimCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastProbeTime.Size())) - n103, err := m.LastProbeTime.MarshalTo(dAtA[i:]) + n105, err := m.LastProbeTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n103 + i += n105 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n104, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n106, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n104 + i += n106 dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -6047,11 +6004,11 @@ func (m *PersistentVolumeClaimList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n105, err := m.ListMeta.MarshalTo(dAtA[i:]) + n107, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n105 + i += n107 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -6100,11 +6057,11 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Resources.Size())) - n106, err := m.Resources.MarshalTo(dAtA[i:]) + n108, err := m.Resources.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n106 + i += n108 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.VolumeName))) @@ -6113,11 +6070,11 @@ func (m *PersistentVolumeClaimSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Selector.Size())) - n107, err := m.Selector.MarshalTo(dAtA[i:]) + n109, err := m.Selector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n107 + i += n109 } if m.StorageClassName != nil { dAtA[i] = 0x2a @@ -6192,11 +6149,11 @@ func (m *PersistentVolumeClaimStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n108, err := (&v).MarshalTo(dAtA[i:]) + n110, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n108 + i += n110 } } if len(m.Conditions) > 0 { @@ -6262,11 +6219,11 @@ func (m *PersistentVolumeList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n109, err := m.ListMeta.MarshalTo(dAtA[i:]) + n111, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n109 + i += n111 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -6301,163 +6258,163 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n110, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n110 - } - if m.AWSElasticBlockStore != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n111, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n111 - } - if m.HostPath != nil { - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n112, err := m.HostPath.MarshalTo(dAtA[i:]) + n112, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n112 } - if m.Glusterfs != nil { - dAtA[i] = 0x22 + if m.AWSElasticBlockStore != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n113, err := m.Glusterfs.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) + n113, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n113 } - if m.NFS != nil { - dAtA[i] = 0x2a + if m.HostPath != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n114, err := m.NFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) + n114, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n114 } - if m.RBD != nil { - dAtA[i] = 0x32 + if m.Glusterfs != nil { + dAtA[i] = 0x22 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n115, err := m.RBD.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) + n115, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n115 } - if m.ISCSI != nil { - dAtA[i] = 0x3a + if m.NFS != nil { + dAtA[i] = 0x2a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n116, err := m.ISCSI.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) + n116, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n116 } - if m.Cinder != nil { - dAtA[i] = 0x42 + if m.RBD != nil { + dAtA[i] = 0x32 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n117, err := m.Cinder.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) + n117, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n117 } - if m.CephFS != nil { - dAtA[i] = 0x4a + if m.ISCSI != nil { + dAtA[i] = 0x3a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n118, err := m.CephFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) + n118, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n118 } - if m.FC != nil { - dAtA[i] = 0x52 + if m.Cinder != nil { + dAtA[i] = 0x42 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n119, err := m.FC.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) + n119, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n119 } - if m.Flocker != nil { - dAtA[i] = 0x5a + if m.CephFS != nil { + dAtA[i] = 0x4a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n120, err := m.Flocker.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) + n120, err := m.CephFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n120 } - if m.FlexVolume != nil { - dAtA[i] = 0x62 + if m.FC != nil { + dAtA[i] = 0x52 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n121, err := m.FlexVolume.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) + n121, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n121 } - if m.AzureFile != nil { - dAtA[i] = 0x6a + if m.Flocker != nil { + dAtA[i] = 0x5a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n122, err := m.AzureFile.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) + n122, err := m.Flocker.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n122 } - if m.VsphereVolume != nil { - dAtA[i] = 0x72 + if m.FlexVolume != nil { + dAtA[i] = 0x62 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n123, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) + n123, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n123 } - if m.Quobyte != nil { - dAtA[i] = 0x7a + if m.AzureFile != nil { + dAtA[i] = 0x6a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n124, err := m.Quobyte.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) + n124, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n124 } + if m.VsphereVolume != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) + n125, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n125 + } + if m.Quobyte != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) + n126, err := m.Quobyte.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n126 + } if m.AzureDisk != nil { dAtA[i] = 0x82 i++ dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n125, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n127, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n125 + i += n127 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0x8a @@ -6465,11 +6422,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n126, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n128, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n126 + i += n128 } if m.PortworxVolume != nil { dAtA[i] = 0x92 @@ -6477,11 +6434,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n127, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n129, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n127 + i += n129 } if m.ScaleIO != nil { dAtA[i] = 0x9a @@ -6489,11 +6446,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n128, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n130, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n128 + i += n130 } if m.Local != nil { dAtA[i] = 0xa2 @@ -6501,11 +6458,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Local.Size())) - n129, err := m.Local.MarshalTo(dAtA[i:]) + n131, err := m.Local.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n129 + i += n131 } if m.StorageOS != nil { dAtA[i] = 0xaa @@ -6513,11 +6470,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n130, err := m.StorageOS.MarshalTo(dAtA[i:]) + n132, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n130 + i += n132 } if m.CSI != nil { dAtA[i] = 0xb2 @@ -6525,11 +6482,11 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CSI.Size())) - n131, err := m.CSI.MarshalTo(dAtA[i:]) + n133, err := m.CSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n131 + i += n133 } return i, nil } @@ -6573,21 +6530,21 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n132, err := (&v).MarshalTo(dAtA[i:]) + n134, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n132 + i += n134 } } dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeSource.Size())) - n133, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) + n135, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n133 + i += n135 if len(m.AccessModes) > 0 { for _, s := range m.AccessModes { dAtA[i] = 0x1a @@ -6607,11 +6564,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ClaimRef.Size())) - n134, err := m.ClaimRef.MarshalTo(dAtA[i:]) + n136, err := m.ClaimRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n134 + i += n136 } dAtA[i] = 0x2a i++ @@ -6646,11 +6603,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodeAffinity.Size())) - n135, err := m.NodeAffinity.MarshalTo(dAtA[i:]) + n137, err := m.NodeAffinity.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n135 + i += n137 } return i, nil } @@ -6729,27 +6686,27 @@ func (m *Pod) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n136, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n136 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n137, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n137 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n138, err := m.Status.MarshalTo(dAtA[i:]) + n138, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n138 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n139, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n139 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n140, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n140 return i, nil } @@ -6814,11 +6771,11 @@ func (m *PodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LabelSelector.Size())) - n139, err := m.LabelSelector.MarshalTo(dAtA[i:]) + n141, err := m.LabelSelector.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n139 + i += n141 } if len(m.Namespaces) > 0 { for _, s := range m.Namespaces { @@ -6964,19 +6921,19 @@ func (m *PodCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastProbeTime.Size())) - n140, err := m.LastProbeTime.MarshalTo(dAtA[i:]) + n142, err := m.LastProbeTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n140 + i += n142 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n141, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n143, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n141 + i += n143 dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -7163,11 +7120,11 @@ func (m *PodList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n142, err := m.ListMeta.MarshalTo(dAtA[i:]) + n144, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n142 + i += n144 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7227,11 +7184,11 @@ func (m *PodLogOptions) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SinceTime.Size())) - n143, err := m.SinceTime.MarshalTo(dAtA[i:]) + n145, err := m.SinceTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n143 + i += n145 } dAtA[i] = 0x30 i++ @@ -7301,6 +7258,28 @@ func (m *PodProxyOptions) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *PodReadinessGate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PodReadinessGate) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ConditionType))) + i += copy(dAtA[i:], m.ConditionType) + return i, nil +} + func (m *PodSecurityContext) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7320,11 +7299,11 @@ func (m *PodSecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n144, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n146, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n144 + i += n146 } if m.RunAsUser != nil { dAtA[i] = 0x10 @@ -7358,6 +7337,18 @@ func (m *PodSecurityContext) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(*m.RunAsGroup)) } + if len(m.Sysctls) > 0 { + for _, msg := range m.Sysctls { + dAtA[i] = 0x3a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -7380,11 +7371,11 @@ func (m *PodSignature) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodController.Size())) - n145, err := m.PodController.MarshalTo(dAtA[i:]) + n147, err := m.PodController.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n145 + i += n147 } return i, nil } @@ -7508,11 +7499,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecurityContext.Size())) - n146, err := m.SecurityContext.MarshalTo(dAtA[i:]) + n148, err := m.SecurityContext.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n146 + i += n148 } if len(m.ImagePullSecrets) > 0 { for _, msg := range m.ImagePullSecrets { @@ -7544,11 +7535,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Affinity.Size())) - n147, err := m.Affinity.MarshalTo(dAtA[i:]) + n149, err := m.Affinity.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n147 + i += n149 } dAtA[i] = 0x9a i++ @@ -7629,11 +7620,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DNSConfig.Size())) - n148, err := m.DNSConfig.MarshalTo(dAtA[i:]) + n150, err := m.DNSConfig.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n148 + i += n150 } if m.ShareProcessNamespace != nil { dAtA[i] = 0xd8 @@ -7647,6 +7638,20 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { } i++ } + if len(m.ReadinessGates) > 0 { + for _, msg := range m.ReadinessGates { + dAtA[i] = 0xe2 + i++ + dAtA[i] = 0x1 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -7701,11 +7706,11 @@ func (m *PodStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartTime.Size())) - n149, err := m.StartTime.MarshalTo(dAtA[i:]) + n151, err := m.StartTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n149 + i += n151 } if len(m.ContainerStatuses) > 0 { for _, msg := range m.ContainerStatuses { @@ -7760,19 +7765,19 @@ func (m *PodStatusResult) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n150, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n152, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n150 + i += n152 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n151, err := m.Status.MarshalTo(dAtA[i:]) + n153, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n151 + i += n153 return i, nil } @@ -7794,19 +7799,19 @@ func (m *PodTemplate) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n152, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n154, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n152 + i += n154 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n153, err := m.Template.MarshalTo(dAtA[i:]) + n155, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n153 + i += n155 return i, nil } @@ -7828,11 +7833,11 @@ func (m *PodTemplateList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n154, err := m.ListMeta.MarshalTo(dAtA[i:]) + n156, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n154 + i += n156 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7866,19 +7871,19 @@ func (m *PodTemplateSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n155, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n157, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n155 + i += n157 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n156, err := m.Spec.MarshalTo(dAtA[i:]) + n158, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n156 + i += n158 return i, nil } @@ -7958,19 +7963,19 @@ func (m *PreferAvoidPodsEntry) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodSignature.Size())) - n157, err := m.PodSignature.MarshalTo(dAtA[i:]) + n159, err := m.PodSignature.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n157 + i += n159 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EvictionTime.Size())) - n158, err := m.EvictionTime.MarshalTo(dAtA[i:]) + n160, err := m.EvictionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n158 + i += n160 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -8003,11 +8008,11 @@ func (m *PreferredSchedulingTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Preference.Size())) - n159, err := m.Preference.MarshalTo(dAtA[i:]) + n161, err := m.Preference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n159 + i += n161 return i, nil } @@ -8029,11 +8034,11 @@ func (m *Probe) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Handler.Size())) - n160, err := m.Handler.MarshalTo(dAtA[i:]) + n162, err := m.Handler.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n160 + i += n162 dAtA[i] = 0x10 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.InitialDelaySeconds)) @@ -8183,11 +8188,11 @@ func (m *RBDPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n161, err := m.SecretRef.MarshalTo(dAtA[i:]) + n163, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n161 + i += n163 } dAtA[i] = 0x40 i++ @@ -8254,11 +8259,11 @@ func (m *RBDVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n162, err := m.SecretRef.MarshalTo(dAtA[i:]) + n164, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n162 + i += n164 } dAtA[i] = 0x40 i++ @@ -8289,11 +8294,11 @@ func (m *RangeAllocation) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n163, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n165, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n163 + i += n165 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Range))) @@ -8325,27 +8330,27 @@ func (m *ReplicationController) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n164, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n164 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n165, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n165 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n166, err := m.Status.MarshalTo(dAtA[i:]) + n166, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n166 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n167, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n167 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n168, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n168 return i, nil } @@ -8375,11 +8380,11 @@ func (m *ReplicationControllerCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n167, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n169, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n167 + i += n169 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -8409,11 +8414,11 @@ func (m *ReplicationControllerList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n168, err := m.ListMeta.MarshalTo(dAtA[i:]) + n170, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n168 + i += n170 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8475,11 +8480,11 @@ func (m *ReplicationControllerSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n169, err := m.Template.MarshalTo(dAtA[i:]) + n171, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n169 + i += n171 } dAtA[i] = 0x20 i++ @@ -8558,11 +8563,11 @@ func (m *ResourceFieldSelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Divisor.Size())) - n170, err := m.Divisor.MarshalTo(dAtA[i:]) + n172, err := m.Divisor.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n170 + i += n172 return i, nil } @@ -8584,27 +8589,27 @@ func (m *ResourceQuota) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n171, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n171 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n172, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n172 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n173, err := m.Status.MarshalTo(dAtA[i:]) + n173, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n173 + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n174, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n174 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n175, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n175 return i, nil } @@ -8626,11 +8631,11 @@ func (m *ResourceQuotaList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n174, err := m.ListMeta.MarshalTo(dAtA[i:]) + n176, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n174 + i += n176 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8685,11 +8690,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n175, err := (&v).MarshalTo(dAtA[i:]) + n177, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n175 + i += n177 } } if len(m.Scopes) > 0 { @@ -8707,6 +8712,16 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], s) } } + if m.ScopeSelector != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ScopeSelector.Size())) + n178, err := m.ScopeSelector.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n178 + } return i, nil } @@ -8749,11 +8764,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n176, err := (&v).MarshalTo(dAtA[i:]) + n179, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n176 + i += n179 } } if len(m.Used) > 0 { @@ -8780,11 +8795,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n177, err := (&v).MarshalTo(dAtA[i:]) + n180, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n177 + i += n180 } } return i, nil @@ -8829,11 +8844,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n178, err := (&v).MarshalTo(dAtA[i:]) + n181, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n178 + i += n181 } } if len(m.Requests) > 0 { @@ -8860,11 +8875,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n179, err := (&v).MarshalTo(dAtA[i:]) + n182, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n179 + i += n182 } } return i, nil @@ -8931,11 +8946,11 @@ func (m *ScaleIOPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n180, err := m.SecretRef.MarshalTo(dAtA[i:]) + n183, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n180 + i += n183 } dAtA[i] = 0x20 i++ @@ -9003,11 +9018,11 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n181, err := m.SecretRef.MarshalTo(dAtA[i:]) + n184, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n181 + i += n184 } dAtA[i] = 0x20 i++ @@ -9048,6 +9063,77 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *ScopeSelector) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ScopeSelector) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.MatchExpressions) > 0 { + for _, msg := range m.MatchExpressions { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *ScopedResourceSelectorRequirement) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ScopedResourceSelectorRequirement) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ScopeName))) + i += copy(dAtA[i:], m.ScopeName) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Operator))) + i += copy(dAtA[i:], m.Operator) + if len(m.Values) > 0 { + for _, s := range m.Values { + dAtA[i] = 0x1a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + func (m *Secret) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9066,11 +9152,11 @@ func (m *Secret) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n182, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n185, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n182 + i += n185 if len(m.Data) > 0 { keysForData := make([]string, 0, len(m.Data)) for k := range m.Data { @@ -9146,11 +9232,11 @@ func (m *SecretEnvSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n183, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n186, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n183 + i += n186 if m.Optional != nil { dAtA[i] = 0x10 i++ @@ -9182,11 +9268,11 @@ func (m *SecretKeySelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n184, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n187, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n184 + i += n187 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) @@ -9222,11 +9308,11 @@ func (m *SecretList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n185, err := m.ListMeta.MarshalTo(dAtA[i:]) + n188, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n185 + i += n188 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9260,11 +9346,11 @@ func (m *SecretProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n186, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n189, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n186 + i += n189 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9384,11 +9470,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Capabilities.Size())) - n187, err := m.Capabilities.MarshalTo(dAtA[i:]) + n190, err := m.Capabilities.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n187 + i += n190 } if m.Privileged != nil { dAtA[i] = 0x10 @@ -9404,11 +9490,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n188, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n191, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n188 + i += n191 } if m.RunAsUser != nil { dAtA[i] = 0x20 @@ -9471,11 +9557,11 @@ func (m *SerializedReference) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Reference.Size())) - n189, err := m.Reference.MarshalTo(dAtA[i:]) + n192, err := m.Reference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n189 + i += n192 return i, nil } @@ -9497,27 +9583,27 @@ func (m *Service) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n190, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n193, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n190 + i += n193 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n191, err := m.Spec.MarshalTo(dAtA[i:]) + n194, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n191 + i += n194 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n192, err := m.Status.MarshalTo(dAtA[i:]) + n195, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n192 + i += n195 return i, nil } @@ -9539,11 +9625,11 @@ func (m *ServiceAccount) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n193, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n196, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n193 + i += n196 if len(m.Secrets) > 0 { for _, msg := range m.Secrets { dAtA[i] = 0x12 @@ -9599,11 +9685,11 @@ func (m *ServiceAccountList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n194, err := m.ListMeta.MarshalTo(dAtA[i:]) + n197, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n194 + i += n197 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9619,6 +9705,37 @@ func (m *ServiceAccountList) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *ServiceAccountTokenProjection) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ServiceAccountTokenProjection) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Audience))) + i += copy(dAtA[i:], m.Audience) + if m.ExpirationSeconds != nil { + dAtA[i] = 0x10 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.ExpirationSeconds)) + } + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Path))) + i += copy(dAtA[i:], m.Path) + return i, nil +} + func (m *ServiceList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9637,11 +9754,11 @@ func (m *ServiceList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n195, err := m.ListMeta.MarshalTo(dAtA[i:]) + n198, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n195 + i += n198 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -9686,11 +9803,11 @@ func (m *ServicePort) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetPort.Size())) - n196, err := m.TargetPort.MarshalTo(dAtA[i:]) + n199, err := m.TargetPort.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n196 + i += n199 dAtA[i] = 0x28 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodePort)) @@ -9837,11 +9954,11 @@ func (m *ServiceSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SessionAffinityConfig.Size())) - n197, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:]) + n200, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n197 + i += n200 } return i, nil } @@ -9864,11 +9981,11 @@ func (m *ServiceStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LoadBalancer.Size())) - n198, err := m.LoadBalancer.MarshalTo(dAtA[i:]) + n201, err := m.LoadBalancer.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n198 + i += n201 return i, nil } @@ -9891,11 +10008,11 @@ func (m *SessionAffinityConfig) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ClientIP.Size())) - n199, err := m.ClientIP.MarshalTo(dAtA[i:]) + n202, err := m.ClientIP.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n199 + i += n202 } return i, nil } @@ -9939,11 +10056,11 @@ func (m *StorageOSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n200, err := m.SecretRef.MarshalTo(dAtA[i:]) + n203, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n200 + i += n203 } return i, nil } @@ -9987,11 +10104,11 @@ func (m *StorageOSVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n201, err := m.SecretRef.MarshalTo(dAtA[i:]) + n204, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n201 + i += n204 } return i, nil } @@ -10040,11 +10157,11 @@ func (m *TCPSocketAction) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n202, err := m.Port.MarshalTo(dAtA[i:]) + n205, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n202 + i += n205 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) @@ -10083,11 +10200,11 @@ func (m *Taint) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TimeAdded.Size())) - n203, err := m.TimeAdded.MarshalTo(dAtA[i:]) + n206, err := m.TimeAdded.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n203 + i += n206 } return i, nil } @@ -10131,6 +10248,73 @@ func (m *Toleration) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *TopologySelectorLabelRequirement) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TopologySelectorLabelRequirement) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + if len(m.Values) > 0 { + for _, s := range m.Values { + dAtA[i] = 0x12 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *TopologySelectorTerm) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TopologySelectorTerm) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.MatchLabelExpressions) > 0 { + for _, msg := range m.MatchLabelExpressions { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + func (m *Volume) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -10153,11 +10337,11 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VolumeSource.Size())) - n204, err := m.VolumeSource.MarshalTo(dAtA[i:]) + n207, err := m.VolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n204 + i += n207 return i, nil } @@ -10250,11 +10434,11 @@ func (m *VolumeNodeAffinity) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Required.Size())) - n205, err := m.Required.MarshalTo(dAtA[i:]) + n208, err := m.Required.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n205 + i += n208 } return i, nil } @@ -10278,31 +10462,41 @@ func (m *VolumeProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n206, err := m.Secret.MarshalTo(dAtA[i:]) + n209, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n206 + i += n209 } if m.DownwardAPI != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n207, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n210, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n207 + i += n210 } if m.ConfigMap != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n208, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n211, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n208 + i += n211 + } + if m.ServiceAccountToken != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ServiceAccountToken.Size())) + n212, err := m.ServiceAccountToken.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n212 } return i, nil } @@ -10326,163 +10520,163 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n209, err := m.HostPath.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n209 - } - if m.EmptyDir != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) - n210, err := m.EmptyDir.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n210 - } - if m.GCEPersistentDisk != nil { - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n211, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n211 - } - if m.AWSElasticBlockStore != nil { - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n212, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n212 - } - if m.GitRepo != nil { - dAtA[i] = 0x2a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) - n213, err := m.GitRepo.MarshalTo(dAtA[i:]) + n213, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n213 } - if m.Secret != nil { - dAtA[i] = 0x32 + if m.EmptyDir != nil { + dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n214, err := m.Secret.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) + n214, err := m.EmptyDir.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n214 } - if m.NFS != nil { - dAtA[i] = 0x3a + if m.GCEPersistentDisk != nil { + dAtA[i] = 0x1a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n215, err := m.NFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) + n215, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n215 } - if m.ISCSI != nil { - dAtA[i] = 0x42 + if m.AWSElasticBlockStore != nil { + dAtA[i] = 0x22 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n216, err := m.ISCSI.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) + n216, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n216 } - if m.Glusterfs != nil { - dAtA[i] = 0x4a + if m.GitRepo != nil { + dAtA[i] = 0x2a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n217, err := m.Glusterfs.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) + n217, err := m.GitRepo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n217 } - if m.PersistentVolumeClaim != nil { - dAtA[i] = 0x52 + if m.Secret != nil { + dAtA[i] = 0x32 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) - n218, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) + n218, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n218 } - if m.RBD != nil { - dAtA[i] = 0x5a + if m.NFS != nil { + dAtA[i] = 0x3a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n219, err := m.RBD.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) + n219, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n219 } - if m.FlexVolume != nil { - dAtA[i] = 0x62 + if m.ISCSI != nil { + dAtA[i] = 0x42 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n220, err := m.FlexVolume.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) + n220, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n220 } - if m.Cinder != nil { - dAtA[i] = 0x6a + if m.Glusterfs != nil { + dAtA[i] = 0x4a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n221, err := m.Cinder.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) + n221, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n221 } - if m.CephFS != nil { - dAtA[i] = 0x72 + if m.PersistentVolumeClaim != nil { + dAtA[i] = 0x52 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n222, err := m.CephFS.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) + n222, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n222 } - if m.Flocker != nil { - dAtA[i] = 0x7a + if m.RBD != nil { + dAtA[i] = 0x5a i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n223, err := m.Flocker.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) + n223, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } i += n223 } + if m.FlexVolume != nil { + dAtA[i] = 0x62 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) + n224, err := m.FlexVolume.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n224 + } + if m.Cinder != nil { + dAtA[i] = 0x6a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) + n225, err := m.Cinder.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n225 + } + if m.CephFS != nil { + dAtA[i] = 0x72 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) + n226, err := m.CephFS.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n226 + } + if m.Flocker != nil { + dAtA[i] = 0x7a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) + n227, err := m.Flocker.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n227 + } if m.DownwardAPI != nil { dAtA[i] = 0x82 i++ dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n224, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n228, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n224 + i += n228 } if m.FC != nil { dAtA[i] = 0x8a @@ -10490,11 +10684,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n225, err := m.FC.MarshalTo(dAtA[i:]) + n229, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n225 + i += n229 } if m.AzureFile != nil { dAtA[i] = 0x92 @@ -10502,11 +10696,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n226, err := m.AzureFile.MarshalTo(dAtA[i:]) + n230, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n226 + i += n230 } if m.ConfigMap != nil { dAtA[i] = 0x9a @@ -10514,11 +10708,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n227, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n231, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n227 + i += n231 } if m.VsphereVolume != nil { dAtA[i] = 0xa2 @@ -10526,11 +10720,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n228, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + n232, err := m.VsphereVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n228 + i += n232 } if m.Quobyte != nil { dAtA[i] = 0xaa @@ -10538,11 +10732,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n229, err := m.Quobyte.MarshalTo(dAtA[i:]) + n233, err := m.Quobyte.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n229 + i += n233 } if m.AzureDisk != nil { dAtA[i] = 0xb2 @@ -10550,11 +10744,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n230, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n234, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n230 + i += n234 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0xba @@ -10562,11 +10756,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n231, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n235, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n231 + i += n235 } if m.PortworxVolume != nil { dAtA[i] = 0xc2 @@ -10574,11 +10768,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n232, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n236, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n232 + i += n236 } if m.ScaleIO != nil { dAtA[i] = 0xca @@ -10586,11 +10780,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n233, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n237, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n233 + i += n237 } if m.Projected != nil { dAtA[i] = 0xd2 @@ -10598,11 +10792,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Projected.Size())) - n234, err := m.Projected.MarshalTo(dAtA[i:]) + n238, err := m.Projected.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n234 + i += n238 } if m.StorageOS != nil { dAtA[i] = 0xda @@ -10610,11 +10804,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n235, err := m.StorageOS.MarshalTo(dAtA[i:]) + n239, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n235 + i += n239 } return i, nil } @@ -10674,11 +10868,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodAffinityTerm.Size())) - n236, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) + n240, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n236 + i += n240 return i, nil } @@ -10919,6 +11113,21 @@ func (m *CephFSVolumeSource) Size() (n int) { return n } +func (m *CinderPersistentVolumeSource) Size() (n int) { + var l int + _ = l + l = len(m.VolumeID) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.FSType) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + if m.SecretRef != nil { + l = m.SecretRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *CinderVolumeSource) Size() (n int) { var l int _ = l @@ -10927,6 +11136,10 @@ func (m *CinderVolumeSource) Size() (n int) { l = len(m.FSType) n += 1 + l + sovGenerated(uint64(l)) n += 2 + if m.SecretRef != nil { + l = m.SecretRef.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -11047,6 +11260,22 @@ func (m *ConfigMapList) Size() (n int) { return n } +func (m *ConfigMapNodeConfigSource) Size() (n int) { + var l int + _ = l + l = len(m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.UID) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ResourceVersion) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.KubeletConfigKey) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *ConfigMapProjection) Size() (n int) { var l int _ = l @@ -11273,26 +11502,6 @@ func (m *DaemonEndpoint) Size() (n int) { return n } -func (m *DeleteOptions) Size() (n int) { - var l int - _ = l - if m.GracePeriodSeconds != nil { - n += 1 + sovGenerated(uint64(*m.GracePeriodSeconds)) - } - if m.Preconditions != nil { - l = m.Preconditions.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.OrphanDependents != nil { - n += 2 - } - if m.PropagationPolicy != nil { - l = len(*m.PropagationPolicy) - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - func (m *DownwardAPIProjection) Size() (n int) { var l int _ = l @@ -11953,23 +12162,6 @@ func (m *List) Size() (n int) { return n } -func (m *ListOptions) Size() (n int) { - var l int - _ = l - l = len(m.LabelSelector) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.FieldSelector) - n += 1 + l + sovGenerated(uint64(l)) - n += 2 - l = len(m.ResourceVersion) - n += 1 + l + sovGenerated(uint64(l)) - if m.TimeoutSeconds != nil { - n += 1 + sovGenerated(uint64(*m.TimeoutSeconds)) - } - n += 2 - return n -} - func (m *LoadBalancerIngress) Size() (n int) { var l int _ = l @@ -12124,13 +12316,33 @@ func (m *NodeCondition) Size() (n int) { func (m *NodeConfigSource) Size() (n int) { var l int _ = l - if m.ConfigMapRef != nil { - l = m.ConfigMapRef.Size() + if m.ConfigMap != nil { + l = m.ConfigMap.Size() n += 1 + l + sovGenerated(uint64(l)) } return n } +func (m *NodeConfigStatus) Size() (n int) { + var l int + _ = l + if m.Assigned != nil { + l = m.Assigned.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Active != nil { + l = m.Active.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.LastKnownGood != nil { + l = m.LastKnownGood.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.Error) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *NodeDaemonEndpoints) Size() (n int) { var l int _ = l @@ -12213,6 +12425,12 @@ func (m *NodeSelectorTerm) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if len(m.MatchFields) > 0 { + for _, e := range m.MatchFields { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -12221,7 +12439,7 @@ func (m *NodeSpec) Size() (n int) { _ = l l = len(m.PodCIDR) n += 1 + l + sovGenerated(uint64(l)) - l = len(m.ExternalID) + l = len(m.DoNotUse_ExternalID) n += 1 + l + sovGenerated(uint64(l)) l = len(m.ProviderID) n += 1 + l + sovGenerated(uint64(l)) @@ -12296,6 +12514,10 @@ func (m *NodeStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.Config != nil { + l = m.Config.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -12335,68 +12557,6 @@ func (m *ObjectFieldSelector) Size() (n int) { return n } -func (m *ObjectMeta) Size() (n int) { - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.GenerateName) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Namespace) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.SelfLink) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.UID) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.ResourceVersion) - n += 1 + l + sovGenerated(uint64(l)) - n += 1 + sovGenerated(uint64(m.Generation)) - l = m.CreationTimestamp.Size() - n += 1 + l + sovGenerated(uint64(l)) - if m.DeletionTimestamp != nil { - l = m.DeletionTimestamp.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.DeletionGracePeriodSeconds != nil { - n += 1 + sovGenerated(uint64(*m.DeletionGracePeriodSeconds)) - } - if len(m.Labels) > 0 { - for k, v := range m.Labels { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - if len(m.Annotations) > 0 { - for k, v := range m.Annotations { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - if len(m.OwnerReferences) > 0 { - for _, e := range m.OwnerReferences { - l = e.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - } - if len(m.Finalizers) > 0 { - for _, s := range m.Finalizers { - l = len(s) - n += 1 + l + sovGenerated(uint64(l)) - } - } - l = len(m.ClusterName) - n += 1 + l + sovGenerated(uint64(l)) - if m.Initializers != nil { - l = m.Initializers.Size() - n += 2 + l + sovGenerated(uint64(l)) - } - return n -} - func (m *ObjectReference) Size() (n int) { var l int _ = l @@ -12921,6 +13081,14 @@ func (m *PodProxyOptions) Size() (n int) { return n } +func (m *PodReadinessGate) Size() (n int) { + var l int + _ = l + l = len(m.ConditionType) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *PodSecurityContext) Size() (n int) { var l int _ = l @@ -12945,6 +13113,12 @@ func (m *PodSecurityContext) Size() (n int) { if m.RunAsGroup != nil { n += 1 + sovGenerated(uint64(*m.RunAsGroup)) } + if len(m.Sysctls) > 0 { + for _, e := range m.Sysctls { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -13053,6 +13227,12 @@ func (m *PodSpec) Size() (n int) { if m.ShareProcessNamespace != nil { n += 3 } + if len(m.ReadinessGates) > 0 { + for _, e := range m.ReadinessGates { + l = e.Size() + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -13434,6 +13614,10 @@ func (m *ResourceQuotaSpec) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.ScopeSelector != nil { + l = m.ScopeSelector.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -13551,6 +13735,34 @@ func (m *ScaleIOVolumeSource) Size() (n int) { return n } +func (m *ScopeSelector) Size() (n int) { + var l int + _ = l + if len(m.MatchExpressions) > 0 { + for _, e := range m.MatchExpressions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *ScopedResourceSelectorRequirement) Size() (n int) { + var l int + _ = l + l = len(m.ScopeName) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Operator) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Values) > 0 { + for _, s := range m.Values { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *Secret) Size() (n int) { var l int _ = l @@ -13755,6 +13967,19 @@ func (m *ServiceAccountList) Size() (n int) { return n } +func (m *ServiceAccountTokenProjection) Size() (n int) { + var l int + _ = l + l = len(m.Audience) + n += 1 + l + sovGenerated(uint64(l)) + if m.ExpirationSeconds != nil { + n += 1 + sovGenerated(uint64(*m.ExpirationSeconds)) + } + l = len(m.Path) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *ServiceList) Size() (n int) { var l int _ = l @@ -13946,6 +14171,32 @@ func (m *Toleration) Size() (n int) { return n } +func (m *TopologySelectorLabelRequirement) Size() (n int) { + var l int + _ = l + l = len(m.Key) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Values) > 0 { + for _, s := range m.Values { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *TopologySelectorTerm) Size() (n int) { + var l int + _ = l + if len(m.MatchLabelExpressions) > 0 { + for _, e := range m.MatchLabelExpressions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *Volume) Size() (n int) { var l int _ = l @@ -14008,6 +14259,10 @@ func (m *VolumeProjection) Size() (n int) { l = m.ConfigMap.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.ServiceAccountToken != nil { + l = m.ServiceAccountToken.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -14326,6 +14581,19 @@ func (this *CephFSVolumeSource) String() string { }, "") return s } +func (this *CinderPersistentVolumeSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CinderPersistentVolumeSource{`, + `VolumeID:` + fmt.Sprintf("%v", this.VolumeID) + `,`, + `FSType:` + fmt.Sprintf("%v", this.FSType) + `,`, + `ReadOnly:` + fmt.Sprintf("%v", this.ReadOnly) + `,`, + `SecretRef:` + strings.Replace(fmt.Sprintf("%v", this.SecretRef), "SecretReference", "SecretReference", 1) + `,`, + `}`, + }, "") + return s +} func (this *CinderVolumeSource) String() string { if this == nil { return "nil" @@ -14334,6 +14602,7 @@ func (this *CinderVolumeSource) String() string { `VolumeID:` + fmt.Sprintf("%v", this.VolumeID) + `,`, `FSType:` + fmt.Sprintf("%v", this.FSType) + `,`, `ReadOnly:` + fmt.Sprintf("%v", this.ReadOnly) + `,`, + `SecretRef:` + strings.Replace(fmt.Sprintf("%v", this.SecretRef), "LocalObjectReference", "LocalObjectReference", 1) + `,`, `}`, }, "") return s @@ -14449,6 +14718,20 @@ func (this *ConfigMapList) String() string { }, "") return s } +func (this *ConfigMapNodeConfigSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ConfigMapNodeConfigSource{`, + `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `UID:` + fmt.Sprintf("%v", this.UID) + `,`, + `ResourceVersion:` + fmt.Sprintf("%v", this.ResourceVersion) + `,`, + `KubeletConfigKey:` + fmt.Sprintf("%v", this.KubeletConfigKey) + `,`, + `}`, + }, "") + return s +} func (this *ConfigMapProjection) String() string { if this == nil { return "nil" @@ -14605,19 +14888,6 @@ func (this *DaemonEndpoint) String() string { }, "") return s } -func (this *DeleteOptions) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&DeleteOptions{`, - `GracePeriodSeconds:` + valueToStringGenerated(this.GracePeriodSeconds) + `,`, - `Preconditions:` + strings.Replace(fmt.Sprintf("%v", this.Preconditions), "Preconditions", "Preconditions", 1) + `,`, - `OrphanDependents:` + valueToStringGenerated(this.OrphanDependents) + `,`, - `PropagationPolicy:` + valueToStringGenerated(this.PropagationPolicy) + `,`, - `}`, - }, "") - return s -} func (this *DownwardAPIProjection) String() string { if this == nil { return "nil" @@ -15167,21 +15437,6 @@ func (this *List) String() string { }, "") return s } -func (this *ListOptions) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&ListOptions{`, - `LabelSelector:` + fmt.Sprintf("%v", this.LabelSelector) + `,`, - `FieldSelector:` + fmt.Sprintf("%v", this.FieldSelector) + `,`, - `Watch:` + fmt.Sprintf("%v", this.Watch) + `,`, - `ResourceVersion:` + fmt.Sprintf("%v", this.ResourceVersion) + `,`, - `TimeoutSeconds:` + valueToStringGenerated(this.TimeoutSeconds) + `,`, - `IncludeUninitialized:` + fmt.Sprintf("%v", this.IncludeUninitialized) + `,`, - `}`, - }, "") - return s -} func (this *LoadBalancerIngress) String() string { if this == nil { return "nil" @@ -15332,7 +15587,20 @@ func (this *NodeConfigSource) String() string { return "nil" } s := strings.Join([]string{`&NodeConfigSource{`, - `ConfigMapRef:` + strings.Replace(fmt.Sprintf("%v", this.ConfigMapRef), "ObjectReference", "ObjectReference", 1) + `,`, + `ConfigMap:` + strings.Replace(fmt.Sprintf("%v", this.ConfigMap), "ConfigMapNodeConfigSource", "ConfigMapNodeConfigSource", 1) + `,`, + `}`, + }, "") + return s +} +func (this *NodeConfigStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NodeConfigStatus{`, + `Assigned:` + strings.Replace(fmt.Sprintf("%v", this.Assigned), "NodeConfigSource", "NodeConfigSource", 1) + `,`, + `Active:` + strings.Replace(fmt.Sprintf("%v", this.Active), "NodeConfigSource", "NodeConfigSource", 1) + `,`, + `LastKnownGood:` + strings.Replace(fmt.Sprintf("%v", this.LastKnownGood), "NodeConfigSource", "NodeConfigSource", 1) + `,`, + `Error:` + fmt.Sprintf("%v", this.Error) + `,`, `}`, }, "") return s @@ -15416,6 +15684,7 @@ func (this *NodeSelectorTerm) String() string { } s := strings.Join([]string{`&NodeSelectorTerm{`, `MatchExpressions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.MatchExpressions), "NodeSelectorRequirement", "NodeSelectorRequirement", 1), `&`, ``, 1) + `,`, + `MatchFields:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.MatchFields), "NodeSelectorRequirement", "NodeSelectorRequirement", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -15426,7 +15695,7 @@ func (this *NodeSpec) String() string { } s := strings.Join([]string{`&NodeSpec{`, `PodCIDR:` + fmt.Sprintf("%v", this.PodCIDR) + `,`, - `ExternalID:` + fmt.Sprintf("%v", this.ExternalID) + `,`, + `DoNotUse_ExternalID:` + fmt.Sprintf("%v", this.DoNotUse_ExternalID) + `,`, `ProviderID:` + fmt.Sprintf("%v", this.ProviderID) + `,`, `Unschedulable:` + fmt.Sprintf("%v", this.Unschedulable) + `,`, `Taints:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Taints), "Taint", "Taint", 1), `&`, ``, 1) + `,`, @@ -15470,6 +15739,7 @@ func (this *NodeStatus) String() string { `Images:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Images), "ContainerImage", "ContainerImage", 1), `&`, ``, 1) + `,`, `VolumesInUse:` + fmt.Sprintf("%v", this.VolumesInUse) + `,`, `VolumesAttached:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.VolumesAttached), "AttachedVolume", "AttachedVolume", 1), `&`, ``, 1) + `,`, + `Config:` + strings.Replace(fmt.Sprintf("%v", this.Config), "NodeConfigStatus", "NodeConfigStatus", 1) + `,`, `}`, }, "") return s @@ -15504,51 +15774,6 @@ func (this *ObjectFieldSelector) String() string { }, "") return s } -func (this *ObjectMeta) String() string { - if this == nil { - return "nil" - } - keysForLabels := make([]string, 0, len(this.Labels)) - for k := range this.Labels { - keysForLabels = append(keysForLabels, k) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForLabels) - mapStringForLabels := "map[string]string{" - for _, k := range keysForLabels { - mapStringForLabels += fmt.Sprintf("%v: %v,", k, this.Labels[k]) - } - mapStringForLabels += "}" - keysForAnnotations := make([]string, 0, len(this.Annotations)) - for k := range this.Annotations { - keysForAnnotations = append(keysForAnnotations, k) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForAnnotations) - mapStringForAnnotations := "map[string]string{" - for _, k := range keysForAnnotations { - mapStringForAnnotations += fmt.Sprintf("%v: %v,", k, this.Annotations[k]) - } - mapStringForAnnotations += "}" - s := strings.Join([]string{`&ObjectMeta{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `GenerateName:` + fmt.Sprintf("%v", this.GenerateName) + `,`, - `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, - `SelfLink:` + fmt.Sprintf("%v", this.SelfLink) + `,`, - `UID:` + fmt.Sprintf("%v", this.UID) + `,`, - `ResourceVersion:` + fmt.Sprintf("%v", this.ResourceVersion) + `,`, - `Generation:` + fmt.Sprintf("%v", this.Generation) + `,`, - `CreationTimestamp:` + strings.Replace(strings.Replace(this.CreationTimestamp.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`, - `DeletionTimestamp:` + strings.Replace(fmt.Sprintf("%v", this.DeletionTimestamp), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1) + `,`, - `DeletionGracePeriodSeconds:` + valueToStringGenerated(this.DeletionGracePeriodSeconds) + `,`, - `Labels:` + mapStringForLabels + `,`, - `Annotations:` + mapStringForAnnotations + `,`, - `OwnerReferences:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.OwnerReferences), "OwnerReference", "k8s_io_apimachinery_pkg_apis_meta_v1.OwnerReference", 1), `&`, ``, 1) + `,`, - `Finalizers:` + fmt.Sprintf("%v", this.Finalizers) + `,`, - `ClusterName:` + fmt.Sprintf("%v", this.ClusterName) + `,`, - `Initializers:` + strings.Replace(fmt.Sprintf("%v", this.Initializers), "Initializers", "k8s_io_apimachinery_pkg_apis_meta_v1.Initializers", 1) + `,`, - `}`, - }, "") - return s -} func (this *ObjectReference) String() string { if this == nil { return "nil" @@ -15687,7 +15912,7 @@ func (this *PersistentVolumeSource) String() string { `NFS:` + strings.Replace(fmt.Sprintf("%v", this.NFS), "NFSVolumeSource", "NFSVolumeSource", 1) + `,`, `RBD:` + strings.Replace(fmt.Sprintf("%v", this.RBD), "RBDPersistentVolumeSource", "RBDPersistentVolumeSource", 1) + `,`, `ISCSI:` + strings.Replace(fmt.Sprintf("%v", this.ISCSI), "ISCSIPersistentVolumeSource", "ISCSIPersistentVolumeSource", 1) + `,`, - `Cinder:` + strings.Replace(fmt.Sprintf("%v", this.Cinder), "CinderVolumeSource", "CinderVolumeSource", 1) + `,`, + `Cinder:` + strings.Replace(fmt.Sprintf("%v", this.Cinder), "CinderPersistentVolumeSource", "CinderPersistentVolumeSource", 1) + `,`, `CephFS:` + strings.Replace(fmt.Sprintf("%v", this.CephFS), "CephFSPersistentVolumeSource", "CephFSPersistentVolumeSource", 1) + `,`, `FC:` + strings.Replace(fmt.Sprintf("%v", this.FC), "FCVolumeSource", "FCVolumeSource", 1) + `,`, `Flocker:` + strings.Replace(fmt.Sprintf("%v", this.Flocker), "FlockerVolumeSource", "FlockerVolumeSource", 1) + `,`, @@ -15918,6 +16143,16 @@ func (this *PodProxyOptions) String() string { }, "") return s } +func (this *PodReadinessGate) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PodReadinessGate{`, + `ConditionType:` + fmt.Sprintf("%v", this.ConditionType) + `,`, + `}`, + }, "") + return s +} func (this *PodSecurityContext) String() string { if this == nil { return "nil" @@ -15929,6 +16164,7 @@ func (this *PodSecurityContext) String() string { `SupplementalGroups:` + fmt.Sprintf("%v", this.SupplementalGroups) + `,`, `FSGroup:` + valueToStringGenerated(this.FSGroup) + `,`, `RunAsGroup:` + valueToStringGenerated(this.RunAsGroup) + `,`, + `Sysctls:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Sysctls), "Sysctl", "Sysctl", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -15985,6 +16221,7 @@ func (this *PodSpec) String() string { `Priority:` + valueToStringGenerated(this.Priority) + `,`, `DNSConfig:` + strings.Replace(fmt.Sprintf("%v", this.DNSConfig), "PodDNSConfig", "PodDNSConfig", 1) + `,`, `ShareProcessNamespace:` + valueToStringGenerated(this.ShareProcessNamespace) + `,`, + `ReadinessGates:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ReadinessGates), "PodReadinessGate", "PodReadinessGate", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -16312,6 +16549,7 @@ func (this *ResourceQuotaSpec) String() string { s := strings.Join([]string{`&ResourceQuotaSpec{`, `Hard:` + mapStringForHard + `,`, `Scopes:` + fmt.Sprintf("%v", this.Scopes) + `,`, + `ScopeSelector:` + strings.Replace(fmt.Sprintf("%v", this.ScopeSelector), "ScopeSelector", "ScopeSelector", 1) + `,`, `}`, }, "") return s @@ -16429,6 +16667,28 @@ func (this *ScaleIOVolumeSource) String() string { }, "") return s } +func (this *ScopeSelector) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ScopeSelector{`, + `MatchExpressions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.MatchExpressions), "ScopedResourceSelectorRequirement", "ScopedResourceSelectorRequirement", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *ScopedResourceSelectorRequirement) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ScopedResourceSelectorRequirement{`, + `ScopeName:` + fmt.Sprintf("%v", this.ScopeName) + `,`, + `Operator:` + fmt.Sprintf("%v", this.Operator) + `,`, + `Values:` + fmt.Sprintf("%v", this.Values) + `,`, + `}`, + }, "") + return s +} func (this *Secret) String() string { if this == nil { return "nil" @@ -16595,6 +16855,18 @@ func (this *ServiceAccountList) String() string { }, "") return s } +func (this *ServiceAccountTokenProjection) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ServiceAccountTokenProjection{`, + `Audience:` + fmt.Sprintf("%v", this.Audience) + `,`, + `ExpirationSeconds:` + valueToStringGenerated(this.ExpirationSeconds) + `,`, + `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `}`, + }, "") + return s +} func (this *ServiceList) String() string { if this == nil { return "nil" @@ -16759,6 +17031,27 @@ func (this *Toleration) String() string { }, "") return s } +func (this *TopologySelectorLabelRequirement) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TopologySelectorLabelRequirement{`, + `Key:` + fmt.Sprintf("%v", this.Key) + `,`, + `Values:` + fmt.Sprintf("%v", this.Values) + `,`, + `}`, + }, "") + return s +} +func (this *TopologySelectorTerm) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&TopologySelectorTerm{`, + `MatchLabelExpressions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.MatchLabelExpressions), "TopologySelectorLabelRequirement", "TopologySelectorLabelRequirement", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} func (this *Volume) String() string { if this == nil { return "nil" @@ -16813,6 +17106,7 @@ func (this *VolumeProjection) String() string { `Secret:` + strings.Replace(fmt.Sprintf("%v", this.Secret), "SecretProjection", "SecretProjection", 1) + `,`, `DownwardAPI:` + strings.Replace(fmt.Sprintf("%v", this.DownwardAPI), "DownwardAPIProjection", "DownwardAPIProjection", 1) + `,`, `ConfigMap:` + strings.Replace(fmt.Sprintf("%v", this.ConfigMap), "ConfigMapProjection", "ConfigMapProjection", 1) + `,`, + `ServiceAccountToken:` + strings.Replace(fmt.Sprintf("%v", this.ServiceAccountToken), "ServiceAccountTokenProjection", "ServiceAccountTokenProjection", 1) + `,`, `}`, }, "") return s @@ -18903,6 +19197,167 @@ func (m *CephFSVolumeSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *CinderPersistentVolumeSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CinderPersistentVolumeSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CinderPersistentVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VolumeID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VolumeID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FSType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FSType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReadOnly = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", 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 > l { + return io.ErrUnexpectedEOF + } + if m.SecretRef == nil { + m.SecretRef = &SecretReference{} + } + if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CinderVolumeSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -19010,6 +19465,39 @@ func (m *CinderVolumeSource) Unmarshal(dAtA []byte) error { } } m.ReadOnly = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretRef", 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 > l { + return io.ErrUnexpectedEOF + } + if m.SecretRef == nil { + m.SecretRef = &LocalObjectReference{} + } + if err := m.SecretRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -20144,6 +20632,201 @@ func (m *ConfigMapList) Unmarshal(dAtA []byte) error { } return nil } +func (m *ConfigMapNodeConfigSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ConfigMapNodeConfigSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConfigMapNodeConfigSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KubeletConfigKey", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KubeletConfigKey = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ConfigMapProjection) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -22266,160 +22949,6 @@ func (m *DaemonEndpoint) Unmarshal(dAtA []byte) error { } return nil } -func (m *DeleteOptions) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: DeleteOptions: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DeleteOptions: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field GracePeriodSeconds", wireType) - } - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - m.GracePeriodSeconds = &v - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Preconditions", 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 > l { - return io.ErrUnexpectedEOF - } - if m.Preconditions == nil { - m.Preconditions = &Preconditions{} - } - if err := m.Preconditions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field OrphanDependents", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - b := bool(v != 0) - m.OrphanDependents = &b - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PropagationPolicy", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := DeletionPropagation(dAtA[iNdEx:postIndex]) - m.PropagationPolicy = &s - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *DownwardAPIProjection) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -28863,203 +29392,6 @@ func (m *List) Unmarshal(dAtA []byte) error { } return nil } -func (m *ListOptions) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ListOptions: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListOptions: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LabelSelector", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.LabelSelector = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FieldSelector", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FieldSelector = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Watch", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - m.Watch = bool(v != 0) - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceVersion", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ResourceVersion = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TimeoutSeconds", wireType) - } - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - m.TimeoutSeconds = &v - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IncludeUninitialized", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - m.IncludeUninitialized = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *LoadBalancerIngress) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -30561,9 +30893,9 @@ func (m *NodeConfigSource) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: NodeConfigSource: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConfigMapRef", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMap", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -30587,10 +30919,10 @@ func (m *NodeConfigSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ConfigMapRef == nil { - m.ConfigMapRef = &ObjectReference{} + if m.ConfigMap == nil { + m.ConfigMap = &ConfigMapNodeConfigSource{} } - if err := m.ConfigMapRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConfigMap.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -30615,6 +30947,184 @@ func (m *NodeConfigSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *NodeConfigStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NodeConfigStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NodeConfigStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Assigned", 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 > l { + return io.ErrUnexpectedEOF + } + if m.Assigned == nil { + m.Assigned = &NodeConfigSource{} + } + if err := m.Assigned.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Active", 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 > l { + return io.ErrUnexpectedEOF + } + if m.Active == nil { + m.Active = &NodeConfigSource{} + } + if err := m.Active.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastKnownGood", 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 > l { + return io.ErrUnexpectedEOF + } + if m.LastKnownGood == nil { + m.LastKnownGood = &NodeConfigSource{} + } + if err := m.LastKnownGood.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NodeDaemonEndpoints) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -31334,6 +31844,37 @@ func (m *NodeSelectorTerm) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchFields", 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 > l { + return io.ErrUnexpectedEOF + } + m.MatchFields = append(m.MatchFields, NodeSelectorRequirement{}) + if err := m.MatchFields[len(m.MatchFields)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -31415,7 +31956,7 @@ func (m *NodeSpec) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExternalID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DoNotUse_ExternalID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -31440,7 +31981,7 @@ func (m *NodeSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ExternalID = string(dAtA[iNdEx:postIndex]) + m.DoNotUse_ExternalID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { @@ -32089,6 +32630,39 @@ func (m *NodeStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", 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 > l { + return io.ErrUnexpectedEOF + } + if m.Config == nil { + m.Config = &NodeConfigStatus{} + } + if err := m.Config.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -32558,686 +33132,6 @@ func (m *ObjectFieldSelector) Unmarshal(dAtA []byte) error { } return nil } -func (m *ObjectMeta) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ObjectMeta: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ObjectMeta: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GenerateName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GenerateName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Namespace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SelfLink", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SelfLink = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UID", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.UID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceVersion", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ResourceVersion = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Generation", wireType) - } - m.Generation = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Generation |= (int64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CreationTimestamp", 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 > l { - return io.ErrUnexpectedEOF - } - if err := m.CreationTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeletionTimestamp", 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 > l { - return io.ErrUnexpectedEOF - } - if m.DeletionTimestamp == nil { - m.DeletionTimestamp = &k8s_io_apimachinery_pkg_apis_meta_v1.Time{} - } - if err := m.DeletionTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DeletionGracePeriodSeconds", wireType) - } - var v int64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - m.DeletionGracePeriodSeconds = &v - case 11: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Labels", 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 > l { - return io.ErrUnexpectedEOF - } - var keykey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - keykey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey := string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - if m.Labels == nil { - m.Labels = make(map[string]string) - } - if iNdEx < postIndex { - var valuekey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - valuekey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue := string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - m.Labels[mapkey] = mapvalue - } else { - var mapvalue string - m.Labels[mapkey] = mapvalue - } - iNdEx = postIndex - case 12: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Annotations", 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 > l { - return io.ErrUnexpectedEOF - } - var keykey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - keykey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey := string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - if m.Annotations == nil { - m.Annotations = make(map[string]string) - } - if iNdEx < postIndex { - var valuekey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - valuekey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue := string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - m.Annotations[mapkey] = mapvalue - } else { - var mapvalue string - m.Annotations[mapkey] = mapvalue - } - iNdEx = postIndex - case 13: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OwnerReferences", 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 > l { - return io.ErrUnexpectedEOF - } - m.OwnerReferences = append(m.OwnerReferences, k8s_io_apimachinery_pkg_apis_meta_v1.OwnerReference{}) - if err := m.OwnerReferences[len(m.OwnerReferences)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 14: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Finalizers", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Finalizers = append(m.Finalizers, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 15: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClusterName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 16: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Initializers", 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 > l { - return io.ErrUnexpectedEOF - } - if m.Initializers == nil { - m.Initializers = &k8s_io_apimachinery_pkg_apis_meta_v1.Initializers{} - } - if err := m.Initializers.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *ObjectReference) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -35096,7 +34990,7 @@ func (m *PersistentVolumeSource) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Cinder == nil { - m.Cinder = &CinderVolumeSource{} + m.Cinder = &CinderPersistentVolumeSource{} } if err := m.Cinder.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -38103,6 +37997,85 @@ func (m *PodProxyOptions) Unmarshal(dAtA []byte) error { } return nil } +func (m *PodReadinessGate) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PodReadinessGate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PodReadinessGate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConditionType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ConditionType = PodConditionType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *PodSecurityContext) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -38308,6 +38281,37 @@ func (m *PodSecurityContext) Unmarshal(dAtA []byte) error { } } m.RunAsGroup = &v + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sysctls", 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 > l { + return io.ErrUnexpectedEOF + } + m.Sysctls = append(m.Sysctls, Sysctl{}) + if err := m.Sysctls[len(m.Sysctls)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -39265,6 +39269,37 @@ func (m *PodSpec) Unmarshal(dAtA []byte) error { } b := bool(v != 0) m.ShareProcessNamespace = &b + case 28: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadinessGates", 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 > l { + return io.ErrUnexpectedEOF + } + m.ReadinessGates = append(m.ReadinessGates, PodReadinessGate{}) + if err := m.ReadinessGates[len(m.ReadinessGates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -43166,6 +43201,39 @@ func (m *ResourceQuotaSpec) Unmarshal(dAtA []byte) error { } m.Scopes = append(m.Scopes, ResourceQuotaScope(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScopeSelector", 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 > l { + return io.ErrUnexpectedEOF + } + if m.ScopeSelector == nil { + m.ScopeSelector = &ScopeSelector{} + } + if err := m.ScopeSelector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -44589,6 +44657,224 @@ func (m *ScaleIOVolumeSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *ScopeSelector) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ScopeSelector: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ScopeSelector: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchExpressions", 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 > l { + return io.ErrUnexpectedEOF + } + m.MatchExpressions = append(m.MatchExpressions, ScopedResourceSelectorRequirement{}) + if err := m.MatchExpressions[len(m.MatchExpressions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ScopedResourceSelectorRequirement) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ScopedResourceSelectorRequirement: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ScopedResourceSelectorRequirement: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ScopeName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ScopeName = ResourceQuotaScope(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Operator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Operator = ScopeSelectorOperator(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Values = append(m.Values, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Secret) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -46398,6 +46684,134 @@ func (m *ServiceAccountList) Unmarshal(dAtA []byte) error { } return nil } +func (m *ServiceAccountTokenProjection) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ServiceAccountTokenProjection: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ServiceAccountTokenProjection: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Audience", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Audience = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpirationSeconds", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ExpirationSeconds = &v + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ServiceList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -48381,6 +48795,195 @@ func (m *Toleration) Unmarshal(dAtA []byte) error { } return nil } +func (m *TopologySelectorLabelRequirement) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TopologySelectorLabelRequirement: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TopologySelectorLabelRequirement: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Values", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Values = append(m.Values, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TopologySelectorTerm) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TopologySelectorTerm: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TopologySelectorTerm: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchLabelExpressions", 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 > l { + return io.ErrUnexpectedEOF + } + m.MatchLabelExpressions = append(m.MatchLabelExpressions, TopologySelectorLabelRequirement{}) + if err := m.MatchLabelExpressions[len(m.MatchLabelExpressions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Volume) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -48996,6 +49599,39 @@ func (m *VolumeProjection) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceAccountToken", 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 > l { + return io.ErrUnexpectedEOF + } + if m.ServiceAccountToken == nil { + m.ServiceAccountToken = &ServiceAccountTokenProjection{} + } + if err := m.ServiceAccountToken.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -50333,797 +50969,799 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 12666 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0x49, - 0x56, 0xd8, 0x55, 0xb7, 0xbe, 0xfa, 0xe9, 0x3b, 0x67, 0x66, 0x57, 0xa3, 0xdd, 0x9d, 0x9e, 0xad, - 0xbd, 0x9b, 0x9b, 0xfd, 0x92, 0x6e, 0x67, 0x77, 0x6f, 0x97, 0xdb, 0xbb, 0x05, 0x49, 0x2d, 0xcd, - 0xf4, 0xce, 0x48, 0xd3, 0x9b, 0xad, 0x99, 0xb9, 0x5b, 0x96, 0xf3, 0x95, 0xba, 0x53, 0xad, 0x5a, - 0x95, 0xaa, 0x7a, 0xab, 0xaa, 0x35, 0xa3, 0x0d, 0x88, 0xb0, 0x8f, 0x0f, 0x1b, 0xc3, 0x8f, 0x0b, - 0x43, 0xd8, 0x18, 0x08, 0x1c, 0x61, 0xe3, 0x80, 0x33, 0xb6, 0x23, 0x30, 0x18, 0xf0, 0x81, 0x6d, - 0x8c, 0xfd, 0x03, 0xfe, 0x60, 0xf0, 0x9f, 0x23, 0x82, 0xb0, 0x0c, 0x82, 0xb0, 0x83, 0x1f, 0x76, - 0x38, 0x4c, 0x84, 0x23, 0x90, 0xb1, 0x71, 0xe4, 0x67, 0x65, 0x56, 0x57, 0x75, 0xb7, 0x66, 0x35, - 0xda, 0x85, 0xb8, 0x7f, 0xdd, 0xf9, 0x5e, 0xbe, 0xcc, 0xca, 0x8f, 0x97, 0x2f, 0x5f, 0xbe, 0x0f, - 0x78, 0x63, 0xf7, 0xf5, 0x68, 0xc1, 0x0d, 0x16, 0x77, 0x3b, 0x5b, 0x24, 0xf4, 0x49, 0x4c, 0xa2, - 0xc5, 0x7d, 0xe2, 0x37, 0x83, 0x70, 0x51, 0x00, 0x9c, 0xb6, 0xbb, 0xd8, 0x08, 0x42, 0xb2, 0xb8, - 0xff, 0xd2, 0x62, 0x8b, 0xf8, 0x24, 0x74, 0x62, 0xd2, 0x5c, 0x68, 0x87, 0x41, 0x1c, 0x20, 0xc4, - 0x71, 0x16, 0x9c, 0xb6, 0xbb, 0x40, 0x71, 0x16, 0xf6, 0x5f, 0x9a, 0x7f, 0xb1, 0xe5, 0xc6, 0x3b, - 0x9d, 0xad, 0x85, 0x46, 0xb0, 0xb7, 0xd8, 0x0a, 0x5a, 0xc1, 0x22, 0x43, 0xdd, 0xea, 0x6c, 0xb3, - 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x49, 0xcc, 0xaf, 0x27, 0xcd, 0x90, 0x07, 0x31, 0xf1, 0x23, 0x37, - 0xf0, 0xa3, 0x17, 0x9d, 0xb6, 0x1b, 0x91, 0x70, 0x9f, 0x84, 0x8b, 0xed, 0xdd, 0x16, 0x85, 0x45, - 0x26, 0xc2, 0xe2, 0xfe, 0x4b, 0x5b, 0x24, 0x76, 0xba, 0x7a, 0x34, 0xff, 0x4a, 0x42, 0x6e, 0xcf, - 0x69, 0xec, 0xb8, 0x3e, 0x09, 0x0f, 0x24, 0x8d, 0xc5, 0x90, 0x44, 0x41, 0x27, 0x6c, 0x90, 0x13, - 0xd5, 0x8a, 0x16, 0xf7, 0x48, 0xec, 0x64, 0x7c, 0xfd, 0xfc, 0x62, 0x5e, 0xad, 0xb0, 0xe3, 0xc7, - 0xee, 0x5e, 0x77, 0x33, 0x9f, 0xed, 0x57, 0x21, 0x6a, 0xec, 0x90, 0x3d, 0xa7, 0xab, 0xde, 0xcb, - 0x79, 0xf5, 0x3a, 0xb1, 0xeb, 0x2d, 0xba, 0x7e, 0x1c, 0xc5, 0x61, 0xba, 0x92, 0xfd, 0x4d, 0x0b, - 0x2e, 0x2f, 0xdd, 0xab, 0xaf, 0x7a, 0x4e, 0x14, 0xbb, 0x8d, 0x65, 0x2f, 0x68, 0xec, 0xd6, 0xe3, - 0x20, 0x24, 0x77, 0x03, 0xaf, 0xb3, 0x47, 0xea, 0x6c, 0x20, 0xd0, 0x0b, 0x30, 0xb6, 0xcf, 0xfe, - 0x57, 0x2b, 0x73, 0xd6, 0x65, 0xeb, 0x6a, 0x69, 0x79, 0xe6, 0x37, 0x0f, 0xcb, 0x9f, 0x38, 0x3a, - 0x2c, 0x8f, 0xdd, 0x15, 0xe5, 0x58, 0x61, 0xa0, 0x2b, 0x30, 0xb2, 0x1d, 0x6d, 0x1e, 0xb4, 0xc9, - 0x5c, 0x81, 0xe1, 0x4e, 0x09, 0xdc, 0x91, 0xb5, 0x3a, 0x2d, 0xc5, 0x02, 0x8a, 0x16, 0xa1, 0xd4, - 0x76, 0xc2, 0xd8, 0x8d, 0xdd, 0xc0, 0x9f, 0x2b, 0x5e, 0xb6, 0xae, 0x0e, 0x2f, 0xcf, 0x0a, 0xd4, - 0x52, 0x4d, 0x02, 0x70, 0x82, 0x43, 0xbb, 0x11, 0x12, 0xa7, 0x79, 0xdb, 0xf7, 0x0e, 0xe6, 0x86, - 0x2e, 0x5b, 0x57, 0xc7, 0x92, 0x6e, 0x60, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0xe3, 0x05, 0x18, 0x5b, - 0xda, 0xde, 0x76, 0x7d, 0x37, 0x3e, 0x40, 0x77, 0x61, 0xc2, 0x0f, 0x9a, 0x44, 0xfe, 0x67, 0x5f, - 0x31, 0x7e, 0xed, 0xf2, 0x42, 0xf7, 0xca, 0x5c, 0xd8, 0xd0, 0xf0, 0x96, 0x67, 0x8e, 0x0e, 0xcb, - 0x13, 0x7a, 0x09, 0x36, 0xe8, 0x20, 0x0c, 0xe3, 0xed, 0xa0, 0xa9, 0xc8, 0x16, 0x18, 0xd9, 0x72, - 0x16, 0xd9, 0x5a, 0x82, 0xb6, 0x3c, 0x7d, 0x74, 0x58, 0x1e, 0xd7, 0x0a, 0xb0, 0x4e, 0x04, 0x6d, - 0xc1, 0x34, 0xfd, 0xeb, 0xc7, 0xae, 0xa2, 0x5b, 0x64, 0x74, 0x9f, 0xc9, 0xa3, 0xab, 0xa1, 0x2e, - 0x9f, 0x3b, 0x3a, 0x2c, 0x4f, 0xa7, 0x0a, 0x71, 0x9a, 0xa0, 0xfd, 0x01, 0x4c, 0x2d, 0xc5, 0xb1, - 0xd3, 0xd8, 0x21, 0x4d, 0x3e, 0x83, 0xe8, 0x15, 0x18, 0xf2, 0x9d, 0x3d, 0x22, 0xe6, 0xf7, 0xb2, - 0x18, 0xd8, 0xa1, 0x0d, 0x67, 0x8f, 0x1c, 0x1f, 0x96, 0x67, 0xee, 0xf8, 0xee, 0xfb, 0x1d, 0xb1, - 0x2a, 0x68, 0x19, 0x66, 0xd8, 0xe8, 0x1a, 0x40, 0x93, 0xec, 0xbb, 0x0d, 0x52, 0x73, 0xe2, 0x1d, - 0x31, 0xdf, 0x48, 0xd4, 0x85, 0x8a, 0x82, 0x60, 0x0d, 0xcb, 0x7e, 0x00, 0xa5, 0xa5, 0xfd, 0xc0, - 0x6d, 0xd6, 0x82, 0x66, 0x84, 0x76, 0x61, 0xba, 0x1d, 0x92, 0x6d, 0x12, 0xaa, 0xa2, 0x39, 0xeb, - 0x72, 0xf1, 0xea, 0xf8, 0xb5, 0xab, 0x99, 0x1f, 0x6b, 0xa2, 0xae, 0xfa, 0x71, 0x78, 0xb0, 0xfc, - 0xb8, 0x68, 0x6f, 0x3a, 0x05, 0xc5, 0x69, 0xca, 0xf6, 0x7f, 0x28, 0xc0, 0x85, 0xa5, 0x0f, 0x3a, - 0x21, 0xa9, 0xb8, 0xd1, 0x6e, 0x7a, 0x85, 0x37, 0xdd, 0x68, 0x77, 0x23, 0x19, 0x01, 0xb5, 0xb4, - 0x2a, 0xa2, 0x1c, 0x2b, 0x0c, 0xf4, 0x22, 0x8c, 0xd2, 0xdf, 0x77, 0x70, 0x55, 0x7c, 0xf2, 0x39, - 0x81, 0x3c, 0x5e, 0x71, 0x62, 0xa7, 0xc2, 0x41, 0x58, 0xe2, 0xa0, 0x75, 0x18, 0x6f, 0xb0, 0x0d, - 0xd9, 0x5a, 0x0f, 0x9a, 0x84, 0x4d, 0x66, 0x69, 0xf9, 0x79, 0x8a, 0xbe, 0x92, 0x14, 0x1f, 0x1f, - 0x96, 0xe7, 0x78, 0xdf, 0x04, 0x09, 0x0d, 0x86, 0xf5, 0xfa, 0xc8, 0x56, 0xfb, 0x6b, 0x88, 0x51, - 0x82, 0x8c, 0xbd, 0x75, 0x55, 0xdb, 0x2a, 0xc3, 0x6c, 0xab, 0x4c, 0x64, 0x6f, 0x13, 0xf4, 0x12, - 0x0c, 0xed, 0xba, 0x7e, 0x73, 0x6e, 0x84, 0xd1, 0x7a, 0x8a, 0xce, 0xf9, 0x4d, 0xd7, 0x6f, 0x1e, - 0x1f, 0x96, 0x67, 0x8d, 0xee, 0xd0, 0x42, 0xcc, 0x50, 0xed, 0x3f, 0xb5, 0xa0, 0xcc, 0x60, 0x6b, - 0xae, 0x47, 0x6a, 0x24, 0x8c, 0xdc, 0x28, 0x26, 0x7e, 0x6c, 0x0c, 0xe8, 0x35, 0x80, 0x88, 0x34, - 0x42, 0x12, 0x6b, 0x43, 0xaa, 0x16, 0x46, 0x5d, 0x41, 0xb0, 0x86, 0x45, 0x19, 0x42, 0xb4, 0xe3, - 0x84, 0x6c, 0x7d, 0x89, 0x81, 0x55, 0x0c, 0xa1, 0x2e, 0x01, 0x38, 0xc1, 0x31, 0x18, 0x42, 0xb1, - 0x1f, 0x43, 0x40, 0x5f, 0x80, 0xe9, 0xa4, 0xb1, 0xa8, 0xed, 0x34, 0xe4, 0x00, 0xb2, 0x2d, 0x53, - 0x37, 0x41, 0x38, 0x8d, 0x6b, 0xff, 0x13, 0x4b, 0x2c, 0x1e, 0xfa, 0xd5, 0x1f, 0xf3, 0x6f, 0xb5, - 0x7f, 0xc5, 0x82, 0xd1, 0x65, 0xd7, 0x6f, 0xba, 0x7e, 0x0b, 0x7d, 0x05, 0xc6, 0xe8, 0xd9, 0xd4, - 0x74, 0x62, 0x47, 0xf0, 0xbd, 0xcf, 0x68, 0x7b, 0x4b, 0x1d, 0x15, 0x0b, 0xed, 0xdd, 0x16, 0x2d, - 0x88, 0x16, 0x28, 0x36, 0xdd, 0x6d, 0xb7, 0xb7, 0xde, 0x23, 0x8d, 0x78, 0x9d, 0xc4, 0x4e, 0xf2, - 0x39, 0x49, 0x19, 0x56, 0x54, 0xd1, 0x4d, 0x18, 0x89, 0x9d, 0xb0, 0x45, 0x62, 0xc1, 0x00, 0x33, - 0x19, 0x15, 0xaf, 0x89, 0xe9, 0x8e, 0x24, 0x7e, 0x83, 0x24, 0xc7, 0xc2, 0x26, 0xab, 0x8a, 0x05, - 0x09, 0xfb, 0x6f, 0x8f, 0xc0, 0xc5, 0x95, 0x7a, 0x35, 0x67, 0x5d, 0x5d, 0x81, 0x91, 0x66, 0xe8, - 0xee, 0x93, 0x50, 0x8c, 0xb3, 0xa2, 0x52, 0x61, 0xa5, 0x58, 0x40, 0xd1, 0xeb, 0x30, 0xc1, 0x0f, - 0xa4, 0x1b, 0x8e, 0xdf, 0xf4, 0xe4, 0x10, 0x9f, 0x17, 0xd8, 0x13, 0x77, 0x35, 0x18, 0x36, 0x30, - 0x4f, 0xb8, 0xa8, 0xae, 0xa4, 0x36, 0x63, 0xde, 0x61, 0xf7, 0x83, 0x16, 0xcc, 0xf0, 0x66, 0x96, - 0xe2, 0x38, 0x74, 0xb7, 0x3a, 0x31, 0x89, 0xe6, 0x86, 0x19, 0xa7, 0x5b, 0xc9, 0x1a, 0xad, 0xdc, - 0x11, 0x58, 0xb8, 0x9b, 0xa2, 0xc2, 0x99, 0xe0, 0x9c, 0x68, 0x77, 0x26, 0x0d, 0xc6, 0x5d, 0xcd, - 0xa2, 0xef, 0xb5, 0x60, 0xbe, 0x11, 0xf8, 0x71, 0x18, 0x78, 0x1e, 0x09, 0x6b, 0x9d, 0x2d, 0xcf, - 0x8d, 0x76, 0xf8, 0x3a, 0xc5, 0x64, 0x9b, 0x71, 0x82, 0x9c, 0x39, 0x54, 0x48, 0x62, 0x0e, 0x2f, - 0x1d, 0x1d, 0x96, 0xe7, 0x57, 0x72, 0x49, 0xe1, 0x1e, 0xcd, 0xa0, 0x5d, 0x40, 0xf4, 0x28, 0xad, - 0xc7, 0x4e, 0x8b, 0x24, 0x8d, 0x8f, 0x0e, 0xde, 0xf8, 0x63, 0x47, 0x87, 0x65, 0xb4, 0xd1, 0x45, - 0x02, 0x67, 0x90, 0x45, 0xef, 0xc3, 0x79, 0x5a, 0xda, 0xf5, 0xad, 0x63, 0x83, 0x37, 0x37, 0x77, - 0x74, 0x58, 0x3e, 0xbf, 0x91, 0x41, 0x04, 0x67, 0x92, 0x9e, 0x5f, 0x81, 0x0b, 0x99, 0x53, 0x85, - 0x66, 0xa0, 0xb8, 0x4b, 0xb8, 0x08, 0x52, 0xc2, 0xf4, 0x27, 0x3a, 0x0f, 0xc3, 0xfb, 0x8e, 0xd7, - 0x11, 0xab, 0x14, 0xf3, 0x3f, 0x9f, 0x2b, 0xbc, 0x6e, 0xd9, 0x0d, 0x98, 0x58, 0x71, 0xda, 0xce, - 0x96, 0xeb, 0xb9, 0xb1, 0x4b, 0x22, 0xf4, 0x69, 0x28, 0x3a, 0xcd, 0x26, 0x3b, 0x22, 0x4b, 0xcb, - 0x17, 0x8e, 0x0e, 0xcb, 0xc5, 0xa5, 0x26, 0xe5, 0xd5, 0xa0, 0xb0, 0x0e, 0x30, 0xc5, 0x40, 0xcf, - 0xc1, 0x50, 0x33, 0x0c, 0xda, 0x73, 0x05, 0x86, 0x49, 0x87, 0x6a, 0xa8, 0x12, 0x06, 0xed, 0x14, - 0x2a, 0xc3, 0xb1, 0x7f, 0xbd, 0x00, 0x4f, 0xae, 0x90, 0xf6, 0xce, 0x5a, 0x3d, 0x67, 0xd3, 0x5d, - 0x85, 0xb1, 0xbd, 0xc0, 0x77, 0xe3, 0x20, 0x8c, 0x44, 0xd3, 0xec, 0x34, 0x59, 0x17, 0x65, 0x58, - 0x41, 0xd1, 0x65, 0x18, 0x6a, 0x27, 0x92, 0xc0, 0x84, 0x94, 0x22, 0x98, 0x0c, 0xc0, 0x20, 0x14, - 0xa3, 0x13, 0x91, 0x50, 0x9c, 0x82, 0x0a, 0xe3, 0x4e, 0x44, 0x42, 0xcc, 0x20, 0x09, 0x3b, 0xa5, - 0x8c, 0x56, 0x6c, 0xab, 0x14, 0x3b, 0xa5, 0x10, 0xac, 0x61, 0xa1, 0x1a, 0x94, 0x22, 0x35, 0xa9, - 0xc3, 0x83, 0x4f, 0xea, 0x24, 0xe3, 0xb7, 0x6a, 0x26, 0x13, 0x22, 0x06, 0x1b, 0x18, 0xe9, 0xcb, - 0x6f, 0x7f, 0xb5, 0x00, 0x88, 0x0f, 0xe1, 0x5f, 0xb2, 0x81, 0xbb, 0xd3, 0x3d, 0x70, 0x99, 0x92, - 0xd7, 0xad, 0xa0, 0xe1, 0x78, 0x69, 0x16, 0x7e, 0x5a, 0xa3, 0xf7, 0x63, 0x16, 0xa0, 0x15, 0xd7, - 0x6f, 0x92, 0xf0, 0x0c, 0xae, 0x1d, 0x27, 0x3b, 0x48, 0x6f, 0xc1, 0xd4, 0x8a, 0xe7, 0x12, 0x3f, - 0xae, 0xd6, 0x56, 0x02, 0x7f, 0xdb, 0x6d, 0xa1, 0xcf, 0xc1, 0x14, 0xbd, 0x85, 0x05, 0x9d, 0xb8, - 0x4e, 0x1a, 0x81, 0xcf, 0x04, 0x56, 0x7a, 0x77, 0x41, 0x47, 0x87, 0xe5, 0xa9, 0x4d, 0x03, 0x82, - 0x53, 0x98, 0xf6, 0xef, 0xd3, 0x0f, 0x0d, 0xf6, 0xda, 0x81, 0x4f, 0xfc, 0x78, 0x25, 0xf0, 0x9b, - 0xfc, 0x62, 0xf3, 0x39, 0x18, 0x8a, 0x69, 0xc7, 0xf9, 0x47, 0x5e, 0x91, 0x53, 0x4b, 0xbb, 0x7b, - 0x7c, 0x58, 0x7e, 0xac, 0xbb, 0x06, 0xfb, 0x20, 0x56, 0x07, 0x7d, 0x1b, 0x8c, 0x44, 0xb1, 0x13, - 0x77, 0x22, 0xf1, 0xd9, 0x4f, 0xcb, 0xcf, 0xae, 0xb3, 0xd2, 0xe3, 0xc3, 0xf2, 0xb4, 0xaa, 0xc6, - 0x8b, 0xb0, 0xa8, 0x80, 0x9e, 0x85, 0xd1, 0x3d, 0x12, 0x45, 0x4e, 0x4b, 0xca, 0xa4, 0xd3, 0xa2, - 0xee, 0xe8, 0x3a, 0x2f, 0xc6, 0x12, 0x8e, 0x9e, 0x81, 0x61, 0x12, 0x86, 0x41, 0x28, 0x56, 0xd5, - 0xa4, 0x40, 0x1c, 0x5e, 0xa5, 0x85, 0x98, 0xc3, 0xec, 0xff, 0x68, 0xc1, 0xb4, 0xea, 0x2b, 0x6f, - 0xeb, 0x0c, 0x84, 0x8f, 0x77, 0x00, 0x1a, 0xf2, 0x03, 0x23, 0xc6, 0xef, 0xc6, 0xaf, 0x5d, 0xc9, - 0x3c, 0x52, 0xbb, 0x86, 0x31, 0xa1, 0xac, 0x8a, 0x22, 0xac, 0x51, 0xb3, 0xff, 0xb5, 0x05, 0xe7, - 0x52, 0x5f, 0x74, 0xcb, 0x8d, 0x62, 0xf4, 0x6e, 0xd7, 0x57, 0x2d, 0x0c, 0xf6, 0x55, 0xb4, 0x36, - 0xfb, 0x26, 0xb5, 0xe6, 0x64, 0x89, 0xf6, 0x45, 0x37, 0x60, 0xd8, 0x8d, 0xc9, 0x9e, 0xfc, 0x98, - 0x67, 0x7a, 0x7e, 0x0c, 0xef, 0x55, 0x32, 0x23, 0x55, 0x5a, 0x13, 0x73, 0x02, 0xf6, 0x8f, 0x14, - 0xa1, 0xc4, 0x97, 0xed, 0xba, 0xd3, 0x3e, 0x83, 0xb9, 0xa8, 0xc2, 0x10, 0xa3, 0xce, 0x3b, 0xfe, - 0xe9, 0xec, 0x8e, 0x8b, 0xee, 0x2c, 0xd0, 0x9b, 0x05, 0x17, 0x5e, 0x14, 0x33, 0xa3, 0x45, 0x98, - 0x91, 0x40, 0x0e, 0xc0, 0x96, 0xeb, 0x3b, 0xe1, 0x01, 0x2d, 0x9b, 0x2b, 0x32, 0x82, 0x2f, 0xf6, - 0x26, 0xb8, 0xac, 0xf0, 0x39, 0x59, 0xd5, 0xd7, 0x04, 0x80, 0x35, 0xa2, 0xf3, 0xaf, 0x41, 0x49, - 0x21, 0x9f, 0xe4, 0x54, 0x9e, 0xff, 0x02, 0x4c, 0xa7, 0xda, 0xea, 0x57, 0x7d, 0x42, 0x3f, 0xd4, - 0xbf, 0xc1, 0xb8, 0x80, 0xe8, 0xf5, 0xaa, 0xbf, 0x2f, 0xd8, 0xdd, 0x07, 0x70, 0xde, 0xcb, 0xe0, - 0xb2, 0x62, 0xaa, 0x06, 0xe7, 0xca, 0x4f, 0x8a, 0xcf, 0x3e, 0x9f, 0x05, 0xc5, 0x99, 0x6d, 0xd0, - 0x83, 0x2a, 0x68, 0xd3, 0x35, 0xef, 0x78, 0xac, 0xbf, 0xe2, 0xbe, 0x78, 0x5b, 0x94, 0x61, 0x05, - 0xa5, 0x2c, 0xec, 0xbc, 0xea, 0xfc, 0x4d, 0x72, 0x50, 0x27, 0x1e, 0x69, 0xc4, 0x41, 0xf8, 0x91, - 0x76, 0xff, 0x29, 0x3e, 0xfa, 0x9c, 0x03, 0x8e, 0x0b, 0x02, 0xc5, 0x9b, 0xe4, 0x80, 0x4f, 0x85, - 0xfe, 0x75, 0xc5, 0x9e, 0x5f, 0xf7, 0xf3, 0x16, 0x4c, 0xaa, 0xaf, 0x3b, 0x83, 0xad, 0xbe, 0x6c, - 0x6e, 0xf5, 0xa7, 0x7a, 0x2e, 0xf0, 0x9c, 0x4d, 0xfe, 0x17, 0x8c, 0x49, 0x09, 0x9c, 0x5a, 0x18, - 0xd0, 0xa1, 0xa1, 0xa7, 0xca, 0x47, 0x39, 0x21, 0x83, 0x7c, 0xd7, 0x4d, 0x72, 0xb0, 0x19, 0x50, - 0x01, 0x27, 0xfb, 0xbb, 0x8c, 0x59, 0x1b, 0xea, 0x39, 0x6b, 0xbf, 0x58, 0x80, 0x0b, 0x6a, 0x04, - 0x0c, 0x11, 0xe2, 0x2f, 0xfb, 0x18, 0xbc, 0x04, 0xe3, 0x4d, 0xb2, 0xed, 0x74, 0xbc, 0x58, 0xa9, - 0x8e, 0x86, 0xb9, 0xfa, 0xb0, 0x92, 0x14, 0x63, 0x1d, 0xe7, 0x04, 0xc3, 0xf6, 0xd3, 0xe3, 0xec, - 0x74, 0x88, 0x1d, 0xba, 0x82, 0xa9, 0x7c, 0xa9, 0x29, 0x00, 0x27, 0x74, 0x05, 0xa0, 0x50, 0xf6, - 0x3d, 0x03, 0xc3, 0xee, 0x1e, 0x95, 0x16, 0x0a, 0xa6, 0x10, 0x50, 0xa5, 0x85, 0x98, 0xc3, 0xd0, - 0xa7, 0x60, 0xb4, 0x11, 0xec, 0xed, 0x39, 0x7e, 0x93, 0x31, 0xed, 0xd2, 0xf2, 0x38, 0x15, 0x28, - 0x56, 0x78, 0x11, 0x96, 0x30, 0xf4, 0x24, 0x0c, 0x39, 0x61, 0x2b, 0x9a, 0x1b, 0x62, 0x38, 0x63, - 0xb4, 0xa5, 0xa5, 0xb0, 0x15, 0x61, 0x56, 0x4a, 0x25, 0xd9, 0xfb, 0x41, 0xb8, 0xeb, 0xfa, 0xad, - 0x8a, 0x1b, 0x32, 0xb1, 0x54, 0x93, 0x64, 0xef, 0x29, 0x08, 0xd6, 0xb0, 0xd0, 0x1a, 0x0c, 0xb7, - 0x83, 0x30, 0x8e, 0xe6, 0x46, 0xd8, 0x70, 0x3f, 0x9d, 0xb3, 0x95, 0xf8, 0xd7, 0xd6, 0x82, 0x30, - 0x4e, 0x3e, 0x80, 0xfe, 0x8b, 0x30, 0xaf, 0x8e, 0xbe, 0x0d, 0x8a, 0xc4, 0xdf, 0x9f, 0x1b, 0x65, - 0x54, 0xe6, 0xb3, 0xa8, 0xac, 0xfa, 0xfb, 0x77, 0x9d, 0x30, 0xe1, 0x33, 0xab, 0xfe, 0x3e, 0xa6, - 0x75, 0xd0, 0x97, 0xa0, 0x24, 0x1f, 0x0f, 0x22, 0x71, 0xb5, 0xcc, 0x5c, 0x62, 0x58, 0x20, 0x61, - 0xf2, 0x7e, 0xc7, 0x0d, 0xc9, 0x1e, 0xf1, 0xe3, 0x28, 0x51, 0xff, 0x48, 0x68, 0x84, 0x13, 0x6a, - 0xe8, 0x4b, 0x52, 0x9f, 0xb1, 0x1e, 0x74, 0xfc, 0x38, 0x9a, 0x2b, 0xb1, 0xee, 0x65, 0x6a, 0x9a, - 0xef, 0x26, 0x78, 0x69, 0x85, 0x07, 0xaf, 0x8c, 0x0d, 0x52, 0x08, 0xc3, 0xa4, 0xe7, 0xee, 0x13, - 0x9f, 0x44, 0x51, 0x2d, 0x0c, 0xb6, 0xc8, 0x1c, 0xb0, 0x9e, 0x5f, 0xcc, 0x56, 0xc0, 0x06, 0x5b, - 0x64, 0x79, 0xf6, 0xe8, 0xb0, 0x3c, 0x79, 0x4b, 0xaf, 0x83, 0x4d, 0x12, 0xe8, 0x0e, 0x4c, 0x51, - 0x11, 0xda, 0x4d, 0x88, 0x8e, 0xf7, 0x23, 0xca, 0xe4, 0x67, 0x6c, 0x54, 0xc2, 0x29, 0x22, 0xe8, - 0x2d, 0x28, 0x79, 0xee, 0x36, 0x69, 0x1c, 0x34, 0x3c, 0x32, 0x37, 0xc1, 0x28, 0x66, 0x6e, 0xab, - 0x5b, 0x12, 0x89, 0x5f, 0x51, 0xd4, 0x5f, 0x9c, 0x54, 0x47, 0x77, 0xe1, 0xb1, 0x98, 0x84, 0x7b, - 0xae, 0xef, 0xd0, 0xed, 0x20, 0x24, 0x5e, 0xa6, 0xc6, 0x9e, 0x64, 0xeb, 0xed, 0x92, 0x18, 0xba, - 0xc7, 0x36, 0x33, 0xb1, 0x70, 0x4e, 0x6d, 0x74, 0x1b, 0xa6, 0xd9, 0x4e, 0xa8, 0x75, 0x3c, 0xaf, - 0x16, 0x78, 0x6e, 0xe3, 0x60, 0x6e, 0x8a, 0x11, 0xfc, 0x94, 0xd4, 0x53, 0x57, 0x4d, 0x30, 0xbd, - 0x93, 0x27, 0xff, 0x70, 0xba, 0x36, 0xda, 0x62, 0x7a, 0xcb, 0x4e, 0xe8, 0xc6, 0x07, 0x74, 0xfd, - 0x92, 0x07, 0xf1, 0xdc, 0x74, 0xcf, 0x1b, 0xae, 0x8e, 0xaa, 0x94, 0x9b, 0x7a, 0x21, 0x4e, 0x13, - 0xa4, 0x5b, 0x3b, 0x8a, 0x9b, 0xae, 0x3f, 0x37, 0xc3, 0x38, 0x86, 0xda, 0x19, 0x75, 0x5a, 0x88, - 0x39, 0x8c, 0xe9, 0x2c, 0xe9, 0x8f, 0xdb, 0x94, 0x83, 0xce, 0x32, 0xc4, 0x44, 0x67, 0x29, 0x01, - 0x38, 0xc1, 0xa1, 0xc7, 0x72, 0x1c, 0x1f, 0xcc, 0x21, 0x86, 0xaa, 0xb6, 0xcb, 0xe6, 0xe6, 0x97, - 0x30, 0x2d, 0x47, 0xb7, 0x60, 0x94, 0xf8, 0xfb, 0x6b, 0x61, 0xb0, 0x37, 0x77, 0x2e, 0x7f, 0xcf, - 0xae, 0x72, 0x14, 0xce, 0xd0, 0x93, 0x2b, 0x8a, 0x28, 0xc6, 0x92, 0x04, 0x7a, 0x00, 0x73, 0x19, - 0x33, 0xc2, 0x27, 0xe0, 0x3c, 0x9b, 0x80, 0xcf, 0x8b, 0xba, 0x73, 0x9b, 0x39, 0x78, 0xc7, 0x3d, - 0x60, 0x38, 0x97, 0x3a, 0xfa, 0x2e, 0x98, 0xe4, 0x1b, 0x8a, 0x3f, 0x78, 0x44, 0x73, 0x17, 0xd8, - 0xd7, 0x5c, 0xce, 0xdf, 0x9c, 0x1c, 0x71, 0xf9, 0x82, 0xe8, 0xd0, 0xa4, 0x5e, 0x1a, 0x61, 0x93, - 0x9a, 0xbd, 0x05, 0x53, 0x8a, 0x6f, 0xb1, 0xa5, 0x83, 0xca, 0x30, 0x4c, 0x19, 0xb2, 0xd4, 0x29, - 0x94, 0xe8, 0x4c, 0x31, 0x45, 0x35, 0xe6, 0xe5, 0x6c, 0xa6, 0xdc, 0x0f, 0xc8, 0xf2, 0x41, 0x4c, - 0xf8, 0xbd, 0xb0, 0xa8, 0xcd, 0x94, 0x04, 0xe0, 0x04, 0xc7, 0xfe, 0x7f, 0x5c, 0xee, 0x49, 0x98, - 0xe3, 0x00, 0xc7, 0xc1, 0x0b, 0x30, 0xb6, 0x13, 0x44, 0x31, 0xc5, 0x66, 0x6d, 0x0c, 0x27, 0x92, - 0xce, 0x0d, 0x51, 0x8e, 0x15, 0x06, 0x7a, 0x03, 0x26, 0x1b, 0x7a, 0x03, 0xe2, 0x2c, 0x53, 0x43, - 0x60, 0xb4, 0x8e, 0x4d, 0x5c, 0xf4, 0x3a, 0x8c, 0xb1, 0xe7, 0xca, 0x46, 0xe0, 0x89, 0x1b, 0xa8, - 0x3c, 0x90, 0xc7, 0x6a, 0xa2, 0xfc, 0x58, 0xfb, 0x8d, 0x15, 0x36, 0xba, 0x02, 0x23, 0xb4, 0x0b, - 0xd5, 0x9a, 0x38, 0x45, 0x94, 0x56, 0xe0, 0x06, 0x2b, 0xc5, 0x02, 0x6a, 0xff, 0x9d, 0x82, 0x36, - 0xca, 0xf4, 0x4e, 0x45, 0x50, 0x0d, 0x46, 0xef, 0x3b, 0x6e, 0xec, 0xfa, 0x2d, 0x21, 0x2e, 0x3c, - 0xdb, 0xf3, 0x48, 0x61, 0x95, 0xee, 0xf1, 0x0a, 0xfc, 0xd0, 0x13, 0x7f, 0xb0, 0x24, 0x43, 0x29, - 0x86, 0x1d, 0xdf, 0xa7, 0x14, 0x0b, 0x83, 0x52, 0xc4, 0xbc, 0x02, 0xa7, 0x28, 0xfe, 0x60, 0x49, - 0x06, 0xbd, 0x0b, 0x20, 0x97, 0x25, 0x69, 0x8a, 0x67, 0xc2, 0x17, 0xfa, 0x13, 0xdd, 0x54, 0x75, - 0x96, 0xa7, 0xe8, 0x91, 0x9a, 0xfc, 0xc7, 0x1a, 0x3d, 0x3b, 0x66, 0x62, 0x55, 0x77, 0x67, 0xd0, - 0x77, 0x52, 0x4e, 0xe0, 0x84, 0x31, 0x69, 0x2e, 0xc5, 0x62, 0x70, 0x9e, 0x1b, 0x4c, 0x2a, 0xde, - 0x74, 0xf7, 0x88, 0xce, 0x35, 0x04, 0x11, 0x9c, 0xd0, 0xb3, 0x7f, 0xb9, 0x08, 0x73, 0x79, 0xdd, - 0xa5, 0x8b, 0x8e, 0x3c, 0x70, 0xe3, 0x15, 0x2a, 0x0d, 0x59, 0xe6, 0xa2, 0x5b, 0x15, 0xe5, 0x58, - 0x61, 0xd0, 0xd9, 0x8f, 0xdc, 0x96, 0xbc, 0xd4, 0x0c, 0x27, 0xb3, 0x5f, 0x67, 0xa5, 0x58, 0x40, - 0x29, 0x5e, 0x48, 0x9c, 0x48, 0xbc, 0x43, 0x6b, 0xab, 0x04, 0xb3, 0x52, 0x2c, 0xa0, 0xba, 0xc6, - 0x64, 0xa8, 0x8f, 0xc6, 0xc4, 0x18, 0xa2, 0xe1, 0xd3, 0x1d, 0x22, 0xf4, 0x65, 0x80, 0x6d, 0xd7, - 0x77, 0xa3, 0x1d, 0x46, 0x7d, 0xe4, 0xc4, 0xd4, 0x95, 0x2c, 0xb5, 0xa6, 0xa8, 0x60, 0x8d, 0x22, - 0x7a, 0x15, 0xc6, 0xd5, 0x06, 0xac, 0x56, 0x98, 0x52, 0x5e, 0x7b, 0xe4, 0x4c, 0xb8, 0x51, 0x05, - 0xeb, 0x78, 0xf6, 0x7b, 0xe9, 0xf5, 0x22, 0x76, 0x80, 0x36, 0xbe, 0xd6, 0xa0, 0xe3, 0x5b, 0xe8, - 0x3d, 0xbe, 0xf6, 0x6f, 0x14, 0x61, 0xda, 0x68, 0xac, 0x13, 0x0d, 0xc0, 0xb3, 0xae, 0xd3, 0x73, - 0xce, 0x89, 0x89, 0xd8, 0x7f, 0x76, 0xff, 0xad, 0xa2, 0x9f, 0x85, 0x74, 0x07, 0xf0, 0xfa, 0xe8, - 0xcb, 0x50, 0xf2, 0x9c, 0x88, 0x69, 0x5f, 0x88, 0xd8, 0x77, 0x83, 0x10, 0x4b, 0xee, 0x11, 0x4e, - 0x14, 0x6b, 0x47, 0x0d, 0xa7, 0x9d, 0x90, 0xa4, 0x07, 0x32, 0x95, 0x7d, 0xa4, 0xa1, 0x83, 0xea, - 0x04, 0x15, 0x90, 0x0e, 0x30, 0x87, 0xa1, 0xd7, 0x61, 0x22, 0x24, 0x6c, 0x55, 0xac, 0x50, 0x51, - 0x8e, 0x2d, 0xb3, 0xe1, 0x44, 0xe6, 0xc3, 0x1a, 0x0c, 0x1b, 0x98, 0x89, 0x28, 0x3f, 0xd2, 0x43, - 0x94, 0x7f, 0x16, 0x46, 0xd9, 0x0f, 0xb5, 0x02, 0xd4, 0x6c, 0x54, 0x79, 0x31, 0x96, 0xf0, 0xf4, - 0x82, 0x19, 0x1b, 0x70, 0xc1, 0x3c, 0x07, 0x53, 0x15, 0x87, 0xec, 0x05, 0xfe, 0xaa, 0xdf, 0x6c, - 0x07, 0xae, 0x1f, 0xa3, 0x39, 0x18, 0x62, 0xa7, 0x03, 0xdf, 0xdb, 0x43, 0x94, 0x02, 0x1e, 0xa2, - 0x82, 0xb9, 0xfd, 0xbb, 0x05, 0x98, 0xac, 0x10, 0x8f, 0xc4, 0x84, 0x5f, 0x65, 0x22, 0xb4, 0x06, - 0xa8, 0x15, 0x3a, 0x0d, 0x52, 0x23, 0xa1, 0x1b, 0x34, 0x75, 0x6d, 0x6c, 0x91, 0x3f, 0x0e, 0x5d, - 0xef, 0x82, 0xe2, 0x8c, 0x1a, 0xe8, 0x1d, 0x98, 0x6c, 0x87, 0xc4, 0x50, 0x22, 0x5a, 0x79, 0xd2, - 0x48, 0x4d, 0x47, 0xe4, 0x82, 0xb0, 0x51, 0x84, 0x4d, 0x52, 0xe8, 0x3b, 0x60, 0x26, 0x08, 0xdb, - 0x3b, 0x8e, 0x5f, 0x21, 0x6d, 0xe2, 0x37, 0xa9, 0xa4, 0x2f, 0x54, 0x10, 0xe7, 0x8f, 0x0e, 0xcb, - 0x33, 0xb7, 0x53, 0x30, 0xdc, 0x85, 0x8d, 0xde, 0x81, 0xd9, 0x76, 0x18, 0xb4, 0x9d, 0x16, 0x5b, - 0x28, 0x42, 0xa0, 0xe1, 0xdc, 0xe7, 0x85, 0xa3, 0xc3, 0xf2, 0x6c, 0x2d, 0x0d, 0x3c, 0x3e, 0x2c, - 0x9f, 0x63, 0x03, 0x45, 0x4b, 0x12, 0x20, 0xee, 0x26, 0x63, 0xb7, 0xe0, 0x42, 0x25, 0xb8, 0xef, - 0xdf, 0x77, 0xc2, 0xe6, 0x52, 0xad, 0xaa, 0xe9, 0x0e, 0x36, 0xe4, 0xdd, 0x95, 0x1b, 0x63, 0x64, - 0x9e, 0x53, 0x5a, 0x4d, 0x2e, 0xbf, 0xac, 0xb9, 0x1e, 0xc9, 0xd1, 0x51, 0xfc, 0xbd, 0x82, 0xd1, - 0x52, 0x82, 0xaf, 0x1e, 0x3e, 0xac, 0xdc, 0x87, 0x8f, 0xb7, 0x61, 0x6c, 0xdb, 0x25, 0x5e, 0x13, - 0x93, 0x6d, 0x31, 0x33, 0x9f, 0xce, 0x7f, 0x5f, 0x5e, 0xa3, 0x98, 0x52, 0x27, 0xc5, 0x6f, 0xbe, - 0x6b, 0xa2, 0x32, 0x56, 0x64, 0xd0, 0x2e, 0xcc, 0xc8, 0xab, 0x95, 0x84, 0x8a, 0x4d, 0xfc, 0x6c, - 0xaf, 0xfb, 0x9a, 0x49, 0x9c, 0x4d, 0x20, 0x4e, 0x91, 0xc1, 0x5d, 0x84, 0xe9, 0x55, 0x77, 0x8f, - 0x1e, 0x57, 0x43, 0x6c, 0x49, 0xb3, 0xab, 0x2e, 0xbb, 0xb5, 0xb3, 0x52, 0xfb, 0x27, 0x2d, 0x78, - 0xbc, 0x6b, 0x64, 0x84, 0xf6, 0xe2, 0x94, 0x67, 0x21, 0xad, 0x4d, 0x28, 0xf4, 0xd7, 0x26, 0xd8, - 0xff, 0xd4, 0x82, 0xf3, 0xab, 0x7b, 0xed, 0xf8, 0xa0, 0xe2, 0x9a, 0x8f, 0x33, 0xaf, 0xc1, 0xc8, - 0x1e, 0x69, 0xba, 0x9d, 0x3d, 0x31, 0x73, 0x65, 0xc9, 0xd2, 0xd7, 0x59, 0xe9, 0xf1, 0x61, 0x79, - 0xb2, 0x1e, 0x07, 0xa1, 0xd3, 0x22, 0xbc, 0x00, 0x0b, 0x74, 0x76, 0x30, 0xba, 0x1f, 0x90, 0x5b, - 0xee, 0x9e, 0x2b, 0xed, 0x05, 0x7a, 0x6a, 0xd4, 0x16, 0xe4, 0x80, 0x2e, 0xbc, 0xdd, 0x71, 0xfc, - 0xd8, 0x8d, 0x0f, 0xc4, 0xbb, 0x93, 0x24, 0x82, 0x13, 0x7a, 0xf6, 0x37, 0x2d, 0x98, 0x96, 0xbc, - 0x64, 0xa9, 0xd9, 0x0c, 0x49, 0x14, 0xa1, 0x79, 0x28, 0xb8, 0x6d, 0xd1, 0x4b, 0x10, 0xbd, 0x2c, - 0x54, 0x6b, 0xb8, 0xe0, 0xb6, 0x51, 0x0d, 0x4a, 0xdc, 0xec, 0x20, 0x59, 0x5c, 0x03, 0x19, 0x2f, - 0xb0, 0x1e, 0x6c, 0xca, 0x9a, 0x38, 0x21, 0x22, 0xa5, 0x62, 0x76, 0x0e, 0x15, 0xcd, 0x47, 0xab, - 0x1b, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x15, 0xc6, 0xfc, 0xa0, 0xc9, 0xad, 0x40, 0xf8, 0x9e, 0x66, - 0x4b, 0x76, 0x43, 0x94, 0x61, 0x05, 0xb5, 0x7f, 0xd8, 0x82, 0x09, 0xf9, 0x65, 0x03, 0x0a, 0xe8, - 0x74, 0x6b, 0x25, 0xc2, 0x79, 0xb2, 0xb5, 0xa8, 0x80, 0xcd, 0x20, 0x86, 0x5c, 0x5d, 0x3c, 0x89, - 0x5c, 0x6d, 0xff, 0x44, 0x01, 0xa6, 0x64, 0x77, 0xea, 0x9d, 0xad, 0x88, 0xc4, 0x68, 0x13, 0x4a, - 0x0e, 0x1f, 0x72, 0x22, 0x57, 0xec, 0x33, 0xd9, 0x17, 0x3a, 0x63, 0x7e, 0x12, 0x51, 0x67, 0x49, - 0xd6, 0xc6, 0x09, 0x21, 0xe4, 0xc1, 0xac, 0x1f, 0xc4, 0xec, 0xd8, 0x53, 0xf0, 0x5e, 0x0f, 0x23, - 0x69, 0xea, 0x17, 0x05, 0xf5, 0xd9, 0x8d, 0x34, 0x15, 0xdc, 0x4d, 0x18, 0xad, 0x4a, 0x25, 0x52, - 0x31, 0xff, 0x0a, 0xa7, 0xcf, 0x42, 0xb6, 0x0e, 0xc9, 0xfe, 0x35, 0x0b, 0x4a, 0x12, 0xed, 0x2c, - 0xde, 0xc0, 0xd6, 0x61, 0x34, 0x62, 0x93, 0x20, 0x87, 0xc6, 0xee, 0xd5, 0x71, 0x3e, 0x5f, 0xc9, - 0x69, 0xce, 0xff, 0x47, 0x58, 0xd2, 0x60, 0x5a, 0x70, 0xd5, 0xfd, 0x8f, 0x89, 0x16, 0x5c, 0xf5, - 0x27, 0xe7, 0x84, 0xf9, 0x6f, 0xac, 0xcf, 0x9a, 0xaa, 0x80, 0x0a, 0x9d, 0xed, 0x90, 0x6c, 0xbb, - 0x0f, 0xd2, 0x42, 0x67, 0x8d, 0x95, 0x62, 0x01, 0x45, 0xef, 0xc2, 0x44, 0x43, 0x2a, 0x8f, 0x13, - 0x36, 0x70, 0xa5, 0xa7, 0x2a, 0x5e, 0xbd, 0xda, 0x70, 0x0b, 0xd1, 0x15, 0xad, 0x3e, 0x36, 0xa8, - 0x99, 0x96, 0x09, 0xc5, 0x7e, 0x96, 0x09, 0x09, 0xdd, 0xdc, 0xb7, 0x75, 0xfb, 0xa7, 0x2c, 0x18, - 0xe1, 0x2a, 0xc8, 0xc1, 0x74, 0xb6, 0xda, 0x23, 0x56, 0x32, 0x76, 0x77, 0x69, 0xa1, 0x78, 0x94, - 0x42, 0xeb, 0x50, 0x62, 0x3f, 0x98, 0x2a, 0xa6, 0x98, 0x6f, 0x1a, 0xcb, 0x5b, 0xd5, 0x3b, 0x78, - 0x57, 0x56, 0xc3, 0x09, 0x05, 0xfb, 0x47, 0x8b, 0x94, 0x55, 0x25, 0xa8, 0xc6, 0x09, 0x6e, 0x3d, - 0xba, 0x13, 0xbc, 0xf0, 0xa8, 0x4e, 0xf0, 0x16, 0x4c, 0x37, 0xb4, 0x27, 0xaf, 0x64, 0x26, 0xaf, - 0xf6, 0x5c, 0x24, 0xda, 0xeb, 0x18, 0x57, 0xc3, 0xad, 0x98, 0x44, 0x70, 0x9a, 0x2a, 0xfa, 0x4e, - 0x98, 0xe0, 0xf3, 0x2c, 0x5a, 0x19, 0x62, 0xad, 0x7c, 0x2a, 0x7f, 0xbd, 0xe8, 0x4d, 0xb0, 0x95, - 0x58, 0xd7, 0xaa, 0x63, 0x83, 0x98, 0xfd, 0xcb, 0x63, 0x30, 0xbc, 0xba, 0x4f, 0xfc, 0xf8, 0x0c, - 0x18, 0x52, 0x03, 0xa6, 0x5c, 0x7f, 0x3f, 0xf0, 0xf6, 0x49, 0x93, 0xc3, 0x4f, 0x72, 0xb8, 0x3e, - 0x26, 0x48, 0x4f, 0x55, 0x0d, 0x12, 0x38, 0x45, 0xf2, 0x51, 0xdc, 0xda, 0xaf, 0xc3, 0x08, 0x9f, - 0x7b, 0x71, 0x65, 0xcf, 0x54, 0xb0, 0xb3, 0x41, 0x14, 0xbb, 0x20, 0xd1, 0x28, 0x70, 0x8d, 0xbe, - 0xa8, 0x8e, 0xde, 0x83, 0xa9, 0x6d, 0x37, 0x8c, 0x62, 0x7a, 0xdd, 0x8e, 0x62, 0x67, 0xaf, 0xfd, - 0x10, 0xb7, 0x74, 0x35, 0x0e, 0x6b, 0x06, 0x25, 0x9c, 0xa2, 0x8c, 0x5a, 0x30, 0x49, 0x2f, 0x8e, - 0x49, 0x53, 0xa3, 0x27, 0x6e, 0x4a, 0xa9, 0xe1, 0x6e, 0xe9, 0x84, 0xb0, 0x49, 0x97, 0x32, 0x93, - 0x06, 0xbb, 0x68, 0x8e, 0x31, 0x89, 0x42, 0x31, 0x13, 0x7e, 0xc3, 0xe4, 0x30, 0xca, 0x93, 0x98, - 0x31, 0x4b, 0xc9, 0xe4, 0x49, 0x9a, 0xc9, 0xca, 0x57, 0xa0, 0x44, 0xe8, 0x10, 0x52, 0xc2, 0xe2, - 0xb1, 0x61, 0x71, 0xb0, 0xbe, 0xae, 0xbb, 0x8d, 0x30, 0x30, 0xf5, 0x23, 0xab, 0x92, 0x12, 0x4e, - 0x88, 0xa2, 0x15, 0x18, 0x89, 0x48, 0xe8, 0x92, 0x48, 0x3c, 0x3b, 0xf4, 0x98, 0x46, 0x86, 0xc6, - 0x6d, 0xa8, 0xf9, 0x6f, 0x2c, 0xaa, 0xd2, 0xe5, 0xe5, 0xb0, 0xdb, 0x10, 0x7b, 0x69, 0xd0, 0x96, - 0xd7, 0x12, 0x2b, 0xc5, 0x02, 0x8a, 0xde, 0x82, 0xd1, 0x90, 0x78, 0x4c, 0x01, 0x37, 0x39, 0xf8, - 0x22, 0xe7, 0xfa, 0x3c, 0x5e, 0x0f, 0x4b, 0x02, 0xe8, 0x26, 0xa0, 0x90, 0x50, 0x19, 0xc2, 0xf5, - 0x5b, 0xca, 0xc4, 0x43, 0xbc, 0x1f, 0x3c, 0x21, 0xda, 0x3f, 0x87, 0x13, 0x0c, 0x69, 0x5d, 0x89, - 0x33, 0xaa, 0xa1, 0xeb, 0x30, 0xab, 0x4a, 0xab, 0x7e, 0x14, 0x3b, 0x7e, 0x83, 0xb0, 0xa7, 0x83, - 0x52, 0x22, 0x15, 0xe1, 0x34, 0x02, 0xee, 0xae, 0x63, 0x7f, 0x9d, 0x8a, 0x33, 0x74, 0xb4, 0xce, - 0x40, 0x16, 0x78, 0xd3, 0x94, 0x05, 0x2e, 0xe6, 0xce, 0x5c, 0x8e, 0x1c, 0x70, 0x64, 0xc1, 0xb8, - 0x36, 0xb3, 0xc9, 0x9a, 0xb5, 0x7a, 0xac, 0xd9, 0x0e, 0xcc, 0xd0, 0x95, 0x7e, 0x7b, 0x8b, 0xb9, - 0x13, 0x35, 0xd9, 0xc2, 0x2c, 0x3c, 0xdc, 0xc2, 0x54, 0x86, 0xb8, 0xb7, 0x52, 0x04, 0x71, 0x57, - 0x13, 0xe8, 0x35, 0xa9, 0x8d, 0x2a, 0x1a, 0xa6, 0x5b, 0x5c, 0xd3, 0x74, 0x7c, 0x58, 0x9e, 0xd1, - 0x3e, 0x44, 0xd7, 0x3e, 0xd9, 0x5f, 0x91, 0xdf, 0xc8, 0x99, 0xcd, 0x22, 0x94, 0x1a, 0x6a, 0xb1, - 0x58, 0xa6, 0x31, 0xb9, 0x5a, 0x0e, 0x38, 0xc1, 0xa1, 0x7b, 0x94, 0x5e, 0x41, 0xd2, 0xd6, 0x86, - 0xf4, 0x82, 0x82, 0x19, 0xc4, 0x7e, 0x19, 0x60, 0xf5, 0x01, 0x69, 0xf0, 0xa5, 0xae, 0x3f, 0xea, - 0x5a, 0xf9, 0x8f, 0xba, 0xf6, 0x7f, 0xb2, 0x60, 0x6a, 0x6d, 0xc5, 0xb8, 0x26, 0x2e, 0x00, 0xf0, - 0xbb, 0xd1, 0xbd, 0x7b, 0x1b, 0xf2, 0xbd, 0x82, 0xab, 0x9c, 0x55, 0x29, 0xd6, 0x30, 0xd0, 0x45, - 0x28, 0x7a, 0x1d, 0x5f, 0x5c, 0x59, 0x46, 0x8f, 0x0e, 0xcb, 0xc5, 0x5b, 0x1d, 0x1f, 0xd3, 0x32, - 0xcd, 0xc0, 0xaf, 0x38, 0xb0, 0x81, 0x5f, 0x5f, 0x37, 0x21, 0x54, 0x86, 0xe1, 0xfb, 0xf7, 0xdd, - 0x26, 0x37, 0xc6, 0x16, 0x6f, 0x29, 0xf7, 0xee, 0x55, 0x2b, 0x11, 0xe6, 0xe5, 0xf6, 0xd7, 0x8a, - 0x30, 0xbf, 0xe6, 0x91, 0x07, 0x1f, 0xd2, 0x20, 0x7d, 0x50, 0xf3, 0xc4, 0x93, 0xc9, 0x8b, 0x27, - 0xb5, 0xc5, 0xec, 0x3f, 0x1e, 0xdb, 0x30, 0xca, 0x0d, 0x04, 0xa4, 0x79, 0xfa, 0x1b, 0x59, 0xad, - 0xe7, 0x0f, 0xc8, 0x82, 0xd0, 0xce, 0x71, 0x13, 0x2c, 0x75, 0xd2, 0x8a, 0x52, 0x2c, 0x89, 0xcf, - 0x7f, 0x0e, 0x26, 0x74, 0xcc, 0x13, 0x59, 0x45, 0xff, 0x8d, 0x22, 0xcc, 0xd0, 0x1e, 0x3c, 0xd2, - 0x89, 0xb8, 0xd3, 0x3d, 0x11, 0xa7, 0x6d, 0x19, 0xdb, 0x7f, 0x36, 0xde, 0x4d, 0xcf, 0xc6, 0x4b, - 0x79, 0xb3, 0x71, 0xd6, 0x73, 0xf0, 0xbd, 0x16, 0x9c, 0x5b, 0xf3, 0x82, 0xc6, 0x6e, 0xca, 0x68, - 0xf7, 0x55, 0x18, 0xa7, 0x7c, 0x3c, 0x32, 0xbc, 0x61, 0x0c, 0xff, 0x28, 0x01, 0xc2, 0x3a, 0x9e, - 0x56, 0xed, 0xce, 0x9d, 0x6a, 0x25, 0xcb, 0xad, 0x4a, 0x80, 0xb0, 0x8e, 0x67, 0xff, 0xb6, 0x05, - 0x4f, 0x5d, 0x5f, 0x59, 0x4d, 0x96, 0x62, 0x97, 0x67, 0x17, 0xbd, 0x05, 0x36, 0xb5, 0xae, 0x24, - 0xb7, 0xc0, 0x0a, 0xeb, 0x85, 0x80, 0x7e, 0x5c, 0xbc, 0x16, 0x7f, 0xd6, 0x82, 0x73, 0xd7, 0xdd, - 0x98, 0x1e, 0xcb, 0x69, 0x1f, 0x23, 0x7a, 0x2e, 0x47, 0x6e, 0x1c, 0x84, 0x07, 0x69, 0x1f, 0x23, - 0xac, 0x20, 0x58, 0xc3, 0xe2, 0x2d, 0xef, 0xbb, 0x11, 0xed, 0x69, 0xc1, 0x54, 0x45, 0x61, 0x51, - 0x8e, 0x15, 0x06, 0xfd, 0xb0, 0xa6, 0x1b, 0xb2, 0xab, 0xc4, 0x81, 0xe0, 0xb0, 0xea, 0xc3, 0x2a, - 0x12, 0x80, 0x13, 0x1c, 0xfb, 0x27, 0x2d, 0xb8, 0x70, 0xdd, 0xeb, 0x44, 0x31, 0x09, 0xb7, 0x23, - 0xa3, 0xb3, 0x2f, 0x43, 0x89, 0xc8, 0xeb, 0xba, 0xe8, 0xab, 0x12, 0x30, 0xd5, 0x3d, 0x9e, 0x3b, - 0x38, 0x29, 0xbc, 0x01, 0x2c, 0xe0, 0x4f, 0x66, 0xb9, 0xfd, 0x0b, 0x05, 0x98, 0xbc, 0xb1, 0xb9, - 0x59, 0xbb, 0x4e, 0x62, 0x71, 0x8a, 0xf5, 0x57, 0x35, 0x63, 0x4d, 0x63, 0xd6, 0xeb, 0x52, 0xd4, - 0x89, 0x5d, 0x6f, 0x81, 0x7b, 0xd4, 0x2e, 0x54, 0xfd, 0xf8, 0x76, 0x58, 0x8f, 0x43, 0xd7, 0x6f, - 0x65, 0xea, 0xd8, 0xe4, 0x59, 0x5b, 0xcc, 0x3b, 0x6b, 0xd1, 0xcb, 0x30, 0xc2, 0x5c, 0x7a, 0xe5, - 0xf5, 0xe4, 0x09, 0x75, 0xa7, 0x60, 0xa5, 0xc7, 0x87, 0xe5, 0xd2, 0x1d, 0x5c, 0xe5, 0x7f, 0xb0, - 0x40, 0x45, 0x77, 0x60, 0x7c, 0x27, 0x8e, 0xdb, 0x37, 0x88, 0xd3, 0x24, 0xa1, 0xe4, 0x0e, 0x97, - 0xb2, 0xb8, 0x03, 0x1d, 0x04, 0x8e, 0x96, 0x6c, 0xa8, 0xa4, 0x2c, 0xc2, 0x3a, 0x1d, 0xbb, 0x0e, - 0x90, 0xc0, 0x4e, 0x49, 0xbf, 0x60, 0xff, 0x91, 0x05, 0xa3, 0xdc, 0xbb, 0x2a, 0x44, 0x9f, 0x87, - 0x21, 0xf2, 0x80, 0x34, 0x84, 0xe4, 0x98, 0xd9, 0xe1, 0x44, 0xf0, 0xe0, 0xda, 0x72, 0xfa, 0x1f, - 0xb3, 0x5a, 0xe8, 0x06, 0x8c, 0xd2, 0xde, 0x5e, 0x57, 0xae, 0x66, 0x4f, 0xe7, 0x7d, 0xb1, 0x9a, - 0x76, 0x2e, 0xab, 0x88, 0x22, 0x2c, 0xab, 0x33, 0xcd, 0x6f, 0xa3, 0x5d, 0xa7, 0x0c, 0x2c, 0xee, - 0x75, 0xce, 0x6e, 0xae, 0xd4, 0x38, 0x92, 0xa0, 0xc6, 0x35, 0xbf, 0xb2, 0x10, 0x27, 0x44, 0xec, - 0x4d, 0x28, 0xd1, 0x49, 0x5d, 0xf2, 0x5c, 0xa7, 0xb7, 0xd2, 0xf9, 0x79, 0x28, 0x49, 0x05, 0x70, - 0x24, 0x1c, 0x74, 0x18, 0x55, 0xa9, 0x1f, 0x8e, 0x70, 0x02, 0xb7, 0xb7, 0xe1, 0x3c, 0xb3, 0xa6, - 0x70, 0xe2, 0x1d, 0x63, 0x8f, 0xf5, 0x5f, 0xcc, 0x2f, 0x88, 0x8b, 0x18, 0x9f, 0x99, 0x39, 0xcd, - 0xa3, 0x60, 0x42, 0x52, 0x4c, 0x2e, 0x65, 0xf6, 0x9f, 0x0c, 0xc1, 0x13, 0xd5, 0x7a, 0xbe, 0xe3, - 0xdd, 0xeb, 0x30, 0xc1, 0xc5, 0x34, 0xba, 0xb4, 0x1d, 0x4f, 0xb4, 0xab, 0xde, 0x1a, 0x37, 0x35, - 0x18, 0x36, 0x30, 0xd1, 0x53, 0x50, 0x74, 0xdf, 0xf7, 0xd3, 0xc6, 0xb9, 0xd5, 0xb7, 0x37, 0x30, - 0x2d, 0xa7, 0x60, 0x2a, 0xf1, 0x71, 0x56, 0xaa, 0xc0, 0x4a, 0xea, 0x7b, 0x13, 0xa6, 0xdc, 0xa8, - 0x11, 0xb9, 0x55, 0x9f, 0xf2, 0x99, 0xc4, 0x69, 0x33, 0x51, 0x12, 0xd0, 0x4e, 0x2b, 0x28, 0x4e, - 0x61, 0x6b, 0x7c, 0x7d, 0x78, 0x60, 0xa9, 0xb1, 0xaf, 0xc7, 0x0a, 0x15, 0x88, 0xdb, 0xec, 0xeb, - 0x22, 0x66, 0x28, 0x28, 0x04, 0x62, 0xfe, 0xc1, 0x11, 0x96, 0x30, 0x7a, 0x03, 0x6b, 0xec, 0x38, - 0xed, 0xa5, 0x4e, 0xbc, 0x53, 0x71, 0xa3, 0x46, 0xb0, 0x4f, 0xc2, 0x03, 0x76, 0x79, 0x1e, 0x4b, - 0x6e, 0x60, 0x0a, 0xb0, 0x72, 0x63, 0xa9, 0x46, 0x31, 0x71, 0x77, 0x1d, 0x53, 0x2a, 0x84, 0xd3, - 0x90, 0x0a, 0x97, 0x60, 0x5a, 0x36, 0x53, 0x27, 0x11, 0x3b, 0x23, 0xc6, 0x59, 0xc7, 0x94, 0x3b, - 0xb5, 0x28, 0x56, 0xdd, 0x4a, 0xe3, 0xa3, 0xd7, 0x60, 0xd2, 0xf5, 0xdd, 0xd8, 0x75, 0xe2, 0x20, - 0x64, 0x27, 0x2c, 0xbf, 0x27, 0xb3, 0x47, 0xd1, 0xaa, 0x0e, 0xc0, 0x26, 0x9e, 0xfd, 0xc7, 0x43, - 0x30, 0xcb, 0xa6, 0xed, 0x5b, 0x2b, 0xec, 0x63, 0xb3, 0xc2, 0xee, 0x74, 0xaf, 0xb0, 0xd3, 0x10, - 0x77, 0x3f, 0xca, 0x65, 0xf6, 0x1e, 0x94, 0x94, 0x7d, 0xb5, 0x74, 0x11, 0xb0, 0x72, 0x5c, 0x04, - 0xfa, 0x4b, 0x1f, 0xf2, 0x19, 0xb7, 0x98, 0xf9, 0x8c, 0xfb, 0xf7, 0x2d, 0x48, 0xcc, 0x4c, 0xd1, - 0x0d, 0x28, 0xb5, 0x03, 0x66, 0xca, 0x11, 0x4a, 0xfb, 0xa8, 0x27, 0x32, 0x0f, 0x2a, 0x7e, 0x28, - 0xf2, 0xf1, 0xab, 0xc9, 0x1a, 0x38, 0xa9, 0x8c, 0x96, 0x61, 0xb4, 0x1d, 0x92, 0x7a, 0xcc, 0x5c, - 0x39, 0xfb, 0xd2, 0xe1, 0x6b, 0x84, 0xe3, 0x63, 0x59, 0xd1, 0xfe, 0x45, 0x0b, 0x80, 0xbf, 0x94, - 0x3a, 0x7e, 0x8b, 0x9c, 0x81, 0xf6, 0xb7, 0x02, 0x43, 0x51, 0x9b, 0x34, 0x7a, 0x19, 0xd9, 0x24, - 0xfd, 0xa9, 0xb7, 0x49, 0x23, 0x19, 0x70, 0xfa, 0x0f, 0xb3, 0xda, 0xf6, 0xf7, 0x03, 0x4c, 0x25, - 0x68, 0xd5, 0x98, 0xec, 0xa1, 0x17, 0x0d, 0x47, 0xb9, 0x8b, 0x29, 0x47, 0xb9, 0x12, 0xc3, 0xd6, - 0x14, 0x8d, 0xef, 0x41, 0x71, 0xcf, 0x79, 0x20, 0x34, 0x49, 0xcf, 0xf7, 0xee, 0x06, 0xa5, 0xbf, - 0xb0, 0xee, 0x3c, 0xe0, 0x77, 0xa6, 0xe7, 0xe5, 0x02, 0x59, 0x77, 0x1e, 0x1c, 0x73, 0x53, 0x1a, - 0xc6, 0xa4, 0x6e, 0xb9, 0x51, 0xfc, 0xd5, 0xff, 0x92, 0xfc, 0x67, 0xcb, 0x8e, 0x36, 0xc2, 0xda, - 0x72, 0x7d, 0xf1, 0x6e, 0x38, 0x50, 0x5b, 0xae, 0x9f, 0x6e, 0xcb, 0xf5, 0x07, 0x68, 0xcb, 0xf5, - 0xd1, 0x07, 0x30, 0x2a, 0xde, 0xe8, 0x99, 0xfd, 0xbc, 0xa9, 0xa5, 0xca, 0x6b, 0x4f, 0x3c, 0xf1, - 0xf3, 0x36, 0x17, 0xe5, 0x9d, 0x50, 0x94, 0xf6, 0x6d, 0x57, 0x36, 0x88, 0xfe, 0xae, 0x05, 0x53, - 0xe2, 0x37, 0x26, 0xef, 0x77, 0x48, 0x14, 0x0b, 0xd9, 0xf3, 0xb3, 0x83, 0xf7, 0x41, 0x54, 0xe4, - 0x5d, 0xf9, 0xac, 0x64, 0xb3, 0x26, 0xb0, 0x6f, 0x8f, 0x52, 0xbd, 0x40, 0xff, 0xdc, 0x82, 0xf3, - 0x7b, 0xce, 0x03, 0xde, 0x22, 0x2f, 0xc3, 0x4e, 0xec, 0x06, 0xc2, 0x1f, 0xe0, 0xf3, 0x83, 0x4d, - 0x7f, 0x57, 0x75, 0xde, 0x49, 0x69, 0x3a, 0x7c, 0x3e, 0x0b, 0xa5, 0x6f, 0x57, 0x33, 0xfb, 0x35, - 0xbf, 0x0d, 0x63, 0x72, 0xbd, 0x65, 0xdc, 0xbc, 0x2b, 0xba, 0x60, 0x7d, 0x62, 0x13, 0x09, 0xdd, - 0x5b, 0x8d, 0xb6, 0x23, 0xd6, 0xda, 0x23, 0x6d, 0xe7, 0x3d, 0x98, 0xd0, 0xd7, 0xd8, 0x23, 0x6d, - 0xeb, 0x7d, 0x38, 0x97, 0xb1, 0x96, 0x1e, 0x69, 0x93, 0xf7, 0xe1, 0x62, 0xee, 0xfa, 0x78, 0x94, - 0x0d, 0xdb, 0xbf, 0x60, 0xe9, 0x7c, 0xf0, 0x0c, 0x54, 0xf0, 0x2b, 0xa6, 0x0a, 0xfe, 0x52, 0xef, - 0x9d, 0x93, 0xa3, 0x87, 0x7f, 0x57, 0xef, 0x34, 0xe5, 0xea, 0xe8, 0x2d, 0x18, 0xf1, 0x68, 0x89, - 0x34, 0x0e, 0xb1, 0xfb, 0xef, 0xc8, 0x44, 0x96, 0x62, 0xe5, 0x11, 0x16, 0x14, 0xec, 0x5f, 0xb1, - 0x60, 0xe8, 0x0c, 0x46, 0x02, 0x9b, 0x23, 0xf1, 0x62, 0x2e, 0x69, 0x11, 0x9a, 0x6b, 0x01, 0x3b, - 0xf7, 0x57, 0x65, 0xf8, 0xb1, 0x9c, 0x81, 0xf9, 0xbf, 0x05, 0x18, 0xa7, 0x4d, 0x49, 0x2b, 0xc6, - 0x37, 0x60, 0xd2, 0x73, 0xb6, 0x88, 0x27, 0xdf, 0x71, 0xd3, 0x0a, 0x93, 0x5b, 0x3a, 0x10, 0x9b, - 0xb8, 0xb4, 0xf2, 0xb6, 0xfe, 0xa4, 0x2d, 0xe4, 0x17, 0x55, 0xd9, 0x78, 0xef, 0xc6, 0x26, 0x2e, - 0xbd, 0xbb, 0xdf, 0x77, 0xe2, 0xc6, 0x8e, 0x50, 0xa6, 0xa8, 0xee, 0xde, 0xa3, 0x85, 0x98, 0xc3, - 0xa8, 0x00, 0x27, 0x57, 0xe7, 0x5d, 0x7a, 0x33, 0x0c, 0x7c, 0x21, 0x1e, 0x2b, 0x01, 0x0e, 0x9b, - 0x60, 0x9c, 0xc6, 0xcf, 0xf0, 0x98, 0x1f, 0x66, 0x36, 0x9a, 0x03, 0x78, 0xcc, 0xa3, 0x1a, 0x9c, - 0x77, 0xfd, 0x86, 0xd7, 0x69, 0x92, 0x3b, 0x3e, 0x97, 0xee, 0x3c, 0xf7, 0x03, 0xd2, 0x14, 0x02, - 0xb4, 0x32, 0xa7, 0xad, 0x66, 0xe0, 0xe0, 0xcc, 0x9a, 0xf6, 0x5f, 0x83, 0x73, 0xb7, 0x02, 0xa7, - 0xb9, 0xec, 0x78, 0x8e, 0xdf, 0x20, 0x61, 0xd5, 0x6f, 0xf5, 0xb5, 0x12, 0xd3, 0x6d, 0xba, 0x0a, - 0xfd, 0x6c, 0xba, 0xec, 0x1d, 0x40, 0x7a, 0x03, 0xc2, 0x36, 0x19, 0xc3, 0xa8, 0xcb, 0x9b, 0x12, - 0xcb, 0xff, 0xd3, 0xd9, 0xd2, 0x75, 0x57, 0xcf, 0x34, 0xab, 0x5b, 0x5e, 0x80, 0x25, 0x21, 0xfb, - 0x75, 0xc8, 0xf4, 0x47, 0xec, 0xaf, 0xb6, 0xb1, 0x5f, 0x85, 0x59, 0x56, 0xf3, 0x64, 0x2a, 0x05, - 0xfb, 0x07, 0x2d, 0x98, 0xde, 0x48, 0xc5, 0xb8, 0xb8, 0xc2, 0xde, 0x5a, 0x33, 0xf4, 0xee, 0x75, - 0x56, 0x8a, 0x05, 0xf4, 0xd4, 0xf5, 0x7b, 0x7f, 0x61, 0x41, 0x49, 0x45, 0x67, 0x3a, 0x03, 0xa1, - 0x76, 0xc5, 0x10, 0x6a, 0x33, 0xf5, 0x4e, 0xaa, 0x3b, 0x79, 0x32, 0x2d, 0xba, 0xa9, 0xa2, 0x35, - 0xf4, 0x50, 0x39, 0x25, 0x64, 0xb8, 0x6f, 0xff, 0x94, 0x19, 0xd2, 0x41, 0xc6, 0x6f, 0x60, 0x66, - 0x5a, 0x0a, 0xf7, 0x63, 0x62, 0xa6, 0xa5, 0xfa, 0x93, 0xc3, 0xfd, 0x6a, 0x5a, 0x97, 0xd9, 0xa9, - 0xf0, 0xed, 0xcc, 0x95, 0x81, 0xed, 0x4d, 0x15, 0x24, 0xa5, 0x2c, 0x5c, 0x13, 0x44, 0xe9, 0x31, - 0x63, 0x64, 0xe2, 0x1f, 0x8f, 0xa4, 0x95, 0x54, 0xb1, 0x6f, 0xc0, 0x74, 0x6a, 0xc0, 0xd0, 0xab, - 0x30, 0xdc, 0xde, 0x71, 0x22, 0x92, 0x32, 0x4d, 0x1d, 0xae, 0xd1, 0xc2, 0xe3, 0xc3, 0xf2, 0x94, - 0xaa, 0xc0, 0x4a, 0x30, 0xc7, 0xb6, 0xff, 0xa7, 0x05, 0x43, 0x1b, 0x41, 0xf3, 0x2c, 0x16, 0xd3, - 0x9b, 0xc6, 0x62, 0x7a, 0x32, 0x2f, 0x0e, 0x61, 0xee, 0x3a, 0x5a, 0x4b, 0xad, 0xa3, 0x4b, 0xb9, - 0x14, 0x7a, 0x2f, 0xa1, 0x3d, 0x18, 0x67, 0xd1, 0x0d, 0x85, 0xa9, 0xec, 0xcb, 0xc6, 0xfd, 0xaa, - 0x9c, 0xba, 0x5f, 0x4d, 0x6b, 0xa8, 0xda, 0x2d, 0xeb, 0x59, 0x18, 0x15, 0xe6, 0x9a, 0x69, 0xa7, - 0x0d, 0x81, 0x8b, 0x25, 0xdc, 0xfe, 0xa9, 0x22, 0x18, 0xd1, 0x14, 0xd1, 0xaf, 0x59, 0xb0, 0x10, - 0x72, 0x2f, 0xd8, 0x66, 0xa5, 0x13, 0xba, 0x7e, 0xab, 0xde, 0xd8, 0x21, 0xcd, 0x8e, 0xe7, 0xfa, - 0xad, 0x6a, 0xcb, 0x0f, 0x54, 0xf1, 0xea, 0x03, 0xd2, 0xe8, 0xb0, 0x37, 0x97, 0x3e, 0xa1, 0x1b, - 0x95, 0x39, 0xd4, 0xb5, 0xa3, 0xc3, 0xf2, 0x02, 0x3e, 0x11, 0x6d, 0x7c, 0xc2, 0xbe, 0xa0, 0xdf, - 0xb6, 0x60, 0x91, 0x07, 0x19, 0x1c, 0xbc, 0xff, 0x3d, 0x6e, 0xa3, 0x35, 0x49, 0x2a, 0x21, 0xb2, - 0x49, 0xc2, 0xbd, 0xe5, 0xd7, 0xc4, 0x80, 0x2e, 0xd6, 0x4e, 0xd6, 0x16, 0x3e, 0x69, 0xe7, 0xec, - 0x7f, 0x57, 0x84, 0x49, 0x3a, 0x8a, 0x49, 0x6c, 0x9a, 0x57, 0x8d, 0x25, 0xf1, 0x74, 0x6a, 0x49, - 0xcc, 0x1a, 0xc8, 0xa7, 0x13, 0x96, 0x26, 0x82, 0x59, 0xcf, 0x89, 0xe2, 0x1b, 0xc4, 0x09, 0xe3, - 0x2d, 0xe2, 0x70, 0x33, 0xa1, 0xe2, 0x89, 0x4d, 0x9a, 0x94, 0xfa, 0xeb, 0x56, 0x9a, 0x18, 0xee, - 0xa6, 0x8f, 0xf6, 0x01, 0x31, 0x5b, 0xa7, 0xd0, 0xf1, 0x23, 0xfe, 0x2d, 0xae, 0x78, 0x8f, 0x39, - 0x59, 0xab, 0xf3, 0xa2, 0x55, 0x74, 0xab, 0x8b, 0x1a, 0xce, 0x68, 0x41, 0xb3, 0x61, 0x1b, 0x1e, - 0xd4, 0x86, 0x6d, 0xa4, 0x8f, 0x67, 0xd4, 0x1e, 0xcc, 0x88, 0x59, 0xd9, 0x76, 0x5b, 0xe2, 0x90, - 0xfe, 0x52, 0xca, 0xc6, 0xd5, 0x1a, 0xdc, 0x50, 0xa9, 0x8f, 0x81, 0xab, 0xfd, 0xdd, 0x70, 0x8e, - 0x36, 0x67, 0xfa, 0xf1, 0x44, 0x88, 0xc0, 0xf4, 0x6e, 0x67, 0x8b, 0x78, 0x24, 0x96, 0x65, 0xa2, - 0xd1, 0x4c, 0xb1, 0xdf, 0xac, 0x9d, 0xc8, 0x96, 0x37, 0x4d, 0x12, 0x38, 0x4d, 0xd3, 0xfe, 0x19, - 0x0b, 0x98, 0xb5, 0xfc, 0x19, 0x1c, 0x7f, 0x5f, 0x30, 0x8f, 0xbf, 0xb9, 0x3c, 0x0e, 0x94, 0x73, - 0xf2, 0xbd, 0xc2, 0xa7, 0xa5, 0x16, 0x06, 0x0f, 0x0e, 0xa4, 0xec, 0xdf, 0x5f, 0xe2, 0xfa, 0x3f, - 0x16, 0xdf, 0x90, 0x2a, 0x28, 0x00, 0xfa, 0x1e, 0x18, 0x6b, 0x38, 0x6d, 0xa7, 0xc1, 0xc3, 0xd8, - 0xe6, 0x6a, 0x7f, 0x8c, 0x4a, 0x0b, 0x2b, 0xa2, 0x06, 0xd7, 0x66, 0x7c, 0x46, 0x7e, 0xa5, 0x2c, - 0xee, 0xab, 0xc1, 0x50, 0x4d, 0xce, 0xef, 0xc2, 0xa4, 0x41, 0xec, 0x91, 0x5e, 0x7d, 0xbf, 0x87, - 0x1f, 0x17, 0xea, 0xc6, 0xb2, 0x07, 0xb3, 0xbe, 0xf6, 0x9f, 0x32, 0x47, 0x29, 0x4e, 0x7f, 0xb2, - 0xdf, 0x81, 0xc0, 0x38, 0xa9, 0xe6, 0x0d, 0x90, 0x22, 0x83, 0xbb, 0x29, 0xdb, 0xff, 0xd0, 0x82, - 0xc7, 0x75, 0x44, 0x2d, 0x5e, 0x43, 0x3f, 0x7d, 0x72, 0x05, 0xc6, 0x82, 0x36, 0x09, 0x9d, 0xe4, - 0x4e, 0x76, 0x55, 0x0e, 0xfa, 0x6d, 0x51, 0x7e, 0x2c, 0xe2, 0x09, 0x4a, 0xea, 0xb2, 0x1c, 0xab, - 0x9a, 0xc8, 0x86, 0x11, 0x36, 0x18, 0x91, 0x88, 0xa5, 0xc1, 0xcc, 0x14, 0xd9, 0xd3, 0x6a, 0x84, - 0x05, 0xc4, 0xfe, 0x7e, 0x8b, 0x2f, 0x2c, 0xbd, 0xeb, 0xe8, 0x7d, 0x98, 0xd9, 0xa3, 0xd7, 0xb7, - 0xd5, 0x07, 0xed, 0x90, 0xab, 0xd1, 0xe5, 0x38, 0x3d, 0xdf, 0x6f, 0x9c, 0xb4, 0x8f, 0x4c, 0x8c, - 0xd9, 0xd6, 0x53, 0xc4, 0x70, 0x17, 0x79, 0xfb, 0xcf, 0x0a, 0x7c, 0x27, 0x32, 0xa9, 0xee, 0x59, - 0x18, 0x6d, 0x07, 0xcd, 0x95, 0x6a, 0x05, 0x8b, 0x11, 0x52, 0xec, 0xaa, 0xc6, 0x8b, 0xb1, 0x84, - 0xa3, 0x6b, 0x00, 0xe4, 0x41, 0x4c, 0x42, 0xdf, 0xf1, 0x94, 0xe1, 0x87, 0x12, 0x9e, 0x56, 0x15, - 0x04, 0x6b, 0x58, 0xb4, 0x4e, 0x3b, 0x0c, 0xf6, 0xdd, 0x26, 0xf3, 0x36, 0x2c, 0x9a, 0x75, 0x6a, - 0x0a, 0x82, 0x35, 0x2c, 0x7a, 0x55, 0xee, 0xf8, 0x11, 0x3f, 0x00, 0x9d, 0x2d, 0x11, 0x20, 0x6f, - 0x2c, 0xb9, 0x2a, 0xdf, 0xd1, 0x81, 0xd8, 0xc4, 0x45, 0x4b, 0x30, 0x12, 0x3b, 0xcc, 0x9c, 0x61, - 0x38, 0xdf, 0x2c, 0x71, 0x93, 0x62, 0xe8, 0x71, 0x4d, 0x69, 0x05, 0x2c, 0x2a, 0xa2, 0x77, 0x24, - 0x0b, 0xe6, 0x2c, 0x59, 0xd8, 0x03, 0xe7, 0x2e, 0x5b, 0x9d, 0x7d, 0xeb, 0x3c, 0x58, 0xd8, 0x19, - 0x1b, 0xb4, 0xec, 0xef, 0x2b, 0x01, 0x24, 0xd2, 0x1e, 0xfa, 0xa0, 0x8b, 0x45, 0xbc, 0xd0, 0x5b, - 0x3e, 0x3c, 0x3d, 0xfe, 0x80, 0x7e, 0xc0, 0x82, 0x71, 0xc7, 0xf3, 0x82, 0x86, 0x13, 0xb3, 0x51, - 0x2e, 0xf4, 0x66, 0x51, 0xa2, 0xfd, 0xa5, 0xa4, 0x06, 0xef, 0xc2, 0xcb, 0xd2, 0x52, 0x41, 0x83, - 0xf4, 0xed, 0x85, 0xde, 0x30, 0xfa, 0x8c, 0xbc, 0x04, 0xf0, 0xe5, 0x31, 0x9f, 0xbe, 0x04, 0x94, - 0x18, 0x37, 0xd6, 0xe4, 0x7f, 0x74, 0xc7, 0x88, 0x24, 0x37, 0x94, 0x1f, 0x92, 0xc2, 0x10, 0x7a, - 0xfa, 0x05, 0x91, 0x43, 0x35, 0xdd, 0x2f, 0x6a, 0x38, 0x3f, 0x6e, 0x8b, 0x26, 0x5d, 0xf7, 0xf1, - 0x89, 0x7a, 0x0f, 0xa6, 0x9b, 0xe6, 0x71, 0x2b, 0x56, 0xd3, 0xa7, 0xf3, 0xe8, 0xa6, 0x4e, 0xe7, - 0xe4, 0x80, 0x4d, 0x01, 0x70, 0x9a, 0x30, 0xaa, 0x71, 0x0f, 0xb5, 0xaa, 0xbf, 0x1d, 0x08, 0xbb, - 0x72, 0x3b, 0x77, 0x2e, 0x0f, 0xa2, 0x98, 0xec, 0x51, 0xcc, 0xe4, 0x1c, 0xdd, 0x10, 0x75, 0xb1, - 0xa2, 0x82, 0xde, 0x82, 0x11, 0xe6, 0x36, 0x1c, 0xcd, 0x8d, 0xe5, 0xeb, 0x01, 0xcd, 0x88, 0x17, - 0xc9, 0xa6, 0x62, 0x7f, 0x23, 0x2c, 0x28, 0xa0, 0x1b, 0x32, 0x2c, 0x4e, 0x54, 0xf5, 0xef, 0x44, - 0x84, 0x85, 0xc5, 0x29, 0x2d, 0x7f, 0x32, 0x89, 0x78, 0xc3, 0xcb, 0x33, 0x23, 0x98, 0x1b, 0x35, - 0xa9, 0xbc, 0x22, 0xfe, 0xcb, 0xc0, 0xe8, 0x73, 0x90, 0xdf, 0x3d, 0x33, 0x78, 0x7a, 0x32, 0x9c, - 0x77, 0x4d, 0x12, 0x38, 0x4d, 0xf3, 0x4c, 0x8f, 0xcf, 0x79, 0x1f, 0x66, 0xd2, 0x1b, 0xeb, 0x91, - 0x1e, 0xd7, 0x7f, 0x34, 0x04, 0x53, 0xe6, 0x42, 0x40, 0x8b, 0x50, 0x12, 0x44, 0x54, 0x10, 0x4f, - 0xb5, 0xb6, 0xd7, 0x25, 0x00, 0x27, 0x38, 0x2c, 0x88, 0x29, 0xab, 0xae, 0xd9, 0x01, 0x26, 0x41, - 0x4c, 0x15, 0x04, 0x6b, 0x58, 0x54, 0x88, 0xde, 0x0a, 0x82, 0x58, 0x1d, 0x05, 0x6a, 0xb5, 0x2c, - 0xb3, 0x52, 0x2c, 0xa0, 0xf4, 0x08, 0xd8, 0x25, 0xa1, 0x4f, 0x3c, 0x53, 0x93, 0xa9, 0x8e, 0x80, - 0x9b, 0x3a, 0x10, 0x9b, 0xb8, 0xf4, 0x48, 0x0b, 0x22, 0xb6, 0xfc, 0x84, 0xa8, 0x9e, 0xd8, 0x55, - 0xd6, 0xb9, 0xdb, 0xbc, 0x84, 0xa3, 0x2f, 0xc1, 0xe3, 0xca, 0xcb, 0x1d, 0x73, 0xcd, 0xb0, 0x6c, - 0x71, 0xc4, 0xb8, 0x59, 0x3f, 0xbe, 0x92, 0x8d, 0x86, 0xf3, 0xea, 0xa3, 0x37, 0x61, 0x4a, 0x88, - 0xc0, 0x92, 0xe2, 0xa8, 0x69, 0xac, 0x70, 0xd3, 0x80, 0xe2, 0x14, 0x36, 0xaa, 0xc0, 0x0c, 0x2d, - 0x61, 0x52, 0xa8, 0xa4, 0xc0, 0xbd, 0xf5, 0xd5, 0x59, 0x7f, 0x33, 0x05, 0xc7, 0x5d, 0x35, 0xd0, - 0x12, 0x4c, 0x73, 0x19, 0x85, 0xde, 0x29, 0xd9, 0x3c, 0x08, 0x77, 0x0f, 0xb5, 0x11, 0x6e, 0x9b, - 0x60, 0x9c, 0xc6, 0x47, 0xaf, 0xc3, 0x84, 0x13, 0x36, 0x76, 0xdc, 0x98, 0x34, 0xe2, 0x4e, 0xc8, - 0xfd, 0x40, 0x34, 0x6b, 0x8f, 0x25, 0x0d, 0x86, 0x0d, 0x4c, 0xfb, 0x03, 0x38, 0x97, 0xe1, 0x29, - 0x46, 0x17, 0x8e, 0xd3, 0x76, 0xe5, 0x37, 0xa5, 0x2c, 0x24, 0x97, 0x6a, 0x55, 0xf9, 0x35, 0x1a, - 0x16, 0x5d, 0x9d, 0x4c, 0x25, 0xae, 0x65, 0x2f, 0x50, 0xab, 0x73, 0x4d, 0x02, 0x70, 0x82, 0x63, - 0xff, 0x16, 0x80, 0xa6, 0xd0, 0x19, 0xc0, 0x3e, 0xee, 0x75, 0x98, 0x90, 0x29, 0x37, 0xb4, 0x50, - 0xef, 0xea, 0x33, 0xaf, 0x6b, 0x30, 0x6c, 0x60, 0xd2, 0xbe, 0xf9, 0x2a, 0x50, 0x7d, 0xca, 0x1e, - 0x33, 0x09, 0x53, 0x9f, 0xe0, 0xa0, 0x17, 0x60, 0x2c, 0x22, 0xde, 0xf6, 0x2d, 0xd7, 0xdf, 0x15, - 0x0b, 0x5b, 0x71, 0xe1, 0xba, 0x28, 0xc7, 0x0a, 0x03, 0x2d, 0x43, 0xb1, 0xe3, 0x36, 0xc5, 0x52, - 0x96, 0x07, 0x7e, 0xf1, 0x4e, 0xb5, 0x72, 0x7c, 0x58, 0x7e, 0x3a, 0x2f, 0x93, 0x08, 0xbd, 0xda, - 0x47, 0x0b, 0x74, 0xfb, 0xd1, 0xca, 0x59, 0x6f, 0x03, 0x23, 0x27, 0x7c, 0x1b, 0xb8, 0x06, 0x20, - 0xbe, 0x5a, 0xae, 0xe5, 0x62, 0x32, 0x6b, 0xd7, 0x15, 0x04, 0x6b, 0x58, 0x28, 0x82, 0xd9, 0x46, - 0x48, 0x1c, 0x79, 0x87, 0xe6, 0x3e, 0x4f, 0x63, 0x0f, 0xaf, 0x20, 0x58, 0x49, 0x13, 0xc3, 0xdd, - 0xf4, 0x51, 0x00, 0xb3, 0x4d, 0x11, 0x54, 0x21, 0x69, 0xb4, 0x74, 0x72, 0x47, 0x2b, 0x66, 0x90, - 0x93, 0x26, 0x84, 0xbb, 0x69, 0xa3, 0x2f, 0xc3, 0xbc, 0x2c, 0xec, 0x8e, 0x63, 0xc1, 0xb6, 0x4b, - 0x91, 0xc7, 0x5f, 0xaf, 0xe4, 0x62, 0xe1, 0x1e, 0x14, 0x10, 0x86, 0x11, 0xf6, 0x96, 0x14, 0xcd, - 0x8d, 0xb3, 0x73, 0xee, 0xb9, 0x7c, 0x65, 0x00, 0x5d, 0xeb, 0x0b, 0xec, 0x1d, 0x4a, 0x98, 0x94, - 0x27, 0xcf, 0x72, 0xac, 0x10, 0x0b, 0x4a, 0x68, 0x1b, 0xc6, 0x1d, 0xdf, 0x0f, 0x62, 0x87, 0x8b, - 0x50, 0x13, 0xf9, 0xb2, 0x9f, 0x46, 0x78, 0x29, 0xa9, 0xc1, 0xa9, 0x2b, 0x2b, 0x55, 0x0d, 0x82, - 0x75, 0xc2, 0xe8, 0x3e, 0x4c, 0x07, 0xf7, 0x29, 0x73, 0x94, 0x5a, 0x8a, 0x68, 0x6e, 0x92, 0xb5, - 0xf5, 0xca, 0x80, 0x7a, 0x5a, 0xa3, 0xb2, 0xc6, 0xb5, 0x4c, 0xa2, 0x38, 0xdd, 0x0a, 0x5a, 0x30, - 0xb4, 0xd5, 0x53, 0x89, 0x3b, 0x4b, 0xa2, 0xad, 0xd6, 0x95, 0xd3, 0x2c, 0x2e, 0x0a, 0x37, 0x91, - 0x66, 0xbb, 0x7f, 0x3a, 0x15, 0x17, 0x25, 0x01, 0x61, 0x1d, 0x0f, 0xed, 0xc0, 0x44, 0xf2, 0x64, - 0x15, 0x46, 0x2c, 0x2a, 0xdb, 0xf8, 0xb5, 0x6b, 0x83, 0x7d, 0x5c, 0x55, 0xab, 0xc9, 0x6f, 0x0e, - 0x7a, 0x09, 0x36, 0x28, 0xcf, 0x7f, 0x1b, 0x8c, 0x6b, 0x13, 0x7b, 0xa2, 0x28, 0xb8, 0x6f, 0xc2, - 0x4c, 0x7a, 0xea, 0x4e, 0xe4, 0x41, 0xf0, 0xbf, 0x0a, 0x30, 0x9d, 0xf1, 0x72, 0xc5, 0xb2, 0x91, - 0xa4, 0x18, 0x6a, 0x92, 0x7c, 0xc4, 0x64, 0x8b, 0x85, 0x01, 0xd8, 0xa2, 0xe4, 0xd1, 0xc5, 0x5c, - 0x1e, 0x2d, 0x58, 0xe1, 0xd0, 0x87, 0x61, 0x85, 0xe6, 0xe9, 0x33, 0x3c, 0xd0, 0xe9, 0x73, 0x0a, - 0xec, 0xd3, 0x38, 0xc0, 0x46, 0x07, 0x38, 0xc0, 0x7e, 0xb4, 0x00, 0x33, 0x69, 0x0b, 0xdf, 0x33, - 0x78, 0xef, 0x78, 0xcb, 0x78, 0xef, 0xc8, 0xce, 0xed, 0x93, 0xb6, 0x3b, 0xce, 0x7b, 0xfb, 0xc0, - 0xa9, 0xb7, 0x8f, 0xe7, 0x06, 0xa2, 0xd6, 0xfb, 0x1d, 0xe4, 0x1f, 0x15, 0xe0, 0x42, 0xba, 0xca, - 0x8a, 0xe7, 0xb8, 0x7b, 0x67, 0x30, 0x36, 0xb7, 0x8d, 0xb1, 0x79, 0x71, 0x90, 0xaf, 0x61, 0x5d, - 0xcb, 0x1d, 0xa0, 0x7b, 0xa9, 0x01, 0x5a, 0x1c, 0x9c, 0x64, 0xef, 0x51, 0xfa, 0x66, 0x11, 0x2e, - 0x65, 0xd6, 0x4b, 0x9e, 0x0b, 0xd6, 0x8c, 0xe7, 0x82, 0x6b, 0xa9, 0xe7, 0x02, 0xbb, 0x77, 0xed, - 0xd3, 0x79, 0x3f, 0x10, 0xee, 0xd0, 0x2c, 0x62, 0xe8, 0x43, 0xbe, 0x1d, 0x18, 0xee, 0xd0, 0x8a, - 0x10, 0x36, 0xe9, 0xfe, 0x55, 0x7a, 0x33, 0xf8, 0x2d, 0x0b, 0x2e, 0x66, 0xce, 0xcd, 0x19, 0xe8, - 0xd5, 0x37, 0x4c, 0xbd, 0xfa, 0xb3, 0x03, 0xaf, 0xd6, 0x1c, 0x45, 0xfb, 0x1f, 0x17, 0x73, 0xbe, - 0x85, 0x69, 0x26, 0x6f, 0xc3, 0xb8, 0xd3, 0x68, 0x90, 0x28, 0x5a, 0x0f, 0x9a, 0x2a, 0x82, 0xe6, - 0x8b, 0x4c, 0xda, 0x48, 0x8a, 0x8f, 0x0f, 0xcb, 0xf3, 0x69, 0x12, 0x09, 0x18, 0xeb, 0x14, 0xcc, - 0xa0, 0xbf, 0x85, 0x53, 0x0d, 0xfa, 0x7b, 0x0d, 0x60, 0x5f, 0xe9, 0x2b, 0xd2, 0x6a, 0x4e, 0x4d, - 0x93, 0xa1, 0x61, 0xa1, 0xef, 0x62, 0xb7, 0x00, 0x6e, 0x0c, 0xc4, 0x97, 0xe2, 0xcb, 0x03, 0xce, - 0x95, 0x6e, 0x58, 0xc4, 0xe3, 0x6e, 0x28, 0x95, 0xb0, 0x22, 0x89, 0xbe, 0x03, 0x66, 0x22, 0x1e, - 0xd6, 0x69, 0xc5, 0x73, 0x22, 0xe6, 0xc4, 0x25, 0x56, 0x21, 0x0b, 0xa6, 0x51, 0x4f, 0xc1, 0x70, - 0x17, 0x36, 0x5a, 0x93, 0x1f, 0xc5, 0x62, 0x50, 0xf1, 0x85, 0x79, 0x25, 0xf9, 0x20, 0x91, 0x0b, - 0xed, 0x7c, 0x7a, 0xf8, 0xd9, 0xc0, 0x6b, 0x35, 0xed, 0x1f, 0x1d, 0x82, 0x27, 0x7a, 0x30, 0x31, - 0xb4, 0x64, 0x1a, 0x01, 0x3c, 0x9f, 0xd6, 0xff, 0xcd, 0x67, 0x56, 0x36, 0x14, 0x82, 0xa9, 0xb5, - 0x52, 0xf8, 0xd0, 0x6b, 0xe5, 0x87, 0x2c, 0x4d, 0x33, 0xcb, 0x4d, 0x85, 0xbf, 0x70, 0x42, 0xe6, - 0x7c, 0x8a, 0xaa, 0xda, 0xed, 0x0c, 0x7d, 0xe7, 0xb5, 0x81, 0xbb, 0x33, 0xb0, 0x02, 0xf4, 0x6c, - 0x9f, 0x8c, 0xbe, 0x6a, 0xc1, 0xd3, 0x99, 0xfd, 0x35, 0x8c, 0x96, 0x16, 0xa1, 0xd4, 0xa0, 0x85, - 0x9a, 0x63, 0x68, 0xe2, 0x31, 0x2f, 0x01, 0x38, 0xc1, 0x31, 0x6c, 0x93, 0x0a, 0x7d, 0x6d, 0x93, - 0xfe, 0xad, 0x05, 0x5d, 0x0b, 0xf8, 0x0c, 0x38, 0x69, 0xd5, 0xe4, 0xa4, 0x9f, 0x1c, 0x64, 0x2e, - 0x73, 0x98, 0xe8, 0xef, 0x4f, 0xc3, 0x63, 0x39, 0x9e, 0x60, 0xfb, 0x30, 0xdb, 0x6a, 0x10, 0xd3, - 0xe5, 0x56, 0x7c, 0x4c, 0xa6, 0x77, 0x72, 0x4f, 0xff, 0x5c, 0x7e, 0x21, 0xee, 0x42, 0xc1, 0xdd, - 0x4d, 0xa0, 0xaf, 0x5a, 0x70, 0xde, 0xb9, 0x1f, 0x75, 0xa5, 0x2a, 0x15, 0x6b, 0xe6, 0x95, 0x4c, - 0x3d, 0x6d, 0x9f, 0xd4, 0xa6, 0x3c, 0xab, 0x57, 0x16, 0x16, 0xce, 0x6c, 0x0b, 0x61, 0x11, 0xf4, - 0x98, 0xca, 0xdb, 0x3d, 0x9c, 0xc2, 0xb3, 0x5c, 0xf6, 0x38, 0x4f, 0x95, 0x10, 0xac, 0xe8, 0xa0, - 0xbb, 0x50, 0x6a, 0x49, 0x3f, 0x5a, 0xc1, 0xb3, 0x33, 0x0f, 0xc1, 0x4c, 0x67, 0x5b, 0xee, 0x3b, - 0xa2, 0x40, 0x38, 0x21, 0x85, 0xde, 0x84, 0xa2, 0xbf, 0x1d, 0xf5, 0x4a, 0x87, 0x95, 0xb2, 0xe5, - 0xe3, 0x01, 0x17, 0x36, 0xd6, 0xea, 0x98, 0x56, 0x44, 0x37, 0xa0, 0x18, 0x6e, 0x35, 0xc5, 0xd3, - 0x42, 0xa6, 0x5c, 0x8a, 0x97, 0x2b, 0xd9, 0x8b, 0x84, 0x53, 0xc2, 0xcb, 0x15, 0x4c, 0x49, 0xa0, - 0x1a, 0x0c, 0x33, 0xa7, 0x29, 0xf1, 0x82, 0x90, 0x29, 0x90, 0xf6, 0x70, 0x3e, 0xe4, 0x51, 0x19, - 0x18, 0x02, 0xe6, 0x84, 0xd0, 0x5b, 0x30, 0xd2, 0x60, 0x19, 0xa3, 0x84, 0xe2, 0x27, 0x3b, 0x5c, - 0x57, 0x57, 0x4e, 0x29, 0xfe, 0x82, 0xca, 0xcb, 0xb1, 0xa0, 0x80, 0x36, 0x61, 0xa4, 0x41, 0xda, - 0x3b, 0xdb, 0x91, 0xd0, 0xe7, 0x7c, 0x26, 0x93, 0x56, 0x8f, 0x04, 0x69, 0x82, 0x2a, 0xc3, 0xc0, - 0x82, 0x16, 0xfa, 0x1c, 0x14, 0xb6, 0x1b, 0xc2, 0x93, 0x2a, 0xf3, 0x0d, 0xc1, 0x8c, 0x94, 0xb1, - 0x3c, 0x72, 0x74, 0x58, 0x2e, 0xac, 0xad, 0xe0, 0xc2, 0x76, 0x03, 0x6d, 0xc0, 0xe8, 0x36, 0xf7, - 0xad, 0x17, 0x01, 0x6c, 0x3e, 0x9d, 0xed, 0xf6, 0xdf, 0xe5, 0x7e, 0xcf, 0x3d, 0x80, 0x04, 0x00, - 0x4b, 0x22, 0x2c, 0x5e, 0xb0, 0x8a, 0x11, 0x20, 0x02, 0xe7, 0x2f, 0x9c, 0x2c, 0xae, 0x83, 0x50, - 0x73, 0x28, 0x2a, 0x58, 0xa3, 0x88, 0xbe, 0x02, 0x25, 0x47, 0xa6, 0xc6, 0x14, 0x41, 0x70, 0x5e, - 0xce, 0xdc, 0x8e, 0xbd, 0xb3, 0x86, 0xf2, 0xb5, 0xac, 0x90, 0x70, 0x42, 0x14, 0xed, 0xc2, 0xe4, - 0x7e, 0xd4, 0xde, 0x21, 0x72, 0xfb, 0xb2, 0x98, 0x38, 0x39, 0xc7, 0xd5, 0x5d, 0x81, 0xe8, 0x86, - 0x71, 0xc7, 0xf1, 0xba, 0x38, 0x0e, 0x73, 0x1c, 0xbb, 0xab, 0x13, 0xc3, 0x26, 0x6d, 0x3a, 0xfc, - 0xef, 0x77, 0x82, 0xad, 0x83, 0x98, 0x88, 0x48, 0xfb, 0x99, 0xc3, 0xff, 0x36, 0x47, 0xe9, 0x1e, - 0x7e, 0x01, 0xc0, 0x92, 0x08, 0xdd, 0xe0, 0x8e, 0x4c, 0x3b, 0x2b, 0x74, 0x39, 0xcf, 0xe6, 0x0e, - 0x4f, 0x57, 0x7f, 0x93, 0x41, 0x61, 0x9c, 0x31, 0x21, 0xc5, 0x38, 0x62, 0x7b, 0x27, 0x88, 0x03, - 0x3f, 0xc5, 0x8d, 0x67, 0xf3, 0x39, 0x62, 0x2d, 0x03, 0xbf, 0x9b, 0x23, 0x66, 0x61, 0xe1, 0xcc, - 0xb6, 0x50, 0x13, 0xa6, 0xda, 0x41, 0x18, 0xdf, 0x0f, 0x42, 0xb9, 0xbe, 0x50, 0x8f, 0x4b, 0xbe, - 0x81, 0x29, 0x5a, 0x64, 0x76, 0xe0, 0x26, 0x04, 0xa7, 0x68, 0xa2, 0x2f, 0xc2, 0x68, 0xd4, 0x70, - 0x3c, 0x52, 0xbd, 0x3d, 0x77, 0x2e, 0xff, 0xa8, 0xa9, 0x73, 0x94, 0x9c, 0xd5, 0xc5, 0x26, 0x47, - 0xa0, 0x60, 0x49, 0x0e, 0xad, 0xc1, 0x30, 0x4b, 0xdf, 0xc2, 0x92, 0x04, 0xe4, 0x04, 0x5b, 0xeb, - 0xb2, 0x95, 0xe6, 0x1c, 0x89, 0x15, 0x63, 0x5e, 0x9d, 0xee, 0x01, 0x21, 0xeb, 0x06, 0xd1, 0xdc, - 0x85, 0xfc, 0x3d, 0x20, 0x44, 0xe4, 0xdb, 0xf5, 0x5e, 0x7b, 0x40, 0x21, 0xe1, 0x84, 0x28, 0xe5, - 0xc7, 0x94, 0x87, 0x3e, 0x96, 0xcf, 0x8f, 0xf3, 0x39, 0x28, 0xe3, 0xc7, 0x94, 0x7f, 0x52, 0x12, - 0xf6, 0x1f, 0x8c, 0x76, 0xcb, 0x27, 0xec, 0x76, 0xf4, 0x7d, 0x56, 0x97, 0xe9, 0xc0, 0x67, 0x07, - 0x55, 0xd6, 0x9c, 0xa2, 0x64, 0xfa, 0x55, 0x0b, 0x1e, 0x6b, 0x67, 0x7e, 0x88, 0x38, 0xec, 0x07, - 0xd3, 0xf9, 0xf0, 0x4f, 0x57, 0x89, 0x3c, 0xb2, 0xe1, 0x38, 0xa7, 0xa5, 0xb4, 0xf4, 0x5f, 0xfc, - 0xd0, 0xd2, 0xff, 0x3a, 0x8c, 0x31, 0x81, 0x32, 0x89, 0xec, 0x37, 0x90, 0x01, 0x1e, 0x13, 0x1b, - 0x56, 0x44, 0x45, 0xac, 0x48, 0xa0, 0x1f, 0xb6, 0xe0, 0xa9, 0x74, 0xd7, 0x31, 0x61, 0x60, 0x11, - 0x25, 0x9a, 0x5f, 0xcc, 0xd6, 0xc4, 0xf7, 0x3f, 0x55, 0xeb, 0x85, 0x7c, 0xdc, 0x0f, 0x01, 0xf7, - 0x6e, 0x0c, 0x55, 0x32, 0x6e, 0x86, 0x23, 0xe6, 0xcb, 0xe2, 0x00, 0xb7, 0xc3, 0x57, 0x60, 0x62, - 0x2f, 0xe8, 0xf8, 0xd2, 0x3b, 0x46, 0xf8, 0x3e, 0x33, 0x2d, 0xf6, 0xba, 0x56, 0x8e, 0x0d, 0xac, - 0xd4, 0x9d, 0x72, 0xec, 0x61, 0xef, 0x94, 0xe8, 0xdd, 0x54, 0x9a, 0xf8, 0x52, 0xbe, 0x6c, 0x21, - 0xae, 0xdf, 0x27, 0x48, 0x16, 0x7f, 0xb6, 0xf7, 0xa0, 0xaf, 0x5b, 0x19, 0x02, 0x3c, 0xbf, 0x19, - 0x7f, 0xde, 0xbc, 0x19, 0x5f, 0x49, 0xdf, 0x8c, 0xbb, 0x34, 0xa1, 0xc6, 0xa5, 0x78, 0xf0, 0x18, - 0xfd, 0x83, 0x06, 0x68, 0xb4, 0x3d, 0xb8, 0xdc, 0xef, 0x58, 0x62, 0xa6, 0x92, 0x4d, 0x65, 0x43, - 0x90, 0x98, 0x4a, 0x36, 0xab, 0x15, 0xcc, 0x20, 0x83, 0x46, 0xf0, 0xb1, 0xff, 0xbb, 0x05, 0xc5, - 0x5a, 0xd0, 0x3c, 0x03, 0xcd, 0xee, 0x17, 0x0c, 0xcd, 0xee, 0x13, 0x39, 0xe9, 0xfb, 0x73, 0xf5, - 0xb8, 0xab, 0x29, 0x3d, 0xee, 0x53, 0x79, 0x04, 0x7a, 0x6b, 0x6d, 0x7f, 0xba, 0x08, 0xe3, 0xb5, - 0xa0, 0xa9, 0x6c, 0xee, 0xff, 0xfd, 0xc3, 0xd8, 0xdc, 0xe7, 0xc6, 0x5b, 0xd6, 0x28, 0x33, 0x0b, - 0x4b, 0xe9, 0xce, 0xfb, 0x97, 0xcc, 0xf4, 0xfe, 0x1e, 0x71, 0x5b, 0x3b, 0x31, 0x69, 0xa6, 0x3f, - 0xe7, 0xec, 0x4c, 0xef, 0xff, 0xab, 0x05, 0xd3, 0xa9, 0xd6, 0x91, 0x97, 0xe5, 0x1b, 0xf8, 0x90, - 0x1a, 0xbd, 0xd9, 0xbe, 0xce, 0x84, 0x0b, 0x00, 0xea, 0xd9, 0x4c, 0x6a, 0xbb, 0x98, 0xd4, 0xaf, - 0xde, 0xd5, 0x22, 0xac, 0x61, 0xa0, 0x57, 0x61, 0x3c, 0x0e, 0xda, 0x81, 0x17, 0xb4, 0x0e, 0x6e, - 0x12, 0x19, 0x33, 0x4a, 0x3d, 0x6e, 0x6e, 0x26, 0x20, 0xac, 0xe3, 0xd9, 0x3f, 0x5b, 0xe4, 0x1f, - 0xea, 0xc7, 0xee, 0xb7, 0xd6, 0xe4, 0xc7, 0x7b, 0x4d, 0x7e, 0xd3, 0x82, 0x19, 0xda, 0x3a, 0xb3, - 0x5e, 0x93, 0x87, 0xad, 0xca, 0x15, 0x66, 0xf5, 0xc8, 0x15, 0x76, 0x85, 0xf2, 0xae, 0x66, 0xd0, - 0x89, 0x85, 0xb6, 0x4c, 0x63, 0x4e, 0xb4, 0x14, 0x0b, 0xa8, 0xc0, 0x23, 0x61, 0x28, 0x3c, 0xfe, - 0x74, 0x3c, 0x12, 0x86, 0x58, 0x40, 0x65, 0x2a, 0xb1, 0xa1, 0x9c, 0x54, 0x62, 0x2c, 0x02, 0xa6, - 0xb0, 0x98, 0x12, 0x62, 0x8f, 0x16, 0x01, 0x53, 0x9a, 0x52, 0x25, 0x38, 0xf6, 0x2f, 0x14, 0x61, - 0xa2, 0x16, 0x34, 0x93, 0x87, 0xab, 0x57, 0x8c, 0x87, 0xab, 0xcb, 0xa9, 0x87, 0xab, 0x19, 0x1d, - 0xf7, 0x5b, 0xcf, 0x54, 0x1f, 0xd5, 0x33, 0xd5, 0xbf, 0xb1, 0xd8, 0xac, 0x55, 0x36, 0xea, 0x22, - 0x19, 0xf7, 0x4b, 0x30, 0xce, 0x18, 0x12, 0x73, 0x31, 0x95, 0xaf, 0x39, 0x2c, 0xa3, 0xc5, 0x46, - 0x52, 0x8c, 0x75, 0x1c, 0x74, 0x15, 0xc6, 0x22, 0xe2, 0x84, 0x8d, 0x1d, 0xc5, 0xe3, 0xc4, 0x5b, - 0x07, 0x2f, 0xc3, 0x0a, 0x8a, 0xde, 0x4e, 0x82, 0x2f, 0x16, 0xf3, 0xd3, 0x4a, 0xeb, 0xfd, 0xe1, - 0x5b, 0x24, 0x3f, 0xe2, 0xa2, 0x7d, 0x0f, 0x50, 0x37, 0xfe, 0x00, 0x66, 0x64, 0x65, 0x33, 0xcc, - 0x5a, 0xa9, 0x2b, 0xc4, 0xda, 0x9f, 0x5b, 0x30, 0x55, 0x0b, 0x9a, 0x74, 0xeb, 0xfe, 0x55, 0xda, - 0xa7, 0x7a, 0xe4, 0xd9, 0x91, 0x1e, 0x91, 0x67, 0xff, 0xb1, 0x05, 0xa3, 0xb5, 0xa0, 0x79, 0x06, - 0x3a, 0xf6, 0xcf, 0x9b, 0x3a, 0xf6, 0xc7, 0x73, 0x96, 0x44, 0x8e, 0x5a, 0xfd, 0x97, 0x8a, 0x30, - 0x49, 0xfb, 0x19, 0xb4, 0xe4, 0x2c, 0x19, 0x23, 0x62, 0x0d, 0x30, 0x22, 0x54, 0xcc, 0x0d, 0x3c, - 0x2f, 0xb8, 0x9f, 0x9e, 0xb1, 0x35, 0x56, 0x8a, 0x05, 0x14, 0xbd, 0x00, 0x63, 0xed, 0x90, 0xec, - 0xbb, 0x41, 0x27, 0x4a, 0x7b, 0x53, 0xd7, 0x44, 0x39, 0x56, 0x18, 0xf4, 0xde, 0x15, 0xb9, 0x7e, - 0x83, 0x48, 0xfb, 0xb2, 0x21, 0x66, 0x5f, 0xc6, 0x43, 0xca, 0x6b, 0xe5, 0xd8, 0xc0, 0x42, 0xf7, - 0xa0, 0xc4, 0xfe, 0x33, 0x8e, 0x72, 0xf2, 0x24, 0x67, 0x22, 0x8f, 0x8b, 0x20, 0x80, 0x13, 0x5a, - 0xe8, 0x1a, 0x40, 0x2c, 0x2d, 0xe1, 0x22, 0xe1, 0xec, 0xaf, 0x64, 0x6d, 0x65, 0x23, 0x17, 0x61, - 0x0d, 0x0b, 0x3d, 0x0f, 0xa5, 0xd8, 0x71, 0xbd, 0x5b, 0xae, 0x4f, 0x22, 0x61, 0x49, 0x28, 0xd2, - 0xb4, 0x88, 0x42, 0x9c, 0xc0, 0xa9, 0xac, 0xc3, 0x42, 0x49, 0xf0, 0x14, 0x89, 0x63, 0x0c, 0x9b, - 0xc9, 0x3a, 0xb7, 0x54, 0x29, 0xd6, 0x30, 0xec, 0xd7, 0xe1, 0x42, 0x2d, 0x68, 0xd6, 0x82, 0x30, - 0x5e, 0x0b, 0xc2, 0xfb, 0x4e, 0xd8, 0x94, 0xf3, 0x57, 0x96, 0x19, 0x43, 0x28, 0xef, 0x19, 0xe6, - 0x3b, 0xd3, 0xc8, 0x05, 0xf2, 0x32, 0x93, 0x76, 0x4e, 0xe8, 0xf6, 0xf5, 0xbf, 0x0b, 0x8c, 0x51, - 0xa4, 0xf2, 0x76, 0xa2, 0x2f, 0xc3, 0x54, 0x44, 0x6e, 0xb9, 0x7e, 0xe7, 0x81, 0xbc, 0x1f, 0xf7, - 0xf0, 0xa9, 0xab, 0xaf, 0xea, 0x98, 0x5c, 0xcb, 0x66, 0x96, 0xe1, 0x14, 0x35, 0x3a, 0x84, 0x61, - 0xc7, 0x5f, 0x8a, 0xee, 0x44, 0x24, 0x14, 0x79, 0x23, 0xd9, 0x10, 0x62, 0x59, 0x88, 0x13, 0x38, - 0x5d, 0x32, 0xec, 0xcf, 0x46, 0xe0, 0xe3, 0x20, 0x88, 0xe5, 0x22, 0x63, 0x99, 0xc7, 0xb4, 0x72, - 0x6c, 0x60, 0xa1, 0x35, 0x40, 0x51, 0xa7, 0xdd, 0xf6, 0xd8, 0x03, 0xb8, 0xe3, 0x5d, 0x0f, 0x83, - 0x4e, 0x9b, 0x3f, 0x3e, 0x8a, 0xa4, 0x5d, 0xf5, 0x2e, 0x28, 0xce, 0xa8, 0x41, 0x19, 0xc3, 0x76, - 0xc4, 0x7e, 0x8b, 0x68, 0x12, 0x5c, 0xf3, 0x5d, 0x67, 0x45, 0x58, 0xc2, 0xe8, 0x3c, 0xb3, 0xe6, - 0x39, 0xe6, 0x48, 0x32, 0xcf, 0x58, 0x95, 0x62, 0x0d, 0xc3, 0xfe, 0x1e, 0x76, 0xc0, 0xb0, 0xf4, - 0x80, 0x71, 0x27, 0x24, 0x68, 0x0f, 0x26, 0xdb, 0xec, 0xe8, 0x17, 0x81, 0xd6, 0xc5, 0x80, 0x3f, - 0x9c, 0x9d, 0x21, 0x4f, 0x17, 0xa6, 0x93, 0xc3, 0x26, 0x75, 0xfb, 0xa7, 0x67, 0x18, 0x1f, 0xab, - 0xf3, 0xeb, 0xdf, 0xa8, 0xf0, 0x1e, 0x10, 0xb2, 0xee, 0x7c, 0xbe, 0x1e, 0x22, 0x39, 0x72, 0x84, - 0x07, 0x02, 0x96, 0x75, 0xd1, 0xdb, 0xec, 0x95, 0x97, 0x33, 0x8f, 0x7e, 0x79, 0xc6, 0x39, 0x96, - 0xf1, 0xa0, 0x2b, 0x2a, 0x62, 0x8d, 0x08, 0xba, 0x05, 0x93, 0x22, 0x9b, 0x9c, 0x50, 0x34, 0x15, - 0x0d, 0x45, 0xc2, 0x24, 0xd6, 0x81, 0xc7, 0xe9, 0x02, 0x6c, 0x56, 0x46, 0x2d, 0x78, 0x4a, 0x4b, - 0xad, 0x9a, 0x61, 0xeb, 0xca, 0x79, 0xd1, 0xd3, 0x47, 0x87, 0xe5, 0xa7, 0x36, 0x7b, 0x21, 0xe2, - 0xde, 0x74, 0xd0, 0x6d, 0xb8, 0xe0, 0x34, 0x62, 0x77, 0x9f, 0x54, 0x88, 0xd3, 0xf4, 0x5c, 0x9f, - 0x98, 0xe1, 0x48, 0x2e, 0x1e, 0x1d, 0x96, 0x2f, 0x2c, 0x65, 0x21, 0xe0, 0xec, 0x7a, 0xe8, 0xf3, - 0x50, 0x6a, 0xfa, 0x91, 0x18, 0x83, 0x11, 0x23, 0x6b, 0x70, 0xa9, 0xb2, 0x51, 0x57, 0xdf, 0x9f, - 0xfc, 0xc1, 0x49, 0x05, 0xd4, 0xe2, 0xca, 0x26, 0x75, 0xb7, 0x1b, 0xed, 0x8a, 0x31, 0x93, 0xd6, - 0x12, 0x18, 0x7e, 0x7a, 0x5c, 0xcb, 0xaa, 0x2c, 0xc9, 0x0d, 0x17, 0x3e, 0x83, 0x30, 0x7a, 0x0b, - 0x10, 0x15, 0x7e, 0xdc, 0x06, 0x59, 0x6a, 0xb0, 0x78, 0xf7, 0x4c, 0x37, 0x37, 0x66, 0xb8, 0x45, - 0xa1, 0x7a, 0x17, 0x06, 0xce, 0xa8, 0x85, 0x6e, 0x50, 0x0e, 0xa4, 0x97, 0x0a, 0xc3, 0x7f, 0x29, - 0x30, 0xcf, 0x55, 0x48, 0x3b, 0x24, 0x0d, 0x27, 0x26, 0x4d, 0x93, 0x22, 0x4e, 0xd5, 0xa3, 0xe7, - 0x93, 0x4a, 0x7d, 0x05, 0xa6, 0xb9, 0x7a, 0x77, 0xfa, 0x2b, 0x7a, 0xd7, 0xdc, 0x09, 0xa2, 0x78, - 0x83, 0xc4, 0xf7, 0x83, 0x70, 0x57, 0xc4, 0x10, 0x4c, 0xc2, 0xd9, 0x26, 0x20, 0xac, 0xe3, 0x51, - 0xd9, 0x92, 0x3d, 0xb3, 0x56, 0x2b, 0xec, 0xd5, 0x6b, 0x2c, 0xd9, 0x27, 0x37, 0x78, 0x31, 0x96, - 0x70, 0x89, 0x5a, 0xad, 0xad, 0xb0, 0x17, 0xac, 0x14, 0x6a, 0xb5, 0xb6, 0x82, 0x25, 0x1c, 0x91, - 0xee, 0x8c, 0xcc, 0x53, 0xf9, 0x9a, 0xc2, 0x6e, 0x3e, 0x3e, 0x60, 0x52, 0x66, 0x1f, 0x66, 0x54, - 0x2e, 0x68, 0x1e, 0x5c, 0x31, 0x9a, 0x9b, 0x66, 0x8b, 0x64, 0xf0, 0xc8, 0x8c, 0x4a, 0xf7, 0x5a, - 0x4d, 0x51, 0xc2, 0x5d, 0xb4, 0x8d, 0x30, 0x37, 0x33, 0x7d, 0x53, 0x97, 0x2d, 0x42, 0x29, 0xea, - 0x6c, 0x35, 0x83, 0x3d, 0xc7, 0xf5, 0xd9, 0x83, 0x93, 0x26, 0xb8, 0xd4, 0x25, 0x00, 0x27, 0x38, - 0x68, 0x0d, 0xc6, 0x1c, 0xa9, 0x58, 0x45, 0xf9, 0x71, 0x2f, 0x94, 0x3a, 0x95, 0x89, 0xe5, 0x4a, - 0x95, 0xaa, 0xea, 0xa2, 0x37, 0x60, 0x52, 0xb8, 0x66, 0x0a, 0xab, 0xea, 0x73, 0xa6, 0x17, 0x4f, - 0x5d, 0x07, 0x62, 0x13, 0x17, 0x7d, 0x17, 0x4c, 0x51, 0x2a, 0x09, 0x63, 0x9b, 0x3b, 0x3f, 0x08, - 0x47, 0xd4, 0x52, 0xd2, 0xe8, 0x95, 0x71, 0x8a, 0x18, 0x6a, 0xc2, 0x93, 0x4e, 0x27, 0x0e, 0x98, - 0x72, 0xda, 0x5c, 0xff, 0x9b, 0xc1, 0x2e, 0xf1, 0xd9, 0xbb, 0xd0, 0xd8, 0xf2, 0xe5, 0xa3, 0xc3, - 0xf2, 0x93, 0x4b, 0x3d, 0xf0, 0x70, 0x4f, 0x2a, 0xe8, 0x0e, 0x8c, 0xc7, 0x81, 0x27, 0xdc, 0x21, - 0xa2, 0xb9, 0xc7, 0xf2, 0xc3, 0x74, 0x6d, 0x2a, 0x34, 0x5d, 0x31, 0xa3, 0xaa, 0x62, 0x9d, 0x0e, - 0xda, 0xe4, 0x7b, 0x8c, 0x05, 0x30, 0x26, 0xd1, 0xdc, 0xe3, 0xf9, 0x03, 0xa3, 0xe2, 0x1c, 0x9b, - 0x5b, 0x50, 0xd4, 0xc4, 0x3a, 0x19, 0x74, 0x1d, 0x66, 0xdb, 0xa1, 0x1b, 0xb0, 0x85, 0xad, 0x1e, - 0x06, 0xe6, 0xcc, 0x2c, 0x24, 0xb5, 0x34, 0x02, 0xee, 0xae, 0x43, 0x2f, 0x6e, 0xb2, 0x70, 0xee, - 0x22, 0x4f, 0x69, 0xc7, 0x85, 0x59, 0x5e, 0x86, 0x15, 0x14, 0xad, 0x33, 0xbe, 0xcc, 0xaf, 0x58, - 0x73, 0xf3, 0xf9, 0xf1, 0x42, 0xf4, 0xab, 0x18, 0x17, 0x74, 0xd4, 0x5f, 0x9c, 0x50, 0xa0, 0xe7, - 0x46, 0xb4, 0xe3, 0x84, 0xa4, 0x16, 0x06, 0x0d, 0xc2, 0x3b, 0xc3, 0xcd, 0xcf, 0x9f, 0xe0, 0x71, - 0x56, 0xe9, 0xb9, 0x51, 0xcf, 0x42, 0xc0, 0xd9, 0xf5, 0xe6, 0xbf, 0x1d, 0x66, 0xbb, 0x38, 0xf9, - 0x89, 0x4c, 0xe7, 0xff, 0x6c, 0x18, 0x4a, 0x4a, 0xf1, 0x8b, 0x16, 0x4d, 0x7d, 0xfe, 0xc5, 0xb4, - 0x3e, 0x7f, 0x8c, 0xca, 0x9f, 0xba, 0x0a, 0x7f, 0xd3, 0x30, 0xfc, 0x2a, 0xe4, 0xa7, 0xba, 0xd3, - 0xb5, 0x1e, 0x7d, 0xfd, 0x5c, 0xb5, 0x7b, 0x7c, 0x71, 0xe0, 0x87, 0x81, 0xa1, 0x9e, 0xaa, 0x81, - 0x01, 0xb3, 0x77, 0xd3, 0xab, 0x6e, 0x3b, 0x68, 0x56, 0x6b, 0xe9, 0x74, 0xb6, 0x35, 0x5a, 0x88, - 0x39, 0x8c, 0x5d, 0x56, 0xa8, 0xd8, 0xc1, 0x2e, 0x2b, 0xa3, 0x0f, 0x79, 0x59, 0x91, 0x04, 0x70, - 0x42, 0x0b, 0x79, 0x30, 0xdb, 0x30, 0x33, 0x11, 0x2b, 0xdf, 0xd6, 0x67, 0xfa, 0xe6, 0x04, 0xee, - 0x68, 0x29, 0x0a, 0x57, 0xd2, 0x54, 0x70, 0x37, 0x61, 0xf4, 0x06, 0x8c, 0xbd, 0x1f, 0x44, 0x6c, - 0x5b, 0x88, 0xb3, 0x57, 0x7a, 0x13, 0x8e, 0xbd, 0x7d, 0xbb, 0xce, 0xca, 0x8f, 0x0f, 0xcb, 0xe3, - 0xb5, 0xa0, 0x29, 0xff, 0x62, 0x55, 0x01, 0x3d, 0x80, 0x0b, 0x06, 0xc7, 0x52, 0xdd, 0x85, 0xc1, - 0xbb, 0xfb, 0x94, 0x68, 0xee, 0x42, 0x35, 0x8b, 0x12, 0xce, 0x6e, 0x80, 0xb2, 0x01, 0x3f, 0x10, - 0x59, 0xbc, 0xe5, 0xf9, 0xce, 0x8e, 0xf1, 0x92, 0x1e, 0x94, 0x21, 0x85, 0x80, 0xbb, 0xeb, 0xd8, - 0xdf, 0xe0, 0x7a, 0x72, 0xa1, 0x4d, 0x23, 0x51, 0xc7, 0x3b, 0x8b, 0x84, 0x66, 0xab, 0x86, 0xa2, - 0xef, 0xa1, 0xdf, 0x62, 0x7e, 0xc3, 0x62, 0x6f, 0x31, 0x9b, 0x64, 0xaf, 0xed, 0x39, 0xf1, 0x59, - 0x78, 0x5e, 0xbc, 0x0d, 0x63, 0xb1, 0x68, 0xad, 0x57, 0x0e, 0x36, 0xad, 0x53, 0xec, 0x3d, 0x4a, - 0x9d, 0xfc, 0xb2, 0x14, 0x2b, 0x32, 0xf6, 0xbf, 0xe4, 0x33, 0x20, 0x21, 0x67, 0xa0, 0x74, 0xa9, - 0x98, 0x4a, 0x97, 0x72, 0x9f, 0x2f, 0xc8, 0x51, 0xbe, 0xfc, 0x0b, 0xb3, 0xdf, 0xec, 0x92, 0xf5, - 0x71, 0x7f, 0x04, 0xb4, 0x7f, 0xdc, 0x82, 0xf3, 0x59, 0x56, 0x33, 0x54, 0x5a, 0xe3, 0x57, 0x3c, - 0xf5, 0x28, 0xaa, 0x46, 0xf0, 0xae, 0x28, 0xc7, 0x0a, 0x63, 0xe0, 0xf4, 0x26, 0x27, 0x8b, 0xc1, - 0x77, 0x1b, 0xcc, 0xec, 0xd7, 0xe8, 0x4d, 0xee, 0x4a, 0x65, 0xa9, 0xf4, 0xd4, 0x27, 0x73, 0xa3, - 0xb2, 0x7f, 0xae, 0x00, 0xe7, 0xf9, 0xab, 0xc6, 0xd2, 0x7e, 0xe0, 0x36, 0x6b, 0x41, 0x53, 0x38, - 0x96, 0xbd, 0x03, 0x13, 0x6d, 0xed, 0x5e, 0xde, 0x2b, 0x0a, 0x98, 0x7e, 0x7f, 0x4f, 0xee, 0x47, - 0x7a, 0x29, 0x36, 0x68, 0xa1, 0x26, 0x4c, 0x90, 0x7d, 0xb7, 0xa1, 0x54, 0xe3, 0x85, 0x13, 0x9f, - 0x0d, 0xaa, 0x95, 0x55, 0x8d, 0x0e, 0x36, 0xa8, 0x3e, 0x82, 0x6c, 0x85, 0xf6, 0x4f, 0x58, 0xf0, - 0x78, 0x4e, 0xcc, 0x30, 0xda, 0xdc, 0x7d, 0xf6, 0x7e, 0x24, 0x12, 0x9f, 0xa9, 0xe6, 0xf8, 0xab, - 0x12, 0x16, 0x50, 0xf4, 0x45, 0x00, 0xfe, 0x2a, 0x44, 0xaf, 0x0b, 0xe2, 0xd3, 0x07, 0x8b, 0xa5, - 0xa3, 0x05, 0x5c, 0x91, 0xf5, 0xb1, 0x46, 0xcb, 0xfe, 0x99, 0x22, 0x0c, 0xb3, 0x57, 0x08, 0xb4, - 0x06, 0xa3, 0x3b, 0x3c, 0x42, 0xf9, 0x20, 0xc1, 0xd0, 0x93, 0x7b, 0x17, 0x2f, 0xc0, 0xb2, 0x32, - 0x5a, 0x87, 0x73, 0xc2, 0x79, 0xb1, 0x42, 0x3c, 0xe7, 0x40, 0x5e, 0xdf, 0x79, 0xb2, 0x30, 0x95, - 0x1e, 0xaf, 0xda, 0x8d, 0x82, 0xb3, 0xea, 0xa1, 0x37, 0xbb, 0xe2, 0x92, 0xf2, 0xd8, 0xee, 0x4a, - 0xd8, 0xef, 0x13, 0x9b, 0xf4, 0x0d, 0x98, 0x6c, 0x77, 0x29, 0x2a, 0x86, 0x93, 0x8b, 0x88, 0xa9, - 0x9c, 0x30, 0x71, 0x99, 0xb9, 0x4c, 0x87, 0x19, 0x07, 0x6d, 0xee, 0x84, 0x24, 0xda, 0x09, 0xbc, - 0xa6, 0xc8, 0xdf, 0x9f, 0x98, 0xcb, 0xa4, 0xe0, 0xb8, 0xab, 0x06, 0xa5, 0xb2, 0xed, 0xb8, 0x5e, - 0x27, 0x24, 0x09, 0x95, 0x11, 0x93, 0xca, 0x5a, 0x0a, 0x8e, 0xbb, 0x6a, 0xd0, 0x75, 0x74, 0x41, - 0x24, 0x7f, 0x97, 0x21, 0x2d, 0x94, 0x0d, 0xd4, 0xa8, 0x74, 0x6d, 0xe9, 0x11, 0x66, 0x49, 0x58, - 0x89, 0xa8, 0xf4, 0xf1, 0x5a, 0x6a, 0x61, 0xe1, 0xd4, 0x22, 0xa9, 0x3c, 0x4c, 0x0a, 0xf2, 0x3f, - 0xb0, 0xe0, 0x5c, 0x86, 0xad, 0x25, 0x67, 0x55, 0x2d, 0x37, 0x8a, 0x55, 0x42, 0x24, 0x8d, 0x55, - 0xf1, 0x72, 0xac, 0x30, 0xe8, 0x7e, 0xe0, 0xcc, 0x30, 0xcd, 0x00, 0x85, 0x2d, 0x93, 0x80, 0x9e, - 0x8c, 0x01, 0xa2, 0xcb, 0x30, 0xd4, 0x89, 0x48, 0x28, 0x73, 0x77, 0x4b, 0xfe, 0xcd, 0x54, 0xa5, - 0x0c, 0x42, 0x45, 0xd3, 0x96, 0xd2, 0x52, 0x6a, 0xa2, 0x29, 0x57, 0x3d, 0x72, 0x98, 0xfd, 0xb5, - 0x22, 0x5c, 0xcc, 0xb5, 0xa5, 0xa6, 0x5d, 0xda, 0x0b, 0x7c, 0x37, 0x0e, 0xd4, 0x0b, 0x17, 0x8f, - 0x07, 0x44, 0xda, 0x3b, 0xeb, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x05, 0x86, 0xd9, 0xcd, 0xbe, 0x2b, - 0xe5, 0xd3, 0x72, 0x85, 0x87, 0xa9, 0xe0, 0xe0, 0x81, 0xd3, 0xe9, 0x3d, 0x03, 0x43, 0xed, 0x20, - 0xf0, 0xd2, 0xcc, 0x88, 0x76, 0x37, 0x08, 0x3c, 0xcc, 0x80, 0xe8, 0x53, 0x62, 0x1c, 0x52, 0x4f, - 0x3a, 0xd8, 0x69, 0x06, 0x91, 0x36, 0x18, 0xcf, 0xc2, 0xe8, 0x2e, 0x39, 0x08, 0x5d, 0xbf, 0x95, - 0x7e, 0xea, 0xbb, 0xc9, 0x8b, 0xb1, 0x84, 0x9b, 0x19, 0x4f, 0x46, 0x4f, 0x3b, 0x0f, 0xde, 0x58, - 0xdf, 0xa3, 0xed, 0x87, 0x8a, 0x30, 0x8d, 0x97, 0x2b, 0xdf, 0x9a, 0x88, 0x3b, 0xdd, 0x13, 0x71, - 0xda, 0x79, 0xf0, 0xfa, 0xcf, 0xc6, 0x2f, 0x59, 0x30, 0xcd, 0xa2, 0x82, 0x8b, 0x78, 0x36, 0x6e, - 0xe0, 0x9f, 0x81, 0xe8, 0xf6, 0x0c, 0x0c, 0x87, 0xb4, 0xd1, 0x74, 0x72, 0x2b, 0xd6, 0x13, 0xcc, - 0x61, 0xe8, 0x49, 0x18, 0x62, 0x5d, 0xa0, 0x93, 0x37, 0xc1, 0xf3, 0x82, 0x54, 0x9c, 0xd8, 0xc1, - 0xac, 0x94, 0x39, 0x16, 0x63, 0xd2, 0xf6, 0x5c, 0xde, 0xe9, 0x44, 0xd5, 0xff, 0xf1, 0x70, 0x2c, - 0xce, 0xec, 0xda, 0x87, 0x73, 0x2c, 0xce, 0x26, 0xd9, 0xfb, 0x5a, 0xf4, 0x3f, 0x0a, 0x70, 0x29, - 0xb3, 0xde, 0xc0, 0x8e, 0xc5, 0xbd, 0x6b, 0x9f, 0x8e, 0xc5, 0x46, 0xb6, 0x21, 0x45, 0xf1, 0x0c, - 0x0d, 0x29, 0x86, 0x06, 0x95, 0x1c, 0x87, 0x07, 0xf0, 0xf7, 0xcd, 0x1c, 0xb2, 0x8f, 0x89, 0xbf, - 0x6f, 0x66, 0xdf, 0x72, 0xae, 0x75, 0x7f, 0x51, 0xc8, 0xf9, 0x16, 0x76, 0xc1, 0xbb, 0x4a, 0xf9, - 0x0c, 0x03, 0x46, 0x42, 0x12, 0x9e, 0xe0, 0x3c, 0x86, 0x97, 0x61, 0x05, 0x45, 0xae, 0xe6, 0x39, - 0x5b, 0xc8, 0x4f, 0x7d, 0x9a, 0xdb, 0xd4, 0x82, 0xf9, 0x32, 0xa3, 0x07, 0xdf, 0x49, 0x7b, 0xd1, - 0xae, 0x6b, 0x97, 0xf2, 0xe2, 0xe0, 0x97, 0xf2, 0x89, 0xec, 0x0b, 0x39, 0x5a, 0x82, 0xe9, 0x3d, - 0xd7, 0xa7, 0x6c, 0xf3, 0xc0, 0x14, 0x45, 0x55, 0x20, 0x89, 0x75, 0x13, 0x8c, 0xd3, 0xf8, 0xf3, - 0x6f, 0xc0, 0xe4, 0xc3, 0xab, 0x23, 0xbf, 0x59, 0x84, 0x27, 0x7a, 0x6c, 0x7b, 0xce, 0xeb, 0x8d, - 0x39, 0xd0, 0x78, 0x7d, 0xd7, 0x3c, 0xd4, 0xe0, 0xfc, 0x76, 0xc7, 0xf3, 0x0e, 0x98, 0xad, 0x22, - 0x69, 0x4a, 0x0c, 0x21, 0x2b, 0xaa, 0x90, 0xff, 0x6b, 0x19, 0x38, 0x38, 0xb3, 0x26, 0x7a, 0x0b, - 0x50, 0x20, 0xf2, 0x2e, 0x27, 0x21, 0x85, 0xd8, 0xc0, 0x17, 0x93, 0xcd, 0x78, 0xbb, 0x0b, 0x03, - 0x67, 0xd4, 0xa2, 0x42, 0x3f, 0x3d, 0x95, 0x0e, 0x54, 0xb7, 0x52, 0x42, 0x3f, 0xd6, 0x81, 0xd8, - 0xc4, 0x45, 0xd7, 0x61, 0xd6, 0xd9, 0x77, 0x5c, 0x1e, 0x62, 0x52, 0x12, 0xe0, 0x52, 0xbf, 0x52, - 0x82, 0x2d, 0xa5, 0x11, 0x70, 0x77, 0x9d, 0x94, 0xeb, 0xee, 0x48, 0xbe, 0xeb, 0x6e, 0x6f, 0xbe, - 0xd8, 0x4f, 0xa7, 0x6b, 0xff, 0x67, 0x8b, 0x1e, 0x5f, 0x5c, 0x78, 0x37, 0xc3, 0x6d, 0xbd, 0x01, - 0x93, 0x4a, 0x37, 0xa9, 0x79, 0xd1, 0xaa, 0x71, 0x58, 0xd1, 0x81, 0xd8, 0xc4, 0xe5, 0x0b, 0x22, - 0x4a, 0x1c, 0x3a, 0x0c, 0xd1, 0x5d, 0xb8, 0xc9, 0x2b, 0x0c, 0xf4, 0x25, 0x18, 0x6d, 0xba, 0xfb, - 0x6e, 0x14, 0x84, 0x62, 0xb3, 0x9c, 0xd0, 0x2c, 0x3e, 0xe1, 0x83, 0x15, 0x4e, 0x06, 0x4b, 0x7a, - 0xf6, 0x0f, 0x15, 0x60, 0x52, 0xb6, 0xf8, 0x76, 0x27, 0x88, 0x9d, 0x33, 0x38, 0x96, 0xaf, 0x1b, - 0xc7, 0xf2, 0xa7, 0x7a, 0xc5, 0x0a, 0x60, 0x5d, 0xca, 0x3d, 0x8e, 0x6f, 0xa7, 0x8e, 0xe3, 0x4f, - 0xf7, 0x27, 0xd5, 0xfb, 0x18, 0xfe, 0x57, 0x16, 0xcc, 0x1a, 0xf8, 0x67, 0x70, 0x1a, 0xac, 0x99, - 0xa7, 0xc1, 0xd3, 0x7d, 0xbf, 0x21, 0xe7, 0x14, 0xf8, 0x7a, 0x21, 0xd5, 0x77, 0xc6, 0xfd, 0xdf, - 0x87, 0xa1, 0x1d, 0x27, 0x6c, 0xf6, 0x0a, 0x94, 0xdc, 0x55, 0x69, 0xe1, 0x86, 0x13, 0x36, 0x39, - 0x0f, 0x7f, 0x41, 0x65, 0x6b, 0x75, 0xc2, 0x66, 0x5f, 0xff, 0x25, 0xd6, 0x14, 0x7a, 0x1d, 0x46, - 0xa2, 0x46, 0xd0, 0x56, 0xd6, 0x85, 0x97, 0x79, 0x26, 0x57, 0x5a, 0x72, 0x7c, 0x58, 0x46, 0x66, - 0x73, 0xb4, 0x18, 0x0b, 0xfc, 0xf9, 0x16, 0x94, 0x54, 0xd3, 0x8f, 0xd4, 0x37, 0xe4, 0x77, 0x8b, - 0x70, 0x2e, 0x63, 0x5d, 0xa0, 0xc8, 0x18, 0xad, 0x97, 0x06, 0x5c, 0x4e, 0x1f, 0x72, 0xbc, 0x22, - 0x76, 0x63, 0x69, 0x8a, 0xf9, 0x1f, 0xb8, 0xd1, 0x3b, 0x11, 0x49, 0x37, 0x4a, 0x8b, 0xfa, 0x37, - 0x4a, 0x1b, 0x3b, 0xb3, 0xa1, 0xa6, 0x0d, 0xa9, 0x9e, 0x3e, 0xd2, 0x39, 0xfd, 0xd3, 0x22, 0x9c, - 0xcf, 0x0a, 0x31, 0x82, 0xbe, 0x3b, 0x95, 0x76, 0xe9, 0x95, 0x41, 0x83, 0x93, 0xf0, 0x5c, 0x4c, - 0x22, 0x26, 0xdb, 0x82, 0x99, 0x88, 0xa9, 0xef, 0x30, 0x8b, 0x36, 0x99, 0x43, 0x61, 0xc8, 0xd3, - 0x65, 0xc9, 0x2d, 0xfe, 0xd9, 0x81, 0x3b, 0x20, 0xf2, 0x6c, 0x45, 0x29, 0x87, 0x42, 0x59, 0xdc, - 0xdf, 0xa1, 0x50, 0xb6, 0x3c, 0xef, 0xc2, 0xb8, 0xf6, 0x35, 0x8f, 0x74, 0xc6, 0x77, 0xe9, 0x89, - 0xa2, 0xf5, 0xfb, 0x91, 0xce, 0xfa, 0x4f, 0x58, 0x90, 0xb2, 0xe9, 0x53, 0x2a, 0x29, 0x2b, 0x57, - 0x25, 0x75, 0x19, 0x86, 0xc2, 0xc0, 0x23, 0xe9, 0x4c, 0x3c, 0x38, 0xf0, 0x08, 0x66, 0x10, 0x8a, - 0x11, 0x27, 0x0a, 0x89, 0x09, 0xfd, 0xb2, 0x25, 0xae, 0x51, 0xcf, 0xc0, 0xb0, 0x47, 0xf6, 0x89, - 0xd4, 0x46, 0x28, 0x9e, 0x7c, 0x8b, 0x16, 0x62, 0x0e, 0xb3, 0x7f, 0x69, 0x08, 0x9e, 0xea, 0xe9, - 0x92, 0x4b, 0xaf, 0x2c, 0x2d, 0x27, 0x26, 0xf7, 0x9d, 0x83, 0x74, 0x9c, 0xf0, 0xeb, 0xbc, 0x18, - 0x4b, 0x38, 0xb3, 0x40, 0xe6, 0xa1, 0x46, 0x53, 0x0a, 0x3c, 0x11, 0x61, 0x54, 0x40, 0x4d, 0xc5, - 0x51, 0xf1, 0x34, 0x14, 0x47, 0xd7, 0x00, 0xa2, 0xc8, 0x5b, 0xf5, 0xa9, 0x04, 0xd6, 0x14, 0xa6, - 0xcd, 0x49, 0x48, 0xda, 0xfa, 0x2d, 0x01, 0xc1, 0x1a, 0x16, 0xaa, 0xc0, 0x4c, 0x3b, 0x0c, 0x62, - 0xae, 0x0f, 0xad, 0x70, 0x23, 0x99, 0x61, 0xd3, 0x1b, 0xb2, 0x96, 0x82, 0xe3, 0xae, 0x1a, 0xe8, - 0x55, 0x18, 0x17, 0x1e, 0x92, 0xb5, 0x20, 0xf0, 0x84, 0xaa, 0x46, 0x99, 0x5c, 0xd4, 0x13, 0x10, - 0xd6, 0xf1, 0xb4, 0x6a, 0x4c, 0xc9, 0x3a, 0x9a, 0x59, 0x8d, 0x2b, 0x5a, 0x35, 0xbc, 0x54, 0xb8, - 0xa1, 0xb1, 0x81, 0xc2, 0x0d, 0x25, 0xca, 0xab, 0xd2, 0xc0, 0xef, 0x4a, 0xd0, 0x57, 0xdd, 0xf3, - 0xf3, 0x43, 0x70, 0x4e, 0x2c, 0x9c, 0x47, 0xbd, 0x5c, 0xee, 0x74, 0x2f, 0x97, 0xd3, 0x50, 0x6f, - 0x7d, 0x6b, 0xcd, 0x9c, 0xf5, 0x9a, 0xf9, 0x46, 0x11, 0x46, 0xf8, 0x54, 0x9c, 0x81, 0x0c, 0xbf, - 0x26, 0x94, 0x7e, 0x3d, 0x02, 0xed, 0xf0, 0xbe, 0x2c, 0x54, 0x9c, 0xd8, 0xe1, 0xe7, 0x97, 0x62, - 0xa3, 0x89, 0x7a, 0x10, 0x2d, 0x18, 0x8c, 0x76, 0x3e, 0xa5, 0xd5, 0x02, 0x4e, 0x43, 0x63, 0xbb, - 0x5f, 0x06, 0x88, 0xe2, 0xd0, 0xf5, 0x5b, 0x94, 0x86, 0x08, 0xd9, 0xf4, 0x5c, 0x8f, 0xd6, 0xeb, - 0x0a, 0x99, 0xf7, 0x21, 0x59, 0x82, 0x0a, 0x80, 0x35, 0x8a, 0xf3, 0xaf, 0x41, 0x49, 0x21, 0xf7, - 0x53, 0x01, 0x4c, 0xe8, 0xa7, 0xde, 0x17, 0x60, 0x3a, 0xd5, 0xd6, 0x89, 0x34, 0x08, 0xbf, 0x6c, - 0xc1, 0x34, 0xef, 0xf2, 0xaa, 0xbf, 0x2f, 0x36, 0xfb, 0x07, 0x70, 0xde, 0xcb, 0xd8, 0x74, 0x62, - 0x46, 0x07, 0xdf, 0xa4, 0x4a, 0x63, 0x90, 0x05, 0xc5, 0x99, 0x6d, 0xa0, 0xab, 0x30, 0xc6, 0x5d, - 0x76, 0x1c, 0x4f, 0xb8, 0x59, 0x4c, 0xf0, 0xd4, 0x1d, 0xbc, 0x0c, 0x2b, 0xa8, 0xfd, 0x7b, 0x16, - 0xcc, 0xf2, 0x9e, 0xdf, 0x24, 0x07, 0xea, 0x76, 0xfc, 0x51, 0xf6, 0x5d, 0x64, 0x26, 0x29, 0xe4, - 0x64, 0x26, 0xd1, 0x3f, 0xad, 0xd8, 0xf3, 0xd3, 0x7e, 0xce, 0x02, 0xb1, 0x02, 0xcf, 0xe0, 0x1e, - 0xf8, 0xed, 0xe6, 0x3d, 0x70, 0x3e, 0x7f, 0x51, 0xe7, 0x5c, 0x00, 0xff, 0xdc, 0x82, 0x19, 0x8e, - 0x90, 0x3c, 0x44, 0x7e, 0xa4, 0xf3, 0x30, 0x48, 0xba, 0x3c, 0x95, 0x9f, 0x3c, 0xfb, 0xa3, 0x8c, - 0xc9, 0x1a, 0xea, 0x39, 0x59, 0x4d, 0xb9, 0x81, 0x4e, 0x90, 0x06, 0xf2, 0xc4, 0xc1, 0x74, 0xed, - 0x3f, 0xb1, 0x00, 0xf1, 0x66, 0x8c, 0x73, 0x99, 0x9e, 0x76, 0xac, 0x54, 0xd3, 0x04, 0x25, 0xac, - 0x46, 0x41, 0xb0, 0x86, 0x75, 0x2a, 0xc3, 0x93, 0x7a, 0x4d, 0x2e, 0xf6, 0x7f, 0x4d, 0x3e, 0xc1, - 0x88, 0x7e, 0x63, 0x08, 0xd2, 0x36, 0xda, 0xe8, 0x2e, 0x4c, 0x34, 0x9c, 0xb6, 0xb3, 0xe5, 0x7a, - 0x6e, 0xec, 0x92, 0xa8, 0x97, 0x19, 0xca, 0x8a, 0x86, 0x27, 0xde, 0x09, 0xb5, 0x12, 0x6c, 0xd0, - 0x41, 0x0b, 0x00, 0xed, 0xd0, 0xdd, 0x77, 0x3d, 0xd2, 0x62, 0x57, 0x61, 0xe6, 0xd8, 0xc5, 0x6d, - 0x2b, 0x64, 0x29, 0xd6, 0x30, 0x32, 0x1c, 0x81, 0x8a, 0x8f, 0xce, 0x11, 0x68, 0xe8, 0x84, 0x8e, - 0x40, 0xc3, 0x03, 0x39, 0x02, 0x61, 0x78, 0x4c, 0x9e, 0xdd, 0xf4, 0xff, 0x9a, 0xeb, 0x11, 0x21, - 0xb0, 0x71, 0x77, 0xaf, 0xf9, 0xa3, 0xc3, 0xf2, 0x63, 0x38, 0x13, 0x03, 0xe7, 0xd4, 0x44, 0x5f, - 0x84, 0x39, 0xc7, 0xf3, 0x82, 0xfb, 0x6a, 0xd4, 0x56, 0xa3, 0x86, 0xe3, 0x25, 0xb1, 0xe5, 0xc7, - 0x96, 0x9f, 0x3c, 0x3a, 0x2c, 0xcf, 0x2d, 0xe5, 0xe0, 0xe0, 0xdc, 0xda, 0x29, 0x3f, 0xa2, 0xb1, - 0xbe, 0x7e, 0x44, 0xbb, 0x70, 0xae, 0x4e, 0x42, 0x99, 0x89, 0x56, 0x6d, 0xc9, 0x4d, 0x28, 0x85, - 0x29, 0x26, 0x34, 0x50, 0x0c, 0x18, 0x2d, 0x4e, 0xa8, 0x64, 0x3a, 0x09, 0x21, 0xfb, 0xcf, 0x2c, - 0x18, 0x15, 0x76, 0xe2, 0x67, 0x20, 0xfb, 0x2c, 0x19, 0xfa, 0xcb, 0x72, 0x36, 0xa3, 0x66, 0x9d, - 0xc9, 0xd5, 0x5c, 0x56, 0x53, 0x9a, 0xcb, 0xa7, 0x7b, 0x11, 0xe9, 0xad, 0xb3, 0xfc, 0xb1, 0x22, - 0x4c, 0x99, 0x36, 0xf2, 0x67, 0x30, 0x04, 0x1b, 0x30, 0x1a, 0x09, 0x87, 0x8c, 0x42, 0xbe, 0xe1, - 0x6c, 0x7a, 0x12, 0x13, 0xab, 0x18, 0xe1, 0x82, 0x21, 0x89, 0x64, 0x7a, 0x7a, 0x14, 0x1f, 0xa1, - 0xa7, 0x47, 0x3f, 0x37, 0x85, 0xa1, 0xd3, 0x70, 0x53, 0xb0, 0x7f, 0x95, 0x1d, 0x16, 0x7a, 0xf9, - 0x19, 0xc8, 0x11, 0xd7, 0xcd, 0x63, 0xc5, 0xee, 0xb1, 0xb2, 0x44, 0xa7, 0x72, 0xe4, 0x89, 0x7f, - 0x66, 0xc1, 0xb8, 0x40, 0x3c, 0x83, 0x6e, 0x7f, 0x87, 0xd9, 0xed, 0x27, 0x7a, 0x74, 0x3b, 0xa7, - 0xbf, 0xff, 0xa0, 0xa0, 0xfa, 0x5b, 0x0b, 0xc2, 0x78, 0xa0, 0xdc, 0x24, 0x63, 0xf4, 0xf6, 0x18, - 0x34, 0x02, 0x4f, 0x1c, 0xfe, 0x4f, 0x26, 0x1e, 0xc2, 0xbc, 0xfc, 0x58, 0xfb, 0x8d, 0x15, 0x36, - 0x73, 0x60, 0x0d, 0xc2, 0x58, 0x1c, 0xb8, 0x89, 0x03, 0x6b, 0x10, 0xc6, 0x98, 0x41, 0x50, 0x13, - 0x20, 0x76, 0xc2, 0x16, 0x89, 0x69, 0x99, 0x08, 0x36, 0x90, 0xbf, 0x0b, 0x3b, 0xb1, 0xeb, 0x2d, - 0xb8, 0x7e, 0x1c, 0xc5, 0xe1, 0x42, 0xd5, 0x8f, 0x6f, 0x87, 0xfc, 0x2e, 0xa1, 0xb9, 0xfc, 0x2a, - 0x5a, 0x58, 0xa3, 0x2b, 0x7d, 0xc8, 0x58, 0x1b, 0xc3, 0xe6, 0xc3, 0xe2, 0x86, 0x28, 0xc7, 0x0a, - 0xc3, 0x7e, 0x8d, 0xf1, 0x64, 0x36, 0x40, 0x27, 0xf3, 0xc6, 0xfd, 0xed, 0x31, 0x35, 0xb4, 0xec, - 0x55, 0xa1, 0xa2, 0xfb, 0xfc, 0xf6, 0x66, 0x81, 0xb4, 0x61, 0xdd, 0x1f, 0x21, 0x71, 0x0c, 0x46, - 0xdf, 0xd9, 0xf5, 0xde, 0xfc, 0x62, 0x1f, 0x5e, 0x7a, 0x82, 0x17, 0x66, 0x16, 0xe0, 0x96, 0x05, - 0x02, 0xad, 0xd6, 0xd2, 0xd9, 0x63, 0x56, 0x24, 0x00, 0x27, 0x38, 0x68, 0x51, 0xdc, 0x44, 0xb9, - 0x3e, 0xef, 0x89, 0xd4, 0x4d, 0x54, 0x7e, 0xbe, 0x76, 0x15, 0x7d, 0x09, 0xc6, 0x55, 0x46, 0xbe, - 0x1a, 0x4f, 0x6c, 0x26, 0x42, 0x2f, 0xac, 0x26, 0xc5, 0x58, 0xc7, 0x41, 0x9b, 0x30, 0x1d, 0xf1, - 0x74, 0x81, 0x2a, 0xc2, 0x16, 0xd7, 0x33, 0x3c, 0x27, 0xdf, 0xa9, 0xeb, 0x26, 0xf8, 0x98, 0x15, - 0xf1, 0xcd, 0x2a, 0x1d, 0xc1, 0xd2, 0x24, 0xd0, 0x9b, 0x30, 0xe5, 0xe9, 0x69, 0xd3, 0x6b, 0x42, - 0x0d, 0xa1, 0xcc, 0x38, 0x8d, 0xa4, 0xea, 0x35, 0x9c, 0xc2, 0xa6, 0x42, 0x83, 0x5e, 0x22, 0xa2, - 0xc2, 0x39, 0x7e, 0x8b, 0x44, 0x22, 0x9f, 0x18, 0x13, 0x1a, 0x6e, 0xe5, 0xe0, 0xe0, 0xdc, 0xda, - 0xe8, 0x75, 0x98, 0x90, 0x9f, 0xaf, 0xb9, 0x39, 0x26, 0xc6, 0xc2, 0x1a, 0x0c, 0x1b, 0x98, 0xe8, - 0x3e, 0x5c, 0x90, 0xff, 0x37, 0x43, 0x67, 0x7b, 0xdb, 0x6d, 0x08, 0x2f, 0x53, 0xee, 0x31, 0xb1, - 0x24, 0x5d, 0x30, 0x56, 0xb3, 0x90, 0x8e, 0x0f, 0xcb, 0x97, 0xc5, 0xa8, 0x65, 0xc2, 0xd9, 0x24, - 0x66, 0xd3, 0x47, 0xeb, 0x70, 0x6e, 0x87, 0x38, 0x5e, 0xbc, 0xb3, 0xb2, 0x43, 0x1a, 0xbb, 0x72, - 0x13, 0x31, 0xe7, 0x49, 0xcd, 0xc4, 0xf6, 0x46, 0x37, 0x0a, 0xce, 0xaa, 0x87, 0xde, 0x85, 0xb9, - 0x76, 0x67, 0xcb, 0x73, 0xa3, 0x9d, 0x8d, 0x20, 0x66, 0x4f, 0xe3, 0x2a, 0xa1, 0x9d, 0xf0, 0xb2, - 0x54, 0x8e, 0xa3, 0xb5, 0x1c, 0x3c, 0x9c, 0x4b, 0x01, 0x7d, 0x00, 0x17, 0x52, 0x8b, 0x41, 0xf8, - 0x7c, 0x4d, 0xe5, 0xc7, 0xd8, 0xac, 0x67, 0x55, 0x10, 0x3e, 0x5c, 0x59, 0x20, 0x9c, 0xdd, 0xc4, - 0x87, 0x33, 0x98, 0x78, 0x9f, 0x56, 0xd6, 0xa4, 0x1b, 0xf4, 0x15, 0x98, 0xd0, 0x57, 0x91, 0x38, - 0x60, 0xae, 0x64, 0x1f, 0xfe, 0xda, 0x6a, 0xe3, 0xb2, 0x91, 0x5a, 0x51, 0x3a, 0x0c, 0x1b, 0x14, - 0x6d, 0x02, 0xd9, 0xdf, 0x87, 0x6e, 0xc1, 0x58, 0xc3, 0x73, 0x89, 0x1f, 0x57, 0x6b, 0xbd, 0xa2, - 0x09, 0xac, 0x08, 0x1c, 0x31, 0x60, 0x22, 0x28, 0x21, 0x2f, 0xc3, 0x8a, 0x82, 0xfd, 0xeb, 0x05, - 0x28, 0xf7, 0x89, 0x70, 0x99, 0xd2, 0x19, 0x5a, 0x03, 0xe9, 0x0c, 0x97, 0x64, 0x7a, 0xbe, 0x8d, - 0xd4, 0x7d, 0x35, 0x95, 0x7a, 0x2f, 0xb9, 0xb5, 0xa6, 0xf1, 0x07, 0xb6, 0xb3, 0xd4, 0xd5, 0x8e, - 0x43, 0x7d, 0x2d, 0x80, 0x8d, 0xe7, 0x86, 0xe1, 0xc1, 0x25, 0xfa, 0x5c, 0xd5, 0xb1, 0xfd, 0xab, - 0x05, 0xb8, 0xa0, 0x86, 0xf0, 0xaf, 0xee, 0xc0, 0xdd, 0xe9, 0x1e, 0xb8, 0x53, 0x50, 0xbc, 0xdb, - 0xb7, 0x61, 0xa4, 0x7e, 0x10, 0x35, 0x62, 0x6f, 0x00, 0x01, 0xe8, 0x19, 0x33, 0xaa, 0x8e, 0x3a, - 0xa6, 0x8d, 0xc8, 0x3a, 0x7f, 0xd3, 0x82, 0xe9, 0xcd, 0x95, 0x5a, 0x3d, 0x68, 0xec, 0x92, 0x78, - 0x89, 0xab, 0x95, 0xb0, 0x90, 0x7f, 0xac, 0x87, 0x94, 0x6b, 0xb2, 0x24, 0xa6, 0xcb, 0x30, 0xb4, - 0x13, 0x44, 0x71, 0xfa, 0x55, 0xee, 0x46, 0x10, 0xc5, 0x98, 0x41, 0xec, 0xdf, 0xb7, 0x60, 0x98, - 0x25, 0x95, 0xed, 0x97, 0x7c, 0x78, 0x90, 0xef, 0x42, 0xaf, 0xc2, 0x08, 0xd9, 0xde, 0x26, 0x8d, - 0x58, 0xcc, 0xaa, 0x74, 0xeb, 0x1b, 0x59, 0x65, 0xa5, 0xf4, 0xd0, 0x67, 0x8d, 0xf1, 0xbf, 0x58, - 0x20, 0xa3, 0x7b, 0x50, 0x8a, 0xdd, 0x3d, 0xb2, 0xd4, 0x6c, 0x8a, 0x77, 0x8d, 0x87, 0xf0, 0xa2, - 0xdc, 0x94, 0x04, 0x70, 0x42, 0xcb, 0xfe, 0x5a, 0x01, 0x20, 0x71, 0x4d, 0xee, 0xf7, 0x89, 0xcb, - 0x5d, 0xf9, 0x95, 0xaf, 0x64, 0xe4, 0x57, 0x46, 0x09, 0xc1, 0x8c, 0xec, 0xca, 0x6a, 0x98, 0x8a, - 0x03, 0x0d, 0xd3, 0xd0, 0x49, 0x86, 0x69, 0x05, 0x66, 0x13, 0xd7, 0x6a, 0x33, 0xce, 0x04, 0x8b, - 0x78, 0xbf, 0x99, 0x06, 0xe2, 0x6e, 0x7c, 0xfb, 0x07, 0x2c, 0x10, 0xee, 0x09, 0x03, 0x2c, 0xe6, - 0x77, 0x64, 0x2a, 0x54, 0x23, 0x50, 0xee, 0xe5, 0x7c, 0x7f, 0x0d, 0x11, 0x1e, 0x57, 0x1d, 0x1e, - 0x46, 0x50, 0x5c, 0x83, 0x96, 0xdd, 0x04, 0x01, 0xad, 0x10, 0xa6, 0x64, 0xe8, 0xdf, 0x9b, 0x6b, - 0x00, 0x4d, 0x86, 0xab, 0xa5, 0x56, 0x54, 0xac, 0xaa, 0xa2, 0x20, 0x58, 0xc3, 0xb2, 0x7f, 0xa4, - 0x00, 0xe3, 0x32, 0x30, 0x2b, 0xbd, 0xc7, 0xf7, 0x6f, 0xe5, 0x44, 0x59, 0x19, 0x58, 0x2e, 0x52, - 0x4a, 0x58, 0x05, 0xef, 0xd7, 0x73, 0x91, 0x4a, 0x00, 0x4e, 0x70, 0xd0, 0xb3, 0x30, 0x1a, 0x75, - 0xb6, 0x18, 0x7a, 0xca, 0xe8, 0xbe, 0xce, 0x8b, 0xb1, 0x84, 0xa3, 0x2f, 0xc2, 0x0c, 0xaf, 0x17, - 0x06, 0x6d, 0xa7, 0xc5, 0x35, 0x4e, 0xc3, 0xca, 0x0b, 0x6e, 0x66, 0x3d, 0x05, 0x3b, 0x3e, 0x2c, - 0x9f, 0x4f, 0x97, 0x31, 0x5d, 0x65, 0x17, 0x15, 0xfb, 0x2b, 0x80, 0xba, 0x63, 0xcd, 0xa2, 0xb7, - 0xb8, 0x59, 0x85, 0x1b, 0x92, 0x66, 0x2f, 0x25, 0xa4, 0xee, 0xb4, 0x25, 0x0d, 0x5f, 0x79, 0x2d, - 0xac, 0xea, 0xd3, 0x9d, 0x37, 0x93, 0x76, 0xe1, 0x41, 0x37, 0x60, 0x84, 0x33, 0x55, 0x41, 0xbe, - 0xc7, 0x1b, 0x97, 0xe6, 0xf8, 0xc3, 0x02, 0xe1, 0x0b, 0xbe, 0x2c, 0xea, 0xa3, 0x77, 0x61, 0xbc, - 0x19, 0xdc, 0xf7, 0xef, 0x3b, 0x61, 0x73, 0xa9, 0x56, 0x15, 0xeb, 0x32, 0x53, 0x36, 0xab, 0x24, - 0x68, 0xba, 0x33, 0x11, 0xd3, 0xe7, 0x26, 0x20, 0xac, 0x93, 0x43, 0x9b, 0x2c, 0x7e, 0xd6, 0xb6, - 0xdb, 0x5a, 0x77, 0xda, 0xbd, 0xec, 0xe0, 0x56, 0x24, 0x92, 0x46, 0x79, 0x52, 0x04, 0xd9, 0xe2, - 0x00, 0x9c, 0x10, 0xb2, 0xbf, 0x7a, 0x0e, 0x8c, 0xfd, 0x60, 0xe4, 0x7d, 0xb0, 0x4e, 0x29, 0xef, - 0x03, 0x86, 0x31, 0xb2, 0xd7, 0x8e, 0x0f, 0x2a, 0x6e, 0xd8, 0x2b, 0x71, 0xd0, 0xaa, 0xc0, 0xe9, - 0xa6, 0x29, 0x21, 0x58, 0xd1, 0xc9, 0x4e, 0xce, 0x51, 0xfc, 0x08, 0x93, 0x73, 0x0c, 0x9d, 0x61, - 0x72, 0x8e, 0x0d, 0x18, 0x6d, 0xb9, 0x31, 0x26, 0xed, 0x40, 0x08, 0x14, 0x99, 0x2b, 0xe1, 0x3a, - 0x47, 0xe9, 0x0e, 0x0d, 0x2f, 0x00, 0x58, 0x12, 0x41, 0x6f, 0xa9, 0x3d, 0x30, 0x92, 0x2f, 0x8f, - 0x77, 0x3f, 0x87, 0x64, 0xee, 0x02, 0x91, 0x8c, 0x63, 0xf4, 0x61, 0x93, 0x71, 0xac, 0xc9, 0x14, - 0x1a, 0x63, 0xf9, 0x66, 0xa3, 0x2c, 0x43, 0x46, 0x9f, 0xc4, 0x19, 0x46, 0xb2, 0x91, 0xd2, 0xe9, - 0x25, 0x1b, 0xf9, 0x01, 0x0b, 0x2e, 0xb4, 0xb3, 0xf2, 0xee, 0x88, 0x14, 0x18, 0xaf, 0x0e, 0x9c, - 0x58, 0xc8, 0x68, 0x90, 0x5d, 0xcc, 0x32, 0xd1, 0x70, 0x76, 0x73, 0x74, 0xa0, 0xc3, 0xad, 0xa6, - 0xc8, 0x9b, 0xf1, 0x4c, 0x4e, 0xd6, 0x92, 0x1e, 0xb9, 0x4a, 0x36, 0x33, 0x72, 0x65, 0x7c, 0x32, - 0x2f, 0x57, 0xc6, 0xc0, 0x19, 0x32, 0x92, 0x7c, 0x25, 0x93, 0x1f, 0x3a, 0x5f, 0xc9, 0x5b, 0x2a, - 0x5f, 0x49, 0x8f, 0xa8, 0x43, 0x3c, 0x1b, 0x49, 0xdf, 0x2c, 0x25, 0x5a, 0xa6, 0x91, 0xe9, 0xd3, - 0xc9, 0x34, 0x62, 0x30, 0x7b, 0x9e, 0xec, 0xe2, 0xf9, 0x3e, 0xcc, 0xde, 0xa0, 0xdb, 0x9b, 0xdd, - 0xf3, 0xac, 0x2a, 0xb3, 0x0f, 0x95, 0x55, 0xe5, 0xae, 0x9e, 0xa5, 0x04, 0xf5, 0x49, 0xc3, 0x41, - 0x91, 0x06, 0xcc, 0x4d, 0x72, 0x57, 0x3f, 0x82, 0xce, 0xe5, 0xd3, 0x55, 0x27, 0x4d, 0x37, 0xdd, - 0xac, 0x43, 0xa8, 0x3b, 0xe7, 0xc9, 0xf9, 0xb3, 0xc9, 0x79, 0x72, 0xe1, 0xd4, 0x73, 0x9e, 0x3c, - 0x76, 0x06, 0x39, 0x4f, 0x1e, 0xff, 0x48, 0x73, 0x9e, 0xcc, 0x3d, 0x82, 0x9c, 0x27, 0x1b, 0x49, - 0xce, 0x93, 0x8b, 0xf9, 0x53, 0x92, 0x61, 0x27, 0x97, 0x93, 0xe9, 0xe4, 0x2e, 0x94, 0xda, 0xd2, - 0xcb, 0x5b, 0x84, 0x45, 0xca, 0x4e, 0xb6, 0x98, 0xe5, 0x0a, 0xce, 0xa7, 0x44, 0x81, 0x70, 0x42, - 0x8a, 0xd2, 0x4d, 0x32, 0x9f, 0x3c, 0xd1, 0x43, 0xf5, 0x96, 0xa5, 0xd4, 0xc8, 0xcf, 0x77, 0x62, - 0xff, 0xad, 0x02, 0x5c, 0xea, 0xbd, 0xae, 0x13, 0x8d, 0x48, 0x2d, 0xd1, 0xe0, 0xa7, 0x34, 0x22, - 0xfc, 0x9a, 0x91, 0x60, 0x0d, 0x1c, 0x0a, 0xe3, 0x3a, 0xcc, 0x2a, 0x03, 0x39, 0xcf, 0x6d, 0x1c, - 0x68, 0x49, 0x18, 0x95, 0xb3, 0x4e, 0x3d, 0x8d, 0x80, 0xbb, 0xeb, 0xa0, 0x25, 0x98, 0x36, 0x0a, - 0xab, 0x15, 0x71, 0x9d, 0x50, 0x2a, 0x98, 0xba, 0x09, 0xc6, 0x69, 0x7c, 0xfb, 0xeb, 0x16, 0x3c, - 0x9e, 0x13, 0x0e, 0x7c, 0xe0, 0x48, 0x0f, 0xdb, 0x30, 0xdd, 0x36, 0xab, 0xf6, 0x09, 0x08, 0x63, - 0x04, 0x1d, 0x57, 0x7d, 0x4d, 0x01, 0x70, 0x9a, 0xe8, 0xf2, 0xd5, 0xdf, 0xfc, 0xc3, 0x4b, 0x9f, - 0xf8, 0x9d, 0x3f, 0xbc, 0xf4, 0x89, 0xdf, 0xfb, 0xc3, 0x4b, 0x9f, 0xf8, 0xeb, 0x47, 0x97, 0xac, - 0xdf, 0x3c, 0xba, 0x64, 0xfd, 0xce, 0xd1, 0x25, 0xeb, 0xf7, 0x8e, 0x2e, 0x59, 0x7f, 0x70, 0x74, - 0xc9, 0xfa, 0xda, 0x1f, 0x5d, 0xfa, 0xc4, 0x3b, 0x85, 0xfd, 0x97, 0xfe, 0x7f, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xcc, 0x93, 0x27, 0x7c, 0x56, 0xe4, 0x00, 0x00, + // 12696 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x6c, 0x24, 0x57, + 0x76, 0x18, 0xbc, 0xd5, 0xdd, 0x7c, 0xf4, 0xe1, 0xfb, 0xce, 0x70, 0xc4, 0xa1, 0x34, 0xd3, 0xa3, + 0xd2, 0xee, 0x68, 0xb4, 0x92, 0xc8, 0xd5, 0x48, 0x5a, 0xc9, 0xab, 0x5d, 0xd9, 0x24, 0x9b, 0x9c, + 0xa1, 0x66, 0xc8, 0x69, 0xdd, 0xe6, 0x8c, 0x76, 0x65, 0xed, 0x7a, 0x8b, 0xdd, 0x97, 0x64, 0x89, + 0xc5, 0xaa, 0x56, 0x55, 0x35, 0x67, 0xa8, 0xcf, 0x06, 0xbe, 0xac, 0x63, 0x27, 0x7e, 0x20, 0x58, + 0xc4, 0x46, 0x1e, 0xb6, 0xe1, 0x00, 0x8e, 0x03, 0xdb, 0x71, 0x12, 0xc4, 0xb1, 0x63, 0x3b, 0xbb, + 0x76, 0xe2, 0x38, 0xf9, 0xe1, 0xfc, 0xd9, 0x38, 0x01, 0x82, 0x35, 0x60, 0x84, 0xb1, 0x69, 0x27, + 0x81, 0x7f, 0xe4, 0x81, 0x38, 0x7f, 0xcc, 0x18, 0x71, 0x70, 0x9f, 0x75, 0x6f, 0x75, 0x55, 0x77, + 0x73, 0xc4, 0xa1, 0x64, 0x63, 0xff, 0x75, 0xdf, 0x73, 0xee, 0xb9, 0xb7, 0xee, 0xf3, 0x9c, 0x73, + 0xcf, 0x03, 0x5e, 0xdb, 0x7d, 0x35, 0x9a, 0x73, 0x83, 0xf9, 0xdd, 0xf6, 0x26, 0x09, 0x7d, 0x12, + 0x93, 0x68, 0x7e, 0x9f, 0xf8, 0xcd, 0x20, 0x9c, 0x17, 0x00, 0xa7, 0xe5, 0xce, 0x37, 0x82, 0x90, + 0xcc, 0xef, 0xbf, 0x30, 0xbf, 0x4d, 0x7c, 0x12, 0x3a, 0x31, 0x69, 0xce, 0xb5, 0xc2, 0x20, 0x0e, + 0x10, 0xe2, 0x38, 0x73, 0x4e, 0xcb, 0x9d, 0xa3, 0x38, 0x73, 0xfb, 0x2f, 0xcc, 0x3e, 0xbf, 0xed, + 0xc6, 0x3b, 0xed, 0xcd, 0xb9, 0x46, 0xb0, 0x37, 0xbf, 0x1d, 0x6c, 0x07, 0xf3, 0x0c, 0x75, 0xb3, + 0xbd, 0xc5, 0xfe, 0xb1, 0x3f, 0xec, 0x17, 0x27, 0x31, 0xbb, 0x96, 0x34, 0x43, 0x1e, 0xc4, 0xc4, + 0x8f, 0xdc, 0xc0, 0x8f, 0x9e, 0x77, 0x5a, 0x6e, 0x44, 0xc2, 0x7d, 0x12, 0xce, 0xb7, 0x76, 0xb7, + 0x29, 0x2c, 0x32, 0x11, 0xe6, 0xf7, 0x5f, 0xd8, 0x24, 0xb1, 0xd3, 0xd1, 0xa3, 0xd9, 0x97, 0x12, + 0x72, 0x7b, 0x4e, 0x63, 0xc7, 0xf5, 0x49, 0x78, 0x20, 0x69, 0xcc, 0x87, 0x24, 0x0a, 0xda, 0x61, + 0x83, 0x9c, 0xa8, 0x56, 0x34, 0xbf, 0x47, 0x62, 0x27, 0xe3, 0xeb, 0x67, 0xe7, 0xf3, 0x6a, 0x85, + 0x6d, 0x3f, 0x76, 0xf7, 0x3a, 0x9b, 0xf9, 0x74, 0xaf, 0x0a, 0x51, 0x63, 0x87, 0xec, 0x39, 0x1d, + 0xf5, 0x5e, 0xcc, 0xab, 0xd7, 0x8e, 0x5d, 0x6f, 0xde, 0xf5, 0xe3, 0x28, 0x0e, 0xd3, 0x95, 0xec, + 0x6f, 0x5a, 0x70, 0x65, 0xe1, 0xad, 0xfa, 0xb2, 0xe7, 0x44, 0xb1, 0xdb, 0x58, 0xf4, 0x82, 0xc6, + 0x6e, 0x3d, 0x0e, 0x42, 0x72, 0x2f, 0xf0, 0xda, 0x7b, 0xa4, 0xce, 0x06, 0x02, 0x3d, 0x07, 0xc3, + 0xfb, 0xec, 0xff, 0x6a, 0x75, 0xc6, 0xba, 0x62, 0x5d, 0x2b, 0x2f, 0x4e, 0xfe, 0xd6, 0x61, 0xe5, + 0x63, 0x47, 0x87, 0x95, 0xe1, 0x7b, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x15, 0x06, 0xb7, 0xa2, 0x8d, + 0x83, 0x16, 0x99, 0x29, 0x30, 0xdc, 0x71, 0x81, 0x3b, 0xb8, 0x52, 0xa7, 0xa5, 0x58, 0x40, 0xd1, + 0x3c, 0x94, 0x5b, 0x4e, 0x18, 0xbb, 0xb1, 0x1b, 0xf8, 0x33, 0xc5, 0x2b, 0xd6, 0xb5, 0x81, 0xc5, + 0x29, 0x81, 0x5a, 0xae, 0x49, 0x00, 0x4e, 0x70, 0x68, 0x37, 0x42, 0xe2, 0x34, 0xef, 0xf8, 0xde, + 0xc1, 0x4c, 0xe9, 0x8a, 0x75, 0x6d, 0x38, 0xe9, 0x06, 0x16, 0xe5, 0x58, 0x61, 0xd8, 0x3f, 0x56, + 0x80, 0xe1, 0x85, 0xad, 0x2d, 0xd7, 0x77, 0xe3, 0x03, 0x74, 0x0f, 0x46, 0xfd, 0xa0, 0x49, 0xe4, + 0x7f, 0xf6, 0x15, 0x23, 0xd7, 0xaf, 0xcc, 0x75, 0xae, 0xcc, 0xb9, 0x75, 0x0d, 0x6f, 0x71, 0xf2, + 0xe8, 0xb0, 0x32, 0xaa, 0x97, 0x60, 0x83, 0x0e, 0xc2, 0x30, 0xd2, 0x0a, 0x9a, 0x8a, 0x6c, 0x81, + 0x91, 0xad, 0x64, 0x91, 0xad, 0x25, 0x68, 0x8b, 0x13, 0x47, 0x87, 0x95, 0x11, 0xad, 0x00, 0xeb, + 0x44, 0xd0, 0x26, 0x4c, 0xd0, 0xbf, 0x7e, 0xec, 0x2a, 0xba, 0x45, 0x46, 0xf7, 0xa9, 0x3c, 0xba, + 0x1a, 0xea, 0xe2, 0xb9, 0xa3, 0xc3, 0xca, 0x44, 0xaa, 0x10, 0xa7, 0x09, 0xda, 0xef, 0xc3, 0xf8, + 0x42, 0x1c, 0x3b, 0x8d, 0x1d, 0xd2, 0xe4, 0x33, 0x88, 0x5e, 0x82, 0x92, 0xef, 0xec, 0x11, 0x31, + 0xbf, 0x57, 0xc4, 0xc0, 0x96, 0xd6, 0x9d, 0x3d, 0x72, 0x7c, 0x58, 0x99, 0xbc, 0xeb, 0xbb, 0xef, + 0xb5, 0xc5, 0xaa, 0xa0, 0x65, 0x98, 0x61, 0xa3, 0xeb, 0x00, 0x4d, 0xb2, 0xef, 0x36, 0x48, 0xcd, + 0x89, 0x77, 0xc4, 0x7c, 0x23, 0x51, 0x17, 0xaa, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x01, 0x94, 0x17, + 0xf6, 0x03, 0xb7, 0x59, 0x0b, 0x9a, 0x11, 0xda, 0x85, 0x89, 0x56, 0x48, 0xb6, 0x48, 0xa8, 0x8a, + 0x66, 0xac, 0x2b, 0xc5, 0x6b, 0x23, 0xd7, 0xaf, 0x65, 0x7e, 0xac, 0x89, 0xba, 0xec, 0xc7, 0xe1, + 0xc1, 0xe2, 0x63, 0xa2, 0xbd, 0x89, 0x14, 0x14, 0xa7, 0x29, 0xdb, 0xff, 0xba, 0x00, 0xd3, 0x0b, + 0xef, 0xb7, 0x43, 0x52, 0x75, 0xa3, 0xdd, 0xf4, 0x0a, 0x6f, 0xba, 0xd1, 0xee, 0x7a, 0x32, 0x02, + 0x6a, 0x69, 0x55, 0x45, 0x39, 0x56, 0x18, 0xe8, 0x79, 0x18, 0xa2, 0xbf, 0xef, 0xe2, 0x55, 0xf1, + 0xc9, 0xe7, 0x04, 0xf2, 0x48, 0xd5, 0x89, 0x9d, 0x2a, 0x07, 0x61, 0x89, 0x83, 0xd6, 0x60, 0xa4, + 0xc1, 0x36, 0xe4, 0xf6, 0x5a, 0xd0, 0x24, 0x6c, 0x32, 0xcb, 0x8b, 0xcf, 0x52, 0xf4, 0xa5, 0xa4, + 0xf8, 0xf8, 0xb0, 0x32, 0xc3, 0xfb, 0x26, 0x48, 0x68, 0x30, 0xac, 0xd7, 0x47, 0xb6, 0xda, 0x5f, + 0x25, 0x46, 0x09, 0x32, 0xf6, 0xd6, 0x35, 0x6d, 0xab, 0x0c, 0xb0, 0xad, 0x32, 0x9a, 0xbd, 0x4d, + 0xd0, 0x0b, 0x50, 0xda, 0x75, 0xfd, 0xe6, 0xcc, 0x20, 0xa3, 0x75, 0x89, 0xce, 0xf9, 0x2d, 0xd7, + 0x6f, 0x1e, 0x1f, 0x56, 0xa6, 0x8c, 0xee, 0xd0, 0x42, 0xcc, 0x50, 0xed, 0x3f, 0xb6, 0xa0, 0xc2, + 0x60, 0x2b, 0xae, 0x47, 0x6a, 0x24, 0x8c, 0xdc, 0x28, 0x26, 0x7e, 0x6c, 0x0c, 0xe8, 0x75, 0x80, + 0x88, 0x34, 0x42, 0x12, 0x6b, 0x43, 0xaa, 0x16, 0x46, 0x5d, 0x41, 0xb0, 0x86, 0x45, 0x0f, 0x84, + 0x68, 0xc7, 0x09, 0xd9, 0xfa, 0x12, 0x03, 0xab, 0x0e, 0x84, 0xba, 0x04, 0xe0, 0x04, 0xc7, 0x38, + 0x10, 0x8a, 0xbd, 0x0e, 0x04, 0xf4, 0x39, 0x98, 0x48, 0x1a, 0x8b, 0x5a, 0x4e, 0x43, 0x0e, 0x20, + 0xdb, 0x32, 0x75, 0x13, 0x84, 0xd3, 0xb8, 0xf6, 0xdf, 0xb7, 0xc4, 0xe2, 0xa1, 0x5f, 0xfd, 0x11, + 0xff, 0x56, 0xfb, 0x57, 0x2d, 0x18, 0x5a, 0x74, 0xfd, 0xa6, 0xeb, 0x6f, 0xa3, 0x2f, 0xc3, 0x30, + 0xbd, 0x9b, 0x9a, 0x4e, 0xec, 0x88, 0x73, 0xef, 0x53, 0xda, 0xde, 0x52, 0x57, 0xc5, 0x5c, 0x6b, + 0x77, 0x9b, 0x16, 0x44, 0x73, 0x14, 0x9b, 0xee, 0xb6, 0x3b, 0x9b, 0xef, 0x92, 0x46, 0xbc, 0x46, + 0x62, 0x27, 0xf9, 0x9c, 0xa4, 0x0c, 0x2b, 0xaa, 0xe8, 0x16, 0x0c, 0xc6, 0x4e, 0xb8, 0x4d, 0x62, + 0x71, 0x00, 0x66, 0x1e, 0x54, 0xbc, 0x26, 0xa6, 0x3b, 0x92, 0xf8, 0x0d, 0x92, 0x5c, 0x0b, 0x1b, + 0xac, 0x2a, 0x16, 0x24, 0xec, 0x1f, 0x1c, 0x84, 0x8b, 0x4b, 0xf5, 0xd5, 0x9c, 0x75, 0x75, 0x15, + 0x06, 0x9b, 0xa1, 0xbb, 0x4f, 0x42, 0x31, 0xce, 0x8a, 0x4a, 0x95, 0x95, 0x62, 0x01, 0x45, 0xaf, + 0xc2, 0x28, 0xbf, 0x90, 0x6e, 0x3a, 0x7e, 0xd3, 0x93, 0x43, 0x7c, 0x5e, 0x60, 0x8f, 0xde, 0xd3, + 0x60, 0xd8, 0xc0, 0x3c, 0xe1, 0xa2, 0xba, 0x9a, 0xda, 0x8c, 0x79, 0x97, 0xdd, 0x0f, 0x58, 0x30, + 0xc9, 0x9b, 0x59, 0x88, 0xe3, 0xd0, 0xdd, 0x6c, 0xc7, 0x24, 0x9a, 0x19, 0x60, 0x27, 0xdd, 0x52, + 0xd6, 0x68, 0xe5, 0x8e, 0xc0, 0xdc, 0xbd, 0x14, 0x15, 0x7e, 0x08, 0xce, 0x88, 0x76, 0x27, 0xd3, + 0x60, 0xdc, 0xd1, 0x2c, 0xfa, 0x5e, 0x0b, 0x66, 0x1b, 0x81, 0x1f, 0x87, 0x81, 0xe7, 0x91, 0xb0, + 0xd6, 0xde, 0xf4, 0xdc, 0x68, 0x87, 0xaf, 0x53, 0x4c, 0xb6, 0xd8, 0x49, 0x90, 0x33, 0x87, 0x0a, + 0x49, 0xcc, 0xe1, 0xe5, 0xa3, 0xc3, 0xca, 0xec, 0x52, 0x2e, 0x29, 0xdc, 0xa5, 0x19, 0xb4, 0x0b, + 0x88, 0x5e, 0xa5, 0xf5, 0xd8, 0xd9, 0x26, 0x49, 0xe3, 0x43, 0xfd, 0x37, 0x7e, 0xe1, 0xe8, 0xb0, + 0x82, 0xd6, 0x3b, 0x48, 0xe0, 0x0c, 0xb2, 0xe8, 0x3d, 0x38, 0x4f, 0x4b, 0x3b, 0xbe, 0x75, 0xb8, + 0xff, 0xe6, 0x66, 0x8e, 0x0e, 0x2b, 0xe7, 0xd7, 0x33, 0x88, 0xe0, 0x4c, 0xd2, 0xb3, 0x4b, 0x30, + 0x9d, 0x39, 0x55, 0x68, 0x12, 0x8a, 0xbb, 0x84, 0xb3, 0x20, 0x65, 0x4c, 0x7f, 0xa2, 0xf3, 0x30, + 0xb0, 0xef, 0x78, 0x6d, 0xb1, 0x4a, 0x31, 0xff, 0xf3, 0x99, 0xc2, 0xab, 0x96, 0xdd, 0x80, 0xd1, + 0x25, 0xa7, 0xe5, 0x6c, 0xba, 0x9e, 0x1b, 0xbb, 0x24, 0x42, 0x4f, 0x43, 0xd1, 0x69, 0x36, 0xd9, + 0x15, 0x59, 0x5e, 0x9c, 0x3e, 0x3a, 0xac, 0x14, 0x17, 0x9a, 0xf4, 0xac, 0x06, 0x85, 0x75, 0x80, + 0x29, 0x06, 0xfa, 0x24, 0x94, 0x9a, 0x61, 0xd0, 0x9a, 0x29, 0x30, 0x4c, 0x3a, 0x54, 0xa5, 0x6a, + 0x18, 0xb4, 0x52, 0xa8, 0x0c, 0xc7, 0xfe, 0x8d, 0x02, 0x3c, 0xb1, 0x44, 0x5a, 0x3b, 0x2b, 0xf5, + 0x9c, 0x4d, 0x77, 0x0d, 0x86, 0xf7, 0x02, 0xdf, 0x8d, 0x83, 0x30, 0x12, 0x4d, 0xb3, 0xdb, 0x64, + 0x4d, 0x94, 0x61, 0x05, 0x45, 0x57, 0xa0, 0xd4, 0x4a, 0x38, 0x81, 0x51, 0xc9, 0x45, 0x30, 0x1e, + 0x80, 0x41, 0x28, 0x46, 0x3b, 0x22, 0xa1, 0xb8, 0x05, 0x15, 0xc6, 0xdd, 0x88, 0x84, 0x98, 0x41, + 0x92, 0xe3, 0x94, 0x1e, 0xb4, 0x62, 0x5b, 0xa5, 0x8e, 0x53, 0x0a, 0xc1, 0x1a, 0x16, 0xaa, 0x41, + 0x39, 0x52, 0x93, 0x3a, 0xd0, 0xff, 0xa4, 0x8e, 0xb1, 0xf3, 0x56, 0xcd, 0x64, 0x42, 0xc4, 0x38, + 0x06, 0x06, 0x7b, 0x9e, 0xb7, 0x5f, 0x2f, 0x00, 0xe2, 0x43, 0xf8, 0xe7, 0x6c, 0xe0, 0xee, 0x76, + 0x0e, 0x5c, 0x26, 0xe7, 0x75, 0x3b, 0x68, 0x38, 0x5e, 0xfa, 0x08, 0x3f, 0xad, 0xd1, 0xfb, 0xdf, + 0x16, 0x3c, 0xb1, 0xe4, 0xfa, 0x4d, 0x12, 0xe6, 0x2c, 0xc0, 0x47, 0x23, 0x80, 0x9c, 0xec, 0xa4, + 0x37, 0x96, 0x58, 0xe9, 0x14, 0x96, 0x98, 0xfd, 0x3f, 0x2c, 0x40, 0xfc, 0xb3, 0x3f, 0x72, 0x1f, + 0x7b, 0xb7, 0xf3, 0x63, 0x4f, 0x61, 0x59, 0xd8, 0xb7, 0x61, 0x7c, 0xc9, 0x73, 0x89, 0x1f, 0xaf, + 0xd6, 0x96, 0x02, 0x7f, 0xcb, 0xdd, 0x46, 0x9f, 0x81, 0x71, 0x2a, 0xd3, 0x06, 0xed, 0xb8, 0x4e, + 0x1a, 0x81, 0xcf, 0xd8, 0x7f, 0x2a, 0x09, 0xa2, 0xa3, 0xc3, 0xca, 0xf8, 0x86, 0x01, 0xc1, 0x29, + 0x4c, 0xfb, 0x77, 0xe9, 0xf8, 0x05, 0x7b, 0xad, 0xc0, 0x27, 0x7e, 0xbc, 0x14, 0xf8, 0x4d, 0x2e, + 0x26, 0x7e, 0x06, 0x4a, 0x31, 0x1d, 0x0f, 0x3e, 0x76, 0x57, 0xe5, 0x46, 0xa1, 0xa3, 0x70, 0x7c, + 0x58, 0xb9, 0xd0, 0x59, 0x83, 0x8d, 0x13, 0xab, 0x83, 0xbe, 0x0d, 0x06, 0xa3, 0xd8, 0x89, 0xdb, + 0x91, 0x18, 0xcd, 0x27, 0xe5, 0x68, 0xd6, 0x59, 0xe9, 0xf1, 0x61, 0x65, 0x42, 0x55, 0xe3, 0x45, + 0x58, 0x54, 0x40, 0xcf, 0xc0, 0xd0, 0x1e, 0x89, 0x22, 0x67, 0x5b, 0x72, 0xf8, 0x13, 0xa2, 0xee, + 0xd0, 0x1a, 0x2f, 0xc6, 0x12, 0x8e, 0x9e, 0x82, 0x01, 0x12, 0x86, 0x41, 0x28, 0xf6, 0xe8, 0x98, + 0x40, 0x1c, 0x58, 0xa6, 0x85, 0x98, 0xc3, 0xec, 0x7f, 0x6b, 0xc1, 0x84, 0xea, 0x2b, 0x6f, 0xeb, + 0x0c, 0x58, 0xb9, 0xb7, 0x01, 0x1a, 0xf2, 0x03, 0x23, 0x76, 0x7b, 0x8c, 0x5c, 0xbf, 0x9a, 0xc9, + 0xa0, 0x74, 0x0c, 0x63, 0x42, 0x59, 0x15, 0x45, 0x58, 0xa3, 0x66, 0xff, 0xba, 0x05, 0xe7, 0x52, + 0x5f, 0x74, 0xdb, 0x8d, 0x62, 0xf4, 0x4e, 0xc7, 0x57, 0xcd, 0xf5, 0xf7, 0x55, 0xb4, 0x36, 0xfb, + 0x26, 0xb5, 0x94, 0x65, 0x89, 0xf6, 0x45, 0x37, 0x61, 0xc0, 0x8d, 0xc9, 0x9e, 0xfc, 0x98, 0xa7, + 0xba, 0x7e, 0x0c, 0xef, 0x55, 0x32, 0x23, 0xab, 0xb4, 0x26, 0xe6, 0x04, 0xec, 0x1f, 0x29, 0x42, + 0x99, 0x2f, 0xdb, 0x35, 0xa7, 0x75, 0x06, 0x73, 0xb1, 0x0a, 0x25, 0x46, 0x9d, 0x77, 0xfc, 0xe9, + 0xec, 0x8e, 0x8b, 0xee, 0xcc, 0x51, 0x39, 0x8d, 0xb3, 0x82, 0xea, 0x6a, 0xa0, 0x45, 0x98, 0x91, + 0x40, 0x0e, 0xc0, 0xa6, 0xeb, 0x3b, 0xe1, 0x01, 0x2d, 0x9b, 0x29, 0x32, 0x82, 0xcf, 0x77, 0x27, + 0xb8, 0xa8, 0xf0, 0x39, 0x59, 0xd5, 0xd7, 0x04, 0x80, 0x35, 0xa2, 0xb3, 0xaf, 0x40, 0x59, 0x21, + 0x9f, 0x84, 0xc7, 0x99, 0xfd, 0x1c, 0x4c, 0xa4, 0xda, 0xea, 0x55, 0x7d, 0x54, 0x67, 0x91, 0xbe, + 0xc6, 0x4e, 0x01, 0xd1, 0xeb, 0x65, 0x7f, 0x5f, 0x9c, 0xa2, 0xef, 0xc3, 0x79, 0x2f, 0xe3, 0x70, + 0x12, 0x53, 0xd5, 0xff, 0x61, 0xf6, 0x84, 0xf8, 0xec, 0xf3, 0x59, 0x50, 0x9c, 0xd9, 0x06, 0xbd, + 0xf6, 0x83, 0x16, 0x5d, 0xf3, 0x8e, 0xc7, 0xfa, 0x2b, 0xa4, 0xef, 0x3b, 0xa2, 0x0c, 0x2b, 0x28, + 0x3d, 0xc2, 0xce, 0xab, 0xce, 0xdf, 0x22, 0x07, 0x75, 0xe2, 0x91, 0x46, 0x1c, 0x84, 0x1f, 0x6a, + 0xf7, 0x2f, 0xf1, 0xd1, 0xe7, 0x27, 0xe0, 0x88, 0x20, 0x50, 0xbc, 0x45, 0x0e, 0xf8, 0x54, 0xe8, + 0x5f, 0x57, 0xec, 0xfa, 0x75, 0xbf, 0x60, 0xc1, 0x98, 0xfa, 0xba, 0x33, 0xd8, 0xea, 0x8b, 0xe6, + 0x56, 0xbf, 0xd4, 0x75, 0x81, 0xe7, 0x6c, 0xf2, 0xaf, 0x17, 0xe0, 0xa2, 0xc2, 0xa1, 0xec, 0x3e, + 0xff, 0x23, 0x56, 0xd5, 0x3c, 0x94, 0x7d, 0xa5, 0x3d, 0xb0, 0x4c, 0xb1, 0x3d, 0xd1, 0x1d, 0x24, + 0x38, 0x94, 0x6b, 0xf3, 0x13, 0x11, 0x7f, 0x54, 0x57, 0xab, 0x09, 0x15, 0xda, 0x22, 0x14, 0xdb, + 0x6e, 0x53, 0xdc, 0x19, 0x9f, 0x92, 0xa3, 0x7d, 0x77, 0xb5, 0x7a, 0x7c, 0x58, 0x79, 0x32, 0x4f, + 0xa5, 0x4b, 0x2f, 0xab, 0x68, 0xee, 0xee, 0x6a, 0x15, 0xd3, 0xca, 0x68, 0x01, 0x26, 0xa4, 0xd6, + 0xfa, 0x1e, 0xe5, 0xa0, 0x02, 0x5f, 0x5c, 0x2d, 0x4a, 0x37, 0x86, 0x4d, 0x30, 0x4e, 0xe3, 0xa3, + 0x2a, 0x4c, 0xee, 0xb6, 0x37, 0x89, 0x47, 0x62, 0xfe, 0xc1, 0xb7, 0x08, 0xd7, 0x1c, 0x95, 0x13, + 0xd1, 0xf2, 0x56, 0x0a, 0x8e, 0x3b, 0x6a, 0xd8, 0x7f, 0xc6, 0x8e, 0x78, 0x31, 0x7a, 0xb5, 0x30, + 0xa0, 0x0b, 0x8b, 0x52, 0xff, 0x30, 0x97, 0x73, 0x3f, 0xab, 0xe2, 0x16, 0x39, 0xd8, 0x08, 0x28, + 0xb3, 0x9d, 0xbd, 0x2a, 0x8c, 0x35, 0x5f, 0xea, 0xba, 0xe6, 0x7f, 0xa9, 0x00, 0xd3, 0x6a, 0x04, + 0x0c, 0xbe, 0xee, 0xcf, 0xfb, 0x18, 0xbc, 0x00, 0x23, 0x4d, 0xb2, 0xe5, 0xb4, 0xbd, 0x58, 0xa9, + 0x31, 0x07, 0xb8, 0x2a, 0xbb, 0x9a, 0x14, 0x63, 0x1d, 0xe7, 0x04, 0xc3, 0xf6, 0xd3, 0x23, 0xec, + 0x6e, 0x8d, 0x1d, 0xba, 0xc6, 0xd5, 0xae, 0xb1, 0x72, 0x77, 0xcd, 0x53, 0x30, 0xe0, 0xee, 0x51, + 0x5e, 0xab, 0x60, 0xb2, 0x50, 0xab, 0xb4, 0x10, 0x73, 0x18, 0xfa, 0x04, 0x0c, 0x35, 0x82, 0xbd, + 0x3d, 0xc7, 0x6f, 0xb2, 0x2b, 0xaf, 0xbc, 0x38, 0x42, 0xd9, 0xb1, 0x25, 0x5e, 0x84, 0x25, 0x0c, + 0x3d, 0x01, 0x25, 0x27, 0xdc, 0x8e, 0x66, 0x4a, 0x0c, 0x67, 0x98, 0xb6, 0xb4, 0x10, 0x6e, 0x47, + 0x98, 0x95, 0x52, 0xa9, 0xea, 0x7e, 0x10, 0xee, 0xba, 0xfe, 0x76, 0xd5, 0x0d, 0xc5, 0x96, 0x50, + 0x77, 0xe1, 0x5b, 0x0a, 0x82, 0x35, 0x2c, 0xb4, 0x02, 0x03, 0xad, 0x20, 0x8c, 0xa3, 0x99, 0x41, + 0x36, 0xdc, 0x4f, 0xe6, 0x1c, 0x44, 0xfc, 0x6b, 0x6b, 0x41, 0x18, 0x27, 0x1f, 0x40, 0xff, 0x45, + 0x98, 0x57, 0x47, 0xdf, 0x06, 0x45, 0xe2, 0xef, 0xcf, 0x0c, 0x31, 0x2a, 0xb3, 0x59, 0x54, 0x96, + 0xfd, 0xfd, 0x7b, 0x4e, 0x98, 0x9c, 0xd2, 0xcb, 0xfe, 0x3e, 0xa6, 0x75, 0xd0, 0x17, 0xa0, 0x2c, + 0xb7, 0x78, 0x24, 0xd4, 0x1c, 0x99, 0x4b, 0x4c, 0x1e, 0x0c, 0x98, 0xbc, 0xd7, 0x76, 0x43, 0xb2, + 0x47, 0xfc, 0x38, 0x4a, 0xce, 0x34, 0x09, 0x8d, 0x70, 0x42, 0x0d, 0x7d, 0x41, 0xea, 0xd6, 0xd6, + 0x82, 0xb6, 0x1f, 0x47, 0x33, 0x65, 0xd6, 0xbd, 0xcc, 0x57, 0x8f, 0x7b, 0x09, 0x5e, 0x5a, 0xf9, + 0xc6, 0x2b, 0x63, 0x83, 0x14, 0xc2, 0x30, 0xe6, 0xb9, 0xfb, 0xc4, 0x27, 0x51, 0x54, 0x0b, 0x83, + 0x4d, 0x32, 0x03, 0xac, 0xe7, 0x17, 0xb3, 0x1f, 0x03, 0x82, 0x4d, 0xb2, 0x38, 0x75, 0x74, 0x58, + 0x19, 0xbb, 0xad, 0xd7, 0xc1, 0x26, 0x09, 0x74, 0x17, 0xc6, 0xa9, 0x5c, 0xe3, 0x26, 0x44, 0x47, + 0x7a, 0x11, 0x65, 0xd2, 0x07, 0x36, 0x2a, 0xe1, 0x14, 0x11, 0xf4, 0x06, 0x94, 0x3d, 0x77, 0x8b, + 0x34, 0x0e, 0x1a, 0x1e, 0x99, 0x19, 0x65, 0x14, 0x33, 0xb7, 0xd5, 0x6d, 0x89, 0xc4, 0xe5, 0x22, + 0xf5, 0x17, 0x27, 0xd5, 0xd1, 0x3d, 0xb8, 0x10, 0x93, 0x70, 0xcf, 0xf5, 0x1d, 0xba, 0x1d, 0x84, + 0xbc, 0xc0, 0x9e, 0x54, 0xc6, 0xd8, 0x7a, 0xbb, 0x2c, 0x86, 0xee, 0xc2, 0x46, 0x26, 0x16, 0xce, + 0xa9, 0x8d, 0xee, 0xc0, 0x04, 0xdb, 0x09, 0xb5, 0xb6, 0xe7, 0xd5, 0x02, 0xcf, 0x6d, 0x1c, 0xcc, + 0x8c, 0x33, 0x82, 0x9f, 0x90, 0xf7, 0xc2, 0xaa, 0x09, 0x3e, 0x3e, 0xac, 0x40, 0xf2, 0x0f, 0xa7, + 0x6b, 0xa3, 0x4d, 0xa6, 0x43, 0x6f, 0x87, 0x6e, 0x7c, 0x40, 0xd7, 0x2f, 0x79, 0x10, 0xcf, 0x4c, + 0x74, 0x15, 0x85, 0x75, 0x54, 0xa5, 0x68, 0xd7, 0x0b, 0x71, 0x9a, 0x20, 0xdd, 0xda, 0x51, 0xdc, + 0x74, 0xfd, 0x99, 0x49, 0x76, 0x62, 0xa8, 0x9d, 0x51, 0xa7, 0x85, 0x98, 0xc3, 0x98, 0xfe, 0x9c, + 0xfe, 0xb8, 0x43, 0x4f, 0xd0, 0x29, 0x86, 0x98, 0xe8, 0xcf, 0x25, 0x00, 0x27, 0x38, 0x94, 0xa9, + 0x89, 0xe3, 0x83, 0x19, 0xc4, 0x50, 0xd5, 0x76, 0xd9, 0xd8, 0xf8, 0x02, 0xa6, 0xe5, 0xe8, 0x36, + 0x0c, 0x11, 0x7f, 0x7f, 0x25, 0x0c, 0xf6, 0x66, 0xce, 0xe5, 0xef, 0xd9, 0x65, 0x8e, 0xc2, 0x0f, + 0xf4, 0x44, 0xc0, 0x13, 0xc5, 0x58, 0x92, 0x40, 0x0f, 0x60, 0x26, 0x63, 0x46, 0xf8, 0x04, 0x9c, + 0x67, 0x13, 0xf0, 0x59, 0x51, 0x77, 0x66, 0x23, 0x07, 0xef, 0xb8, 0x0b, 0x0c, 0xe7, 0x52, 0x47, + 0x5f, 0x84, 0x31, 0xbe, 0xa1, 0xf8, 0xe3, 0x5b, 0x34, 0x33, 0xcd, 0xbe, 0xe6, 0x4a, 0xfe, 0xe6, + 0xe4, 0x88, 0x8b, 0xd3, 0xa2, 0x43, 0x63, 0x7a, 0x69, 0x84, 0x4d, 0x6a, 0xf6, 0x26, 0x8c, 0xab, + 0x73, 0x8b, 0x2d, 0x1d, 0x54, 0x81, 0x01, 0xc6, 0xed, 0x08, 0xfd, 0x56, 0x99, 0xce, 0x14, 0xe3, + 0x84, 0x30, 0x2f, 0x67, 0x33, 0xe5, 0xbe, 0x4f, 0x16, 0x0f, 0x62, 0xc2, 0xa5, 0xea, 0xa2, 0x36, + 0x53, 0x12, 0x80, 0x13, 0x1c, 0xfb, 0xff, 0x72, 0xae, 0x31, 0x39, 0x1c, 0xfb, 0xb8, 0x0e, 0x9e, + 0x83, 0xe1, 0x9d, 0x20, 0x8a, 0x29, 0x36, 0x6b, 0x63, 0x20, 0xe1, 0x13, 0x6f, 0x8a, 0x72, 0xac, + 0x30, 0xd0, 0x6b, 0x30, 0xd6, 0xd0, 0x1b, 0x10, 0x77, 0x99, 0x1a, 0x02, 0xa3, 0x75, 0x6c, 0xe2, + 0xa2, 0x57, 0x61, 0x98, 0x3d, 0x9d, 0x37, 0x02, 0x4f, 0x30, 0x59, 0xf2, 0x42, 0x1e, 0xae, 0x89, + 0xf2, 0x63, 0xed, 0x37, 0x56, 0xd8, 0xe8, 0x2a, 0x0c, 0xd2, 0x2e, 0xac, 0xd6, 0xc4, 0x2d, 0xa2, + 0x54, 0x35, 0x37, 0x59, 0x29, 0x16, 0x50, 0xfb, 0xaf, 0x17, 0xb4, 0x51, 0xa6, 0x12, 0x29, 0x41, + 0x35, 0x18, 0xba, 0xef, 0xb8, 0xb1, 0xeb, 0x6f, 0x0b, 0x76, 0xe1, 0x99, 0xae, 0x57, 0x0a, 0xab, + 0xf4, 0x16, 0xaf, 0xc0, 0x2f, 0x3d, 0xf1, 0x07, 0x4b, 0x32, 0x94, 0x62, 0xd8, 0xf6, 0x7d, 0x4a, + 0xb1, 0xd0, 0x2f, 0x45, 0xcc, 0x2b, 0x70, 0x8a, 0xe2, 0x0f, 0x96, 0x64, 0xd0, 0x3b, 0x00, 0x72, + 0x59, 0x92, 0xa6, 0x78, 0xb2, 0x7e, 0xae, 0x37, 0xd1, 0x0d, 0x55, 0x67, 0x71, 0x9c, 0x5e, 0xa9, + 0xc9, 0x7f, 0xac, 0xd1, 0xb3, 0x63, 0xc6, 0x56, 0x75, 0x76, 0x06, 0x7d, 0x27, 0x3d, 0x09, 0x9c, + 0x30, 0x26, 0xcd, 0x85, 0x58, 0x0c, 0xce, 0x27, 0xfb, 0x93, 0x29, 0x36, 0xdc, 0x3d, 0xa2, 0x9f, + 0x1a, 0x82, 0x08, 0x4e, 0xe8, 0xd9, 0xbf, 0x52, 0x84, 0x99, 0xbc, 0xee, 0xd2, 0x45, 0x47, 0x1e, + 0xb8, 0xf1, 0x12, 0xe5, 0x86, 0x2c, 0x73, 0xd1, 0x2d, 0x8b, 0x72, 0xac, 0x30, 0xe8, 0xec, 0x47, + 0xee, 0xb6, 0x14, 0x09, 0x07, 0x92, 0xd9, 0xaf, 0xb3, 0x52, 0x2c, 0xa0, 0x14, 0x2f, 0x24, 0x4e, + 0x24, 0x6c, 0x22, 0xb4, 0x55, 0x82, 0x59, 0x29, 0x16, 0x50, 0x5d, 0xdf, 0x54, 0xea, 0xa1, 0x6f, + 0x32, 0x86, 0x68, 0xe0, 0x74, 0x87, 0x08, 0x7d, 0x09, 0x60, 0xcb, 0xf5, 0xdd, 0x68, 0x87, 0x51, + 0x1f, 0x3c, 0x31, 0x75, 0xc5, 0x4b, 0xad, 0x28, 0x2a, 0x58, 0xa3, 0x88, 0x5e, 0x86, 0x11, 0xb5, + 0x01, 0x57, 0xab, 0xec, 0x81, 0x48, 0x7b, 0x70, 0x4f, 0x4e, 0xa3, 0x2a, 0xd6, 0xf1, 0xec, 0x77, + 0xd3, 0xeb, 0x45, 0xec, 0x00, 0x6d, 0x7c, 0xad, 0x7e, 0xc7, 0xb7, 0xd0, 0x7d, 0x7c, 0xed, 0xdf, + 0x2c, 0xc2, 0x84, 0xd1, 0x58, 0x3b, 0xea, 0xe3, 0xcc, 0xba, 0x41, 0xef, 0x39, 0x27, 0x26, 0x62, + 0xff, 0xd9, 0xbd, 0xb7, 0x8a, 0x7e, 0x17, 0xd2, 0x1d, 0xc0, 0xeb, 0xa3, 0x2f, 0x41, 0xd9, 0x73, + 0x22, 0xa6, 0xbb, 0x22, 0x62, 0xdf, 0xf5, 0x43, 0x2c, 0x91, 0x23, 0x9c, 0x28, 0xd6, 0xae, 0x1a, + 0x4e, 0x3b, 0x21, 0x49, 0x2f, 0x64, 0xca, 0xfb, 0x48, 0xa3, 0x1b, 0xd5, 0x09, 0xca, 0x20, 0x1d, + 0x60, 0x0e, 0x43, 0xaf, 0xc2, 0x68, 0x48, 0xd8, 0xaa, 0x58, 0xa2, 0xac, 0x1c, 0x5b, 0x66, 0x03, + 0x09, 0xcf, 0x87, 0x35, 0x18, 0x36, 0x30, 0x13, 0x56, 0x7e, 0xb0, 0x0b, 0x2b, 0xff, 0x0c, 0x0c, + 0xb1, 0x1f, 0x6a, 0x05, 0xa8, 0xd9, 0x58, 0xe5, 0xc5, 0x58, 0xc2, 0xd3, 0x0b, 0x66, 0xb8, 0xcf, + 0x05, 0xf3, 0x49, 0x18, 0xaf, 0x3a, 0x64, 0x2f, 0xf0, 0x97, 0xfd, 0x66, 0x2b, 0x70, 0xfd, 0x18, + 0xcd, 0x40, 0x89, 0xdd, 0x0e, 0x7c, 0x6f, 0x97, 0x28, 0x05, 0x5c, 0xa2, 0x8c, 0xb9, 0xbd, 0x0d, + 0xd3, 0xd5, 0xe0, 0xbe, 0x7f, 0xdf, 0x09, 0x9b, 0x0b, 0xb5, 0x55, 0x4d, 0xce, 0x5d, 0x97, 0x72, + 0x16, 0x37, 0x62, 0xc9, 0x3c, 0x53, 0xb5, 0x9a, 0xfc, 0xae, 0x5d, 0x71, 0x3d, 0x92, 0xa3, 0x8d, + 0xf8, 0x9b, 0x05, 0xa3, 0xa5, 0x04, 0x5f, 0x3d, 0x18, 0x59, 0xb9, 0x0f, 0x46, 0x6f, 0xc2, 0xf0, + 0x96, 0x4b, 0xbc, 0x26, 0x26, 0x5b, 0x62, 0x89, 0x3d, 0x9d, 0xff, 0x2e, 0xbf, 0x42, 0x31, 0xa5, + 0xf6, 0x89, 0x4b, 0x69, 0x2b, 0xa2, 0x32, 0x56, 0x64, 0xd0, 0x2e, 0x4c, 0x4a, 0x31, 0x40, 0x42, + 0xc5, 0x82, 0x7b, 0xa6, 0x9b, 0x6c, 0x61, 0x12, 0x3f, 0x7f, 0x74, 0x58, 0x99, 0xc4, 0x29, 0x32, + 0xb8, 0x83, 0x30, 0x15, 0xcb, 0xf6, 0xe8, 0xd1, 0x5a, 0x62, 0xc3, 0xcf, 0xc4, 0x32, 0x26, 0x61, + 0xb2, 0x52, 0xfb, 0x27, 0x2c, 0x78, 0xac, 0x63, 0x64, 0x84, 0xa4, 0x7d, 0xca, 0xb3, 0x90, 0x96, + 0x7c, 0x0b, 0xbd, 0x25, 0x5f, 0xfb, 0x1f, 0x58, 0x70, 0x7e, 0x79, 0xaf, 0x15, 0x1f, 0x54, 0x5d, + 0xf3, 0x75, 0xe7, 0x15, 0x18, 0xdc, 0x23, 0x4d, 0xb7, 0xbd, 0x27, 0x66, 0xae, 0x22, 0x8f, 0x9f, + 0x35, 0x56, 0x7a, 0x7c, 0x58, 0x19, 0xab, 0xc7, 0x41, 0xe8, 0x6c, 0x13, 0x5e, 0x80, 0x05, 0x3a, + 0x3b, 0xc4, 0xdd, 0xf7, 0xc9, 0x6d, 0x77, 0xcf, 0x95, 0x76, 0x16, 0x5d, 0x75, 0x67, 0x73, 0x72, + 0x40, 0xe7, 0xde, 0x6c, 0x3b, 0x7e, 0xec, 0xc6, 0x07, 0xe2, 0x61, 0x46, 0x12, 0xc1, 0x09, 0x3d, + 0xfb, 0x9b, 0x16, 0x4c, 0xc8, 0x75, 0xbf, 0xd0, 0x6c, 0x86, 0x24, 0x8a, 0xd0, 0x2c, 0x14, 0xdc, + 0x96, 0xe8, 0x25, 0x88, 0x5e, 0x16, 0x56, 0x6b, 0xb8, 0xe0, 0xb6, 0x50, 0x0d, 0xca, 0xdc, 0x5c, + 0x23, 0x59, 0x5c, 0x7d, 0x19, 0x7d, 0xb0, 0x1e, 0x6c, 0xc8, 0x9a, 0x38, 0x21, 0x22, 0x39, 0x38, + 0x76, 0x66, 0x16, 0xcd, 0x57, 0xaf, 0x9b, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x0d, 0x86, 0xfd, 0xa0, + 0xc9, 0xad, 0x67, 0xf8, 0xed, 0xc7, 0x96, 0xec, 0xba, 0x28, 0xc3, 0x0a, 0x6a, 0xff, 0xb0, 0x05, + 0xa3, 0xf2, 0xcb, 0xfa, 0x64, 0x26, 0xe9, 0xd6, 0x4a, 0x18, 0xc9, 0x64, 0x6b, 0x51, 0x66, 0x90, + 0x41, 0x0c, 0x1e, 0xb0, 0x78, 0x12, 0x1e, 0xd0, 0xfe, 0xf1, 0x02, 0x8c, 0xcb, 0xee, 0xd4, 0xdb, + 0x9b, 0x11, 0x89, 0xd1, 0x06, 0x94, 0x1d, 0x3e, 0xe4, 0x44, 0xae, 0xd8, 0xa7, 0xb2, 0x85, 0x0f, + 0x63, 0x7e, 0x92, 0x6b, 0x79, 0x41, 0xd6, 0xc6, 0x09, 0x21, 0xe4, 0xc1, 0x94, 0x1f, 0xc4, 0xec, + 0x88, 0x56, 0xf0, 0x6e, 0x4f, 0x20, 0x69, 0xea, 0x17, 0x05, 0xf5, 0xa9, 0xf5, 0x34, 0x15, 0xdc, + 0x49, 0x18, 0x2d, 0x4b, 0x85, 0x47, 0x31, 0x5f, 0xdc, 0xd0, 0x67, 0x21, 0x5b, 0xdf, 0x61, 0xff, + 0x9a, 0x05, 0x65, 0x89, 0x76, 0x16, 0xaf, 0x5d, 0x6b, 0x30, 0x14, 0xb1, 0x49, 0x90, 0x43, 0x63, + 0x77, 0xeb, 0x38, 0x9f, 0xaf, 0xe4, 0xe6, 0xe1, 0xff, 0x23, 0x2c, 0x69, 0x30, 0x7d, 0xb7, 0xea, + 0xfe, 0x47, 0x44, 0xdf, 0xad, 0xfa, 0x93, 0x73, 0xc3, 0xfc, 0x57, 0xd6, 0x67, 0x4d, 0xac, 0xa5, + 0x0c, 0x52, 0x2b, 0x24, 0x5b, 0xee, 0x83, 0x34, 0x83, 0x54, 0x63, 0xa5, 0x58, 0x40, 0xd1, 0x3b, + 0x30, 0xda, 0x90, 0x8a, 0xce, 0xe4, 0x18, 0xb8, 0xda, 0x55, 0xe9, 0xae, 0xde, 0x67, 0xb8, 0x65, + 0xed, 0x92, 0x56, 0x1f, 0x1b, 0xd4, 0xcc, 0xe7, 0xf6, 0x62, 0xaf, 0xe7, 0xf6, 0x84, 0x6e, 0xfe, + 0xe3, 0xf3, 0x4f, 0x5a, 0x30, 0xc8, 0xd5, 0x65, 0xfd, 0xe9, 0x17, 0xb5, 0xe7, 0xaa, 0x64, 0xec, + 0xee, 0xd1, 0x42, 0xf1, 0xfc, 0x84, 0xd6, 0xa0, 0xcc, 0x7e, 0x30, 0xb5, 0x41, 0x31, 0xdf, 0xa4, + 0x98, 0xb7, 0xaa, 0x77, 0xf0, 0x9e, 0xac, 0x86, 0x13, 0x0a, 0xf6, 0x8f, 0x16, 0xe9, 0x51, 0x95, + 0xa0, 0x1a, 0x37, 0xb8, 0xf5, 0xe8, 0x6e, 0xf0, 0xc2, 0xa3, 0xba, 0xc1, 0xb7, 0x61, 0xa2, 0xa1, + 0x3d, 0x6e, 0x25, 0x33, 0x79, 0xad, 0xeb, 0x22, 0xd1, 0xde, 0xc1, 0xb8, 0xca, 0x68, 0xc9, 0x24, + 0x82, 0xd3, 0x54, 0xd1, 0x77, 0xc2, 0x28, 0x9f, 0x67, 0xd1, 0x0a, 0xb7, 0x58, 0xf8, 0x44, 0xfe, + 0x7a, 0xd1, 0x9b, 0x60, 0x2b, 0xb1, 0xae, 0x55, 0xc7, 0x06, 0x31, 0xfb, 0x57, 0x86, 0x61, 0x60, + 0x79, 0x9f, 0xf8, 0xf1, 0x19, 0x1c, 0x48, 0x0d, 0x18, 0x77, 0xfd, 0xfd, 0xc0, 0xdb, 0x27, 0x4d, + 0x0e, 0x3f, 0xc9, 0xe5, 0x7a, 0x41, 0x90, 0x1e, 0x5f, 0x35, 0x48, 0xe0, 0x14, 0xc9, 0x47, 0x21, + 0x61, 0xde, 0x80, 0x41, 0x3e, 0xf7, 0x42, 0xbc, 0xcc, 0x54, 0x06, 0xb3, 0x41, 0x14, 0xbb, 0x20, + 0x91, 0x7e, 0xb9, 0xf6, 0x59, 0x54, 0x47, 0xef, 0xc2, 0xf8, 0x96, 0x1b, 0x46, 0x31, 0x15, 0x0d, + 0xa3, 0xd8, 0xd9, 0x6b, 0x3d, 0x84, 0x44, 0xa9, 0xc6, 0x61, 0xc5, 0xa0, 0x84, 0x53, 0x94, 0xd1, + 0x36, 0x8c, 0x51, 0x21, 0x27, 0x69, 0x6a, 0xe8, 0xc4, 0x4d, 0x29, 0x95, 0xd1, 0x6d, 0x9d, 0x10, + 0x36, 0xe9, 0xd2, 0xc3, 0xa4, 0xc1, 0x84, 0xa2, 0x61, 0xc6, 0x51, 0xa8, 0xc3, 0x84, 0x4b, 0x43, + 0x1c, 0x46, 0xcf, 0x24, 0x66, 0xb6, 0x52, 0x36, 0xcf, 0x24, 0xcd, 0x38, 0xe5, 0xcb, 0x50, 0x26, + 0x74, 0x08, 0x29, 0x61, 0xa1, 0x18, 0x9f, 0xef, 0xaf, 0xaf, 0x6b, 0x6e, 0x23, 0x0c, 0x4c, 0x59, + 0x7e, 0x59, 0x52, 0xc2, 0x09, 0x51, 0xb4, 0x04, 0x83, 0x11, 0x09, 0x5d, 0x12, 0x09, 0x15, 0x79, + 0x97, 0x69, 0x64, 0x68, 0xdc, 0xf6, 0x9c, 0xff, 0xc6, 0xa2, 0x2a, 0x5d, 0x5e, 0x0e, 0x93, 0x86, + 0x98, 0x56, 0x5c, 0x5b, 0x5e, 0x0b, 0xac, 0x14, 0x0b, 0x28, 0x7a, 0x03, 0x86, 0x42, 0xe2, 0x31, + 0x65, 0xd1, 0x58, 0xff, 0x8b, 0x9c, 0xeb, 0x9e, 0x78, 0x3d, 0x2c, 0x09, 0xa0, 0x5b, 0x80, 0x42, + 0x42, 0x79, 0x08, 0xd7, 0xdf, 0x56, 0xc6, 0x1c, 0x42, 0xd7, 0xfd, 0xb8, 0x68, 0xff, 0x1c, 0x4e, + 0x30, 0xa4, 0x55, 0x2a, 0xce, 0xa8, 0x86, 0x6e, 0xc0, 0x94, 0x2a, 0x5d, 0xf5, 0xa3, 0xd8, 0xf1, + 0x1b, 0x84, 0xa9, 0xb9, 0xcb, 0x09, 0x57, 0x84, 0xd3, 0x08, 0xb8, 0xb3, 0x8e, 0xfd, 0x73, 0x94, + 0x9d, 0xa1, 0xa3, 0x75, 0x06, 0xbc, 0xc0, 0xeb, 0x26, 0x2f, 0x70, 0x31, 0x77, 0xe6, 0x72, 0xf8, + 0x80, 0x23, 0x0b, 0x46, 0xb4, 0x99, 0x4d, 0xd6, 0xac, 0xd5, 0x65, 0xcd, 0xb6, 0x61, 0x92, 0xae, + 0xf4, 0x3b, 0x9b, 0xcc, 0x0d, 0xab, 0xc9, 0x16, 0x66, 0xe1, 0xe1, 0x16, 0xa6, 0x7a, 0x65, 0xbe, + 0x9d, 0x22, 0x88, 0x3b, 0x9a, 0x40, 0xaf, 0x48, 0xcd, 0x49, 0xd1, 0x30, 0xd2, 0xe2, 0x5a, 0x91, + 0xe3, 0xc3, 0xca, 0xa4, 0xf6, 0x21, 0xba, 0xa6, 0xc4, 0xfe, 0xb2, 0xfc, 0x46, 0xf5, 0x9a, 0xdf, + 0x50, 0x8b, 0x25, 0xf5, 0x9a, 0xaf, 0x96, 0x03, 0x4e, 0x70, 0xe8, 0x1e, 0xa5, 0x22, 0x48, 0xfa, + 0x35, 0x9f, 0x0a, 0x28, 0x98, 0x41, 0xec, 0x17, 0x01, 0x96, 0x1f, 0x90, 0x06, 0x5f, 0xea, 0xfa, + 0x03, 0xa4, 0x95, 0xff, 0x00, 0x69, 0xff, 0x7b, 0x0b, 0xc6, 0x57, 0x96, 0x0c, 0x31, 0x71, 0x0e, + 0x80, 0xcb, 0x46, 0x6f, 0xbd, 0xb5, 0x2e, 0x75, 0xeb, 0x5c, 0x3d, 0xaa, 0x4a, 0xb1, 0x86, 0x81, + 0x2e, 0x42, 0xd1, 0x6b, 0xfb, 0x42, 0x64, 0x19, 0x3a, 0x3a, 0xac, 0x14, 0x6f, 0xb7, 0x7d, 0x4c, + 0xcb, 0x34, 0x0b, 0xc1, 0x62, 0xdf, 0x16, 0x82, 0x3d, 0xdd, 0xab, 0x50, 0x05, 0x06, 0xee, 0xdf, + 0x77, 0x9b, 0xdc, 0x88, 0x5d, 0xe8, 0xfd, 0xdf, 0x7a, 0x6b, 0xb5, 0x1a, 0x61, 0x5e, 0x6e, 0x7f, + 0xb5, 0x08, 0xb3, 0x2b, 0x1e, 0x79, 0xf0, 0x01, 0x0d, 0xf9, 0xfb, 0xb5, 0x6f, 0x3c, 0x19, 0xbf, + 0x78, 0x52, 0x1b, 0xd6, 0xde, 0xe3, 0xb1, 0x05, 0x43, 0xfc, 0x31, 0x5b, 0x9a, 0xf5, 0xbf, 0x96, + 0xd5, 0x7a, 0xfe, 0x80, 0xcc, 0xf1, 0x47, 0x71, 0x61, 0xce, 0xaf, 0x6e, 0x5a, 0x51, 0x8a, 0x25, + 0xf1, 0xd9, 0xcf, 0xc0, 0xa8, 0x8e, 0x79, 0x22, 0x6b, 0xf2, 0xbf, 0x54, 0x84, 0x49, 0xda, 0x83, + 0x47, 0x3a, 0x11, 0x77, 0x3b, 0x27, 0xe2, 0xb4, 0x2d, 0x8a, 0x7b, 0xcf, 0xc6, 0x3b, 0xe9, 0xd9, + 0x78, 0x21, 0x6f, 0x36, 0xce, 0x7a, 0x0e, 0xbe, 0xd7, 0x82, 0x73, 0x2b, 0x5e, 0xd0, 0xd8, 0x4d, + 0x59, 0xfd, 0xbe, 0x0c, 0x23, 0xf4, 0x1c, 0x8f, 0x0c, 0x2f, 0x22, 0xc3, 0xaf, 0x4c, 0x80, 0xb0, + 0x8e, 0xa7, 0x55, 0xbb, 0x7b, 0x77, 0xb5, 0x9a, 0xe5, 0x8e, 0x26, 0x40, 0x58, 0xc7, 0xb3, 0xbf, + 0x61, 0xc1, 0xa5, 0x1b, 0x4b, 0xcb, 0xc9, 0x52, 0xec, 0xf0, 0x88, 0xa3, 0x52, 0x60, 0x53, 0xeb, + 0x4a, 0x22, 0x05, 0x56, 0x59, 0x2f, 0x04, 0xf4, 0xa3, 0xe2, 0xed, 0xf9, 0xb3, 0x16, 0x9c, 0xbb, + 0xe1, 0xc6, 0xf4, 0x5a, 0x4e, 0xfb, 0x66, 0xd1, 0x7b, 0x39, 0x72, 0xe3, 0x20, 0x3c, 0x48, 0xfb, + 0x66, 0x61, 0x05, 0xc1, 0x1a, 0x16, 0x6f, 0x79, 0xdf, 0x65, 0x66, 0x54, 0x05, 0x53, 0x15, 0x85, + 0x45, 0x39, 0x56, 0x18, 0xf4, 0xc3, 0x9a, 0x6e, 0xc8, 0x44, 0x89, 0x03, 0x71, 0xc2, 0xaa, 0x0f, + 0xab, 0x4a, 0x00, 0x4e, 0x70, 0xec, 0x9f, 0xb0, 0x60, 0xfa, 0x86, 0xd7, 0x8e, 0x62, 0x12, 0x6e, + 0x45, 0x46, 0x67, 0x5f, 0x84, 0x32, 0x91, 0xe2, 0xba, 0xe8, 0xab, 0x62, 0x30, 0x95, 0x1c, 0xcf, + 0x1d, 0xc3, 0x14, 0x5e, 0x1f, 0x9e, 0x03, 0x27, 0x73, 0x1d, 0xfb, 0xc5, 0x02, 0x8c, 0xdd, 0xdc, + 0xd8, 0xa8, 0xdd, 0x20, 0xb1, 0xb8, 0xc5, 0x7a, 0xab, 0x9a, 0xb1, 0xa6, 0x31, 0xeb, 0x26, 0x14, + 0xb5, 0x63, 0xd7, 0x9b, 0xe3, 0x9e, 0xc8, 0x73, 0xab, 0x7e, 0x7c, 0x27, 0xac, 0xc7, 0xa1, 0xeb, + 0x6f, 0x67, 0xea, 0xd8, 0xe4, 0x5d, 0x5b, 0xcc, 0xbb, 0x6b, 0xd1, 0x8b, 0x30, 0xc8, 0x5c, 0xa1, + 0xa5, 0x78, 0xf2, 0xb8, 0x92, 0x29, 0x58, 0xe9, 0xf1, 0x61, 0xa5, 0x7c, 0x17, 0xaf, 0xf2, 0x3f, + 0x58, 0xa0, 0xa2, 0xbb, 0x30, 0xb2, 0x13, 0xc7, 0xad, 0x9b, 0xc4, 0x69, 0x92, 0x50, 0x9e, 0x0e, + 0x97, 0xb3, 0x4e, 0x07, 0x3a, 0x08, 0x1c, 0x2d, 0xd9, 0x50, 0x49, 0x59, 0x84, 0x75, 0x3a, 0x76, + 0x1d, 0x20, 0x81, 0x9d, 0x92, 0x7e, 0xc1, 0xfe, 0x03, 0x0b, 0x86, 0xb8, 0x57, 0x5a, 0x88, 0x3e, + 0x0b, 0x25, 0xf2, 0x80, 0x34, 0x04, 0xe7, 0x98, 0xd9, 0xe1, 0x84, 0xf1, 0xe0, 0xda, 0x72, 0xfa, + 0x1f, 0xb3, 0x5a, 0xe8, 0x26, 0x0c, 0xd1, 0xde, 0xde, 0x50, 0x2e, 0x7a, 0x4f, 0xe6, 0x7d, 0xb1, + 0x9a, 0x76, 0xce, 0xab, 0x88, 0x22, 0x2c, 0xab, 0x33, 0xcd, 0x6f, 0xa3, 0x55, 0xa7, 0x07, 0x58, + 0xdc, 0xed, 0x9e, 0xdd, 0x58, 0xaa, 0x71, 0x24, 0x41, 0x8d, 0x6b, 0x7e, 0x65, 0x21, 0x4e, 0x88, + 0xd8, 0x1b, 0x50, 0xa6, 0x93, 0xba, 0xe0, 0xb9, 0x4e, 0x77, 0xa5, 0xf3, 0xb3, 0x50, 0x96, 0x0a, + 0xe0, 0x48, 0x38, 0x36, 0x31, 0xaa, 0x52, 0x3f, 0x1c, 0xe1, 0x04, 0x6e, 0x6f, 0xc1, 0x79, 0xf6, + 0xf2, 0xef, 0xc4, 0x3b, 0xc6, 0x1e, 0xeb, 0xbd, 0x98, 0x9f, 0x13, 0x82, 0x18, 0x9f, 0x99, 0x19, + 0xcd, 0x77, 0x60, 0x54, 0x52, 0x4c, 0x84, 0x32, 0xfb, 0x8f, 0x4a, 0xf0, 0xf8, 0x6a, 0x3d, 0xdf, + 0x61, 0xf1, 0x55, 0x18, 0xe5, 0x6c, 0x1a, 0x5d, 0xda, 0x8e, 0x27, 0xda, 0x55, 0xef, 0x62, 0x1b, + 0x1a, 0x0c, 0x1b, 0x98, 0xe8, 0x12, 0x14, 0xdd, 0xf7, 0xfc, 0xb4, 0x19, 0xee, 0xea, 0x9b, 0xeb, + 0x98, 0x96, 0x53, 0x30, 0xe5, 0xf8, 0xf8, 0x51, 0xaa, 0xc0, 0x8a, 0xeb, 0x7b, 0x1d, 0xc6, 0xdd, + 0xa8, 0x11, 0xb9, 0xab, 0x3e, 0x3d, 0x67, 0x12, 0x67, 0xd7, 0x44, 0x49, 0x40, 0x3b, 0xad, 0xa0, + 0x38, 0x85, 0xad, 0x9d, 0xeb, 0x03, 0x7d, 0x73, 0x8d, 0x3d, 0x3d, 0x7d, 0x28, 0x43, 0xdc, 0x62, + 0x5f, 0x17, 0x31, 0xa3, 0x36, 0xc1, 0x10, 0xf3, 0x0f, 0x8e, 0xb0, 0x84, 0x51, 0x09, 0xac, 0xb1, + 0xe3, 0xb4, 0x16, 0xda, 0xf1, 0x4e, 0xd5, 0x8d, 0x1a, 0xc1, 0x3e, 0x09, 0x0f, 0x98, 0xf0, 0x3c, + 0x9c, 0x48, 0x60, 0x0a, 0xb0, 0x74, 0x73, 0xa1, 0x46, 0x31, 0x71, 0x67, 0x1d, 0x93, 0x2b, 0x84, + 0xd3, 0xe0, 0x0a, 0x17, 0x60, 0x42, 0x36, 0x53, 0x27, 0x11, 0xbb, 0x23, 0x46, 0x58, 0xc7, 0x94, + 0xa9, 0xad, 0x28, 0x56, 0xdd, 0x4a, 0xe3, 0xa3, 0x57, 0x60, 0xcc, 0xf5, 0xdd, 0xd8, 0x75, 0xe2, + 0x20, 0x64, 0x37, 0x2c, 0x97, 0x93, 0x99, 0x25, 0xdb, 0xaa, 0x0e, 0xc0, 0x26, 0x9e, 0xfd, 0x87, + 0x25, 0x98, 0x62, 0xd3, 0xf6, 0xad, 0x15, 0xf6, 0x91, 0x59, 0x61, 0x77, 0x3b, 0x57, 0xd8, 0x69, + 0xb0, 0xbb, 0x1f, 0xe6, 0x32, 0x7b, 0x17, 0xca, 0xca, 0x16, 0x58, 0x3a, 0x03, 0x58, 0x39, 0xce, + 0x00, 0xbd, 0xb9, 0x0f, 0xf9, 0x8c, 0x5b, 0xcc, 0x7c, 0xc6, 0xfd, 0xdb, 0x16, 0x24, 0x26, 0x91, + 0xe8, 0x26, 0x94, 0x5b, 0x01, 0x33, 0x3b, 0x08, 0xa5, 0x2d, 0xcf, 0xe3, 0x99, 0x17, 0x15, 0xbf, + 0x14, 0xf9, 0xf8, 0xd5, 0x64, 0x0d, 0x9c, 0x54, 0x46, 0x8b, 0x30, 0xd4, 0x0a, 0x49, 0x3d, 0x66, + 0x2e, 0xb0, 0x3d, 0xe9, 0xf0, 0x35, 0xc2, 0xf1, 0xb1, 0xac, 0x68, 0xff, 0x92, 0x05, 0xc0, 0x5f, + 0x4a, 0x1d, 0x7f, 0x9b, 0x9c, 0x81, 0xf6, 0xb7, 0x0a, 0xa5, 0xa8, 0x45, 0x1a, 0xdd, 0x0c, 0x42, + 0x92, 0xfe, 0xd4, 0x5b, 0xa4, 0x91, 0x0c, 0x38, 0xfd, 0x87, 0x59, 0x6d, 0xfb, 0xfb, 0x00, 0xc6, + 0x13, 0xb4, 0xd5, 0x98, 0xec, 0xa1, 0xe7, 0x0d, 0x97, 0xb8, 0x8b, 0x29, 0x97, 0xb8, 0x32, 0xc3, + 0xd6, 0x14, 0x8d, 0xef, 0x42, 0x71, 0xcf, 0x79, 0x20, 0x34, 0x49, 0xcf, 0x76, 0xef, 0x06, 0xa5, + 0x3f, 0xb7, 0xe6, 0x3c, 0xe0, 0x32, 0xd3, 0xb3, 0x72, 0x81, 0xac, 0x39, 0x0f, 0x8e, 0xb9, 0xd9, + 0x07, 0x3b, 0xa4, 0x6e, 0xbb, 0x51, 0xfc, 0x95, 0xff, 0x94, 0xfc, 0x67, 0xcb, 0x8e, 0x36, 0xc2, + 0xda, 0x72, 0x7d, 0xf1, 0x6e, 0xd8, 0x57, 0x5b, 0xae, 0x9f, 0x6e, 0xcb, 0xf5, 0xfb, 0x68, 0xcb, + 0xf5, 0xd1, 0xfb, 0x30, 0x24, 0xde, 0xe8, 0x99, 0xad, 0xb7, 0xa9, 0xa5, 0xca, 0x6b, 0x4f, 0x3c, + 0xf1, 0xf3, 0x36, 0xe7, 0xa5, 0x4c, 0x28, 0x4a, 0x7b, 0xb6, 0x2b, 0x1b, 0x44, 0x7f, 0xc3, 0x82, + 0x71, 0xf1, 0x1b, 0x93, 0xf7, 0xda, 0x24, 0x8a, 0x05, 0xef, 0xf9, 0xe9, 0xfe, 0xfb, 0x20, 0x2a, + 0xf2, 0xae, 0x7c, 0x5a, 0x1e, 0xb3, 0x26, 0xb0, 0x67, 0x8f, 0x52, 0xbd, 0x40, 0xff, 0xc8, 0x82, + 0xf3, 0x7b, 0xce, 0x03, 0xde, 0x22, 0x2f, 0xc3, 0x4e, 0xec, 0x06, 0xc2, 0x76, 0xfd, 0xb3, 0xfd, + 0x4d, 0x7f, 0x47, 0x75, 0xde, 0x49, 0x69, 0xe6, 0x7a, 0x3e, 0x0b, 0xa5, 0x67, 0x57, 0x33, 0xfb, + 0x35, 0xbb, 0x05, 0xc3, 0x72, 0xbd, 0x65, 0x48, 0xde, 0x55, 0x9d, 0xb1, 0x3e, 0xb1, 0x89, 0x84, + 0xee, 0x97, 0x46, 0xdb, 0x11, 0x6b, 0xed, 0x91, 0xb6, 0xf3, 0x2e, 0x8c, 0xea, 0x6b, 0xec, 0x91, + 0xb6, 0xf5, 0x1e, 0x9c, 0xcb, 0x58, 0x4b, 0x8f, 0xb4, 0xc9, 0xfb, 0x70, 0x31, 0x77, 0x7d, 0x3c, + 0xca, 0x86, 0xed, 0x5f, 0xb4, 0xf4, 0x73, 0xf0, 0x0c, 0x54, 0xf0, 0x4b, 0xa6, 0x0a, 0xfe, 0x72, + 0xf7, 0x9d, 0x93, 0xa3, 0x87, 0x7f, 0x47, 0xef, 0x34, 0x3d, 0xd5, 0xd1, 0x1b, 0x30, 0xe8, 0xd1, + 0x12, 0x69, 0x1c, 0x62, 0xf7, 0xde, 0x91, 0x09, 0x2f, 0xc5, 0xca, 0x23, 0x2c, 0x28, 0xd8, 0xbf, + 0x6a, 0x41, 0xe9, 0x0c, 0x46, 0x02, 0x9b, 0x23, 0xf1, 0x7c, 0x2e, 0x69, 0x11, 0xd2, 0x6c, 0x0e, + 0x3b, 0xf7, 0x97, 0x65, 0xd8, 0xb6, 0x9c, 0x81, 0xf9, 0x2e, 0x38, 0x77, 0x3b, 0x70, 0x9a, 0x8b, + 0x8e, 0xe7, 0xf8, 0x0d, 0x12, 0xae, 0xfa, 0xdb, 0x3d, 0xad, 0x94, 0x74, 0x9b, 0xa2, 0x42, 0x2f, + 0x9b, 0x22, 0x7b, 0x07, 0x90, 0xde, 0x80, 0xb0, 0xe3, 0xc4, 0x30, 0xe4, 0xf2, 0xa6, 0xc4, 0xf0, + 0x3f, 0x9d, 0xcd, 0xdd, 0x75, 0xf4, 0x4c, 0xb3, 0x50, 0xe4, 0x05, 0x58, 0x12, 0xb2, 0x5f, 0x85, + 0x4c, 0xdf, 0xad, 0xde, 0x6a, 0x03, 0xfb, 0x65, 0x98, 0x62, 0x35, 0x4f, 0x26, 0xd2, 0xda, 0x3f, + 0x60, 0xc1, 0xc4, 0x7a, 0x2a, 0x36, 0xc5, 0x55, 0xf6, 0xd6, 0x97, 0xa1, 0xf7, 0xad, 0xb3, 0x52, + 0x2c, 0xa0, 0xa7, 0xae, 0x5f, 0xfa, 0x33, 0x0b, 0x12, 0x57, 0xc9, 0x33, 0x60, 0xaa, 0x96, 0x0c, + 0xa6, 0x2a, 0x53, 0xef, 0xa1, 0xba, 0x93, 0xc7, 0x53, 0xa1, 0x5b, 0x2a, 0x2e, 0x40, 0x17, 0x95, + 0x47, 0x42, 0x86, 0x7b, 0x91, 0x8f, 0x9b, 0xc1, 0x03, 0x64, 0xa4, 0x00, 0x66, 0x26, 0xa4, 0x70, + 0x3f, 0x22, 0x66, 0x42, 0xaa, 0x3f, 0x39, 0xbb, 0xaf, 0xa6, 0x75, 0x99, 0x9d, 0x4a, 0xdf, 0xce, + 0xcc, 0xbe, 0x1d, 0xcf, 0x7d, 0x9f, 0xa8, 0xe0, 0x26, 0x15, 0x61, 0xc6, 0x2d, 0x4a, 0x8f, 0x0f, + 0x2b, 0x63, 0xea, 0x1f, 0x8f, 0x80, 0x95, 0x54, 0xb1, 0x6f, 0xc2, 0x44, 0x6a, 0xc0, 0xd0, 0xcb, + 0x30, 0xd0, 0xda, 0x71, 0x22, 0x92, 0x32, 0x8d, 0x1c, 0xa8, 0xd1, 0xc2, 0xe3, 0xc3, 0xca, 0xb8, + 0xaa, 0xc0, 0x4a, 0x30, 0xc7, 0xb6, 0xff, 0xa7, 0x05, 0xa5, 0xf5, 0xa0, 0x79, 0x16, 0x8b, 0xe9, + 0x75, 0x63, 0x31, 0x3d, 0x91, 0x17, 0x3f, 0x30, 0x77, 0x1d, 0xad, 0xa4, 0xd6, 0xd1, 0xe5, 0x5c, + 0x0a, 0xdd, 0x97, 0xd0, 0x1e, 0x8c, 0xb0, 0xa8, 0x84, 0xc2, 0x54, 0xf3, 0x45, 0x83, 0xbf, 0xaf, + 0xa4, 0xf8, 0xfb, 0x09, 0x0d, 0x55, 0xe3, 0xf2, 0x9f, 0x81, 0x21, 0x61, 0x2e, 0x98, 0x36, 0x70, + 0x17, 0xb8, 0x58, 0xc2, 0xed, 0x9f, 0x2c, 0x82, 0x11, 0x05, 0x11, 0xfd, 0x9a, 0x05, 0x73, 0x21, + 0xf7, 0x18, 0x6c, 0x56, 0xdb, 0xa1, 0xeb, 0x6f, 0xd7, 0x1b, 0x3b, 0xa4, 0xd9, 0xf6, 0x5c, 0x7f, + 0x7b, 0x75, 0xdb, 0x0f, 0x54, 0xf1, 0xf2, 0x03, 0xd2, 0x68, 0x33, 0x9d, 0x7f, 0x8f, 0x90, 0x8b, + 0xca, 0x1c, 0xe7, 0xfa, 0xd1, 0x61, 0x65, 0x0e, 0x9f, 0x88, 0x36, 0x3e, 0x61, 0x5f, 0xd0, 0x37, + 0x2c, 0x98, 0xe7, 0xc1, 0x01, 0xfb, 0xef, 0x7f, 0x17, 0x69, 0xa8, 0x26, 0x49, 0x25, 0x44, 0x36, + 0x48, 0xb8, 0xb7, 0xf8, 0x8a, 0x18, 0xd0, 0xf9, 0xda, 0xc9, 0xda, 0xc2, 0x27, 0xed, 0x9c, 0xfd, + 0x2f, 0x8b, 0x30, 0x26, 0x9c, 0xd5, 0x45, 0x14, 0x94, 0x97, 0x8d, 0x25, 0xf1, 0x64, 0x6a, 0x49, + 0x4c, 0x19, 0xc8, 0xa7, 0x13, 0x00, 0x25, 0x82, 0x29, 0xcf, 0x89, 0xe2, 0x9b, 0xc4, 0x09, 0xe3, + 0x4d, 0xe2, 0x70, 0x33, 0x95, 0xe2, 0x89, 0x4d, 0x6a, 0x94, 0xfa, 0xe5, 0x76, 0x9a, 0x18, 0xee, + 0xa4, 0x8f, 0xf6, 0x01, 0x31, 0x5b, 0x9b, 0xd0, 0xf1, 0x23, 0xfe, 0x2d, 0xae, 0x78, 0x0f, 0x38, + 0x59, 0xab, 0xb3, 0xa2, 0x55, 0x74, 0xbb, 0x83, 0x1a, 0xce, 0x68, 0x41, 0xb3, 0xa1, 0x1a, 0xe8, + 0xd7, 0x86, 0x6a, 0xb0, 0x87, 0x17, 0x89, 0x0f, 0x93, 0x1d, 0xf1, 0x06, 0xde, 0x86, 0xb2, 0xb2, + 0x75, 0x13, 0x87, 0x4e, 0xf7, 0xb0, 0x1d, 0x69, 0x0a, 0x5c, 0x45, 0x92, 0xd8, 0x59, 0x26, 0xe4, + 0xec, 0x7f, 0x5c, 0x30, 0x1a, 0xe4, 0x93, 0xb8, 0x0e, 0xc3, 0x4e, 0x14, 0xb9, 0xdb, 0x3e, 0x69, + 0x8a, 0x1d, 0xfb, 0xf1, 0xbc, 0x1d, 0x6b, 0x34, 0xc3, 0xec, 0x0d, 0x17, 0x44, 0x4d, 0xac, 0x68, + 0xa0, 0x9b, 0xdc, 0x18, 0x68, 0x5f, 0xf2, 0xf3, 0xfd, 0x51, 0x03, 0x69, 0x2e, 0xb4, 0x4f, 0xb0, + 0xa8, 0x8f, 0xbe, 0xc8, 0xad, 0xb5, 0x6e, 0xf9, 0xc1, 0x7d, 0xff, 0x46, 0x10, 0x48, 0x0f, 0xb3, + 0xfe, 0x08, 0x4e, 0x49, 0x1b, 0x2d, 0x55, 0x1d, 0x9b, 0xd4, 0xfa, 0x8b, 0xc9, 0xf3, 0xdd, 0x70, + 0x8e, 0x92, 0x36, 0xfd, 0x44, 0x22, 0x44, 0x60, 0x42, 0x44, 0x42, 0x90, 0x65, 0x62, 0xec, 0x32, + 0x59, 0x75, 0xb3, 0x76, 0xa2, 0xd0, 0xbb, 0x65, 0x92, 0xc0, 0x69, 0x9a, 0xf6, 0xcf, 0x58, 0xc0, + 0x2c, 0xdc, 0xcf, 0x80, 0x65, 0xf8, 0x9c, 0xc9, 0x32, 0xcc, 0xe4, 0x0d, 0x72, 0x0e, 0xb7, 0xf0, + 0x12, 0x5f, 0x59, 0xb5, 0x30, 0x78, 0x70, 0x20, 0x5e, 0xca, 0xfb, 0xe0, 0x52, 0xff, 0x8f, 0xc5, + 0x0f, 0x31, 0xe5, 0x74, 0x8e, 0xbe, 0x07, 0x86, 0x1b, 0x4e, 0xcb, 0x69, 0xf0, 0x90, 0xbd, 0xb9, + 0x1a, 0x1b, 0xa3, 0xd2, 0xdc, 0x92, 0xa8, 0xc1, 0x35, 0x10, 0x32, 0xa2, 0xc6, 0xb0, 0x2c, 0xee, + 0xa9, 0x75, 0x50, 0x4d, 0xce, 0xee, 0xc2, 0x98, 0x41, 0xec, 0x91, 0x8a, 0xab, 0xdf, 0xc3, 0xaf, + 0x58, 0x15, 0x01, 0x66, 0x0f, 0xa6, 0x7c, 0xed, 0x3f, 0xbd, 0x50, 0xa4, 0x08, 0xf2, 0xf1, 0x5e, + 0x97, 0x28, 0xbb, 0x7d, 0x34, 0x0b, 0xfe, 0x14, 0x19, 0xdc, 0x49, 0xd9, 0xfe, 0x29, 0x0b, 0x1e, + 0xd3, 0x11, 0xb5, 0x78, 0x00, 0xbd, 0x74, 0xc0, 0x55, 0x18, 0x0e, 0x5a, 0x24, 0x74, 0xe2, 0x20, + 0x14, 0xb7, 0xc6, 0x35, 0x39, 0xe8, 0x77, 0x44, 0xf9, 0xb1, 0x88, 0x9d, 0x28, 0xa9, 0xcb, 0x72, + 0xac, 0x6a, 0x22, 0x1b, 0x06, 0xd9, 0x60, 0x44, 0x22, 0x56, 0x03, 0x3b, 0x03, 0xd8, 0x73, 0x68, + 0x84, 0x05, 0xc4, 0xfe, 0x23, 0x8b, 0x2f, 0x2c, 0xbd, 0xeb, 0xe8, 0x3d, 0x98, 0xdc, 0x73, 0xe2, + 0xc6, 0xce, 0xf2, 0x83, 0x56, 0xc8, 0x55, 0xdf, 0x72, 0x9c, 0x9e, 0xed, 0x35, 0x4e, 0xda, 0x47, + 0x26, 0x06, 0x68, 0x6b, 0x29, 0x62, 0xb8, 0x83, 0x3c, 0xda, 0x84, 0x11, 0x56, 0xc6, 0x2c, 0x9d, + 0xa3, 0x6e, 0xac, 0x41, 0x5e, 0x6b, 0xea, 0x45, 0x79, 0x2d, 0xa1, 0x83, 0x75, 0xa2, 0xf6, 0x57, + 0x8a, 0x7c, 0xb7, 0x33, 0x6e, 0xfb, 0x19, 0x18, 0x6a, 0x05, 0xcd, 0xa5, 0xd5, 0x2a, 0x16, 0xb3, + 0xa0, 0xae, 0x91, 0x1a, 0x2f, 0xc6, 0x12, 0x8e, 0x5e, 0x03, 0x20, 0x0f, 0x62, 0x12, 0xfa, 0x8e, + 0xa7, 0x0c, 0x42, 0x94, 0x09, 0x64, 0x35, 0x58, 0x0f, 0xe2, 0xbb, 0x11, 0xf9, 0xae, 0x65, 0x85, + 0x82, 0x35, 0x74, 0x74, 0x1d, 0xa0, 0x15, 0x06, 0xfb, 0x6e, 0x93, 0xb9, 0xce, 0x15, 0x4d, 0x73, + 0x89, 0x9a, 0x82, 0x60, 0x0d, 0x0b, 0xbd, 0x06, 0x63, 0x6d, 0x3f, 0xe2, 0x1c, 0x8a, 0xb3, 0x29, + 0x22, 0x0f, 0x0e, 0x27, 0x96, 0x0b, 0x77, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x02, 0x0c, 0xc6, 0x0e, + 0xb3, 0x77, 0x18, 0xc8, 0xb7, 0x5b, 0xdc, 0xa0, 0x18, 0x7a, 0xc0, 0x58, 0x5a, 0x01, 0x8b, 0x8a, + 0xe8, 0x6d, 0xe9, 0x87, 0xc0, 0xcf, 0x7a, 0x61, 0x30, 0xdc, 0xdf, 0xbd, 0xa0, 0x79, 0x21, 0x08, + 0x43, 0x64, 0x83, 0x96, 0xfd, 0x8d, 0x32, 0x40, 0xc2, 0x8e, 0xa3, 0xf7, 0x3b, 0xce, 0xa3, 0xe7, + 0xba, 0x33, 0xf0, 0xa7, 0x77, 0x18, 0xa1, 0xef, 0xb7, 0x60, 0xc4, 0xf1, 0xbc, 0xa0, 0xe1, 0xc4, + 0x6c, 0x94, 0x0b, 0xdd, 0xcf, 0x43, 0xd1, 0xfe, 0x42, 0x52, 0x83, 0x77, 0xe1, 0x45, 0xb9, 0xf0, + 0x34, 0x48, 0xcf, 0x5e, 0xe8, 0x0d, 0xa3, 0x4f, 0x49, 0x29, 0x8d, 0x2f, 0x8f, 0xd9, 0xb4, 0x94, + 0x56, 0x66, 0x47, 0xbf, 0x26, 0xa0, 0xa1, 0xbb, 0x46, 0x50, 0xb9, 0x52, 0x7e, 0x7c, 0x05, 0x83, + 0x2b, 0xed, 0x15, 0x4f, 0x0e, 0xd5, 0x74, 0xc7, 0xa9, 0x81, 0xfc, 0x20, 0x24, 0x9a, 0xf8, 0xd3, + 0xc3, 0x69, 0xea, 0x5d, 0x98, 0x68, 0x9a, 0x77, 0xbb, 0x58, 0x4d, 0x4f, 0xe7, 0xd1, 0x4d, 0xb1, + 0x02, 0xc9, 0x6d, 0x9e, 0x02, 0xe0, 0x34, 0x61, 0x54, 0xe3, 0x2e, 0x6c, 0xab, 0xfe, 0x56, 0x20, + 0x0c, 0xcf, 0xed, 0xdc, 0xb9, 0x3c, 0x88, 0x62, 0xb2, 0x47, 0x31, 0x93, 0x4b, 0x7b, 0x5d, 0xd4, + 0xc5, 0x8a, 0x0a, 0x7a, 0x03, 0x06, 0x99, 0x0f, 0x6c, 0x34, 0x33, 0x9c, 0xaf, 0x28, 0x34, 0xc3, + 0x37, 0x24, 0x9b, 0x8a, 0xfd, 0x8d, 0xb0, 0xa0, 0x80, 0x6e, 0xca, 0x18, 0x2f, 0xd1, 0xaa, 0x7f, + 0x37, 0x22, 0x2c, 0xc6, 0x4b, 0x79, 0xf1, 0xe3, 0x49, 0xf8, 0x16, 0x5e, 0x9e, 0x19, 0x1a, 0xde, + 0xa8, 0x49, 0x99, 0x23, 0xf1, 0x5f, 0x46, 0x9c, 0x9f, 0x81, 0xfc, 0xee, 0x99, 0x51, 0xe9, 0x93, + 0xe1, 0xbc, 0x67, 0x92, 0xc0, 0x69, 0x9a, 0x94, 0xd1, 0xe4, 0x3b, 0x57, 0x98, 0xae, 0xf7, 0xda, + 0xff, 0x5c, 0xbe, 0x66, 0x97, 0x0c, 0x2f, 0xc1, 0xa2, 0xfe, 0x99, 0xde, 0xfa, 0xb3, 0x3e, 0x4c, + 0xa6, 0xb7, 0xe8, 0x23, 0xe5, 0x32, 0xfe, 0xa0, 0x04, 0xe3, 0xe6, 0x92, 0x42, 0xf3, 0x50, 0x16, + 0x44, 0x54, 0xc0, 0x51, 0xb5, 0x4b, 0xd6, 0x24, 0x00, 0x27, 0x38, 0x2c, 0xce, 0x2c, 0xab, 0xae, + 0x99, 0x1c, 0x26, 0x71, 0x66, 0x15, 0x04, 0x6b, 0x58, 0x54, 0x5e, 0xda, 0x0c, 0x82, 0x58, 0x5d, + 0x2a, 0x6a, 0xdd, 0x2d, 0xb2, 0x52, 0x2c, 0xa0, 0xf4, 0x32, 0xd9, 0x25, 0xa1, 0x4f, 0x3c, 0x33, + 0x8e, 0x99, 0xba, 0x4c, 0x6e, 0xe9, 0x40, 0x6c, 0xe2, 0xd2, 0x5b, 0x32, 0x88, 0xd8, 0x42, 0x16, + 0x52, 0x59, 0x62, 0xc2, 0x59, 0xe7, 0xde, 0xe4, 0x12, 0x8e, 0xbe, 0x00, 0x8f, 0x29, 0xe7, 0x6f, + 0xcc, 0x95, 0xd0, 0xb2, 0xc5, 0x41, 0x43, 0x89, 0xf2, 0xd8, 0x52, 0x36, 0x1a, 0xce, 0xab, 0x8f, + 0x5e, 0x87, 0x71, 0xc1, 0xb9, 0x4b, 0x8a, 0x43, 0xa6, 0x5d, 0xc4, 0x2d, 0x03, 0x8a, 0x53, 0xd8, + 0x32, 0x12, 0x1b, 0x63, 0x9e, 0x25, 0x85, 0xe1, 0xce, 0x48, 0x6c, 0x3a, 0x1c, 0x77, 0xd4, 0x40, + 0x0b, 0x30, 0xc1, 0x59, 0x2b, 0xd7, 0xdf, 0xe6, 0x73, 0x22, 0x3c, 0x4b, 0xd4, 0x96, 0xba, 0x63, + 0x82, 0x71, 0x1a, 0x1f, 0xbd, 0x0a, 0xa3, 0x4e, 0xd8, 0xd8, 0x71, 0x63, 0xd2, 0x88, 0xdb, 0x21, + 0x77, 0x39, 0xd1, 0x0c, 0x4b, 0x16, 0x34, 0x18, 0x36, 0x30, 0xed, 0xf7, 0xe1, 0x5c, 0x86, 0x53, + 0x1a, 0x5d, 0x38, 0x4e, 0xcb, 0x95, 0xdf, 0x94, 0x32, 0xc6, 0x5c, 0xa8, 0xad, 0xca, 0xaf, 0xd1, + 0xb0, 0xe8, 0xea, 0x64, 0xce, 0x6b, 0x5a, 0x82, 0x09, 0xb5, 0x3a, 0x57, 0x24, 0x00, 0x27, 0x38, + 0xf6, 0xff, 0x2a, 0xc0, 0x44, 0x86, 0x62, 0x9d, 0x25, 0x39, 0x48, 0xc9, 0x1e, 0x49, 0x4e, 0x03, + 0x33, 0xb0, 0x5f, 0xe1, 0x04, 0x81, 0xfd, 0x8a, 0xbd, 0x02, 0xfb, 0x95, 0x3e, 0x48, 0x60, 0x3f, + 0x73, 0xc4, 0x06, 0xfa, 0x1a, 0xb1, 0x8c, 0x60, 0x80, 0x83, 0x27, 0x0c, 0x06, 0x68, 0x0c, 0xfa, + 0x50, 0x1f, 0x83, 0xfe, 0xa3, 0x05, 0x98, 0x4c, 0x1b, 0xc0, 0x9d, 0x81, 0x3a, 0xf6, 0x0d, 0x43, + 0x1d, 0x9b, 0x9d, 0x32, 0x24, 0x6d, 0x96, 0x97, 0xa7, 0x9a, 0xc5, 0x29, 0xd5, 0xec, 0x27, 0xfb, + 0xa2, 0xd6, 0x5d, 0x4d, 0xfb, 0x77, 0x0b, 0x30, 0x9d, 0xae, 0xb2, 0xe4, 0x39, 0xee, 0xde, 0x19, + 0x8c, 0xcd, 0x1d, 0x63, 0x6c, 0x9e, 0xef, 0xe7, 0x6b, 0x58, 0xd7, 0x72, 0x07, 0xe8, 0xad, 0xd4, + 0x00, 0xcd, 0xf7, 0x4f, 0xb2, 0xfb, 0x28, 0x7d, 0xb3, 0x08, 0x97, 0x33, 0xeb, 0x25, 0xda, 0xcc, + 0x15, 0x43, 0x9b, 0x79, 0x3d, 0xa5, 0xcd, 0xb4, 0xbb, 0xd7, 0x3e, 0x1d, 0xf5, 0xa6, 0xf0, 0x16, + 0x64, 0xc1, 0xdf, 0x1e, 0x52, 0xb5, 0x69, 0x78, 0x0b, 0x2a, 0x42, 0xd8, 0xa4, 0xfb, 0x17, 0x49, + 0xa5, 0xf9, 0x6f, 0x2c, 0xb8, 0x98, 0x39, 0x37, 0x67, 0xa0, 0xc2, 0x5a, 0x37, 0x55, 0x58, 0xcf, + 0xf4, 0xbd, 0x5a, 0x73, 0x74, 0x5a, 0x7f, 0x58, 0xcc, 0xf9, 0x16, 0x26, 0xa0, 0xdf, 0x81, 0x11, + 0xa7, 0xd1, 0x20, 0x51, 0xb4, 0x16, 0x34, 0x55, 0x30, 0xb4, 0xe7, 0x99, 0x9c, 0x95, 0x14, 0x1f, + 0x1f, 0x56, 0x66, 0xd3, 0x24, 0x12, 0x30, 0xd6, 0x29, 0x98, 0xf1, 0x1b, 0x0b, 0xa7, 0x1a, 0xbf, + 0xf1, 0x3a, 0xc0, 0xbe, 0xe2, 0xd6, 0xd3, 0x42, 0xbe, 0xc6, 0xc7, 0x6b, 0x58, 0xe8, 0x8b, 0x30, + 0x1c, 0x89, 0x6b, 0x5c, 0x2c, 0xc5, 0x17, 0xfb, 0x9c, 0x2b, 0x67, 0x93, 0x78, 0xa6, 0x5b, 0xba, + 0xd2, 0x87, 0x28, 0x92, 0xe8, 0x3b, 0x60, 0x32, 0xe2, 0x51, 0x4f, 0x96, 0x3c, 0x27, 0x62, 0x3e, + 0x0e, 0x62, 0x15, 0x32, 0x5f, 0xf3, 0x7a, 0x0a, 0x86, 0x3b, 0xb0, 0xd1, 0x8a, 0xfc, 0x28, 0x16, + 0xa2, 0x85, 0x2f, 0xcc, 0xab, 0xc9, 0x07, 0x89, 0x14, 0x4b, 0xe7, 0xd3, 0xc3, 0xcf, 0x06, 0x5e, + 0xab, 0x69, 0xff, 0x68, 0x09, 0x1e, 0xef, 0x72, 0x88, 0xa1, 0x05, 0xf3, 0x8d, 0xf2, 0xd9, 0xb4, + 0xf4, 0x3b, 0x9b, 0x59, 0xd9, 0x10, 0x87, 0x53, 0x6b, 0xa5, 0xf0, 0x81, 0xd7, 0xca, 0x0f, 0x59, + 0x9a, 0x5e, 0x82, 0x5b, 0xd2, 0x7d, 0xee, 0x84, 0x87, 0xf3, 0x29, 0x2a, 0x2a, 0xb6, 0x32, 0xa4, + 0xfd, 0xeb, 0x7d, 0x77, 0xa7, 0x6f, 0xf1, 0xff, 0x6c, 0xb5, 0xb3, 0x5f, 0xb1, 0xe0, 0xc9, 0xcc, + 0xfe, 0x1a, 0x36, 0x15, 0xf3, 0x50, 0x6e, 0xd0, 0x42, 0xcd, 0x6f, 0x2a, 0x71, 0x28, 0x95, 0x00, + 0x9c, 0xe0, 0x18, 0xa6, 0x13, 0x85, 0x9e, 0xa6, 0x13, 0xff, 0xc2, 0x82, 0x8e, 0x05, 0x7c, 0x06, + 0x27, 0xe9, 0xaa, 0x79, 0x92, 0x7e, 0xbc, 0x9f, 0xb9, 0xcc, 0x39, 0x44, 0xff, 0xf3, 0x04, 0x5c, + 0xc8, 0x71, 0x94, 0xd8, 0x87, 0xa9, 0xed, 0x06, 0x31, 0x3d, 0xd2, 0xc4, 0xc7, 0x64, 0x3a, 0xef, + 0x75, 0x75, 0x5f, 0x63, 0xb9, 0x71, 0xa6, 0x3a, 0x50, 0x70, 0x67, 0x13, 0xe8, 0x2b, 0x16, 0x9c, + 0x77, 0xee, 0x47, 0x1d, 0x19, 0x10, 0xc5, 0x9a, 0x79, 0x29, 0x53, 0x4b, 0xd1, 0x23, 0x63, 0x22, + 0x4f, 0x16, 0x94, 0x85, 0x85, 0x33, 0xdb, 0x42, 0x58, 0xc4, 0xaf, 0xa4, 0xfc, 0x76, 0x17, 0x9f, + 0xc9, 0x2c, 0x8f, 0x16, 0x7e, 0xa6, 0x4a, 0x08, 0x56, 0x74, 0xd0, 0x3d, 0x28, 0x6f, 0x4b, 0x37, + 0x33, 0x71, 0x66, 0x67, 0x5e, 0x82, 0x99, 0xbe, 0x68, 0xfc, 0xdd, 0x50, 0x81, 0x70, 0x42, 0x0a, + 0xbd, 0x0e, 0x45, 0x7f, 0x2b, 0xea, 0x96, 0x65, 0x27, 0x65, 0x6a, 0xc4, 0xfd, 0x91, 0xd7, 0x57, + 0xea, 0x98, 0x56, 0x44, 0x37, 0xa1, 0x18, 0x6e, 0x36, 0x85, 0x62, 0x2d, 0x93, 0x2f, 0xc5, 0x8b, + 0xd5, 0xec, 0x45, 0xc2, 0x29, 0xe1, 0xc5, 0x2a, 0xa6, 0x24, 0x50, 0x0d, 0x06, 0x98, 0x4f, 0x81, + 0xd0, 0x9f, 0x65, 0x32, 0xa4, 0x5d, 0x7c, 0x73, 0xb8, 0xd3, 0x32, 0x43, 0xc0, 0x9c, 0x10, 0xda, + 0x80, 0xc1, 0x06, 0xcb, 0xc8, 0x22, 0x42, 0x26, 0x7f, 0x2a, 0x53, 0x85, 0xd6, 0x25, 0x55, 0x8d, + 0xd0, 0x28, 0x31, 0x0c, 0x2c, 0x68, 0x31, 0xaa, 0xa4, 0xb5, 0xb3, 0x15, 0x31, 0x11, 0x3c, 0x8f, + 0x6a, 0x97, 0x0c, 0x4c, 0x82, 0x2a, 0xc3, 0xc0, 0x82, 0x16, 0xfa, 0x0c, 0x14, 0xb6, 0x1a, 0xc2, + 0xe5, 0x20, 0x53, 0x97, 0x66, 0xba, 0x94, 0x2f, 0x0e, 0x1e, 0x1d, 0x56, 0x0a, 0x2b, 0x4b, 0xb8, + 0xb0, 0xd5, 0x40, 0xeb, 0x30, 0xb4, 0xc5, 0x9d, 0x50, 0x85, 0xba, 0xec, 0xe9, 0x6c, 0xff, 0xd8, + 0x0e, 0x3f, 0x55, 0x6e, 0x2a, 0x2f, 0x00, 0x58, 0x12, 0x61, 0x41, 0x20, 0x95, 0x33, 0xad, 0x88, + 0x86, 0x3c, 0x77, 0x32, 0x07, 0x68, 0xee, 0xde, 0x9e, 0xb8, 0xe4, 0x62, 0x8d, 0x22, 0xfa, 0x32, + 0x94, 0x1d, 0x99, 0x7b, 0x4f, 0x44, 0x8b, 0x78, 0x31, 0x73, 0x63, 0x76, 0x4f, 0x4b, 0xc8, 0x57, + 0xb5, 0x42, 0xc2, 0x09, 0x51, 0xb4, 0x0b, 0x63, 0xfb, 0x51, 0x6b, 0x87, 0xc8, 0x8d, 0xcc, 0x82, + 0x47, 0xe4, 0x5c, 0x5c, 0xf7, 0x04, 0xa2, 0x1b, 0xc6, 0x6d, 0xc7, 0xeb, 0x38, 0x7b, 0xd8, 0x63, + 0xf3, 0x3d, 0x9d, 0x18, 0x36, 0x69, 0xd3, 0xe1, 0x7f, 0xaf, 0x1d, 0x6c, 0x1e, 0xc4, 0x44, 0x84, + 0x4f, 0xce, 0x1c, 0xfe, 0x37, 0x39, 0x4a, 0xe7, 0xf0, 0x0b, 0x00, 0x96, 0x44, 0xe8, 0x56, 0x77, + 0x64, 0x5e, 0x4b, 0x16, 0x36, 0x39, 0x67, 0xab, 0x67, 0x26, 0xbf, 0xd4, 0x06, 0x85, 0x9d, 0x91, + 0x09, 0x29, 0x76, 0x36, 0xb6, 0x76, 0x82, 0x38, 0xf0, 0x53, 0xe7, 0xf2, 0x54, 0xfe, 0xd9, 0x58, + 0xcb, 0xc0, 0xef, 0x3c, 0x1b, 0xb3, 0xb0, 0x70, 0x66, 0x5b, 0xa8, 0x09, 0xe3, 0xad, 0x20, 0x8c, + 0xef, 0x07, 0xa1, 0x5c, 0x5f, 0xa8, 0x8b, 0xb8, 0x6f, 0x60, 0x8a, 0x16, 0x59, 0x38, 0x6f, 0x13, + 0x82, 0x53, 0x34, 0xd1, 0xe7, 0x61, 0x28, 0x6a, 0x38, 0x1e, 0x59, 0xbd, 0x33, 0x73, 0x2e, 0xff, + 0xd2, 0xa9, 0x73, 0x94, 0x9c, 0xd5, 0xc5, 0x26, 0x47, 0xa0, 0x60, 0x49, 0x0e, 0xad, 0xc0, 0x00, + 0x8b, 0xc9, 0xcf, 0x22, 0x3f, 0xe7, 0x44, 0x25, 0xea, 0x30, 0xea, 0xe4, 0x67, 0x13, 0x2b, 0xc6, + 0xbc, 0x3a, 0xdd, 0x03, 0x82, 0xeb, 0x0d, 0xa2, 0x99, 0xe9, 0xfc, 0x3d, 0x20, 0x98, 0xe5, 0x3b, + 0xf5, 0x6e, 0x7b, 0x40, 0x21, 0xe1, 0x84, 0x28, 0x3d, 0x99, 0xe9, 0x69, 0x7a, 0xa1, 0x8b, 0x9d, + 0x49, 0xee, 0x59, 0xca, 0x4e, 0x66, 0x7a, 0x92, 0x52, 0x12, 0xf6, 0xef, 0x0d, 0x75, 0x72, 0x2a, + 0x4c, 0x4e, 0xfa, 0xcb, 0x56, 0xc7, 0x13, 0xda, 0xa7, 0xfb, 0x55, 0xdb, 0x9c, 0x22, 0x8f, 0xfa, + 0x15, 0x0b, 0x2e, 0xb4, 0x32, 0x3f, 0x44, 0x5c, 0xfb, 0xfd, 0x69, 0x7f, 0xf8, 0xa7, 0xab, 0xe8, + 0xec, 0xd9, 0x70, 0x9c, 0xd3, 0x52, 0x5a, 0x0e, 0x28, 0x7e, 0x60, 0x39, 0x60, 0x0d, 0x86, 0x19, + 0x6b, 0xd9, 0x23, 0x43, 0x59, 0xda, 0x0b, 0x8d, 0x31, 0x10, 0x4b, 0xa2, 0x22, 0x56, 0x24, 0xd0, + 0x0f, 0x5b, 0x70, 0x29, 0xdd, 0x75, 0x4c, 0x18, 0x58, 0xc4, 0x32, 0xe7, 0x22, 0xda, 0x8a, 0xf8, + 0xfe, 0x4b, 0xb5, 0x6e, 0xc8, 0xc7, 0xbd, 0x10, 0x70, 0xf7, 0xc6, 0x50, 0x35, 0x43, 0x46, 0x1c, + 0x34, 0xf5, 0xe2, 0x7d, 0xc8, 0x89, 0x2f, 0xc1, 0xe8, 0x5e, 0xd0, 0xf6, 0x63, 0x61, 0x96, 0x22, + 0x9c, 0x04, 0xd9, 0x3b, 0xf0, 0x9a, 0x56, 0x8e, 0x0d, 0xac, 0x94, 0x74, 0x39, 0xfc, 0xb0, 0xd2, + 0x25, 0x7a, 0x27, 0x95, 0x87, 0xba, 0x9c, 0x1f, 0x33, 0x4f, 0x08, 0xe2, 0x27, 0xc8, 0x46, 0x7d, + 0xb6, 0x12, 0xd1, 0xcf, 0x59, 0x19, 0xac, 0x3c, 0x97, 0x91, 0x3f, 0x6b, 0xca, 0xc8, 0x57, 0xd3, + 0x32, 0x72, 0x87, 0x4e, 0xd4, 0x10, 0x8f, 0xfb, 0x0f, 0xbc, 0xdc, 0x6f, 0x24, 0x33, 0xdb, 0x83, + 0x2b, 0xbd, 0xae, 0x25, 0x66, 0x9f, 0xd4, 0x54, 0x2f, 0x60, 0x89, 0x7d, 0x52, 0x73, 0xb5, 0x8a, + 0x19, 0xa4, 0xdf, 0x50, 0x17, 0xf6, 0x7f, 0xb3, 0xa0, 0x58, 0x0b, 0x9a, 0x67, 0xa0, 0xe3, 0xfd, + 0x9c, 0xa1, 0xe3, 0x7d, 0x3c, 0x27, 0x3f, 0x78, 0xae, 0x46, 0x77, 0x39, 0xa5, 0xd1, 0xbd, 0x94, + 0x47, 0xa0, 0xbb, 0xfe, 0xf6, 0xa7, 0x8b, 0xa0, 0x67, 0x33, 0x47, 0xff, 0xea, 0x61, 0x8c, 0x83, + 0x8b, 0xdd, 0x12, 0x9c, 0x0b, 0xca, 0xcc, 0xac, 0x49, 0xfa, 0xbd, 0xfd, 0x39, 0xb3, 0x11, 0x7e, + 0x8b, 0xb8, 0xdb, 0x3b, 0x31, 0x69, 0xa6, 0x3f, 0xe7, 0xec, 0x6c, 0x84, 0xff, 0x8b, 0x05, 0x13, + 0xa9, 0xd6, 0x91, 0x07, 0x63, 0x9e, 0xae, 0xa0, 0x13, 0xeb, 0xf4, 0xa1, 0x74, 0x7b, 0xc2, 0xc6, + 0x52, 0x2b, 0xc2, 0x26, 0x71, 0x34, 0x07, 0xa0, 0x1e, 0xd0, 0xa4, 0xde, 0x8b, 0x71, 0xfd, 0xea, + 0x85, 0x2d, 0xc2, 0x1a, 0x06, 0x7a, 0x19, 0x46, 0xe2, 0xa0, 0x15, 0x78, 0xc1, 0xf6, 0xc1, 0x2d, + 0x22, 0x83, 0xab, 0x28, 0xcb, 0xa9, 0x8d, 0x04, 0x84, 0x75, 0x3c, 0xfb, 0x67, 0x8b, 0x90, 0xce, + 0x80, 0xff, 0xad, 0x35, 0xf9, 0xd1, 0x5c, 0x93, 0xdf, 0xb4, 0x60, 0x92, 0xb6, 0xce, 0xac, 0x38, + 0xe4, 0x65, 0xab, 0x12, 0xc0, 0x58, 0x5d, 0x12, 0xc0, 0x5c, 0xa5, 0x67, 0x57, 0x33, 0x68, 0xc7, + 0x42, 0x6f, 0xa6, 0x1d, 0x4e, 0xb4, 0x14, 0x0b, 0xa8, 0xc0, 0x23, 0x61, 0x28, 0x5c, 0x93, 0x74, + 0x3c, 0x12, 0x86, 0x58, 0x40, 0x65, 0x7e, 0x98, 0x52, 0x4e, 0x7e, 0x18, 0x16, 0x2a, 0x4e, 0xbc, + 0xf7, 0x0b, 0xb6, 0x47, 0x0b, 0x15, 0x27, 0x0d, 0x01, 0x12, 0x1c, 0xfb, 0x17, 0x8b, 0x30, 0x5a, + 0x0b, 0x9a, 0xc9, 0x13, 0xd6, 0x4b, 0xc6, 0x13, 0xd6, 0x95, 0xd4, 0x13, 0xd6, 0xa4, 0x8e, 0xfb, + 0xad, 0x07, 0xab, 0x0f, 0xeb, 0xc1, 0xea, 0x9f, 0x5b, 0x6c, 0xd6, 0xaa, 0xeb, 0x75, 0x91, 0x9f, + 0xf6, 0x05, 0x18, 0x61, 0x07, 0x12, 0xf3, 0x85, 0x93, 0xef, 0x3a, 0x2c, 0xf4, 0xfb, 0x7a, 0x52, + 0x8c, 0x75, 0x1c, 0x74, 0x0d, 0x86, 0x23, 0xe2, 0x84, 0x8d, 0x1d, 0x75, 0xc6, 0x89, 0x57, 0x0f, + 0x5e, 0x86, 0x15, 0x14, 0xbd, 0x99, 0x44, 0x29, 0x2b, 0xe6, 0x67, 0x5a, 0xd5, 0xfb, 0xc3, 0xb7, + 0x48, 0x7e, 0x68, 0x32, 0xfb, 0x2d, 0x40, 0x9d, 0xf8, 0x7d, 0xc4, 0x23, 0xaa, 0x98, 0xf1, 0x88, + 0xca, 0x1d, 0xb1, 0x88, 0xfe, 0xd4, 0x82, 0xf1, 0x5a, 0xd0, 0xa4, 0x5b, 0xf7, 0x2f, 0xd2, 0x3e, + 0xd5, 0x43, 0x34, 0x0e, 0x76, 0x09, 0xd1, 0xf8, 0xf7, 0x2c, 0x18, 0xaa, 0x05, 0xcd, 0x33, 0xd0, + 0xb6, 0x7f, 0xd6, 0xd4, 0xb6, 0x3f, 0x96, 0xb3, 0x24, 0x72, 0x14, 0xec, 0xbf, 0x5c, 0x84, 0x31, + 0xda, 0xcf, 0x60, 0x5b, 0xce, 0x92, 0x31, 0x22, 0x56, 0x1f, 0x23, 0x42, 0xd9, 0xdc, 0xc0, 0xf3, + 0x82, 0xfb, 0xe9, 0x19, 0x5b, 0x61, 0xa5, 0x58, 0x40, 0xd1, 0x73, 0x30, 0xdc, 0x0a, 0xc9, 0xbe, + 0x1b, 0x08, 0xfe, 0x51, 0x7b, 0xbb, 0xa8, 0x89, 0x72, 0xac, 0x30, 0xa8, 0xdc, 0x15, 0xb9, 0x7e, + 0x83, 0xc8, 0x34, 0xcf, 0x25, 0x96, 0x09, 0x8a, 0xc7, 0x5e, 0xd6, 0xca, 0xb1, 0x81, 0x85, 0xde, + 0x82, 0x32, 0xfb, 0xcf, 0x4e, 0x94, 0x93, 0x67, 0xae, 0x11, 0x09, 0x0f, 0x04, 0x01, 0x9c, 0xd0, + 0x42, 0xd7, 0x01, 0x62, 0x19, 0x9f, 0x37, 0x12, 0x61, 0x65, 0x14, 0xaf, 0xad, 0x22, 0xf7, 0x46, + 0x58, 0xc3, 0x42, 0xcf, 0x42, 0x39, 0x76, 0x5c, 0xef, 0xb6, 0xeb, 0x93, 0x88, 0xa9, 0x9c, 0x8b, + 0x32, 0x9f, 0x81, 0x28, 0xc4, 0x09, 0x9c, 0xf2, 0x3a, 0xcc, 0xe7, 0x9a, 0xe7, 0xbd, 0x1a, 0x66, + 0xd8, 0x8c, 0xd7, 0xb9, 0xad, 0x4a, 0xb1, 0x86, 0x61, 0xbf, 0x0a, 0xd3, 0xb5, 0xa0, 0x59, 0x0b, + 0xc2, 0x78, 0x25, 0x08, 0xef, 0x3b, 0x61, 0x53, 0xce, 0x5f, 0x45, 0x86, 0xd6, 0xa7, 0x67, 0xcf, + 0x00, 0xdf, 0x99, 0x46, 0xd0, 0xfc, 0x17, 0x19, 0xb7, 0x73, 0x42, 0x5f, 0x8b, 0x06, 0xbb, 0x77, + 0x55, 0x8a, 0xbb, 0x1b, 0x4e, 0x4c, 0xd0, 0x1d, 0x96, 0x16, 0x2b, 0xb9, 0x82, 0x44, 0xf5, 0x67, + 0xb4, 0xb4, 0x58, 0x09, 0x30, 0xf3, 0xce, 0x32, 0xeb, 0xdb, 0xbf, 0x5e, 0x64, 0xa7, 0x51, 0x2a, + 0xe3, 0x1b, 0xfa, 0x12, 0x8c, 0x47, 0xe4, 0xb6, 0xeb, 0xb7, 0x1f, 0x48, 0x21, 0xbc, 0x8b, 0xb7, + 0x4c, 0x7d, 0x59, 0xc7, 0xe4, 0xaa, 0x3c, 0xb3, 0x0c, 0xa7, 0xa8, 0xd1, 0x79, 0x0a, 0xdb, 0xfe, + 0x42, 0x74, 0x37, 0x22, 0xa1, 0xc8, 0x38, 0xc6, 0xe6, 0x09, 0xcb, 0x42, 0x9c, 0xc0, 0xe9, 0xba, + 0x64, 0x7f, 0xd6, 0x03, 0x1f, 0x07, 0x41, 0x2c, 0x57, 0x32, 0xcb, 0x59, 0xa3, 0x95, 0x63, 0x03, + 0x0b, 0xad, 0x00, 0x8a, 0xda, 0xad, 0x96, 0xc7, 0xde, 0xdb, 0x1d, 0xef, 0x46, 0x18, 0xb4, 0x5b, + 0xfc, 0xad, 0xb3, 0xb8, 0x78, 0x81, 0x5e, 0x61, 0xf5, 0x0e, 0x28, 0xce, 0xa8, 0x41, 0x4f, 0x9f, + 0xad, 0x88, 0xfd, 0x66, 0xab, 0xbb, 0x28, 0xd4, 0xeb, 0x75, 0x56, 0x84, 0x25, 0x8c, 0x2e, 0x26, + 0xd6, 0x3c, 0xc7, 0x1c, 0x4c, 0x16, 0x13, 0x56, 0xa5, 0x58, 0xc3, 0x40, 0xcb, 0x30, 0x14, 0x1d, + 0x44, 0x8d, 0x58, 0x04, 0x41, 0xca, 0xc9, 0x1d, 0x59, 0x67, 0x28, 0x5a, 0x3e, 0x03, 0x5e, 0x05, + 0xcb, 0xba, 0xf6, 0xf7, 0xb0, 0xcb, 0x90, 0xe5, 0xa7, 0x8a, 0xdb, 0x21, 0x41, 0x7b, 0x30, 0xd6, + 0x62, 0x53, 0x2e, 0xa2, 0x27, 0x8b, 0x79, 0x7b, 0xa9, 0x4f, 0xa9, 0xf6, 0x3e, 0x3d, 0x68, 0x94, + 0xd6, 0x89, 0x89, 0x0b, 0x35, 0x9d, 0x1c, 0x36, 0xa9, 0xdb, 0x3f, 0x38, 0xc5, 0xce, 0xdc, 0x3a, + 0x17, 0x55, 0x87, 0x84, 0xc5, 0xaf, 0xe0, 0xcb, 0x67, 0xf3, 0x75, 0x26, 0xc9, 0x17, 0x09, 0xab, + 0x61, 0x2c, 0xeb, 0xa2, 0x37, 0xd9, 0xdb, 0x34, 0x3f, 0xe8, 0x7a, 0xa5, 0x09, 0xe6, 0x58, 0xc6, + 0x33, 0xb4, 0xa8, 0x88, 0x35, 0x22, 0xe8, 0x36, 0x8c, 0x89, 0x74, 0x46, 0x42, 0x29, 0x56, 0x34, + 0x94, 0x1e, 0x63, 0x58, 0x07, 0x1e, 0xa7, 0x0b, 0xb0, 0x59, 0x19, 0x6d, 0xc3, 0x25, 0x2d, 0xb7, + 0xdf, 0x8d, 0xd0, 0x61, 0xef, 0x95, 0x2e, 0xdb, 0x44, 0xda, 0xb9, 0xf9, 0xe4, 0xd1, 0x61, 0xe5, + 0xd2, 0x46, 0x37, 0x44, 0xdc, 0x9d, 0x0e, 0xba, 0x03, 0xd3, 0xdc, 0xb1, 0xae, 0x4a, 0x9c, 0xa6, + 0xe7, 0xfa, 0xea, 0x60, 0xe6, 0xeb, 0xf0, 0xe2, 0xd1, 0x61, 0x65, 0x7a, 0x21, 0x0b, 0x01, 0x67, + 0xd7, 0x43, 0x9f, 0x85, 0x72, 0xd3, 0x8f, 0xc4, 0x18, 0x0c, 0x1a, 0x69, 0x2b, 0xcb, 0xd5, 0xf5, + 0xba, 0xfa, 0xfe, 0xe4, 0x0f, 0x4e, 0x2a, 0xa0, 0x6d, 0xae, 0x18, 0x53, 0x72, 0xe8, 0x50, 0x7e, + 0x8a, 0x72, 0xb1, 0x24, 0x0c, 0xd7, 0x1a, 0xae, 0x11, 0x56, 0xa6, 0xa9, 0x86, 0xd7, 0x8d, 0x41, + 0x18, 0xbd, 0x01, 0x88, 0x32, 0x6a, 0x6e, 0x83, 0x2c, 0x34, 0x58, 0x10, 0x6b, 0xa6, 0x47, 0x1c, + 0x36, 0x5c, 0x19, 0x50, 0xbd, 0x03, 0x03, 0x67, 0xd4, 0x42, 0x37, 0xe9, 0x41, 0xa6, 0x97, 0x0a, + 0x13, 0x5b, 0xc9, 0xdc, 0xcf, 0x54, 0x49, 0x2b, 0x24, 0x0d, 0x27, 0x26, 0x4d, 0x93, 0x22, 0x4e, + 0xd5, 0xa3, 0x77, 0xa9, 0xca, 0x67, 0x03, 0x66, 0xa4, 0x8a, 0xce, 0x9c, 0x36, 0x54, 0x2e, 0xde, + 0x09, 0xa2, 0x78, 0x9d, 0xc4, 0xf7, 0x83, 0x70, 0x57, 0x04, 0x06, 0x4b, 0x62, 0x54, 0x26, 0x20, + 0xac, 0xe3, 0x51, 0x3e, 0x98, 0x3d, 0x0e, 0xaf, 0x56, 0xd9, 0x0b, 0xdd, 0x70, 0xb2, 0x4f, 0x6e, + 0xf2, 0x62, 0x2c, 0xe1, 0x12, 0x75, 0xb5, 0xb6, 0xc4, 0x5e, 0xdb, 0x52, 0xa8, 0xab, 0xb5, 0x25, + 0x2c, 0xe1, 0x88, 0x74, 0xa6, 0x04, 0x1d, 0xcf, 0xd7, 0x6a, 0x76, 0x5e, 0x07, 0x7d, 0x66, 0x05, + 0xf5, 0x61, 0x52, 0x25, 0x23, 0xe5, 0x11, 0xd3, 0xa2, 0x99, 0x09, 0xb6, 0x48, 0xfa, 0x0f, 0xb7, + 0xa6, 0xf4, 0xc4, 0xab, 0x29, 0x4a, 0xb8, 0x83, 0xb6, 0x11, 0x3b, 0x64, 0xb2, 0x67, 0x3e, 0xa2, + 0x79, 0x28, 0x47, 0xed, 0xcd, 0x66, 0xb0, 0xe7, 0xb8, 0x3e, 0x7b, 0x1c, 0xd3, 0x98, 0xac, 0xba, + 0x04, 0xe0, 0x04, 0x07, 0xad, 0xc0, 0xb0, 0x23, 0x95, 0xc0, 0x28, 0x3f, 0x98, 0x80, 0x52, 0xfd, + 0x72, 0xff, 0x5a, 0xa9, 0xf6, 0x55, 0x75, 0xd1, 0x6b, 0x30, 0x26, 0xdc, 0xa9, 0x78, 0x88, 0x05, + 0xf6, 0x78, 0xa5, 0xd9, 0xcb, 0xd7, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x17, 0x61, 0x9c, 0x52, 0x49, + 0x0e, 0xb6, 0x99, 0xf3, 0xfd, 0x9c, 0x88, 0x5a, 0x9e, 0x09, 0xbd, 0x32, 0x4e, 0x11, 0x43, 0x4d, + 0x78, 0xc2, 0x69, 0xc7, 0x01, 0x53, 0xa4, 0x9b, 0xeb, 0x7f, 0x23, 0xd8, 0x25, 0x3e, 0x7b, 0xc3, + 0x1a, 0x5e, 0xbc, 0x72, 0x74, 0x58, 0x79, 0x62, 0xa1, 0x0b, 0x1e, 0xee, 0x4a, 0x05, 0xdd, 0x85, + 0x91, 0x38, 0xf0, 0x98, 0xe5, 0x3a, 0x65, 0x25, 0x2e, 0xe4, 0xc7, 0xde, 0xd9, 0x50, 0x68, 0xba, + 0x12, 0x49, 0x55, 0xc5, 0x3a, 0x1d, 0xb4, 0xc1, 0xf7, 0x18, 0x8b, 0x4a, 0x4a, 0xa2, 0x99, 0xc7, + 0xf2, 0x07, 0x46, 0x05, 0x2f, 0x35, 0xb7, 0xa0, 0xa8, 0x89, 0x75, 0x32, 0xe8, 0x06, 0x4c, 0xb5, + 0x42, 0x37, 0x60, 0x0b, 0x5b, 0x3d, 0x62, 0xcc, 0x98, 0xa9, 0x05, 0x6a, 0x69, 0x04, 0xdc, 0x59, + 0x87, 0x0a, 0x99, 0xb2, 0x70, 0xe6, 0x22, 0xcf, 0x53, 0xc5, 0x19, 0x6f, 0x5e, 0x86, 0x15, 0x14, + 0xad, 0xb1, 0x73, 0x99, 0x8b, 0x83, 0x33, 0xb3, 0xf9, 0x41, 0x18, 0x74, 0xb1, 0x91, 0xf3, 0x4b, + 0xea, 0x2f, 0x4e, 0x28, 0xd0, 0x7b, 0x23, 0xda, 0x71, 0x42, 0x52, 0x0b, 0x83, 0x06, 0xe1, 0x9d, + 0xe1, 0x46, 0xf3, 0x8f, 0xf3, 0xe0, 0x89, 0xf4, 0xde, 0xa8, 0x67, 0x21, 0xe0, 0xec, 0x7a, 0xa8, + 0xa9, 0xa5, 0x67, 0xa6, 0x6c, 0x68, 0x34, 0xf3, 0x44, 0x17, 0x33, 0xa3, 0x14, 0xcf, 0x9a, 0xac, + 0x45, 0xa3, 0x38, 0xc2, 0x29, 0x9a, 0xb3, 0xdf, 0x0e, 0x53, 0x1d, 0xf7, 0xc5, 0x89, 0xe2, 0x76, + 0xff, 0xc9, 0x00, 0x94, 0x95, 0x2a, 0x1c, 0xcd, 0x9b, 0x2f, 0x1c, 0x17, 0xd3, 0x2f, 0x1c, 0xc3, + 0x94, 0x23, 0xd7, 0x1f, 0x35, 0x36, 0x0c, 0xa3, 0xb8, 0x42, 0x7e, 0x96, 0x2c, 0x9d, 0xa7, 0xee, + 0xe9, 0x01, 0xa7, 0x69, 0x36, 0x8a, 0x7d, 0x3f, 0x95, 0x94, 0xba, 0x2a, 0x4b, 0xfa, 0x4c, 0x52, + 0x4b, 0x85, 0xff, 0x56, 0xd0, 0x5c, 0xad, 0xa5, 0xb3, 0x36, 0xd6, 0x68, 0x21, 0xe6, 0x30, 0x26, + 0xbe, 0x51, 0xe6, 0x86, 0x89, 0x6f, 0x43, 0x0f, 0x29, 0xbe, 0x49, 0x02, 0x38, 0xa1, 0x85, 0x3c, + 0x98, 0x6a, 0x98, 0x09, 0x37, 0x95, 0xd7, 0xdb, 0x53, 0x3d, 0x53, 0x5f, 0xb6, 0xb5, 0xec, 0x66, + 0x4b, 0x69, 0x2a, 0xb8, 0x93, 0x30, 0x7a, 0x0d, 0x86, 0xdf, 0x0b, 0x22, 0xb6, 0xf9, 0xc4, 0x0d, + 0x2f, 0xbd, 0x83, 0x86, 0xdf, 0xbc, 0x53, 0x67, 0xe5, 0xc7, 0x87, 0x95, 0x91, 0x5a, 0xd0, 0x94, + 0x7f, 0xb1, 0xaa, 0x80, 0x1e, 0xc0, 0xb4, 0x71, 0x2e, 0xaa, 0xee, 0x42, 0xff, 0xdd, 0xbd, 0x24, + 0x9a, 0x9b, 0x5e, 0xcd, 0xa2, 0x84, 0xb3, 0x1b, 0xa0, 0x87, 0x8d, 0x1f, 0x88, 0x64, 0xb5, 0x92, + 0x8b, 0x60, 0xcc, 0x42, 0x59, 0xf7, 0x0d, 0x4f, 0x21, 0xe0, 0xce, 0x3a, 0xf6, 0xd7, 0xf8, 0xcb, + 0x81, 0xd0, 0x2f, 0x92, 0xa8, 0xed, 0x9d, 0x45, 0x2e, 0xa4, 0x65, 0x43, 0xf5, 0xf9, 0xd0, 0xaf, + 0x53, 0xbf, 0x69, 0xb1, 0xd7, 0xa9, 0x0d, 0xb2, 0xd7, 0xf2, 0xa8, 0x94, 0xfb, 0xe8, 0x3b, 0xfe, + 0x26, 0x0c, 0xc7, 0xa2, 0xb5, 0x6e, 0xe9, 0x9b, 0xb4, 0x4e, 0xb1, 0x17, 0x3a, 0xc5, 0x5f, 0xc8, + 0x52, 0xac, 0xc8, 0xd8, 0xff, 0x94, 0xcf, 0x80, 0x84, 0x9c, 0x81, 0x1a, 0xaa, 0x6a, 0xaa, 0xa1, + 0x2a, 0x3d, 0xbe, 0x20, 0x47, 0x1d, 0xf5, 0x4f, 0xcc, 0x7e, 0x33, 0x51, 0xee, 0xa3, 0xfe, 0x2c, + 0x6a, 0xff, 0x98, 0x05, 0xe7, 0xb3, 0xec, 0x88, 0x28, 0x4f, 0xc8, 0x05, 0x49, 0xf5, 0x4c, 0xac, + 0x46, 0xf0, 0x9e, 0x28, 0xc7, 0x0a, 0xa3, 0xef, 0xcc, 0x08, 0x27, 0x0b, 0x9f, 0x76, 0x07, 0xc6, + 0x6a, 0x21, 0xd1, 0xee, 0x80, 0xd7, 0xb9, 0x9b, 0x19, 0xef, 0xcf, 0x73, 0x27, 0x76, 0x31, 0xb3, + 0x7f, 0xbe, 0x00, 0xe7, 0xf9, 0x3b, 0xcf, 0xc2, 0x7e, 0xe0, 0x36, 0x6b, 0x41, 0x53, 0x64, 0xb5, + 0x78, 0x1b, 0x46, 0x5b, 0x9a, 0xf4, 0xdf, 0x2d, 0x80, 0x93, 0xae, 0x25, 0x48, 0xa4, 0x30, 0xbd, + 0x14, 0x1b, 0xb4, 0x50, 0x13, 0x46, 0xc9, 0xbe, 0xdb, 0x50, 0x8f, 0x05, 0x85, 0x13, 0xdf, 0x0d, + 0xaa, 0x95, 0x65, 0x8d, 0x0e, 0x36, 0xa8, 0x3e, 0x82, 0x44, 0x67, 0xf6, 0x8f, 0x5b, 0xf0, 0x58, + 0x4e, 0xb8, 0x27, 0xda, 0xdc, 0x7d, 0xf6, 0xa2, 0x26, 0x72, 0x26, 0xa9, 0xe6, 0xf8, 0x3b, 0x1b, + 0x16, 0x50, 0xf4, 0x79, 0x00, 0xfe, 0x4e, 0x46, 0x85, 0x92, 0x5e, 0x71, 0x71, 0x8c, 0x90, 0x1e, + 0x5a, 0x28, 0x06, 0x59, 0x1f, 0x6b, 0xb4, 0xec, 0x9f, 0x29, 0xc2, 0x00, 0x7b, 0x97, 0x41, 0x2b, + 0x30, 0xb4, 0xc3, 0x83, 0x1b, 0xf7, 0x13, 0x47, 0x39, 0x91, 0xee, 0x78, 0x01, 0x96, 0x95, 0xd1, + 0x1a, 0x9c, 0xe3, 0xc1, 0xa1, 0xbd, 0x2a, 0xf1, 0x9c, 0x03, 0xa9, 0x24, 0xe0, 0x79, 0x86, 0x54, + 0x58, 0x89, 0xd5, 0x4e, 0x14, 0x9c, 0x55, 0x0f, 0xbd, 0x0e, 0xe3, 0xb1, 0xbb, 0x47, 0x82, 0x76, + 0x2c, 0x29, 0xf1, 0xb0, 0xd0, 0x8a, 0x8d, 0xdb, 0x30, 0xa0, 0x38, 0x85, 0x4d, 0xc5, 0x9d, 0x56, + 0x87, 0x3a, 0x44, 0xcb, 0xdc, 0x6f, 0xaa, 0x40, 0x4c, 0x5c, 0x66, 0x40, 0xd4, 0x66, 0xe6, 0x52, + 0x1b, 0x3b, 0x21, 0x89, 0x76, 0x02, 0xaf, 0x29, 0xd2, 0x54, 0x27, 0x06, 0x44, 0x29, 0x38, 0xee, + 0xa8, 0x41, 0xa9, 0x6c, 0x39, 0xae, 0xd7, 0x0e, 0x49, 0x42, 0x65, 0xd0, 0xa4, 0xb2, 0x92, 0x82, + 0xe3, 0x8e, 0x1a, 0x74, 0x1d, 0x4d, 0x8b, 0xbc, 0xd1, 0xd2, 0xd9, 0x5d, 0x59, 0x85, 0x0d, 0x49, + 0xb7, 0x9f, 0x2e, 0xd1, 0x5e, 0x84, 0xdd, 0x8c, 0xca, 0x3c, 0xad, 0x69, 0xf1, 0x84, 0xc3, 0x8f, + 0xa4, 0xf2, 0x30, 0xd9, 0x8b, 0x7f, 0xcf, 0x82, 0x73, 0x19, 0xd6, 0xa7, 0xfc, 0xa8, 0xda, 0x76, + 0xa3, 0x58, 0xe5, 0x52, 0xd1, 0x8e, 0x2a, 0x5e, 0x8e, 0x15, 0x06, 0xdd, 0x0f, 0xfc, 0x30, 0x4c, + 0x1f, 0x80, 0xc2, 0xba, 0x4b, 0x40, 0x4f, 0x76, 0x00, 0xa2, 0x2b, 0x50, 0x6a, 0x47, 0x44, 0xc6, + 0x69, 0x52, 0xe7, 0x37, 0xd3, 0xeb, 0x32, 0x08, 0x65, 0x4d, 0xb7, 0x95, 0x4a, 0x55, 0x63, 0x4d, + 0xb9, 0x9e, 0x94, 0xc3, 0xec, 0xaf, 0x16, 0xe1, 0x62, 0xae, 0x9d, 0x39, 0xed, 0xd2, 0x5e, 0xe0, + 0xbb, 0x71, 0xa0, 0xde, 0xfc, 0x78, 0xa4, 0x10, 0xd2, 0xda, 0x59, 0x13, 0xe5, 0x58, 0x61, 0xa0, + 0xab, 0x32, 0x83, 0x79, 0x3a, 0x5b, 0xcc, 0x62, 0xd5, 0x48, 0x62, 0xde, 0x6f, 0x26, 0xae, 0xa7, + 0xa0, 0xd4, 0x0a, 0x02, 0x2f, 0x7d, 0x18, 0xd1, 0xee, 0x06, 0x81, 0x87, 0x19, 0x10, 0x7d, 0x42, + 0x8c, 0x43, 0xea, 0x91, 0x0b, 0x3b, 0xcd, 0x20, 0xd2, 0x06, 0xe3, 0x19, 0x18, 0xda, 0x25, 0x07, + 0xa1, 0xeb, 0x6f, 0xa7, 0x1f, 0x3f, 0x6f, 0xf1, 0x62, 0x2c, 0xe1, 0x66, 0xb2, 0x84, 0xa1, 0xd3, + 0x4e, 0xa1, 0x35, 0xdc, 0xf3, 0x6a, 0xfb, 0xa1, 0x22, 0x4c, 0xe0, 0xc5, 0xea, 0xb7, 0x26, 0xe2, + 0x6e, 0xe7, 0x44, 0x9c, 0x76, 0x0a, 0xad, 0xde, 0xb3, 0xf1, 0xcb, 0x16, 0x4c, 0xb0, 0x80, 0xc2, + 0x22, 0x3e, 0x85, 0x1b, 0xf8, 0x67, 0xc0, 0xba, 0x3d, 0x05, 0x03, 0x21, 0x6d, 0x34, 0x9d, 0x17, + 0x87, 0xf5, 0x04, 0x73, 0x18, 0x7a, 0x02, 0x4a, 0xac, 0x0b, 0x74, 0xf2, 0x46, 0x79, 0x4a, 0x81, + 0xaa, 0x13, 0x3b, 0x98, 0x95, 0x32, 0xa7, 0x6b, 0x4c, 0x5a, 0x9e, 0xcb, 0x3b, 0x9d, 0x3c, 0x28, + 0x7c, 0x34, 0x9c, 0xae, 0x33, 0xbb, 0xf6, 0xc1, 0x9c, 0xae, 0xb3, 0x49, 0x76, 0x17, 0x8b, 0xfe, + 0x7b, 0x01, 0x2e, 0x67, 0xd6, 0xeb, 0xdb, 0xe9, 0xba, 0x7b, 0xed, 0xd3, 0xb1, 0x61, 0xc9, 0x36, + 0x2d, 0x29, 0x9e, 0xa1, 0x69, 0x49, 0xa9, 0x5f, 0xce, 0x71, 0xa0, 0x0f, 0x5f, 0xe8, 0xcc, 0x21, + 0xfb, 0x88, 0xf8, 0x42, 0x67, 0xf6, 0x2d, 0x47, 0xac, 0xfb, 0xb3, 0x42, 0xce, 0xb7, 0x30, 0x01, + 0xef, 0x1a, 0x3d, 0x67, 0x18, 0x30, 0x12, 0x9c, 0xf0, 0x28, 0x3f, 0x63, 0x78, 0x19, 0x56, 0x50, + 0xe4, 0x6a, 0x5e, 0xc5, 0x85, 0xfc, 0xac, 0x89, 0xb9, 0x4d, 0xcd, 0x99, 0xef, 0x3f, 0x6a, 0x08, + 0x32, 0x3c, 0x8c, 0xd7, 0x34, 0xa1, 0xbc, 0xd8, 0xbf, 0x50, 0x3e, 0x9a, 0x2d, 0x90, 0xa3, 0x05, + 0x98, 0xd8, 0x73, 0x7d, 0x96, 0x05, 0xdf, 0x64, 0x45, 0x55, 0x90, 0x8d, 0x35, 0x13, 0x8c, 0xd3, + 0xf8, 0xb3, 0xaf, 0xc1, 0xd8, 0xc3, 0xab, 0x23, 0xbf, 0x59, 0x84, 0xc7, 0xbb, 0x6c, 0x7b, 0x7e, + 0xd6, 0x1b, 0x73, 0xa0, 0x9d, 0xf5, 0x1d, 0xf3, 0x50, 0x83, 0xf3, 0x5b, 0x6d, 0xcf, 0x3b, 0x60, + 0xd6, 0x9b, 0xa4, 0x29, 0x31, 0x04, 0xaf, 0xf8, 0x84, 0x4c, 0xe2, 0xb0, 0x92, 0x81, 0x83, 0x33, + 0x6b, 0xa2, 0x37, 0x00, 0x05, 0x22, 0x65, 0xeb, 0x0d, 0xe2, 0x0b, 0xad, 0x3a, 0x1b, 0xf8, 0x62, + 0xb2, 0x19, 0xef, 0x74, 0x60, 0xe0, 0x8c, 0x5a, 0x94, 0xe9, 0xa7, 0xb7, 0xd2, 0x81, 0xea, 0x56, + 0x8a, 0xe9, 0xc7, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x06, 0x4c, 0x39, 0xfb, 0x8e, 0xcb, 0x83, 0xcf, + 0x49, 0x02, 0x9c, 0xeb, 0x57, 0x4a, 0xb0, 0x85, 0x34, 0x02, 0xee, 0xac, 0x93, 0x72, 0x6b, 0x1e, + 0xcc, 0x77, 0x6b, 0xee, 0x7e, 0x2e, 0xf6, 0xd2, 0xe9, 0xda, 0xff, 0xd1, 0xa2, 0xd7, 0x57, 0x46, + 0xda, 0x75, 0x3a, 0x0e, 0x4a, 0x37, 0xa9, 0x79, 0x18, 0x4f, 0x6b, 0xf6, 0x19, 0x09, 0x10, 0x9b, + 0xb8, 0x7c, 0x41, 0x44, 0x89, 0x8b, 0x8b, 0xc1, 0xba, 0x8b, 0x10, 0x02, 0x0a, 0x03, 0x7d, 0x01, + 0x86, 0x9a, 0xee, 0xbe, 0x1b, 0x05, 0xa1, 0xd8, 0x2c, 0x27, 0x74, 0x14, 0x48, 0xce, 0xc1, 0x2a, + 0x27, 0x83, 0x25, 0x3d, 0xfb, 0x87, 0x0a, 0x30, 0x26, 0x5b, 0x7c, 0xb3, 0x1d, 0xc4, 0xce, 0x19, + 0x5c, 0xcb, 0x37, 0x8c, 0x6b, 0xf9, 0x13, 0xdd, 0xe2, 0x28, 0xb0, 0x2e, 0xe5, 0x5e, 0xc7, 0x77, + 0x52, 0xd7, 0xf1, 0xd3, 0xbd, 0x49, 0x75, 0xbf, 0x86, 0xff, 0x99, 0x05, 0x53, 0x06, 0xfe, 0x19, + 0xdc, 0x06, 0x2b, 0xe6, 0x6d, 0xf0, 0x64, 0xcf, 0x6f, 0xc8, 0xb9, 0x05, 0xbe, 0xaf, 0x98, 0xea, + 0x3b, 0x3b, 0xfd, 0xdf, 0x83, 0xd2, 0x8e, 0x13, 0x36, 0xbb, 0xc5, 0x6b, 0xed, 0xa8, 0x34, 0x77, + 0xd3, 0x09, 0x9b, 0xfc, 0x0c, 0x7f, 0x4e, 0x25, 0x7a, 0x74, 0xc2, 0x66, 0x4f, 0x8f, 0x2e, 0xd6, + 0x14, 0x7a, 0x15, 0x06, 0xa3, 0x46, 0xd0, 0x52, 0xf6, 0x96, 0x57, 0x78, 0x12, 0x48, 0x5a, 0x72, + 0x7c, 0x58, 0x41, 0x66, 0x73, 0xb4, 0x18, 0x0b, 0x7c, 0xf4, 0x36, 0x8c, 0xb1, 0x5f, 0xca, 0xee, + 0xa0, 0x98, 0x9f, 0x25, 0xa0, 0xae, 0x23, 0x72, 0xf3, 0x15, 0xa3, 0x08, 0x9b, 0xa4, 0x66, 0xb7, + 0xa1, 0xac, 0x3e, 0xeb, 0x91, 0x7a, 0xe2, 0xfc, 0xbb, 0x22, 0x9c, 0xcb, 0x58, 0x73, 0x28, 0x32, + 0x66, 0xe2, 0x85, 0x3e, 0x97, 0xea, 0x07, 0x9c, 0x8b, 0x88, 0x49, 0x43, 0x4d, 0xb1, 0xb6, 0xfa, + 0x6e, 0xf4, 0x6e, 0x44, 0xd2, 0x8d, 0xd2, 0xa2, 0xde, 0x8d, 0xd2, 0xc6, 0xce, 0x6c, 0xa8, 0x69, + 0x43, 0xaa, 0xa7, 0x8f, 0x74, 0x4e, 0xff, 0xb8, 0x08, 0xe7, 0xb3, 0x42, 0xbb, 0xa0, 0xef, 0x4e, + 0x65, 0x83, 0x79, 0xa9, 0xdf, 0xa0, 0x30, 0x3c, 0x45, 0x8c, 0xc8, 0x6d, 0x3c, 0x67, 0xe6, 0x87, + 0xe9, 0x39, 0xcc, 0xa2, 0x4d, 0xe6, 0xbe, 0x19, 0xf2, 0x2c, 0x3e, 0xf2, 0xf8, 0xf8, 0x74, 0xdf, + 0x1d, 0x10, 0xe9, 0x7f, 0xa2, 0x94, 0xfb, 0xa6, 0x2c, 0xee, 0xed, 0xbe, 0x29, 0x5b, 0x9e, 0x75, + 0x61, 0x44, 0xfb, 0x9a, 0x47, 0x3a, 0xe3, 0xbb, 0xf4, 0xb6, 0xd2, 0xfa, 0xfd, 0x48, 0x67, 0xfd, + 0xc7, 0x2d, 0x48, 0x19, 0x37, 0x2a, 0x75, 0x97, 0x95, 0xab, 0xee, 0xba, 0x02, 0xa5, 0x30, 0xf0, + 0x48, 0x3a, 0x41, 0x0b, 0x0e, 0x3c, 0x82, 0x19, 0x84, 0x62, 0xc4, 0x89, 0xb2, 0x63, 0x54, 0x17, + 0xe4, 0x84, 0x88, 0xf6, 0x14, 0x0c, 0x78, 0x64, 0x9f, 0x78, 0xe9, 0xe8, 0xe7, 0xb7, 0x69, 0x21, + 0xe6, 0x30, 0xfb, 0x97, 0x4b, 0x70, 0xa9, 0xab, 0x03, 0x34, 0x15, 0x87, 0xb6, 0x9d, 0x98, 0xdc, + 0x77, 0x0e, 0xd2, 0x61, 0x8a, 0x6f, 0xf0, 0x62, 0x2c, 0xe1, 0xcc, 0xde, 0x9b, 0x87, 0x25, 0x4c, + 0x29, 0x07, 0x45, 0x34, 0x42, 0x01, 0x7d, 0x04, 0x79, 0xdd, 0xaf, 0x03, 0x44, 0x91, 0xb7, 0xec, + 0x53, 0xee, 0xae, 0x29, 0x0c, 0xc9, 0x93, 0xf0, 0x95, 0xf5, 0xdb, 0x02, 0x82, 0x35, 0x2c, 0x54, + 0x85, 0xc9, 0x56, 0x18, 0xc4, 0x5c, 0xd7, 0x5a, 0xe5, 0x66, 0x3e, 0x03, 0xa6, 0xef, 0x69, 0x2d, + 0x05, 0xc7, 0x1d, 0x35, 0xd0, 0xcb, 0x30, 0x22, 0xfc, 0x51, 0x6b, 0x41, 0xe0, 0x09, 0x35, 0x90, + 0x32, 0x1a, 0xa9, 0x27, 0x20, 0xac, 0xe3, 0x69, 0xd5, 0x98, 0x02, 0x77, 0x28, 0xb3, 0x1a, 0x57, + 0xe2, 0x6a, 0x78, 0xa9, 0x30, 0x4f, 0xc3, 0x7d, 0x85, 0x79, 0x4a, 0x14, 0x63, 0xe5, 0xbe, 0xdf, + 0xac, 0xa0, 0xa7, 0x2a, 0xe9, 0x17, 0x4a, 0x70, 0x4e, 0x2c, 0x9c, 0x47, 0xbd, 0x5c, 0x1e, 0x51, + 0xf6, 0xf9, 0x6f, 0xad, 0x99, 0xb3, 0x5e, 0x33, 0x3f, 0x6c, 0x81, 0xc9, 0x5e, 0xa1, 0xff, 0x2f, + 0x37, 0xce, 0xfb, 0xcb, 0xb9, 0xec, 0x5a, 0x53, 0x5e, 0x20, 0x1f, 0x30, 0xe2, 0xbb, 0xfd, 0x1f, + 0x2c, 0x78, 0xb2, 0x27, 0x45, 0xb4, 0x0c, 0x65, 0xc6, 0x03, 0x6a, 0xd2, 0xd9, 0xd3, 0xca, 0x0c, + 0x50, 0x02, 0x72, 0x58, 0xd2, 0xa4, 0x26, 0x5a, 0xee, 0x08, 0xa8, 0xff, 0x4c, 0x46, 0x40, 0xfd, + 0x69, 0x63, 0x78, 0x1e, 0x32, 0xa2, 0xfe, 0xd7, 0x8a, 0x30, 0xc8, 0x57, 0xfc, 0x19, 0x88, 0x61, + 0x2b, 0x42, 0x6f, 0xdb, 0x25, 0x8e, 0x14, 0xef, 0xcb, 0x5c, 0xd5, 0x89, 0x1d, 0xce, 0x26, 0xa8, + 0xdb, 0x2a, 0xd1, 0xf0, 0xa2, 0x39, 0xe3, 0x3e, 0x9b, 0x4d, 0x29, 0x26, 0x81, 0xd3, 0xd0, 0x6e, + 0xb7, 0x2f, 0x01, 0x44, 0x2c, 0xd1, 0x3c, 0xa5, 0x21, 0x22, 0x92, 0x7d, 0xb2, 0x4b, 0xeb, 0x75, + 0x85, 0xcc, 0xfb, 0x90, 0xec, 0x74, 0x05, 0xc0, 0x1a, 0xc5, 0xd9, 0x57, 0xa0, 0xac, 0x90, 0x7b, + 0x69, 0x71, 0x46, 0x75, 0xe6, 0xe2, 0x73, 0x30, 0x91, 0x6a, 0xeb, 0x44, 0x4a, 0xa0, 0x5f, 0xb1, + 0x60, 0x82, 0x77, 0x79, 0xd9, 0xdf, 0x17, 0x67, 0xea, 0xfb, 0x70, 0xde, 0xcb, 0x38, 0xdb, 0xc4, + 0x8c, 0xf6, 0x7f, 0x16, 0x2a, 0xa5, 0x4f, 0x16, 0x14, 0x67, 0xb6, 0x81, 0xae, 0xd1, 0x75, 0x4b, + 0xcf, 0x2e, 0xc7, 0x13, 0xbe, 0x43, 0xa3, 0x7c, 0xcd, 0xf2, 0x32, 0xac, 0xa0, 0xf6, 0xef, 0x58, + 0x30, 0xc5, 0x7b, 0x7e, 0x8b, 0x1c, 0xa8, 0x1d, 0xfe, 0x61, 0xf6, 0x5d, 0xe4, 0xb8, 0x28, 0xe4, + 0xe4, 0xb8, 0xd0, 0x3f, 0xad, 0xd8, 0xf5, 0xd3, 0x7e, 0xde, 0x02, 0xb1, 0x02, 0xcf, 0x40, 0x94, + 0xff, 0x76, 0x53, 0x94, 0x9f, 0xcd, 0x5f, 0xd4, 0x39, 0x32, 0xfc, 0x9f, 0x5a, 0x30, 0xc9, 0x11, + 0x92, 0xb7, 0xe4, 0x0f, 0x75, 0x1e, 0xfa, 0x49, 0x56, 0xa7, 0xb2, 0x53, 0x67, 0x7f, 0x94, 0x31, + 0x59, 0xa5, 0xae, 0x93, 0xd5, 0x94, 0x1b, 0xe8, 0x04, 0x49, 0x18, 0x4f, 0x1c, 0x2b, 0xda, 0xfe, + 0x23, 0x0b, 0x10, 0x6f, 0xc6, 0x60, 0x7f, 0x28, 0x53, 0xc1, 0x4a, 0xb5, 0xeb, 0x22, 0x39, 0x6a, + 0x14, 0x04, 0x6b, 0x58, 0xa7, 0x32, 0x3c, 0x29, 0x83, 0x80, 0x62, 0x6f, 0x83, 0x80, 0x13, 0x8c, + 0xe8, 0xd7, 0x4a, 0x90, 0x36, 0xe6, 0x47, 0xf7, 0x60, 0xb4, 0xe1, 0xb4, 0x9c, 0x4d, 0xd7, 0x73, + 0x63, 0x97, 0x44, 0xdd, 0x2c, 0x89, 0x96, 0x34, 0x3c, 0xf1, 0xd4, 0xab, 0x95, 0x60, 0x83, 0x0e, + 0x9a, 0x03, 0x68, 0x85, 0xee, 0xbe, 0xeb, 0x91, 0x6d, 0xa6, 0x71, 0x60, 0xde, 0x8a, 0xdc, 0x3c, + 0x46, 0x96, 0x62, 0x0d, 0x23, 0xc3, 0xf1, 0xac, 0xf8, 0xe8, 0x1c, 0xcf, 0x4a, 0x27, 0x74, 0x3c, + 0x1b, 0xe8, 0xcb, 0xf1, 0x0c, 0xc3, 0x05, 0xc9, 0x22, 0xd1, 0xff, 0x2b, 0xae, 0x47, 0x04, 0x5f, + 0xcc, 0x7d, 0x18, 0x67, 0x8f, 0x0e, 0x2b, 0x17, 0x70, 0x26, 0x06, 0xce, 0xa9, 0x89, 0x3e, 0x0f, + 0x33, 0x8e, 0xe7, 0x05, 0xf7, 0xd5, 0xa8, 0x2d, 0x47, 0x0d, 0xc7, 0xe3, 0x1a, 0xfb, 0x21, 0x46, + 0xf5, 0x89, 0xa3, 0xc3, 0xca, 0xcc, 0x42, 0x0e, 0x0e, 0xce, 0xad, 0x9d, 0xf2, 0x5b, 0x1b, 0xee, + 0xe5, 0xb7, 0x66, 0xef, 0xc2, 0xb9, 0x3a, 0x09, 0x5d, 0x96, 0x22, 0xb2, 0x99, 0x6c, 0xc9, 0x0d, + 0x28, 0x87, 0xa9, 0x43, 0xa8, 0xaf, 0xc0, 0x46, 0x5a, 0x18, 0x5c, 0x79, 0xe8, 0x24, 0x84, 0xec, + 0x3f, 0xb1, 0x60, 0x48, 0x38, 0x14, 0x9c, 0x01, 0xef, 0xb3, 0x60, 0xa8, 0xa0, 0x2b, 0xd9, 0x07, + 0x35, 0xeb, 0x4c, 0xae, 0xf2, 0x79, 0x35, 0xa5, 0x7c, 0x7e, 0xb2, 0x1b, 0x91, 0xee, 0x6a, 0xe7, + 0xbf, 0x55, 0x84, 0x71, 0xd3, 0x99, 0xe2, 0x0c, 0x86, 0x60, 0x1d, 0x86, 0x22, 0xe1, 0xb9, 0x53, + 0xc8, 0xb7, 0x7d, 0x4e, 0x4f, 0x62, 0x62, 0xd8, 0x24, 0x7c, 0x75, 0x24, 0x91, 0x4c, 0x97, 0xa0, + 0xe2, 0x23, 0x74, 0x09, 0xea, 0xe5, 0xcf, 0x52, 0x3a, 0x0d, 0x7f, 0x16, 0xfb, 0xeb, 0xec, 0xb2, + 0xd0, 0xcb, 0xcf, 0x80, 0x8f, 0xb8, 0x61, 0x5e, 0x2b, 0x76, 0x97, 0x95, 0x25, 0x3a, 0x95, 0xc3, + 0x4f, 0xfc, 0x92, 0x05, 0x97, 0x32, 0xbe, 0x4a, 0x63, 0x2e, 0x9e, 0x83, 0x61, 0xa7, 0xdd, 0x74, + 0xd5, 0x5e, 0xd6, 0x1e, 0xa2, 0x16, 0x44, 0x39, 0x56, 0x18, 0x68, 0x09, 0xa6, 0xc8, 0x83, 0x96, + 0xcb, 0x5f, 0x02, 0x75, 0xeb, 0xc3, 0x22, 0x0f, 0xf1, 0xba, 0x9c, 0x06, 0xe2, 0x4e, 0x7c, 0xe5, + 0x0e, 0x5d, 0xcc, 0x75, 0x87, 0xfe, 0x87, 0x16, 0x8c, 0x88, 0x6e, 0x9f, 0xc1, 0x68, 0x7f, 0x87, + 0x39, 0xda, 0x8f, 0x77, 0x19, 0xed, 0x9c, 0x61, 0xfe, 0x3b, 0x05, 0xd5, 0xdf, 0x5a, 0x10, 0xc6, + 0x7d, 0x30, 0x2d, 0xaf, 0xc2, 0x70, 0x2b, 0x0c, 0xe2, 0xa0, 0x11, 0x78, 0x82, 0x67, 0x79, 0x22, + 0xf1, 0xd6, 0xe7, 0xe5, 0xc7, 0xda, 0x6f, 0xac, 0xb0, 0xd9, 0xe8, 0x05, 0x61, 0x2c, 0xf8, 0x84, + 0x64, 0xf4, 0x82, 0x30, 0xc6, 0x0c, 0x82, 0x9a, 0x00, 0xb1, 0x13, 0x6e, 0x93, 0x98, 0x96, 0x89, + 0xc0, 0x1f, 0xf9, 0x87, 0x47, 0x3b, 0x76, 0xbd, 0x39, 0xd7, 0x8f, 0xa3, 0x38, 0x9c, 0x5b, 0xf5, + 0xe3, 0x3b, 0x21, 0x17, 0x81, 0x34, 0xf7, 0x7b, 0x45, 0x0b, 0x6b, 0x74, 0xa5, 0x8f, 0x24, 0x6b, + 0x63, 0xc0, 0x7c, 0xd2, 0x5e, 0x17, 0xe5, 0x58, 0x61, 0xd8, 0xaf, 0xb0, 0xab, 0x84, 0x0d, 0xd0, + 0xc9, 0x3c, 0xe3, 0xbf, 0x31, 0xac, 0x86, 0x96, 0xbd, 0x67, 0x55, 0x75, 0xff, 0xfb, 0xee, 0x27, + 0x37, 0x6d, 0x58, 0xf7, 0x84, 0x49, 0x9c, 0xf4, 0xd1, 0x77, 0x76, 0x58, 0x3a, 0x3c, 0xdf, 0xe3, + 0x0a, 0x38, 0x81, 0x6d, 0x03, 0x0b, 0x3b, 0xcd, 0xc2, 0xf3, 0xae, 0xd6, 0xc4, 0x22, 0xd7, 0xc2, + 0x4e, 0x0b, 0x00, 0x4e, 0x70, 0xd0, 0xbc, 0x10, 0xa0, 0x4b, 0x46, 0x76, 0x38, 0x29, 0x40, 0xcb, + 0xcf, 0xd7, 0x24, 0xe8, 0x17, 0x60, 0x44, 0x65, 0x89, 0xab, 0xf1, 0x64, 0x5b, 0x22, 0x0c, 0xca, + 0x72, 0x52, 0x8c, 0x75, 0x1c, 0xb4, 0x01, 0x13, 0x11, 0xd7, 0x9e, 0xa8, 0x68, 0x77, 0x5c, 0x0b, + 0xf5, 0x49, 0x69, 0x21, 0x51, 0x37, 0xc1, 0xc7, 0xac, 0x88, 0x1f, 0x1d, 0xd2, 0xd1, 0x31, 0x4d, + 0x02, 0xbd, 0x0e, 0xe3, 0x9e, 0x9e, 0x6b, 0xbd, 0x26, 0x94, 0x54, 0xca, 0x80, 0xd8, 0xc8, 0xc4, + 0x5e, 0xc3, 0x29, 0x6c, 0xca, 0xeb, 0xe8, 0x25, 0x22, 0x42, 0xa3, 0xe3, 0x6f, 0x93, 0x48, 0xe4, + 0xb8, 0x62, 0xbc, 0xce, 0xed, 0x1c, 0x1c, 0x9c, 0x5b, 0x1b, 0xbd, 0x0a, 0xa3, 0xf2, 0xf3, 0x35, + 0x37, 0xde, 0xc4, 0x4c, 0x5d, 0x83, 0x61, 0x03, 0x13, 0xdd, 0x87, 0x69, 0xf9, 0x7f, 0x23, 0x74, + 0xb6, 0xb6, 0xdc, 0x86, 0xf0, 0xa2, 0xe6, 0xbe, 0x3a, 0x0b, 0xd2, 0xf9, 0x67, 0x39, 0x0b, 0xe9, + 0xf8, 0xb0, 0x72, 0x45, 0x8c, 0x5a, 0x26, 0x9c, 0x4d, 0x62, 0x36, 0x7d, 0xb4, 0x06, 0xe7, 0x76, + 0x88, 0xe3, 0xc5, 0x3b, 0x4b, 0x3b, 0xa4, 0xb1, 0x2b, 0x37, 0x11, 0x73, 0x0e, 0xd6, 0x8c, 0xbb, + 0x6f, 0x76, 0xa2, 0xe0, 0xac, 0x7a, 0xe8, 0x1d, 0x98, 0x69, 0xb5, 0x37, 0x3d, 0x37, 0xda, 0x59, + 0x0f, 0x62, 0x66, 0x94, 0xa1, 0x92, 0xac, 0x09, 0x2f, 0x62, 0xe5, 0x18, 0x5d, 0xcb, 0xc1, 0xc3, + 0xb9, 0x14, 0xd0, 0xfb, 0x30, 0x9d, 0x5a, 0x0c, 0xc2, 0xa7, 0x71, 0x3c, 0x3f, 0xde, 0x6d, 0x3d, + 0xab, 0x82, 0xf0, 0x51, 0xcc, 0x02, 0xe1, 0xec, 0x26, 0x3e, 0x98, 0xa9, 0xce, 0x7b, 0xb4, 0xb2, + 0xc6, 0x94, 0xa1, 0x2f, 0xc3, 0xa8, 0xbe, 0x8a, 0xc4, 0x05, 0x73, 0x35, 0x9b, 0x67, 0xd1, 0x56, + 0x1b, 0x67, 0xe9, 0xd4, 0x8a, 0xd2, 0x61, 0xd8, 0xa0, 0x68, 0x13, 0xc8, 0xfe, 0x3e, 0x74, 0x1b, + 0x86, 0x1b, 0x9e, 0x4b, 0xfc, 0x78, 0xb5, 0xd6, 0x2d, 0xe8, 0xc6, 0x92, 0xc0, 0x11, 0x03, 0x26, + 0x02, 0x84, 0xf2, 0x32, 0xac, 0x28, 0xd8, 0xbf, 0x51, 0x80, 0x4a, 0x8f, 0x68, 0xb3, 0x29, 0x8d, + 0xb2, 0xd5, 0x97, 0x46, 0x79, 0x41, 0xa6, 0x8c, 0x5b, 0x4f, 0x89, 0xd9, 0xa9, 0x74, 0x70, 0x89, + 0xb0, 0x9d, 0xc6, 0xef, 0xdb, 0xc2, 0x57, 0x57, 0x4a, 0x97, 0x7a, 0xda, 0x9e, 0x1b, 0x8f, 0x51, + 0x03, 0xfd, 0x0b, 0x22, 0xb9, 0x0f, 0x0b, 0xf6, 0xd7, 0x0b, 0x30, 0xad, 0x86, 0xf0, 0x2f, 0xee, + 0xc0, 0xdd, 0xed, 0x1c, 0xb8, 0x53, 0x78, 0x96, 0xb1, 0xef, 0xc0, 0x20, 0x0f, 0x5a, 0xd2, 0x07, + 0x03, 0xf4, 0x94, 0x19, 0xe1, 0x4a, 0x5d, 0xd3, 0x46, 0x94, 0xab, 0xbf, 0x62, 0xc1, 0xc4, 0xc6, + 0x52, 0xad, 0x1e, 0x34, 0x76, 0x49, 0xbc, 0xc0, 0x19, 0x56, 0x2c, 0xf8, 0x1f, 0xeb, 0x21, 0xf9, + 0x9a, 0x2c, 0x8e, 0xe9, 0x0a, 0x94, 0x76, 0x82, 0x28, 0x4e, 0xbf, 0xd9, 0xde, 0x0c, 0xa2, 0x18, + 0x33, 0x88, 0xfd, 0xbb, 0x16, 0x0c, 0xb0, 0x44, 0xa7, 0xbd, 0xb2, 0xef, 0xf6, 0xf3, 0x5d, 0xe8, + 0x65, 0x18, 0x24, 0x5b, 0x5b, 0xa4, 0x11, 0x8b, 0x59, 0x95, 0x0e, 0xa5, 0x83, 0xcb, 0xac, 0x94, + 0x5e, 0xfa, 0xac, 0x31, 0xfe, 0x17, 0x0b, 0x64, 0xf4, 0x16, 0x94, 0x63, 0x77, 0x8f, 0x2c, 0x34, + 0x9b, 0xe2, 0xd5, 0xeb, 0x21, 0xfc, 0x77, 0x37, 0x24, 0x01, 0x9c, 0xd0, 0xb2, 0xbf, 0x5a, 0x00, + 0x48, 0x5c, 0xef, 0x7b, 0x7d, 0xe2, 0x62, 0xc7, 0x7b, 0xc8, 0xd5, 0x8c, 0xf7, 0x10, 0x94, 0x10, + 0xcc, 0x78, 0x0c, 0x51, 0xc3, 0x54, 0xec, 0x6b, 0x98, 0x4a, 0x27, 0x19, 0xa6, 0x25, 0x98, 0x4a, + 0x42, 0x07, 0x98, 0x71, 0x54, 0x98, 0x90, 0xb2, 0x91, 0x06, 0xe2, 0x4e, 0x7c, 0x9b, 0xc0, 0x15, + 0x19, 0xd1, 0x52, 0xde, 0x35, 0xcc, 0xa8, 0xf2, 0x04, 0x89, 0x98, 0x93, 0x07, 0x9f, 0x42, 0xee, + 0x83, 0xcf, 0x4f, 0x59, 0x70, 0x3e, 0xdd, 0x0e, 0xf3, 0x5e, 0xfb, 0x01, 0x0b, 0xa6, 0xd9, 0xb3, + 0x17, 0x6b, 0xb5, 0xf3, 0x91, 0xed, 0xa5, 0xec, 0x90, 0x0a, 0xdd, 0x7b, 0x9c, 0x78, 0x2e, 0xaf, + 0x65, 0x91, 0xc6, 0xd9, 0x2d, 0xda, 0xdf, 0x6f, 0x81, 0x70, 0x12, 0xea, 0x63, 0x63, 0xbf, 0x2d, + 0x53, 0x95, 0x1a, 0x01, 0xbc, 0xaf, 0xe4, 0x7b, 0x4d, 0x89, 0xb0, 0xdd, 0xea, 0x22, 0x35, 0x82, + 0x75, 0x1b, 0xb4, 0xec, 0x26, 0x08, 0x68, 0x95, 0x30, 0x3d, 0x51, 0xef, 0xde, 0x5c, 0x07, 0x68, + 0x32, 0x5c, 0x2d, 0x61, 0xa1, 0x3a, 0xb6, 0xab, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x47, 0x0a, 0x30, + 0x22, 0x03, 0x46, 0xb7, 0xfd, 0x7e, 0xa4, 0xb9, 0x13, 0xe5, 0x8d, 0x61, 0x19, 0x3e, 0x29, 0xe1, + 0x5a, 0x22, 0x04, 0x27, 0x19, 0x3e, 0x25, 0x00, 0x27, 0x38, 0xe8, 0x19, 0x18, 0x8a, 0xda, 0x9b, + 0x0c, 0x3d, 0xe5, 0xfa, 0x52, 0xe7, 0xc5, 0x58, 0xc2, 0xd1, 0xe7, 0x61, 0x92, 0xd7, 0x0b, 0x83, + 0x96, 0xb3, 0xcd, 0x95, 0x86, 0x03, 0xca, 0x17, 0x75, 0x72, 0x2d, 0x05, 0x3b, 0x3e, 0xac, 0x9c, + 0x4f, 0x97, 0x31, 0x75, 0x73, 0x07, 0x15, 0xfb, 0xcb, 0x80, 0x3a, 0x63, 0x60, 0xa3, 0x37, 0xb8, + 0x01, 0x92, 0x1b, 0x92, 0x66, 0x37, 0x3d, 0xb2, 0xee, 0x3a, 0x29, 0xcd, 0xcf, 0x79, 0x2d, 0xac, + 0xea, 0xdb, 0x7f, 0xad, 0x08, 0x93, 0x69, 0x47, 0x3a, 0x74, 0x13, 0x06, 0xf9, 0x05, 0x23, 0xc8, + 0x77, 0x79, 0xa6, 0xd4, 0xdc, 0xef, 0xd8, 0x56, 0x13, 0x77, 0x94, 0xa8, 0x8f, 0xde, 0x81, 0x91, + 0x66, 0x70, 0xdf, 0xbf, 0xef, 0x84, 0xcd, 0x85, 0xda, 0xaa, 0x58, 0x97, 0x99, 0x7c, 0x6a, 0x35, + 0x41, 0xd3, 0x5d, 0xfa, 0x98, 0x4a, 0x3e, 0x01, 0x61, 0x9d, 0x1c, 0xda, 0x60, 0x71, 0xfd, 0xb6, + 0xdc, 0xed, 0x35, 0xa7, 0xd5, 0xcd, 0x1a, 0x75, 0x49, 0x22, 0x69, 0x94, 0xc7, 0x44, 0xf0, 0x3f, + 0x0e, 0xc0, 0x09, 0x21, 0xf4, 0xdd, 0x70, 0x2e, 0xca, 0x51, 0x6d, 0xe5, 0xa5, 0x44, 0xe8, 0xa6, + 0xed, 0x59, 0x7c, 0x8c, 0x4a, 0x10, 0x59, 0x4a, 0xb0, 0xac, 0x66, 0xec, 0xaf, 0x9c, 0x03, 0x63, + 0x37, 0x1a, 0x79, 0x71, 0xac, 0x53, 0xca, 0x8b, 0x83, 0x61, 0x98, 0xec, 0xb5, 0xe2, 0x83, 0xaa, + 0x1b, 0x76, 0x4b, 0xac, 0xb6, 0x2c, 0x70, 0x3a, 0x69, 0x4a, 0x08, 0x56, 0x74, 0xb2, 0x93, 0x17, + 0x15, 0x3f, 0xc4, 0xe4, 0x45, 0xa5, 0x33, 0x4c, 0x5e, 0xb4, 0x0e, 0x43, 0xdb, 0x6e, 0x8c, 0x49, + 0x2b, 0x10, 0xac, 0x5d, 0xe6, 0x3a, 0xbc, 0xc1, 0x51, 0x3a, 0x13, 0x66, 0x08, 0x00, 0x96, 0x44, + 0xd0, 0x1b, 0x6a, 0x07, 0x0e, 0xe6, 0x4b, 0x46, 0x9d, 0xef, 0x69, 0x99, 0x7b, 0x50, 0x24, 0x2b, + 0x1a, 0x7a, 0xd8, 0x64, 0x45, 0x2b, 0x32, 0xc5, 0xd0, 0x70, 0xbe, 0xe9, 0x38, 0xcb, 0x20, 0xd4, + 0x23, 0xb1, 0x90, 0x91, 0x8c, 0xa9, 0x7c, 0x7a, 0xc9, 0x98, 0xbe, 0xdf, 0x82, 0xe9, 0x56, 0x56, + 0x5e, 0x32, 0x91, 0x18, 0xe8, 0xe5, 0xbe, 0x13, 0xaf, 0x19, 0x0d, 0x32, 0x11, 0x39, 0x13, 0x0d, + 0x67, 0x37, 0x47, 0x07, 0x3a, 0xdc, 0x6c, 0x8a, 0x6c, 0x42, 0x4f, 0xe5, 0x64, 0x75, 0xea, 0x92, + 0xcb, 0x69, 0x23, 0x23, 0x83, 0xd0, 0xc7, 0xf3, 0x32, 0x08, 0xf5, 0x9d, 0x37, 0xe8, 0x0d, 0x95, + 0xcf, 0x69, 0x2c, 0x7f, 0x29, 0xf1, 0x6c, 0x4d, 0x3d, 0xb3, 0x38, 0xbd, 0xa1, 0xb2, 0x38, 0x75, + 0x89, 0x6f, 0xc6, 0x73, 0x34, 0xf5, 0xcc, 0xdd, 0xa4, 0xe5, 0x5f, 0x9a, 0x38, 0x9d, 0xfc, 0x4b, + 0xc6, 0x55, 0xc3, 0x53, 0x00, 0x3d, 0xdb, 0xe3, 0xaa, 0x31, 0xe8, 0x76, 0xbf, 0x6c, 0x78, 0xae, + 0xa9, 0xa9, 0x87, 0xca, 0x35, 0x75, 0x4f, 0xcf, 0xdd, 0x84, 0x7a, 0x24, 0x27, 0xa2, 0x48, 0x7d, + 0x66, 0x6c, 0xba, 0xa7, 0x5f, 0x80, 0xe7, 0xf2, 0xe9, 0xaa, 0x7b, 0xae, 0x93, 0x6e, 0xe6, 0x15, + 0xd8, 0x91, 0x09, 0xea, 0xfc, 0xd9, 0x64, 0x82, 0x9a, 0x3e, 0xf5, 0x4c, 0x50, 0x17, 0xce, 0x20, + 0x13, 0xd4, 0x63, 0x1f, 0x6a, 0x26, 0xa8, 0x99, 0x47, 0x90, 0x09, 0x6a, 0x3d, 0xc9, 0x04, 0x75, + 0x31, 0x7f, 0x4a, 0x32, 0xec, 0x59, 0x73, 0xf2, 0x3f, 0xdd, 0x83, 0x72, 0x4b, 0x46, 0x7a, 0x10, + 0x01, 0xd8, 0xb2, 0x93, 0xd1, 0x66, 0x85, 0x83, 0xe0, 0x53, 0xa2, 0x40, 0x38, 0x21, 0x45, 0xe9, + 0x26, 0xf9, 0xa0, 0x1e, 0xef, 0xa2, 0x04, 0xcd, 0x52, 0x2f, 0xe5, 0x67, 0x81, 0xb2, 0xff, 0x6a, + 0x01, 0x2e, 0x77, 0x5f, 0xd7, 0x89, 0x6e, 0xaa, 0x96, 0xbc, 0xa5, 0xa4, 0x74, 0x53, 0x5c, 0xc8, + 0x49, 0xb0, 0xfa, 0x0e, 0x87, 0x73, 0x03, 0xa6, 0x94, 0x21, 0xab, 0xe7, 0x36, 0x0e, 0xb4, 0x24, + 0xb5, 0xca, 0x61, 0xaf, 0x9e, 0x46, 0xc0, 0x9d, 0x75, 0xd0, 0x02, 0x4c, 0x18, 0x85, 0xab, 0x55, + 0x21, 0xcc, 0x28, 0x65, 0x58, 0xdd, 0x04, 0xe3, 0x34, 0xbe, 0xfd, 0x73, 0x16, 0x3c, 0x96, 0x93, + 0x24, 0xa1, 0xef, 0x68, 0x2f, 0x5b, 0x30, 0xd1, 0x32, 0xab, 0xf6, 0x08, 0x0a, 0x65, 0xa4, 0x62, + 0x50, 0x7d, 0x4d, 0x01, 0x70, 0x9a, 0xe8, 0xe2, 0xb5, 0xdf, 0xfa, 0xfd, 0xcb, 0x1f, 0xfb, 0xed, + 0xdf, 0xbf, 0xfc, 0xb1, 0xdf, 0xf9, 0xfd, 0xcb, 0x1f, 0xfb, 0xff, 0x8f, 0x2e, 0x5b, 0xbf, 0x75, + 0x74, 0xd9, 0xfa, 0xed, 0xa3, 0xcb, 0xd6, 0xef, 0x1c, 0x5d, 0xb6, 0x7e, 0xef, 0xe8, 0xb2, 0xf5, + 0xd5, 0x3f, 0xb8, 0xfc, 0xb1, 0xb7, 0x0b, 0xfb, 0x2f, 0xfc, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x67, 0xe8, 0x47, 0xf4, 0xcd, 0xe5, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/core/v1/generated.proto b/vendor/k8s.io/api/core/v1/generated.proto index 845db97b1..b4d75069f 100644 --- a/vendor/k8s.io/api/core/v1/generated.proto +++ b/vendor/k8s.io/api/core/v1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -298,6 +298,34 @@ message CephFSVolumeSource { optional bool readOnly = 6; } +// Represents a cinder volume resource in Openstack. +// A Cinder volume must exist before mounting to a container. +// The volume must also be in the same region as the kubelet. +// Cinder volumes support ownership management and SELinux relabeling. +message CinderPersistentVolumeSource { + // volume id used to identify the volume in cinder + // More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md + optional string volumeID = 1; + + // Filesystem type to mount. + // Must be a filesystem type supported by the host operating system. + // Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md + // +optional + optional string fsType = 2; + + // Optional: Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md + // +optional + optional bool readOnly = 3; + + // Optional: points to a secret object containing parameters used to connect + // to OpenStack. + // +optional + optional SecretReference secretRef = 4; +} + // Represents a cinder volume resource in Openstack. // A Cinder volume must exist before mounting to a container. // The volume must also be in the same region as the kubelet. @@ -319,6 +347,11 @@ message CinderVolumeSource { // More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md // +optional optional bool readOnly = 3; + + // Optional: points to a secret object containing parameters used to connect + // to OpenStack. + // +optional + optional LocalObjectReference secretRef = 4; } // ClientIPConfig represents the configurations of Client IP based session affinity. @@ -439,6 +472,31 @@ message ConfigMapList { repeated ConfigMap items = 2; } +// ConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node. +message ConfigMapNodeConfigSource { + // Namespace is the metadata.namespace of the referenced ConfigMap. + // This field is required in all cases. + optional string namespace = 1; + + // Name is the metadata.name of the referenced ConfigMap. + // This field is required in all cases. + optional string name = 2; + + // UID is the metadata.UID of the referenced ConfigMap. + // This field is forbidden in Node.Spec, and required in Node.Status. + // +optional + optional string uid = 3; + + // ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap. + // This field is forbidden in Node.Spec, and required in Node.Status. + // +optional + optional string resourceVersion = 4; + + // KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure + // This field is required in all cases. + optional string kubeletConfigKey = 5; +} + // Adapts a ConfigMap into a projected volume. // // The contents of the target ConfigMap's Data field will be presented in a @@ -809,41 +867,6 @@ message DaemonEndpoint { optional int32 Port = 1; } -// DeleteOptions may be provided when deleting an API object -// DEPRECATED: This type has been moved to meta/v1 and will be removed soon. -// +k8s:openapi-gen=false -message DeleteOptions { - // The duration in seconds before the object should be deleted. Value must be non-negative integer. - // The value zero indicates delete immediately. If this value is nil, the default grace period for the - // specified type will be used. - // Defaults to a per object value if not specified. zero means delete immediately. - // +optional - optional int64 gracePeriodSeconds = 1; - - // Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be - // returned. - // +optional - optional Preconditions preconditions = 2; - - // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. - // Should the dependent objects be orphaned. If true/false, the "orphan" - // finalizer will be added to/removed from the object's finalizers list. - // Either this field or PropagationPolicy may be set, but not both. - // +optional - optional bool orphanDependents = 3; - - // Whether and how garbage collection will be performed. - // Either this field or OrphanDependents may be set, but not both. - // The default policy is decided by the existing finalizer set in the - // metadata.finalizers and the resource-specific default policy. - // Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - - // allow the garbage collector to delete the dependents in the background; - // 'Foreground' - a cascading policy that deletes all dependents in the - // foreground. - // +optional - optional string propagationPolicy = 4; -} - // Represents downward API info for projecting into a projected volume. // Note that this is identical to a downwardAPI volume source without the default // mode. @@ -1328,6 +1351,10 @@ message GCEPersistentDiskVolumeSource { // Represents a volume that is populated with the contents of a git repository. // Git repo volumes do not support ownership management. // Git repo volumes support SELinux relabeling. +// +// DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an +// EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir +// into the Pod's container. message GitRepoVolumeSource { // Repository URL optional string repository = 1; @@ -1662,43 +1689,6 @@ message List { repeated k8s.io.apimachinery.pkg.runtime.RawExtension items = 2; } -// ListOptions is the query options to a standard REST list call. -// DEPRECATED: This type has been moved to meta/v1 and will be removed soon. -// +k8s:openapi-gen=false -message ListOptions { - // A selector to restrict the list of returned objects by their labels. - // Defaults to everything. - // +optional - optional string labelSelector = 1; - - // A selector to restrict the list of returned objects by their fields. - // Defaults to everything. - // +optional - optional string fieldSelector = 2; - - // If true, partially initialized resources are included in the response. - // +optional - optional bool includeUninitialized = 6; - - // Watch for changes to the described resources and return them as a stream of - // add, update, and remove notifications. Specify resourceVersion. - // +optional - optional bool watch = 3; - - // When specified with a watch call, shows changes that occur after that particular version of a resource. - // Defaults to changes from the beginning of history. - // When specified for list: - // - if unset, then the result is returned from remote storage based on quorum-read flag; - // - if it's 0, then we simply return what we currently have in cache, no guarantee; - // - if set to non zero, then the result is at least as fresh as given rv. - // +optional - optional string resourceVersion = 4; - - // Timeout for the list/watch call. - // +optional - optional int64 timeoutSeconds = 5; -} - // LoadBalancerIngress represents the status of a load-balancer ingress point: // traffic intended for the service should be sent to an ingress point. message LoadBalancerIngress { @@ -1731,11 +1721,13 @@ message LocalObjectReference { optional string name = 1; } -// Local represents directly-attached storage with node affinity +// Local represents directly-attached storage with node affinity (Beta feature) message LocalVolumeSource { - // The full path to the volume on the node - // For alpha, this path must be a directory - // Once block as a source is supported, then this path can point to a block device + // The full path to the volume on the node. + // It can be either a directory or block device (disk, partition, ...). + // Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. + // Block devices can be represented only by VolumeMode=Block, which also requires the + // BlockVolume alpha feature gate to be enabled. optional string path = 1; } @@ -1885,7 +1877,58 @@ message NodeCondition { // NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil. message NodeConfigSource { - optional ObjectReference configMapRef = 1; + // ConfigMap is a reference to a Node's ConfigMap + optional ConfigMapNodeConfigSource configMap = 2; +} + +// NodeConfigStatus describes the status of the config assigned by Node.Spec.ConfigSource. +message NodeConfigStatus { + // Assigned reports the checkpointed config the node will try to use. + // When Node.Spec.ConfigSource is updated, the node checkpoints the associated + // config payload to local disk, along with a record indicating intended + // config. The node refers to this record to choose its config checkpoint, and + // reports this record in Assigned. Assigned only updates in the status after + // the record has been checkpointed to disk. When the Kubelet is restarted, + // it tries to make the Assigned config the Active config by loading and + // validating the checkpointed payload identified by Assigned. + // +optional + optional NodeConfigSource assigned = 1; + + // Active reports the checkpointed config the node is actively using. + // Active will represent either the current version of the Assigned config, + // or the current LastKnownGood config, depending on whether attempting to use the + // Assigned config results in an error. + // +optional + optional NodeConfigSource active = 2; + + // LastKnownGood reports the checkpointed config the node will fall back to + // when it encounters an error attempting to use the Assigned config. + // The Assigned config becomes the LastKnownGood config when the node determines + // that the Assigned config is stable and correct. + // This is currently implemented as a 10-minute soak period starting when the local + // record of Assigned config is updated. If the Assigned config is Active at the end + // of this period, it becomes the LastKnownGood. Note that if Spec.ConfigSource is + // reset to nil (use local defaults), the LastKnownGood is also immediately reset to nil, + // because the local default config is always assumed good. + // You should not make assumptions about the node's method of determining config stability + // and correctness, as this may change or become configurable in the future. + // +optional + optional NodeConfigSource lastKnownGood = 3; + + // Error describes any problems reconciling the Spec.ConfigSource to the Active config. + // Errors may occur, for example, attempting to checkpoint Spec.ConfigSource to the local Assigned + // record, attempting to checkpoint the payload associated with Spec.ConfigSource, attempting + // to load or validate the Assigned config, etc. + // Errors may occur at different points while syncing config. Earlier errors (e.g. download or + // checkpointing errors) will not result in a rollback to LastKnownGood, and may resolve across + // Kubelet retries. Later errors (e.g. loading or validating a checkpointed config) will result in + // a rollback to LastKnownGood. In the latter case, it is usually possible to resolve the error + // by fixing the config assigned in Spec.ConfigSource. + // You can find additional information for debugging by searching the error message in the Kubelet log. + // Error is a human-readable description of the error state; machines can check whether or not Error + // is empty, but should not rely on the stability of the Error text across Kubelet versions. + // +optional + optional string error = 4; } // NodeDaemonEndpoints lists ports opened by daemons running on the Node. @@ -1947,10 +1990,17 @@ message NodeSelectorRequirement { repeated string values = 3; } -// A null or empty node selector term matches no objects. +// A null or empty node selector term matches no objects. The requirements of +// them are ANDed. +// The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. message NodeSelectorTerm { - // Required. A list of node selector requirements. The requirements are ANDed. + // A list of node selector requirements by node's labels. + // +optional repeated NodeSelectorRequirement matchExpressions = 1; + + // A list of node selector requirements by node's fields. + // +optional + repeated NodeSelectorRequirement matchFields = 2; } // NodeSpec describes the attributes that a node is created with. @@ -1959,11 +2009,6 @@ message NodeSpec { // +optional optional string podCIDR = 1; - // External ID of the node assigned by some machine database (e.g. a cloud provider). - // Deprecated. - // +optional - optional string externalID = 2; - // ID of the node assigned by the cloud provider in the format: :// // +optional optional string providerID = 3; @@ -1981,6 +2026,11 @@ message NodeSpec { // The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field // +optional optional NodeConfigSource configSource = 6; + + // Deprecated. Not all kubelets will set this field. Remove field after 1.13. + // see: https://issues.k8s.io/61966 + // +optional + optional string externalID = 2; } // NodeStatus is information about the current status of a node. @@ -2036,6 +2086,10 @@ message NodeStatus { // List of volumes that are attached to the node. // +optional repeated AttachedVolume volumesAttached = 10; + + // Status of the config assigned to the node via the dynamic Kubelet config feature. + // +optional + optional NodeConfigStatus config = 11; } // NodeSystemInfo is a set of ids/uuids to uniquely identify the node. @@ -2085,170 +2139,6 @@ message ObjectFieldSelector { optional string fieldPath = 2; } -// ObjectMeta is metadata that all persisted resources must have, which includes all objects -// users must create. -// DEPRECATED: Use k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta instead - this type will be removed soon. -// +k8s:openapi-gen=false -message ObjectMeta { - // Name must be unique within a namespace. Is required when creating resources, although - // some resources may allow a client to request the generation of an appropriate name - // automatically. Name is primarily intended for creation idempotence and configuration - // definition. - // Cannot be updated. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - // +optional - optional string name = 1; - - // GenerateName is an optional prefix, used by the server, to generate a unique - // name ONLY IF the Name field has not been provided. - // If this field is used, the name returned to the client will be different - // than the name passed. This value will also be combined with a unique suffix. - // The provided value has the same validation rules as the Name field, - // and may be truncated by the length of the suffix required to make the value - // unique on the server. - // - // If this field is specified and the generated name exists, the server will - // NOT return a 409 - instead, it will either return 201 Created or 500 with Reason - // ServerTimeout indicating a unique name could not be found in the time allotted, and the client - // should retry (optionally after the time indicated in the Retry-After header). - // - // Applied only if Name is not specified. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency - // +optional - optional string generateName = 2; - - // Namespace defines the space within each name must be unique. An empty namespace is - // equivalent to the "default" namespace, but "default" is the canonical representation. - // Not all objects are required to be scoped to a namespace - the value of this field for - // those objects will be empty. - // - // Must be a DNS_LABEL. - // Cannot be updated. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ - // +optional - optional string namespace = 3; - - // SelfLink is a URL representing this object. - // Populated by the system. - // Read-only. - // +optional - optional string selfLink = 4; - - // UID is the unique in time and space value for this object. It is typically generated by - // the server on successful creation of a resource and is not allowed to change on PUT - // operations. - // - // Populated by the system. - // Read-only. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids - // +optional - optional string uid = 5; - - // An opaque value that represents the internal version of this object that can - // be used by clients to determine when objects have changed. May be used for optimistic - // concurrency, change detection, and the watch operation on a resource or set of resources. - // Clients must treat these values as opaque and passed unmodified back to the server. - // They may only be valid for a particular resource or set of resources. - // - // Populated by the system. - // Read-only. - // Value must be treated as opaque by clients and . - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency - // +optional - optional string resourceVersion = 6; - - // A sequence number representing a specific generation of the desired state. - // Populated by the system. Read-only. - // +optional - optional int64 generation = 7; - - // CreationTimestamp is a timestamp representing the server time when this object was - // created. It is not guaranteed to be set in happens-before order across separate operations. - // Clients may not set this value. It is represented in RFC3339 form and is in UTC. - // - // Populated by the system. - // Read-only. - // Null for lists. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.Time creationTimestamp = 8; - - // DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This - // field is set by the server when a graceful deletion is requested by the user, and is not - // directly settable by a client. The resource is expected to be deleted (no longer visible - // from resource lists, and not reachable by name) after the time in this field. Once set, - // this value may not be unset or be set further into the future, although it may be shortened - // or the resource may be deleted prior to this time. For example, a user may request that - // a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination - // signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard - // termination signal (SIGKILL) to the container and after cleanup, remove the pod from the - // API. In the presence of network partitions, this object may still exist after this - // timestamp, until an administrator or automated process can determine the resource is - // fully terminated. - // If not set, graceful deletion of the object has not been requested. - // - // Populated by the system when a graceful deletion is requested. - // Read-only. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.Time deletionTimestamp = 9; - - // Number of seconds allowed for this object to gracefully terminate before - // it will be removed from the system. Only set when deletionTimestamp is also set. - // May only be shortened. - // Read-only. - // +optional - optional int64 deletionGracePeriodSeconds = 10; - - // Map of string keys and values that can be used to organize and categorize - // (scope and select) objects. May match selectors of replication controllers - // and services. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ - // +optional - map labels = 11; - - // Annotations is an unstructured key value map stored with a resource that may be - // set by external tools to store and retrieve arbitrary metadata. They are not - // queryable and should be preserved when modifying objects. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ - // +optional - map annotations = 12; - - // List of objects depended by this object. If ALL objects in the list have - // been deleted, this object will be garbage collected. If this object is managed by a controller, - // then an entry in this list will point to this controller, with the controller field set to true. - // There cannot be more than one managing controller. - // +optional - // +patchMergeKey=uid - // +patchStrategy=merge - repeated k8s.io.apimachinery.pkg.apis.meta.v1.OwnerReference ownerReferences = 13; - - // An initializer is a controller which enforces some system invariant at object creation time. - // This field is a list of initializers that have not yet acted on this object. If nil or empty, - // this object has been completely initialized. Otherwise, the object is considered uninitialized - // and is hidden (in list/watch and get calls) from clients that haven't explicitly asked to - // observe uninitialized objects. - // - // When an object is created, the system will populate this list with the current set of initializers. - // Only privileged users may set or modify this list. Once it is empty, it may not be modified further - // by any user. - optional k8s.io.apimachinery.pkg.apis.meta.v1.Initializers initializers = 16; - - // Must be empty before the object is deleted from the registry. Each entry - // is an identifier for the responsible component that will remove the entry - // from the list. If the deletionTimestamp of the object is non-nil, entries - // in this list can only be removed. - // +optional - // +patchStrategy=merge - repeated string finalizers = 14; - - // The name of the cluster which the object belongs to. - // This is used to distinguish resources with same name and namespace in different clusters. - // This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request. - // +optional - optional string clusterName = 15; -} - // ObjectReference contains enough information to let you inspect or modify the referred object. // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object message ObjectReference { @@ -2502,7 +2392,7 @@ message PersistentVolumeSource { // Cinder represents a cinder volume attached and mounted on kubelets host machine // More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md // +optional - optional CinderVolumeSource cinder = 8; + optional CinderPersistentVolumeSource cinder = 8; // CephFS represents a Ceph FS mount on the host that shares a pod's lifetime // +optional @@ -2775,7 +2665,6 @@ message PodAttachOptions { // PodCondition contains details for the current condition of this pod. message PodCondition { // Type is the type of the condition. - // Currently only Ready. // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions optional string type = 1; @@ -2944,6 +2833,12 @@ message PodProxyOptions { optional string path = 1; } +// PodReadinessGate contains the reference to a pod condition +message PodReadinessGate { + // ConditionType refers to a condition in the pod's condition list with matching type. + optional string conditionType = 1; +} + // PodSecurityContext holds pod-level security attributes and common container settings. // Some fields are also present in container.securityContext. Field values of // container.securityContext take precedence over field values of PodSecurityContext. @@ -2998,6 +2893,11 @@ message PodSecurityContext { // If unset, the Kubelet will not modify the ownership and permissions of any volume. // +optional optional int64 fsGroup = 5; + + // Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported + // sysctls (by the container runtime) might fail to launch. + // +optional + repeated Sysctl sysctls = 7; } // Describes the class of pods that should avoid this node. @@ -3196,12 +3096,36 @@ message PodSpec { // configuration based on DNSPolicy. // +optional optional PodDNSConfig dnsConfig = 26; + + // If specified, all readiness gates will be evaluated for pod readiness. + // A pod is ready when all its containers are ready AND + // all conditions specified in the readiness gates have status equal to "True" + // More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md + // +optional + repeated PodReadinessGate readinessGates = 28; } // PodStatus represents information about the status of a pod. Status may trail the actual -// state of a system. +// state of a system, especially if the node that hosts the pod cannot contact the control +// plane. message PodStatus { - // Current condition of the pod. + // The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. + // The conditions array, the reason and message fields, and the individual container status + // arrays contain more detail about the pod's status. + // There are five possible phase values: + // + // Pending: The pod has been accepted by the Kubernetes system, but one or more of the + // container images has not been created. This includes time before being scheduled as + // well as time spent downloading images over the network, which could take a while. + // Running: The pod has been bound to a node, and all of the containers have been created. + // At least one container is still running, or is in the process of starting or restarting. + // Succeeded: All containers in the pod have terminated in success, and will not be restarted. + // Failed: All containers in the pod have terminated, and at least one container has + // terminated in failure. The container either exited with non-zero status or was terminated + // by the system. + // Unknown: For some reason the state of the pod could not be obtained, typically due to an + // error in communicating with the host of the pod. + // // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase // +optional optional string phase = 1; @@ -3721,7 +3645,7 @@ message ResourceQuotaList { // ResourceQuotaSpec defines the desired hard limits to enforce for Quota. message ResourceQuotaSpec { - // Hard is the set of desired hard limits for each named resource. + // hard is the set of desired hard limits for each named resource. // More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/ // +optional map hard = 1; @@ -3730,6 +3654,12 @@ message ResourceQuotaSpec { // If not specified, the quota matches all objects. // +optional repeated string scopes = 2; + + // scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota + // but expressed using ScopeSelectorOperator in combination with possible values. + // For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched. + // +optional + optional ScopeSelector scopeSelector = 3; } // ResourceQuotaStatus defines the enforced hard limits and observed use. @@ -3866,6 +3796,32 @@ message ScaleIOVolumeSource { optional bool readOnly = 10; } +// A scope selector represents the AND of the selectors represented +// by the scoped-resource selector requirements. +message ScopeSelector { + // A list of scope selector requirements by scope of the resources. + // +optional + repeated ScopedResourceSelectorRequirement matchExpressions = 1; +} + +// A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator +// that relates the scope name and values. +message ScopedResourceSelectorRequirement { + // The name of the scope that the selector applies to. + optional string scopeName = 1; + + // Represents a scope's relationship to a set of values. + // Valid operators are In, NotIn, Exists, DoesNotExist. + optional string operator = 2; + + // An array of string values. If the operator is In or NotIn, + // the values array must be non-empty. If the operator is Exists or DoesNotExist, + // the values array must be empty. + // This array is replaced during a strategic merge patch. + // +optional + repeated string values = 3; +} + // Secret holds secret data of a certain type. The total bytes of the values in // the Data field must be less than MaxSecretSize bytes. message Secret { @@ -4134,6 +4090,32 @@ message ServiceAccountList { repeated ServiceAccount items = 2; } +// ServiceAccountTokenProjection represents a projected service account token +// volume. This projection can be used to insert a service account token into +// the pods runtime filesystem for use against APIs (Kubernetes API Server or +// otherwise). +message ServiceAccountTokenProjection { + // Audience is the intended audience of the token. A recipient of a token + // must identify itself with an identifier specified in the audience of the + // token, and otherwise should reject the token. The audience defaults to the + // identifier of the apiserver. + // +optional + optional string audience = 1; + + // ExpirationSeconds is the requested duration of validity of the service + // account token. As the token approaches expiration, the kubelet volume + // plugin will proactively rotate the service account token. The kubelet will + // start trying to rotate the token if the token is older than 80 percent of + // its time to live or if the token is older than 24 hours.Defaults to 1 hour + // and must be at least 10 minutes. + // +optional + optional int64 expirationSeconds = 2; + + // Path is the path relative to the mount point of the file to project the + // token into. + optional string path = 3; +} + // ServiceList holds a list of services. message ServiceList { // Standard list metadata. @@ -4300,9 +4282,6 @@ message ServiceSpec { // The primary use case for setting this field is to use a StatefulSet's Headless Service // to propagate SRV records for its Pods without respect to their readiness for purpose // of peer discovery. - // This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints - // when that annotation is deprecated and all clients have been converted to use this - // field. // +optional optional bool publishNotReadyAddresses = 13; @@ -4465,6 +4444,28 @@ message Toleration { optional int64 tolerationSeconds = 5; } +// A topology selector requirement is a selector that matches given label. +// This is an alpha feature and may change in the future. +message TopologySelectorLabelRequirement { + // The label key that the selector applies to. + optional string key = 1; + + // An array of string values. One value must match the label to be selected. + // Each entry in Values is ORed. + repeated string values = 2; +} + +// A topology selector term represents the result of label queries. +// A null or empty topology selector term matches no objects. +// The requirements of them are ANDed. +// It provides a subset of functionality as NodeSelectorTerm. +// This is an alpha feature and may change in the future. +message TopologySelectorTerm { + // A list of topology selector requirements by labels. + // +optional + repeated TopologySelectorLabelRequirement matchLabelExpressions = 1; +} + // Volume represents a named volume in a pod that may be accessed by any container in the pod. message Volume { // Volume's name. @@ -4523,13 +4524,20 @@ message VolumeNodeAffinity { // Projection that may be projected along with other supported volume types message VolumeProjection { // information about the secret data to project + // +optional optional SecretProjection secret = 1; // information about the downwardAPI data to project + // +optional optional DownwardAPIProjection downwardAPI = 2; // information about the configMap data to project + // +optional optional ConfigMapProjection configMap = 3; + + // information about the serviceAccountToken data to project + // +optional + optional ServiceAccountTokenProjection serviceAccountToken = 4; } // Represents the source of a volume to mount. @@ -4564,6 +4572,9 @@ message VolumeSource { optional AWSElasticBlockStoreVolumeSource awsElasticBlockStore = 4; // GitRepo represents a git repository at a particular revision. + // DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an + // EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir + // into the Pod's container. // +optional optional GitRepoVolumeSource gitRepo = 5; diff --git a/vendor/k8s.io/api/core/v1/meta.go b/vendor/k8s.io/api/core/v1/meta.go deleted file mode 100644 index 0e3f5d920..000000000 --- a/vendor/k8s.io/api/core/v1/meta.go +++ /dev/null @@ -1,108 +0,0 @@ -/* -Copyright 2014 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1 - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" -) - -func (obj *ObjectMeta) GetObjectMeta() metav1.Object { return obj } - -// Namespace implements metav1.Object for any object with an ObjectMeta typed field. Allows -// fast, direct access to metadata fields for API objects. -func (meta *ObjectMeta) GetNamespace() string { return meta.Namespace } -func (meta *ObjectMeta) SetNamespace(namespace string) { meta.Namespace = namespace } -func (meta *ObjectMeta) GetName() string { return meta.Name } -func (meta *ObjectMeta) SetName(name string) { meta.Name = name } -func (meta *ObjectMeta) GetGenerateName() string { return meta.GenerateName } -func (meta *ObjectMeta) SetGenerateName(generateName string) { meta.GenerateName = generateName } -func (meta *ObjectMeta) GetUID() types.UID { return meta.UID } -func (meta *ObjectMeta) SetUID(uid types.UID) { meta.UID = uid } -func (meta *ObjectMeta) GetResourceVersion() string { return meta.ResourceVersion } -func (meta *ObjectMeta) SetResourceVersion(version string) { meta.ResourceVersion = version } -func (meta *ObjectMeta) GetGeneration() int64 { return meta.Generation } -func (meta *ObjectMeta) SetGeneration(generation int64) { meta.Generation = generation } -func (meta *ObjectMeta) GetSelfLink() string { return meta.SelfLink } -func (meta *ObjectMeta) SetSelfLink(selfLink string) { meta.SelfLink = selfLink } -func (meta *ObjectMeta) GetCreationTimestamp() metav1.Time { return meta.CreationTimestamp } -func (meta *ObjectMeta) SetCreationTimestamp(creationTimestamp metav1.Time) { - meta.CreationTimestamp = creationTimestamp -} -func (meta *ObjectMeta) GetDeletionTimestamp() *metav1.Time { return meta.DeletionTimestamp } -func (meta *ObjectMeta) SetDeletionTimestamp(deletionTimestamp *metav1.Time) { - meta.DeletionTimestamp = deletionTimestamp -} -func (meta *ObjectMeta) GetDeletionGracePeriodSeconds() *int64 { return meta.DeletionGracePeriodSeconds } -func (meta *ObjectMeta) SetDeletionGracePeriodSeconds(deletionGracePeriodSeconds *int64) { - meta.DeletionGracePeriodSeconds = deletionGracePeriodSeconds -} -func (meta *ObjectMeta) GetLabels() map[string]string { return meta.Labels } -func (meta *ObjectMeta) SetLabels(labels map[string]string) { meta.Labels = labels } -func (meta *ObjectMeta) GetAnnotations() map[string]string { return meta.Annotations } -func (meta *ObjectMeta) SetAnnotations(annotations map[string]string) { meta.Annotations = annotations } -func (meta *ObjectMeta) GetInitializers() *metav1.Initializers { return meta.Initializers } -func (meta *ObjectMeta) SetInitializers(initializers *metav1.Initializers) { - meta.Initializers = initializers -} -func (meta *ObjectMeta) GetFinalizers() []string { return meta.Finalizers } -func (meta *ObjectMeta) SetFinalizers(finalizers []string) { meta.Finalizers = finalizers } - -func (meta *ObjectMeta) GetOwnerReferences() []metav1.OwnerReference { - ret := make([]metav1.OwnerReference, len(meta.OwnerReferences)) - for i := 0; i < len(meta.OwnerReferences); i++ { - ret[i].Kind = meta.OwnerReferences[i].Kind - ret[i].Name = meta.OwnerReferences[i].Name - ret[i].UID = meta.OwnerReferences[i].UID - ret[i].APIVersion = meta.OwnerReferences[i].APIVersion - if meta.OwnerReferences[i].Controller != nil { - value := *meta.OwnerReferences[i].Controller - ret[i].Controller = &value - } - if meta.OwnerReferences[i].BlockOwnerDeletion != nil { - value := *meta.OwnerReferences[i].BlockOwnerDeletion - ret[i].BlockOwnerDeletion = &value - } - } - return ret -} - -func (meta *ObjectMeta) SetOwnerReferences(references []metav1.OwnerReference) { - newReferences := make([]metav1.OwnerReference, len(references)) - for i := 0; i < len(references); i++ { - newReferences[i].Kind = references[i].Kind - newReferences[i].Name = references[i].Name - newReferences[i].UID = references[i].UID - newReferences[i].APIVersion = references[i].APIVersion - if references[i].Controller != nil { - value := *references[i].Controller - newReferences[i].Controller = &value - } - if references[i].BlockOwnerDeletion != nil { - value := *references[i].BlockOwnerDeletion - newReferences[i].BlockOwnerDeletion = &value - } - } - meta.OwnerReferences = newReferences -} - -func (meta *ObjectMeta) GetClusterName() string { - return meta.ClusterName -} -func (meta *ObjectMeta) SetClusterName(clusterName string) { - meta.ClusterName = clusterName -} diff --git a/vendor/k8s.io/api/core/v1/register.go b/vendor/k8s.io/api/core/v1/register.go index 526e1320a..1aac0cb41 100644 --- a/vendor/k8s.io/api/core/v1/register.go +++ b/vendor/k8s.io/api/core/v1/register.go @@ -57,7 +57,6 @@ func addKnownTypes(scheme *runtime.Scheme) error { &Endpoints{}, &EndpointsList{}, &Node{}, - &NodeConfigSource{}, &NodeList{}, &NodeProxyOptions{}, &Binding{}, diff --git a/vendor/k8s.io/api/core/v1/resource.go b/vendor/k8s.io/api/core/v1/resource.go index 3bd6fec62..bb8041254 100644 --- a/vendor/k8s.io/api/core/v1/resource.go +++ b/vendor/k8s.io/api/core/v1/resource.go @@ -48,13 +48,6 @@ func (self *ResourceList) Pods() *resource.Quantity { return &resource.Quantity{} } -func (self *ResourceList) NvidiaGPU() *resource.Quantity { - if val, ok := (*self)[ResourceNvidiaGPU]; ok { - return &val - } - return &resource.Quantity{} -} - func (self *ResourceList) StorageEphemeral() *resource.Quantity { if val, ok := (*self)[ResourceEphemeralStorage]; ok { return &val diff --git a/vendor/k8s.io/api/core/v1/types.go b/vendor/k8s.io/api/core/v1/types.go index 08ef4194e..b941e0ac2 100644 --- a/vendor/k8s.io/api/core/v1/types.go +++ b/vendor/k8s.io/api/core/v1/types.go @@ -23,209 +23,6 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" ) -// The comments for the structs and fields can be used from go-restful to -// generate Swagger API documentation for its models. Please read this PR for more -// information on the implementation: https://github.com/emicklei/go-restful/pull/215 -// -// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if -// they are on one line! For multiple line or blocks that you want to ignore use ---. -// Any context after a --- is ignored and not exported to the SwaggerAPI. -// -// The aforementioned methods can be generated by hack/update-generated-swagger-docs.sh - -// Common string formats -// --------------------- -// Many fields in this API have formatting requirements. The commonly used -// formats are defined here. -// -// C_IDENTIFIER: This is a string that conforms to the definition of an "identifier" -// in the C language. This is captured by the following regex: -// [A-Za-z_][A-Za-z0-9_]* -// This defines the format, but not the length restriction, which should be -// specified at the definition of any field of this type. -// -// DNS_LABEL: This is a string, no more than 63 characters long, that conforms -// to the definition of a "label" in RFCs 1035 and 1123. This is captured -// by the following regex: -// [a-z0-9]([-a-z0-9]*[a-z0-9])? -// -// DNS_SUBDOMAIN: This is a string, no more than 253 characters long, that conforms -// to the definition of a "subdomain" in RFCs 1035 and 1123. This is captured -// by the following regex: -// [a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)* -// or more simply: -// DNS_LABEL(\.DNS_LABEL)* -// -// IANA_SVC_NAME: This is a string, no more than 15 characters long, that -// conforms to the definition of IANA service name in RFC 6335. -// It must contains at least one letter [a-z] and it must contains only [a-z0-9-]. -// Hypens ('-') cannot be leading or trailing character of the string -// and cannot be adjacent to other hyphens. - -// ObjectMeta is metadata that all persisted resources must have, which includes all objects -// users must create. -// DEPRECATED: Use k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta instead - this type will be removed soon. -// +k8s:openapi-gen=false -type ObjectMeta struct { - // Name must be unique within a namespace. Is required when creating resources, although - // some resources may allow a client to request the generation of an appropriate name - // automatically. Name is primarily intended for creation idempotence and configuration - // definition. - // Cannot be updated. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names - // +optional - Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"` - - // GenerateName is an optional prefix, used by the server, to generate a unique - // name ONLY IF the Name field has not been provided. - // If this field is used, the name returned to the client will be different - // than the name passed. This value will also be combined with a unique suffix. - // The provided value has the same validation rules as the Name field, - // and may be truncated by the length of the suffix required to make the value - // unique on the server. - // - // If this field is specified and the generated name exists, the server will - // NOT return a 409 - instead, it will either return 201 Created or 500 with Reason - // ServerTimeout indicating a unique name could not be found in the time allotted, and the client - // should retry (optionally after the time indicated in the Retry-After header). - // - // Applied only if Name is not specified. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency - // +optional - GenerateName string `json:"generateName,omitempty" protobuf:"bytes,2,opt,name=generateName"` - - // Namespace defines the space within each name must be unique. An empty namespace is - // equivalent to the "default" namespace, but "default" is the canonical representation. - // Not all objects are required to be scoped to a namespace - the value of this field for - // those objects will be empty. - // - // Must be a DNS_LABEL. - // Cannot be updated. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/ - // +optional - Namespace string `json:"namespace,omitempty" protobuf:"bytes,3,opt,name=namespace"` - - // SelfLink is a URL representing this object. - // Populated by the system. - // Read-only. - // +optional - SelfLink string `json:"selfLink,omitempty" protobuf:"bytes,4,opt,name=selfLink"` - - // UID is the unique in time and space value for this object. It is typically generated by - // the server on successful creation of a resource and is not allowed to change on PUT - // operations. - // - // Populated by the system. - // Read-only. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids - // +optional - UID types.UID `json:"uid,omitempty" protobuf:"bytes,5,opt,name=uid,casttype=k8s.io/apimachinery/pkg/types.UID"` - - // An opaque value that represents the internal version of this object that can - // be used by clients to determine when objects have changed. May be used for optimistic - // concurrency, change detection, and the watch operation on a resource or set of resources. - // Clients must treat these values as opaque and passed unmodified back to the server. - // They may only be valid for a particular resource or set of resources. - // - // Populated by the system. - // Read-only. - // Value must be treated as opaque by clients and . - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency - // +optional - ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,6,opt,name=resourceVersion"` - - // A sequence number representing a specific generation of the desired state. - // Populated by the system. Read-only. - // +optional - Generation int64 `json:"generation,omitempty" protobuf:"varint,7,opt,name=generation"` - - // CreationTimestamp is a timestamp representing the server time when this object was - // created. It is not guaranteed to be set in happens-before order across separate operations. - // Clients may not set this value. It is represented in RFC3339 form and is in UTC. - // - // Populated by the system. - // Read-only. - // Null for lists. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata - // +optional - CreationTimestamp metav1.Time `json:"creationTimestamp,omitempty" protobuf:"bytes,8,opt,name=creationTimestamp"` - - // DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This - // field is set by the server when a graceful deletion is requested by the user, and is not - // directly settable by a client. The resource is expected to be deleted (no longer visible - // from resource lists, and not reachable by name) after the time in this field. Once set, - // this value may not be unset or be set further into the future, although it may be shortened - // or the resource may be deleted prior to this time. For example, a user may request that - // a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination - // signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard - // termination signal (SIGKILL) to the container and after cleanup, remove the pod from the - // API. In the presence of network partitions, this object may still exist after this - // timestamp, until an administrator or automated process can determine the resource is - // fully terminated. - // If not set, graceful deletion of the object has not been requested. - // - // Populated by the system when a graceful deletion is requested. - // Read-only. - // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata - // +optional - DeletionTimestamp *metav1.Time `json:"deletionTimestamp,omitempty" protobuf:"bytes,9,opt,name=deletionTimestamp"` - - // Number of seconds allowed for this object to gracefully terminate before - // it will be removed from the system. Only set when deletionTimestamp is also set. - // May only be shortened. - // Read-only. - // +optional - DeletionGracePeriodSeconds *int64 `json:"deletionGracePeriodSeconds,omitempty" protobuf:"varint,10,opt,name=deletionGracePeriodSeconds"` - - // Map of string keys and values that can be used to organize and categorize - // (scope and select) objects. May match selectors of replication controllers - // and services. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ - // +optional - Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,11,rep,name=labels"` - - // Annotations is an unstructured key value map stored with a resource that may be - // set by external tools to store and retrieve arbitrary metadata. They are not - // queryable and should be preserved when modifying objects. - // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ - // +optional - Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,12,rep,name=annotations"` - - // List of objects depended by this object. If ALL objects in the list have - // been deleted, this object will be garbage collected. If this object is managed by a controller, - // then an entry in this list will point to this controller, with the controller field set to true. - // There cannot be more than one managing controller. - // +optional - // +patchMergeKey=uid - // +patchStrategy=merge - OwnerReferences []metav1.OwnerReference `json:"ownerReferences,omitempty" patchStrategy:"merge" patchMergeKey:"uid" protobuf:"bytes,13,rep,name=ownerReferences"` - - // An initializer is a controller which enforces some system invariant at object creation time. - // This field is a list of initializers that have not yet acted on this object. If nil or empty, - // this object has been completely initialized. Otherwise, the object is considered uninitialized - // and is hidden (in list/watch and get calls) from clients that haven't explicitly asked to - // observe uninitialized objects. - // - // When an object is created, the system will populate this list with the current set of initializers. - // Only privileged users may set or modify this list. Once it is empty, it may not be modified further - // by any user. - Initializers *metav1.Initializers `json:"initializers,omitempty" patchStrategy:"merge" protobuf:"bytes,16,rep,name=initializers"` - - // Must be empty before the object is deleted from the registry. Each entry - // is an identifier for the responsible component that will remove the entry - // from the list. If the deletionTimestamp of the object is non-nil, entries - // in this list can only be removed. - // +optional - // +patchStrategy=merge - Finalizers []string `json:"finalizers,omitempty" patchStrategy:"merge" protobuf:"bytes,14,rep,name=finalizers"` - - // The name of the cluster which the object belongs to. - // This is used to distinguish resources with same name and namespace in different clusters. - // This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request. - // +optional - ClusterName string `json:"clusterName,omitempty" protobuf:"bytes,15,opt,name=clusterName"` -} - const ( // NamespaceDefault means the object is in the default namespace which is applied when not specified by clients NamespaceDefault string = "default" @@ -273,6 +70,9 @@ type VolumeSource struct { // +optional AWSElasticBlockStore *AWSElasticBlockStoreVolumeSource `json:"awsElasticBlockStore,omitempty" protobuf:"bytes,4,opt,name=awsElasticBlockStore"` // GitRepo represents a git repository at a particular revision. + // DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an + // EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir + // into the Pod's container. // +optional GitRepo *GitRepoVolumeSource `json:"gitRepo,omitempty" protobuf:"bytes,5,opt,name=gitRepo"` // Secret represents a secret that should populate this volume. @@ -405,7 +205,7 @@ type PersistentVolumeSource struct { // Cinder represents a cinder volume attached and mounted on kubelets host machine // More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md // +optional - Cinder *CinderVolumeSource `json:"cinder,omitempty" protobuf:"bytes,8,opt,name=cinder"` + Cinder *CinderPersistentVolumeSource `json:"cinder,omitempty" protobuf:"bytes,8,opt,name=cinder"` // CephFS represents a Ceph FS mount on the host that shares a pod's lifetime // +optional CephFS *CephFSPersistentVolumeSource `json:"cephfs,omitempty" protobuf:"bytes,9,opt,name=cephfs"` @@ -458,10 +258,6 @@ const ( // MountOptionAnnotation defines mount option annotation used in PVs MountOptionAnnotation = "volume.beta.kubernetes.io/mount-options" - - // AlphaStorageNodeAffinityAnnotation defines node affinity policies for a PersistentVolume. - // Value is a string of the json representation of type NodeAffinity - AlphaStorageNodeAffinityAnnotation = "volume.alpha.kubernetes.io/node-affinity" ) // +genclient @@ -935,6 +731,35 @@ type CinderVolumeSource struct { // More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md // +optional ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,3,opt,name=readOnly"` + // Optional: points to a secret object containing parameters used to connect + // to OpenStack. + // +optional + SecretRef *LocalObjectReference `json:"secretRef,omitempty" protobuf:"bytes,4,opt,name=secretRef"` +} + +// Represents a cinder volume resource in Openstack. +// A Cinder volume must exist before mounting to a container. +// The volume must also be in the same region as the kubelet. +// Cinder volumes support ownership management and SELinux relabeling. +type CinderPersistentVolumeSource struct { + // volume id used to identify the volume in cinder + // More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md + VolumeID string `json:"volumeID" protobuf:"bytes,1,opt,name=volumeID"` + // Filesystem type to mount. + // Must be a filesystem type supported by the host operating system. + // Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + // More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md + // +optional + FSType string `json:"fsType,omitempty" protobuf:"bytes,2,opt,name=fsType"` + // Optional: Defaults to false (read/write). ReadOnly here will force + // the ReadOnly setting in VolumeMounts. + // More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md + // +optional + ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,3,opt,name=readOnly"` + // Optional: points to a secret object containing parameters used to connect + // to OpenStack. + // +optional + SecretRef *SecretReference `json:"secretRef,omitempty" protobuf:"bytes,4,opt,name=secretRef"` } // Represents a Ceph Filesystem mount that lasts the lifetime of a pod @@ -1179,6 +1004,10 @@ type AWSElasticBlockStoreVolumeSource struct { // Represents a volume that is populated with the contents of a git repository. // Git repo volumes do not support ownership management. // Git repo volumes support SELinux relabeling. +// +// DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an +// EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir +// into the Pod's container. type GitRepoVolumeSource struct { // Repository URL Repository string `json:"repository" protobuf:"bytes,1,opt,name=repository"` @@ -1673,6 +1502,30 @@ type ConfigMapProjection struct { Optional *bool `json:"optional,omitempty" protobuf:"varint,4,opt,name=optional"` } +// ServiceAccountTokenProjection represents a projected service account token +// volume. This projection can be used to insert a service account token into +// the pods runtime filesystem for use against APIs (Kubernetes API Server or +// otherwise). +type ServiceAccountTokenProjection struct { + // Audience is the intended audience of the token. A recipient of a token + // must identify itself with an identifier specified in the audience of the + // token, and otherwise should reject the token. The audience defaults to the + // identifier of the apiserver. + //+optional + Audience string `json:"audience,omitempty" protobuf:"bytes,1,rep,name=audience"` + // ExpirationSeconds is the requested duration of validity of the service + // account token. As the token approaches expiration, the kubelet volume + // plugin will proactively rotate the service account token. The kubelet will + // start trying to rotate the token if the token is older than 80 percent of + // its time to live or if the token is older than 24 hours.Defaults to 1 hour + // and must be at least 10 minutes. + //+optional + ExpirationSeconds *int64 `json:"expirationSeconds,omitempty" protobuf:"varint,2,opt,name=expirationSeconds"` + // Path is the path relative to the mount point of the file to project the + // token into. + Path string `json:"path" protobuf:"bytes,3,opt,name=path"` +} + // Represents a projected volume source type ProjectedVolumeSource struct { // list of volume projections @@ -1691,11 +1544,17 @@ type VolumeProjection struct { // all types below are the supported types for projection into the same volume // information about the secret data to project + // +optional Secret *SecretProjection `json:"secret,omitempty" protobuf:"bytes,1,opt,name=secret"` // information about the downwardAPI data to project + // +optional DownwardAPI *DownwardAPIProjection `json:"downwardAPI,omitempty" protobuf:"bytes,2,opt,name=downwardAPI"` // information about the configMap data to project + // +optional ConfigMap *ConfigMapProjection `json:"configMap,omitempty" protobuf:"bytes,3,opt,name=configMap"` + // information about the serviceAccountToken data to project + // +optional + ServiceAccountToken *ServiceAccountTokenProjection `json:"serviceAccountToken,omitempty" protobuf:"bytes,4,opt,name=serviceAccountToken"` } const ( @@ -1720,11 +1579,13 @@ type KeyToPath struct { Mode *int32 `json:"mode,omitempty" protobuf:"varint,3,opt,name=mode"` } -// Local represents directly-attached storage with node affinity +// Local represents directly-attached storage with node affinity (Beta feature) type LocalVolumeSource struct { - // The full path to the volume on the node - // For alpha, this path must be a directory - // Once block as a source is supported, then this path can point to a block device + // The full path to the volume on the node. + // It can be either a directory or block device (disk, partition, ...). + // Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. + // Block devices can be represented only by VolumeMode=Block, which also requires the + // BlockVolume alpha feature gate to be enabled. Path string `json:"path" protobuf:"bytes,1,opt,name=path"` } @@ -1831,6 +1692,12 @@ type VolumeMount struct { type MountPropagationMode string const ( + // MountPropagationNone means that the volume in a container will + // not receive new mounts from the host or other containers, and filesystems + // mounted inside the container won't be propagated to the host or other + // containers. + // Note that this mode corresponds to "private" in Linux terminology. + MountPropagationNone MountPropagationMode = "None" // MountPropagationHostToContainer means that the volume in a container will // receive new mounts from the host or other containers, but filesystems // mounted inside the container won't be propagated to the host or other @@ -2445,12 +2312,13 @@ const ( // PodReasonUnschedulable reason in PodScheduled PodCondition means that the scheduler // can't schedule the pod right now, for example due to insufficient resources in the cluster. PodReasonUnschedulable = "Unschedulable" + // ContainersReady indicates whether all containers in the pod are ready. + ContainersReady PodConditionType = "ContainersReady" ) // PodCondition contains details for the current condition of this pod. type PodCondition struct { // Type is the type of the condition. - // Currently only Ready. // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions Type PodConditionType `json:"type" protobuf:"bytes,1,opt,name=type,casttype=PodConditionType"` // Status is the status of the condition. @@ -2521,10 +2389,16 @@ type NodeSelector struct { NodeSelectorTerms []NodeSelectorTerm `json:"nodeSelectorTerms" protobuf:"bytes,1,rep,name=nodeSelectorTerms"` } -// A null or empty node selector term matches no objects. +// A null or empty node selector term matches no objects. The requirements of +// them are ANDed. +// The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. type NodeSelectorTerm struct { - //Required. A list of node selector requirements. The requirements are ANDed. - MatchExpressions []NodeSelectorRequirement `json:"matchExpressions" protobuf:"bytes,1,rep,name=matchExpressions"` + // A list of node selector requirements by node's labels. + // +optional + MatchExpressions []NodeSelectorRequirement `json:"matchExpressions,omitempty" protobuf:"bytes,1,rep,name=matchExpressions"` + // A list of node selector requirements by node's fields. + // +optional + MatchFields []NodeSelectorRequirement `json:"matchFields,omitempty" protobuf:"bytes,2,rep,name=matchFields"` } // A node selector requirement is a selector that contains values, a key, and an operator @@ -2557,6 +2431,27 @@ const ( NodeSelectorOpLt NodeSelectorOperator = "Lt" ) +// A topology selector term represents the result of label queries. +// A null or empty topology selector term matches no objects. +// The requirements of them are ANDed. +// It provides a subset of functionality as NodeSelectorTerm. +// This is an alpha feature and may change in the future. +type TopologySelectorTerm struct { + // A list of topology selector requirements by labels. + // +optional + MatchLabelExpressions []TopologySelectorLabelRequirement `json:"matchLabelExpressions,omitempty" protobuf:"bytes,1,rep,name=matchLabelExpressions"` +} + +// A topology selector requirement is a selector that matches given label. +// This is an alpha feature and may change in the future. +type TopologySelectorLabelRequirement struct { + // The label key that the selector applies to. + Key string `json:"key" protobuf:"bytes,1,opt,name=key"` + // An array of string values. One value must match the label to be selected. + // Each entry in Values is ORed. + Values []string `json:"values" protobuf:"bytes,2,rep,name=values"` +} + // Affinity is a group of affinity scheduling rules. type Affinity struct { // Describes node affinity scheduling rules for the pod. @@ -2789,6 +2684,12 @@ const ( TolerationOpEqual TolerationOperator = "Equal" ) +// PodReadinessGate contains the reference to a pod condition +type PodReadinessGate struct { + // ConditionType refers to a condition in the pod's condition list with matching type. + ConditionType PodConditionType `json:"conditionType" protobuf:"bytes,1,opt,name=conditionType,casttype=PodConditionType"` +} + // PodSpec is a description of a pod. type PodSpec struct { // List of volumes that can be mounted by containers belonging to the pod. @@ -2953,6 +2854,13 @@ type PodSpec struct { // configuration based on DNSPolicy. // +optional DNSConfig *PodDNSConfig `json:"dnsConfig,omitempty" protobuf:"bytes,26,opt,name=dnsConfig"` + + // If specified, all readiness gates will be evaluated for pod readiness. + // A pod is ready when all its containers are ready AND + // all conditions specified in the readiness gates have status equal to "True" + // More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md + // +optional + ReadinessGates []PodReadinessGate `json:"readinessGates,omitempty" protobuf:"bytes,28,opt,name=readinessGates"` } // HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the @@ -3013,6 +2921,10 @@ type PodSecurityContext struct { // If unset, the Kubelet will not modify the ownership and permissions of any volume. // +optional FSGroup *int64 `json:"fsGroup,omitempty" protobuf:"varint,5,opt,name=fsGroup"` + // Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported + // sysctls (by the container runtime) might fail to launch. + // +optional + Sysctls []Sysctl `json:"sysctls,omitempty" protobuf:"bytes,7,rep,name=sysctls"` } // PodQOSClass defines the supported qos classes of Pods. @@ -3057,9 +2969,26 @@ type PodDNSConfigOption struct { } // PodStatus represents information about the status of a pod. Status may trail the actual -// state of a system. +// state of a system, especially if the node that hosts the pod cannot contact the control +// plane. type PodStatus struct { - // Current condition of the pod. + // The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. + // The conditions array, the reason and message fields, and the individual container status + // arrays contain more detail about the pod's status. + // There are five possible phase values: + // + // Pending: The pod has been accepted by the Kubernetes system, but one or more of the + // container images has not been created. This includes time before being scheduled as + // well as time spent downloading images over the network, which could take a while. + // Running: The pod has been bound to a node, and all of the containers have been created. + // At least one container is still running, or is in the process of starting or restarting. + // Succeeded: All containers in the pod have terminated in success, and will not be restarted. + // Failed: All containers in the pod have terminated, and at least one container has + // terminated in failure. The container either exited with non-zero status or was terminated + // by the system. + // Unknown: For some reason the state of the pod could not be obtained, typically due to an + // error in communicating with the host of the pod. + // // More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase // +optional Phase PodPhase `json:"phase,omitempty" protobuf:"bytes,1,opt,name=phase,casttype=PodPhase"` @@ -3556,9 +3485,6 @@ type ServiceSpec struct { // The primary use case for setting this field is to use a StatefulSet's Headless Service // to propagate SRV records for its Pods without respect to their readiness for purpose // of peer discovery. - // This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints - // when that annotation is deprecated and all clients have been converted to use this - // field. // +optional PublishNotReadyAddresses bool `json:"publishNotReadyAddresses,omitempty" protobuf:"varint,13,opt,name=publishNotReadyAddresses"` // sessionAffinityConfig contains the configurations of session affinity. @@ -3604,6 +3530,7 @@ type ServicePort struct { } // +genclient +// +genclient:skipVerbs=deleteCollection // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Service is a named abstraction of software service (for example, mysql) consisting of local port @@ -3813,10 +3740,6 @@ type NodeSpec struct { // PodCIDR represents the pod IP range assigned to the node. // +optional PodCIDR string `json:"podCIDR,omitempty" protobuf:"bytes,1,opt,name=podCIDR"` - // External ID of the node assigned by some machine database (e.g. a cloud provider). - // Deprecated. - // +optional - ExternalID string `json:"externalID,omitempty" protobuf:"bytes,2,opt,name=externalID"` // ID of the node assigned by the cloud provider in the format: :// // +optional ProviderID string `json:"providerID,omitempty" protobuf:"bytes,3,opt,name=providerID"` @@ -3831,14 +3754,53 @@ type NodeSpec struct { // The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field // +optional ConfigSource *NodeConfigSource `json:"configSource,omitempty" protobuf:"bytes,6,opt,name=configSource"` -} -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + // Deprecated. Not all kubelets will set this field. Remove field after 1.13. + // see: https://issues.k8s.io/61966 + // +optional + DoNotUse_ExternalID string `json:"externalID,omitempty" protobuf:"bytes,2,opt,name=externalID"` +} // NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil. type NodeConfigSource struct { - metav1.TypeMeta `json:",inline"` - ConfigMapRef *ObjectReference `json:"configMapRef,omitempty" protobuf:"bytes,1,opt,name=configMapRef"` + // For historical context, regarding the below kind, apiVersion, and configMapRef deprecation tags: + // 1. kind/apiVersion were used by the kubelet to persist this struct to disk (they had no protobuf tags) + // 2. configMapRef and proto tag 1 were used by the API to refer to a configmap, + // but used a generic ObjectReference type that didn't really have the fields we needed + // All uses/persistence of the NodeConfigSource struct prior to 1.11 were gated by alpha feature flags, + // so there was no persisted data for these fields that needed to be migrated/handled. + + // +k8s:deprecated=kind + // +k8s:deprecated=apiVersion + // +k8s:deprecated=configMapRef,protobuf=1 + + // ConfigMap is a reference to a Node's ConfigMap + ConfigMap *ConfigMapNodeConfigSource `json:"configMap,omitempty" protobuf:"bytes,2,opt,name=configMap"` +} + +// ConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node. +type ConfigMapNodeConfigSource struct { + // Namespace is the metadata.namespace of the referenced ConfigMap. + // This field is required in all cases. + Namespace string `json:"namespace" protobuf:"bytes,1,opt,name=namespace"` + + // Name is the metadata.name of the referenced ConfigMap. + // This field is required in all cases. + Name string `json:"name" protobuf:"bytes,2,opt,name=name"` + + // UID is the metadata.UID of the referenced ConfigMap. + // This field is forbidden in Node.Spec, and required in Node.Status. + // +optional + UID types.UID `json:"uid,omitempty" protobuf:"bytes,3,opt,name=uid"` + + // ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap. + // This field is forbidden in Node.Spec, and required in Node.Status. + // +optional + ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,4,opt,name=resourceVersion"` + + // KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure + // This field is required in all cases. + KubeletConfigKey string `json:"kubeletConfigKey" protobuf:"bytes,5,opt,name=kubeletConfigKey"` } // DaemonEndpoint contains information about a single Daemon endpoint. @@ -3888,6 +3850,53 @@ type NodeSystemInfo struct { Architecture string `json:"architecture" protobuf:"bytes,10,opt,name=architecture"` } +// NodeConfigStatus describes the status of the config assigned by Node.Spec.ConfigSource. +type NodeConfigStatus struct { + // Assigned reports the checkpointed config the node will try to use. + // When Node.Spec.ConfigSource is updated, the node checkpoints the associated + // config payload to local disk, along with a record indicating intended + // config. The node refers to this record to choose its config checkpoint, and + // reports this record in Assigned. Assigned only updates in the status after + // the record has been checkpointed to disk. When the Kubelet is restarted, + // it tries to make the Assigned config the Active config by loading and + // validating the checkpointed payload identified by Assigned. + // +optional + Assigned *NodeConfigSource `json:"assigned,omitempty" protobuf:"bytes,1,opt,name=assigned"` + // Active reports the checkpointed config the node is actively using. + // Active will represent either the current version of the Assigned config, + // or the current LastKnownGood config, depending on whether attempting to use the + // Assigned config results in an error. + // +optional + Active *NodeConfigSource `json:"active,omitempty" protobuf:"bytes,2,opt,name=active"` + // LastKnownGood reports the checkpointed config the node will fall back to + // when it encounters an error attempting to use the Assigned config. + // The Assigned config becomes the LastKnownGood config when the node determines + // that the Assigned config is stable and correct. + // This is currently implemented as a 10-minute soak period starting when the local + // record of Assigned config is updated. If the Assigned config is Active at the end + // of this period, it becomes the LastKnownGood. Note that if Spec.ConfigSource is + // reset to nil (use local defaults), the LastKnownGood is also immediately reset to nil, + // because the local default config is always assumed good. + // You should not make assumptions about the node's method of determining config stability + // and correctness, as this may change or become configurable in the future. + // +optional + LastKnownGood *NodeConfigSource `json:"lastKnownGood,omitempty" protobuf:"bytes,3,opt,name=lastKnownGood"` + // Error describes any problems reconciling the Spec.ConfigSource to the Active config. + // Errors may occur, for example, attempting to checkpoint Spec.ConfigSource to the local Assigned + // record, attempting to checkpoint the payload associated with Spec.ConfigSource, attempting + // to load or validate the Assigned config, etc. + // Errors may occur at different points while syncing config. Earlier errors (e.g. download or + // checkpointing errors) will not result in a rollback to LastKnownGood, and may resolve across + // Kubelet retries. Later errors (e.g. loading or validating a checkpointed config) will result in + // a rollback to LastKnownGood. In the latter case, it is usually possible to resolve the error + // by fixing the config assigned in Spec.ConfigSource. + // You can find additional information for debugging by searching the error message in the Kubelet log. + // Error is a human-readable description of the error state; machines can check whether or not Error + // is empty, but should not rely on the stability of the Error text across Kubelet versions. + // +optional + Error string `json:"error,omitempty" protobuf:"bytes,4,opt,name=error"` +} + // NodeStatus is information about the current status of a node. type NodeStatus struct { // Capacity represents the total resources of a node. @@ -3932,6 +3941,9 @@ type NodeStatus struct { // List of volumes that are attached to the node. // +optional VolumesAttached []AttachedVolume `json:"volumesAttached,omitempty" protobuf:"bytes,10,rep,name=volumesAttached"` + // Status of the config assigned to the node via the dynamic Kubelet config feature. + // +optional + Config *NodeConfigStatus `json:"config,omitempty" protobuf:"bytes,11,opt,name=config"` } type UniqueVolumeName string @@ -4019,8 +4031,6 @@ const ( NodePIDPressure NodeConditionType = "PIDPressure" // NodeNetworkUnavailable means that network for the node is not correctly configured. NodeNetworkUnavailable NodeConditionType = "NetworkUnavailable" - // NodeKubeletConfigOk indicates whether the kubelet is correctly configured - NodeKubeletConfigOk NodeConditionType = "KubeletConfigOk" ) // NodeCondition contains condition information for a node. @@ -4080,8 +4090,6 @@ const ( // Local ephemeral storage, in bytes. (500Gi = 500GiB = 500 * 1024 * 1024 * 1024) // The resource name for ResourceEphemeralStorage is alpha and it can change across releases. ResourceEphemeralStorage ResourceName = "ephemeral-storage" - // NVIDIA GPU, in devices. Alpha, might change: although fractional and allowing values >1, only one whole device per node is assigned. - ResourceNvidiaGPU ResourceName = "alpha.kubernetes.io/nvidia-gpu" ) const ( @@ -4089,6 +4097,8 @@ const ( ResourceDefaultNamespacePrefix = "kubernetes.io/" // Name prefix for huge page resources (alpha). ResourceHugePagesPrefix = "hugepages-" + // Name prefix for storage resource limits + ResourceAttachableVolumesPrefix = "attachable-volumes-" ) // ResourceList is a set of (resource name, quantity) pairs. @@ -4171,6 +4181,7 @@ const ( // +genclient // +genclient:nonNamespaced +// +genclient:skipVerbs=deleteCollection // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Namespace provides a scope for Names. @@ -4231,95 +4242,6 @@ type Preconditions struct { UID *types.UID `json:"uid,omitempty" protobuf:"bytes,1,opt,name=uid,casttype=k8s.io/apimachinery/pkg/types.UID"` } -// DeletionPropagation decides if a deletion will propagate to the dependents of the object, and how the garbage collector will handle the propagation. -type DeletionPropagation string - -const ( - // Orphans the dependents. - DeletePropagationOrphan DeletionPropagation = "Orphan" - // Deletes the object from the key-value store, the garbage collector will delete the dependents in the background. - DeletePropagationBackground DeletionPropagation = "Background" - // The object exists in the key-value store until the garbage collector deletes all the dependents whose ownerReference.blockOwnerDeletion=true from the key-value store. - // API sever will put the "DeletingDependents" finalizer on the object, and sets its deletionTimestamp. - // This policy is cascading, i.e., the dependents will be deleted with Foreground. - DeletePropagationForeground DeletionPropagation = "Foreground" -) - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// DeleteOptions may be provided when deleting an API object -// DEPRECATED: This type has been moved to meta/v1 and will be removed soon. -// +k8s:openapi-gen=false -type DeleteOptions struct { - metav1.TypeMeta `json:",inline"` - - // The duration in seconds before the object should be deleted. Value must be non-negative integer. - // The value zero indicates delete immediately. If this value is nil, the default grace period for the - // specified type will be used. - // Defaults to a per object value if not specified. zero means delete immediately. - // +optional - GracePeriodSeconds *int64 `json:"gracePeriodSeconds,omitempty" protobuf:"varint,1,opt,name=gracePeriodSeconds"` - - // Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be - // returned. - // +optional - Preconditions *Preconditions `json:"preconditions,omitempty" protobuf:"bytes,2,opt,name=preconditions"` - - // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. - // Should the dependent objects be orphaned. If true/false, the "orphan" - // finalizer will be added to/removed from the object's finalizers list. - // Either this field or PropagationPolicy may be set, but not both. - // +optional - OrphanDependents *bool `json:"orphanDependents,omitempty" protobuf:"varint,3,opt,name=orphanDependents"` - - // Whether and how garbage collection will be performed. - // Either this field or OrphanDependents may be set, but not both. - // The default policy is decided by the existing finalizer set in the - // metadata.finalizers and the resource-specific default policy. - // Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - - // allow the garbage collector to delete the dependents in the background; - // 'Foreground' - a cascading policy that deletes all dependents in the - // foreground. - // +optional - PropagationPolicy *DeletionPropagation `protobuf:"bytes,4,opt,name=propagationPolicy,casttype=DeletionPropagation"` -} - -// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - -// ListOptions is the query options to a standard REST list call. -// DEPRECATED: This type has been moved to meta/v1 and will be removed soon. -// +k8s:openapi-gen=false -type ListOptions struct { - metav1.TypeMeta `json:",inline"` - - // A selector to restrict the list of returned objects by their labels. - // Defaults to everything. - // +optional - LabelSelector string `json:"labelSelector,omitempty" protobuf:"bytes,1,opt,name=labelSelector"` - // A selector to restrict the list of returned objects by their fields. - // Defaults to everything. - // +optional - FieldSelector string `json:"fieldSelector,omitempty" protobuf:"bytes,2,opt,name=fieldSelector"` - // If true, partially initialized resources are included in the response. - // +optional - IncludeUninitialized bool `json:"includeUninitialized,omitempty" protobuf:"varint,6,opt,name=includeUninitialized"` - // Watch for changes to the described resources and return them as a stream of - // add, update, and remove notifications. Specify resourceVersion. - // +optional - Watch bool `json:"watch,omitempty" protobuf:"varint,3,opt,name=watch"` - // When specified with a watch call, shows changes that occur after that particular version of a resource. - // Defaults to changes from the beginning of history. - // When specified for list: - // - if unset, then the result is returned from remote storage based on quorum-read flag; - // - if it's 0, then we simply return what we currently have in cache, no guarantee; - // - if set to non zero, then the result is at least as fresh as given rv. - // +optional - ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,4,opt,name=resourceVersion"` - // Timeout for the list/watch call. - // +optional - TimeoutSeconds *int64 `json:"timeoutSeconds,omitempty" protobuf:"varint,5,opt,name=timeoutSeconds"` -} - // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // PodLogOptions is the query options for a Pod's logs REST call. @@ -4804,11 +4726,13 @@ const ( ResourceQuotaScopeBestEffort ResourceQuotaScope = "BestEffort" // Match all pod objects that do not have best effort quality of service ResourceQuotaScopeNotBestEffort ResourceQuotaScope = "NotBestEffort" + // Match all pod objects that have priority class mentioned + ResourceQuotaScopePriorityClass ResourceQuotaScope = "PriorityClass" ) // ResourceQuotaSpec defines the desired hard limits to enforce for Quota. type ResourceQuotaSpec struct { - // Hard is the set of desired hard limits for each named resource. + // hard is the set of desired hard limits for each named resource. // More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/ // +optional Hard ResourceList `json:"hard,omitempty" protobuf:"bytes,1,rep,name=hard,casttype=ResourceList,castkey=ResourceName"` @@ -4816,8 +4740,48 @@ type ResourceQuotaSpec struct { // If not specified, the quota matches all objects. // +optional Scopes []ResourceQuotaScope `json:"scopes,omitempty" protobuf:"bytes,2,rep,name=scopes,casttype=ResourceQuotaScope"` + // scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota + // but expressed using ScopeSelectorOperator in combination with possible values. + // For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched. + // +optional + ScopeSelector *ScopeSelector `json:"scopeSelector,omitempty" protobuf:"bytes,3,opt,name=scopeSelector"` } +// A scope selector represents the AND of the selectors represented +// by the scoped-resource selector requirements. +type ScopeSelector struct { + // A list of scope selector requirements by scope of the resources. + // +optional + MatchExpressions []ScopedResourceSelectorRequirement `json:"matchExpressions,omitempty" protobuf:"bytes,1,rep,name=matchExpressions"` +} + +// A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator +// that relates the scope name and values. +type ScopedResourceSelectorRequirement struct { + // The name of the scope that the selector applies to. + ScopeName ResourceQuotaScope `json:"scopeName" protobuf:"bytes,1,opt,name=scopeName"` + // Represents a scope's relationship to a set of values. + // Valid operators are In, NotIn, Exists, DoesNotExist. + Operator ScopeSelectorOperator `json:"operator" protobuf:"bytes,2,opt,name=operator,casttype=ScopedResourceSelectorOperator"` + // An array of string values. If the operator is In or NotIn, + // the values array must be non-empty. If the operator is Exists or DoesNotExist, + // the values array must be empty. + // This array is replaced during a strategic merge patch. + // +optional + Values []string `json:"values,omitempty" protobuf:"bytes,3,rep,name=values"` +} + +// A scope selector operator is the set of operators that can be used in +// a scope selector requirement. +type ScopeSelectorOperator string + +const ( + ScopeSelectorOpIn ScopeSelectorOperator = "In" + ScopeSelectorOpNotIn ScopeSelectorOperator = "NotIn" + ScopeSelectorOpExists ScopeSelectorOperator = "Exists" + ScopeSelectorOpDoesNotExist ScopeSelectorOperator = "DoesNotExist" +) + // ResourceQuotaStatus defines the enforced hard limits and observed use. type ResourceQuotaStatus struct { // Hard is the set of enforced hard limits for each named resource. @@ -5245,9 +5209,9 @@ const ( // Sysctl defines a kernel parameter to be set type Sysctl struct { // Name of a property to set - Name string `protobuf:"bytes,1,opt,name=name"` + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` // Value of a property to set - Value string `protobuf:"bytes,2,opt,name=value"` + Value string `json:"value" protobuf:"bytes,2,opt,name=value"` } // NodeResources is an object for conveying resource information about a node. diff --git a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index 7b41f018a..5b4e173db 100644 --- a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_AWSElasticBlockStoreVolumeSource = map[string]string{ "": "Represents a Persistent Disk resource in AWS.\n\nAn AWS EBS disk must exist before mounting to a container. The disk must also be in the same AWS zone as the kubelet. An AWS EBS disk can only be mounted as read/write once. AWS EBS volumes support ownership management and SELinux relabeling.", "volumeID": "Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore", @@ -170,11 +170,24 @@ func (CephFSVolumeSource) SwaggerDoc() map[string]string { return map_CephFSVolumeSource } +var map_CinderPersistentVolumeSource = map[string]string{ + "": "Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. The volume must also be in the same region as the kubelet. Cinder volumes support ownership management and SELinux relabeling.", + "volumeID": "volume id used to identify the volume in cinder More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", + "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", + "readOnly": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", + "secretRef": "Optional: points to a secret object containing parameters used to connect to OpenStack.", +} + +func (CinderPersistentVolumeSource) SwaggerDoc() map[string]string { + return map_CinderPersistentVolumeSource +} + var map_CinderVolumeSource = map[string]string{ - "": "Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. The volume must also be in the same region as the kubelet. Cinder volumes support ownership management and SELinux relabeling.", - "volumeID": "volume id used to identify the volume in cinder More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", - "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", - "readOnly": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", + "": "Represents a cinder volume resource in Openstack. A Cinder volume must exist before mounting to a container. The volume must also be in the same region as the kubelet. Cinder volumes support ownership management and SELinux relabeling.", + "volumeID": "volume id used to identify the volume in cinder More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", + "fsType": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified. More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", + "readOnly": "Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://releases.k8s.io/HEAD/examples/mysql-cinder-pd/README.md", + "secretRef": "Optional: points to a secret object containing parameters used to connect to OpenStack.", } func (CinderVolumeSource) SwaggerDoc() map[string]string { @@ -262,6 +275,19 @@ func (ConfigMapList) SwaggerDoc() map[string]string { return map_ConfigMapList } +var map_ConfigMapNodeConfigSource = map[string]string{ + "": "ConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node.", + "namespace": "Namespace is the metadata.namespace of the referenced ConfigMap. This field is required in all cases.", + "name": "Name is the metadata.name of the referenced ConfigMap. This field is required in all cases.", + "uid": "UID is the metadata.UID of the referenced ConfigMap. This field is forbidden in Node.Spec, and required in Node.Status.", + "resourceVersion": "ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap. This field is forbidden in Node.Spec, and required in Node.Status.", + "kubeletConfigKey": "KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure This field is required in all cases.", +} + +func (ConfigMapNodeConfigSource) SwaggerDoc() map[string]string { + return map_ConfigMapNodeConfigSource +} + var map_ConfigMapProjection = map[string]string{ "": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", "items": "If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'.", @@ -405,18 +431,6 @@ func (DaemonEndpoint) SwaggerDoc() map[string]string { return map_DaemonEndpoint } -var map_DeleteOptions = map[string]string{ - "": "DeleteOptions may be provided when deleting an API object DEPRECATED: This type has been moved to meta/v1 and will be removed soon.", - "gracePeriodSeconds": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", - "preconditions": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.", - "orphanDependents": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", - "PropagationPolicy": "Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground.", -} - -func (DeleteOptions) SwaggerDoc() map[string]string { - return map_DeleteOptions -} - var map_DownwardAPIProjection = map[string]string{ "": "Represents downward API info for projecting into a projected volume. Note that this is identical to a downwardAPI volume source without the default mode.", "items": "Items is a list of DownwardAPIVolume file", @@ -671,7 +685,7 @@ func (GCEPersistentDiskVolumeSource) SwaggerDoc() map[string]string { } var map_GitRepoVolumeSource = map[string]string{ - "": "Represents a volume that is populated with the contents of a git repository. Git repo volumes do not support ownership management. Git repo volumes support SELinux relabeling.", + "": "Represents a volume that is populated with the contents of a git repository. Git repo volumes do not support ownership management. Git repo volumes support SELinux relabeling.\n\nDEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container.", "repository": "Repository URL", "revision": "Commit hash for the specified revision.", "directory": "Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name.", @@ -848,20 +862,6 @@ func (LimitRangeSpec) SwaggerDoc() map[string]string { return map_LimitRangeSpec } -var map_ListOptions = map[string]string{ - "": "ListOptions is the query options to a standard REST list call. DEPRECATED: This type has been moved to meta/v1 and will be removed soon.", - "labelSelector": "A selector to restrict the list of returned objects by their labels. Defaults to everything.", - "fieldSelector": "A selector to restrict the list of returned objects by their fields. Defaults to everything.", - "includeUninitialized": "If true, partially initialized resources are included in the response.", - "watch": "Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion.", - "resourceVersion": "When specified with a watch call, shows changes that occur after that particular version of a resource. Defaults to changes from the beginning of history. When specified for list: - if unset, then the result is returned from remote storage based on quorum-read flag; - if it's 0, then we simply return what we currently have in cache, no guarantee; - if set to non zero, then the result is at least as fresh as given rv.", - "timeoutSeconds": "Timeout for the list/watch call.", -} - -func (ListOptions) SwaggerDoc() map[string]string { - return map_ListOptions -} - var map_LoadBalancerIngress = map[string]string{ "": "LoadBalancerIngress represents the status of a load-balancer ingress point: traffic intended for the service should be sent to an ingress point.", "ip": "IP is set for load-balancer ingress points that are IP based (typically GCE or OpenStack load-balancers)", @@ -891,8 +891,8 @@ func (LocalObjectReference) SwaggerDoc() map[string]string { } var map_LocalVolumeSource = map[string]string{ - "": "Local represents directly-attached storage with node affinity", - "path": "The full path to the volume on the node For alpha, this path must be a directory Once block as a source is supported, then this path can point to a block device", + "": "Local represents directly-attached storage with node affinity (Beta feature)", + "path": "The full path to the volume on the node. It can be either a directory or block device (disk, partition, ...). Directories can be represented only by PersistentVolume with VolumeMode=Filesystem. Block devices can be represented only by VolumeMode=Block, which also requires the BlockVolume alpha feature gate to be enabled.", } func (LocalVolumeSource) SwaggerDoc() map[string]string { @@ -995,13 +995,26 @@ func (NodeCondition) SwaggerDoc() map[string]string { } var map_NodeConfigSource = map[string]string{ - "": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.", + "": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.", + "configMap": "ConfigMap is a reference to a Node's ConfigMap", } func (NodeConfigSource) SwaggerDoc() map[string]string { return map_NodeConfigSource } +var map_NodeConfigStatus = map[string]string{ + "": "NodeConfigStatus describes the status of the config assigned by Node.Spec.ConfigSource.", + "assigned": "Assigned reports the checkpointed config the node will try to use. When Node.Spec.ConfigSource is updated, the node checkpoints the associated config payload to local disk, along with a record indicating intended config. The node refers to this record to choose its config checkpoint, and reports this record in Assigned. Assigned only updates in the status after the record has been checkpointed to disk. When the Kubelet is restarted, it tries to make the Assigned config the Active config by loading and validating the checkpointed payload identified by Assigned.", + "active": "Active reports the checkpointed config the node is actively using. Active will represent either the current version of the Assigned config, or the current LastKnownGood config, depending on whether attempting to use the Assigned config results in an error.", + "lastKnownGood": "LastKnownGood reports the checkpointed config the node will fall back to when it encounters an error attempting to use the Assigned config. The Assigned config becomes the LastKnownGood config when the node determines that the Assigned config is stable and correct. This is currently implemented as a 10-minute soak period starting when the local record of Assigned config is updated. If the Assigned config is Active at the end of this period, it becomes the LastKnownGood. Note that if Spec.ConfigSource is reset to nil (use local defaults), the LastKnownGood is also immediately reset to nil, because the local default config is always assumed good. You should not make assumptions about the node's method of determining config stability and correctness, as this may change or become configurable in the future.", + "error": "Error describes any problems reconciling the Spec.ConfigSource to the Active config. Errors may occur, for example, attempting to checkpoint Spec.ConfigSource to the local Assigned record, attempting to checkpoint the payload associated with Spec.ConfigSource, attempting to load or validate the Assigned config, etc. Errors may occur at different points while syncing config. Earlier errors (e.g. download or checkpointing errors) will not result in a rollback to LastKnownGood, and may resolve across Kubelet retries. Later errors (e.g. loading or validating a checkpointed config) will result in a rollback to LastKnownGood. In the latter case, it is usually possible to resolve the error by fixing the config assigned in Spec.ConfigSource. You can find additional information for debugging by searching the error message in the Kubelet log. Error is a human-readable description of the error state; machines can check whether or not Error is empty, but should not rely on the stability of the Error text across Kubelet versions.", +} + +func (NodeConfigStatus) SwaggerDoc() map[string]string { + return map_NodeConfigStatus +} + var map_NodeDaemonEndpoints = map[string]string{ "": "NodeDaemonEndpoints lists ports opened by daemons running on the Node.", "kubeletEndpoint": "Endpoint on which Kubelet is listening.", @@ -1060,8 +1073,9 @@ func (NodeSelectorRequirement) SwaggerDoc() map[string]string { } var map_NodeSelectorTerm = map[string]string{ - "": "A null or empty node selector term matches no objects.", - "matchExpressions": "Required. A list of node selector requirements. The requirements are ANDed.", + "": "A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.", + "matchExpressions": "A list of node selector requirements by node's labels.", + "matchFields": "A list of node selector requirements by node's fields.", } func (NodeSelectorTerm) SwaggerDoc() map[string]string { @@ -1071,11 +1085,11 @@ func (NodeSelectorTerm) SwaggerDoc() map[string]string { var map_NodeSpec = map[string]string{ "": "NodeSpec describes the attributes that a node is created with.", "podCIDR": "PodCIDR represents the pod IP range assigned to the node.", - "externalID": "External ID of the node assigned by some machine database (e.g. a cloud provider). Deprecated.", "providerID": "ID of the node assigned by the cloud provider in the format: ://", "unschedulable": "Unschedulable controls node schedulability of new pods. By default, node is schedulable. More info: https://kubernetes.io/docs/concepts/nodes/node/#manual-node-administration", "taints": "If specified, the node's taints.", "configSource": "If specified, the source to get node configuration from The DynamicKubeletConfig feature gate must be enabled for the Kubelet to use this field", + "externalID": "Deprecated. Not all kubelets will set this field. Remove field after 1.13. see: https://issues.k8s.io/61966", } func (NodeSpec) SwaggerDoc() map[string]string { @@ -1094,6 +1108,7 @@ var map_NodeStatus = map[string]string{ "images": "List of container images on this node", "volumesInUse": "List of attachable volumes in use (mounted) by the node.", "volumesAttached": "List of volumes that are attached to the node.", + "config": "Status of the config assigned to the node via the dynamic Kubelet config feature.", } func (NodeStatus) SwaggerDoc() map[string]string { @@ -1128,30 +1143,6 @@ func (ObjectFieldSelector) SwaggerDoc() map[string]string { return map_ObjectFieldSelector } -var map_ObjectMeta = map[string]string{ - "": "ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create. DEPRECATED: Use k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta instead - this type will be removed soon.", - "name": "Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", - "generateName": "GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency", - "namespace": "Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/", - "selfLink": "SelfLink is a URL representing this object. Populated by the system. Read-only.", - "uid": "UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids", - "resourceVersion": "An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency", - "generation": "A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.", - "creationTimestamp": "CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.\n\nPopulated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", - "deletionTimestamp": "DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This field is set by the server when a graceful deletion is requested by the user, and is not directly settable by a client. The resource is expected to be deleted (no longer visible from resource lists, and not reachable by name) after the time in this field. Once set, this value may not be unset or be set further into the future, although it may be shortened or the resource may be deleted prior to this time. For example, a user may request that a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL) to the container and after cleanup, remove the pod from the API. In the presence of network partitions, this object may still exist after this timestamp, until an administrator or automated process can determine the resource is fully terminated. If not set, graceful deletion of the object has not been requested.\n\nPopulated by the system when a graceful deletion is requested. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", - "deletionGracePeriodSeconds": "Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.", - "labels": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/", - "annotations": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/", - "ownerReferences": "List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.", - "initializers": "An initializer is a controller which enforces some system invariant at object creation time. This field is a list of initializers that have not yet acted on this object. If nil or empty, this object has been completely initialized. Otherwise, the object is considered uninitialized and is hidden (in list/watch and get calls) from clients that haven't explicitly asked to observe uninitialized objects.\n\nWhen an object is created, the system will populate this list with the current set of initializers. Only privileged users may set or modify this list. Once it is empty, it may not be modified further by any user.", - "finalizers": "Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed.", - "clusterName": "The name of the cluster which the object belongs to. This is used to distinguish resources with same name and namespace in different clusters. This field is not set anywhere right now and apiserver is going to ignore it if set in create or update request.", -} - -func (ObjectMeta) SwaggerDoc() map[string]string { - return map_ObjectMeta -} - var map_ObjectReference = map[string]string{ "": "ObjectReference contains enough information to let you inspect or modify the referred object.", "kind": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", @@ -1381,7 +1372,7 @@ func (PodAttachOptions) SwaggerDoc() map[string]string { var map_PodCondition = map[string]string{ "": "PodCondition contains details for the current condition of this pod.", - "type": "Type is the type of the condition. Currently only Ready. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", + "type": "Type is the type of the condition. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", "status": "Status is the status of the condition. Can be True, False, Unknown. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", "lastProbeTime": "Last time we probed the condition.", "lastTransitionTime": "Last time the condition transitioned from one status to another.", @@ -1471,6 +1462,15 @@ func (PodProxyOptions) SwaggerDoc() map[string]string { return map_PodProxyOptions } +var map_PodReadinessGate = map[string]string{ + "": "PodReadinessGate contains the reference to a pod condition", + "conditionType": "ConditionType refers to a condition in the pod's condition list with matching type.", +} + +func (PodReadinessGate) SwaggerDoc() map[string]string { + return map_PodReadinessGate +} + var map_PodSecurityContext = map[string]string{ "": "PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.", "seLinuxOptions": "The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container.", @@ -1479,6 +1479,7 @@ var map_PodSecurityContext = map[string]string{ "runAsNonRoot": "Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.", "supplementalGroups": "A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container.", "fsGroup": "A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod:\n\n1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw ", + "sysctls": "Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch.", } func (PodSecurityContext) SwaggerDoc() map[string]string { @@ -1523,6 +1524,7 @@ var map_PodSpec = map[string]string{ "priorityClassName": "If specified, indicates the pod's priority. \"system-node-critical\" and \"system-cluster-critical\" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default.", "priority": "The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority.", "dnsConfig": "Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy.", + "readinessGates": "If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md", } func (PodSpec) SwaggerDoc() map[string]string { @@ -1530,8 +1532,8 @@ func (PodSpec) SwaggerDoc() map[string]string { } var map_PodStatus = map[string]string{ - "": "PodStatus represents information about the status of a pod. Status may trail the actual state of a system.", - "phase": "Current condition of the pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase", + "": "PodStatus represents information about the status of a pod. Status may trail the actual state of a system, especially if the node that hosts the pod cannot contact the control plane.", + "phase": "The phase of a Pod is a simple, high-level summary of where the Pod is in its lifecycle. The conditions array, the reason and message fields, and the individual container status arrays contain more detail about the pod's status. There are five possible phase values:\n\nPending: The pod has been accepted by the Kubernetes system, but one or more of the container images has not been created. This includes time before being scheduled as well as time spent downloading images over the network, which could take a while. Running: The pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. Succeeded: All containers in the pod have terminated in success, and will not be restarted. Failed: All containers in the pod have terminated, and at least one container has terminated in failure. The container either exited with non-zero status or was terminated by the system. Unknown: For some reason the state of the pod could not be obtained, typically due to an error in communicating with the host of the pod.\n\nMore info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-phase", "conditions": "Current service state of pod. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#pod-conditions", "message": "A human readable message indicating details about why the pod is in this condition.", "reason": "A brief CamelCase message indicating details about why the pod is in this state. e.g. 'Evicted'", @@ -1802,9 +1804,10 @@ func (ResourceQuotaList) SwaggerDoc() map[string]string { } var map_ResourceQuotaSpec = map[string]string{ - "": "ResourceQuotaSpec defines the desired hard limits to enforce for Quota.", - "hard": "Hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/", - "scopes": "A collection of filters that must match each object tracked by a quota. If not specified, the quota matches all objects.", + "": "ResourceQuotaSpec defines the desired hard limits to enforce for Quota.", + "hard": "hard is the set of desired hard limits for each named resource. More info: https://kubernetes.io/docs/concepts/policy/resource-quotas/", + "scopes": "A collection of filters that must match each object tracked by a quota. If not specified, the quota matches all objects.", + "scopeSelector": "scopeSelector is also a collection of filters like scopes that must match each object tracked by a quota but expressed using ScopeSelectorOperator in combination with possible values. For a resource to match, both scopes AND scopeSelector (if specified in spec), must be matched.", } func (ResourceQuotaSpec) SwaggerDoc() map[string]string { @@ -1879,6 +1882,26 @@ func (ScaleIOVolumeSource) SwaggerDoc() map[string]string { return map_ScaleIOVolumeSource } +var map_ScopeSelector = map[string]string{ + "": "A scope selector represents the AND of the selectors represented by the scoped-resource selector requirements.", + "matchExpressions": "A list of scope selector requirements by scope of the resources.", +} + +func (ScopeSelector) SwaggerDoc() map[string]string { + return map_ScopeSelector +} + +var map_ScopedResourceSelectorRequirement = map[string]string{ + "": "A scoped-resource selector requirement is a selector that contains values, a scope name, and an operator that relates the scope name and values.", + "scopeName": "The name of the scope that the selector applies to.", + "operator": "Represents a scope's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist.", + "values": "An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.", +} + +func (ScopedResourceSelectorRequirement) SwaggerDoc() map[string]string { + return map_ScopedResourceSelectorRequirement +} + var map_Secret = map[string]string{ "": "Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", @@ -2010,6 +2033,17 @@ func (ServiceAccountList) SwaggerDoc() map[string]string { return map_ServiceAccountList } +var map_ServiceAccountTokenProjection = map[string]string{ + "": "ServiceAccountTokenProjection represents a projected service account token volume. This projection can be used to insert a service account token into the pods runtime filesystem for use against APIs (Kubernetes API Server or otherwise).", + "audience": "Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver.", + "expirationSeconds": "ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes.", + "path": "Path is the path relative to the mount point of the file to project the token into.", +} + +func (ServiceAccountTokenProjection) SwaggerDoc() map[string]string { + return map_ServiceAccountTokenProjection +} + var map_ServiceList = map[string]string{ "": "ServiceList holds a list of services.", "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", @@ -2055,7 +2089,7 @@ var map_ServiceSpec = map[string]string{ "externalName": "externalName is the external reference that kubedns or equivalent will return as a CNAME record for this service. No proxying will be involved. Must be a valid RFC-1123 hostname (https://tools.ietf.org/html/rfc1123) and requires Type to be ExternalName.", "externalTrafficPolicy": "externalTrafficPolicy denotes if this Service desires to route external traffic to node-local or cluster-wide endpoints. \"Local\" preserves the client source IP and avoids a second hop for LoadBalancer and Nodeport type services, but risks potentially imbalanced traffic spreading. \"Cluster\" obscures the client source IP and may cause a second hop to another node, but should have good overall load-spreading.", "healthCheckNodePort": "healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local.", - "publishNotReadyAddresses": "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery. This field will replace the service.alpha.kubernetes.io/tolerate-unready-endpoints when that annotation is deprecated and all clients have been converted to use this field.", + "publishNotReadyAddresses": "publishNotReadyAddresses, when set to true, indicates that DNS implementations must publish the notReadyAddresses of subsets for the Endpoints associated with the Service. The default value is false. The primary use case for setting this field is to use a StatefulSet's Headless Service to propagate SRV records for its Pods without respect to their readiness for purpose of peer discovery.", "sessionAffinityConfig": "sessionAffinityConfig contains the configurations of session affinity.", } @@ -2109,8 +2143,8 @@ func (StorageOSVolumeSource) SwaggerDoc() map[string]string { var map_Sysctl = map[string]string{ "": "Sysctl defines a kernel parameter to be set", - "Name": "Name of a property to set", - "Value": "Value of a property to set", + "name": "Name of a property to set", + "value": "Value of a property to set", } func (Sysctl) SwaggerDoc() map[string]string { @@ -2152,6 +2186,25 @@ func (Toleration) SwaggerDoc() map[string]string { return map_Toleration } +var map_TopologySelectorLabelRequirement = map[string]string{ + "": "A topology selector requirement is a selector that matches given label. This is an alpha feature and may change in the future.", + "key": "The label key that the selector applies to.", + "values": "An array of string values. One value must match the label to be selected. Each entry in Values is ORed.", +} + +func (TopologySelectorLabelRequirement) SwaggerDoc() map[string]string { + return map_TopologySelectorLabelRequirement +} + +var map_TopologySelectorTerm = map[string]string{ + "": "A topology selector term represents the result of label queries. A null or empty topology selector term matches no objects. The requirements of them are ANDed. It provides a subset of functionality as NodeSelectorTerm. This is an alpha feature and may change in the future.", + "matchLabelExpressions": "A list of topology selector requirements by labels.", +} + +func (TopologySelectorTerm) SwaggerDoc() map[string]string { + return map_TopologySelectorTerm +} + var map_Volume = map[string]string{ "": "Volume represents a named volume in a pod that may be accessed by any container in the pod.", "name": "Volume's name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", @@ -2194,10 +2247,11 @@ func (VolumeNodeAffinity) SwaggerDoc() map[string]string { } var map_VolumeProjection = map[string]string{ - "": "Projection that may be projected along with other supported volume types", - "secret": "information about the secret data to project", - "downwardAPI": "information about the downwardAPI data to project", - "configMap": "information about the configMap data to project", + "": "Projection that may be projected along with other supported volume types", + "secret": "information about the secret data to project", + "downwardAPI": "information about the downwardAPI data to project", + "configMap": "information about the configMap data to project", + "serviceAccountToken": "information about the serviceAccountToken data to project", } func (VolumeProjection) SwaggerDoc() map[string]string { @@ -2210,7 +2264,7 @@ var map_VolumeSource = map[string]string{ "emptyDir": "EmptyDir represents a temporary directory that shares a pod's lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir", "gcePersistentDisk": "GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk", "awsElasticBlockStore": "AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore", - "gitRepo": "GitRepo represents a git repository at a particular revision.", + "gitRepo": "GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod's container.", "secret": "Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret", "nfs": "NFS represents an NFS mount on the host that shares a pod's lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs", "iscsi": "ISCSI represents an ISCSI Disk resource that is attached to a kubelet's host machine and then exposed to the pod. More info: https://releases.k8s.io/HEAD/examples/volumes/iscsi/README.md", diff --git a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go index ebdcb890d..0501bbcb5 100644 --- a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -380,9 +380,43 @@ func (in *CephFSVolumeSource) DeepCopy() *CephFSVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CinderPersistentVolumeSource) DeepCopyInto(out *CinderPersistentVolumeSource) { + *out = *in + if in.SecretRef != nil { + in, out := &in.SecretRef, &out.SecretRef + if *in == nil { + *out = nil + } else { + *out = new(SecretReference) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CinderPersistentVolumeSource. +func (in *CinderPersistentVolumeSource) DeepCopy() *CinderPersistentVolumeSource { + if in == nil { + return nil + } + out := new(CinderPersistentVolumeSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CinderVolumeSource) DeepCopyInto(out *CinderVolumeSource) { *out = *in + if in.SecretRef != nil { + in, out := &in.SecretRef, &out.SecretRef + if *in == nil { + *out = nil + } else { + *out = new(LocalObjectReference) + **out = **in + } + } return } @@ -631,6 +665,22 @@ func (in *ConfigMapList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ConfigMapNodeConfigSource) DeepCopyInto(out *ConfigMapNodeConfigSource) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigMapNodeConfigSource. +func (in *ConfigMapNodeConfigSource) DeepCopy() *ConfigMapNodeConfigSource { + if in == nil { + return nil + } + out := new(ConfigMapNodeConfigSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ConfigMapProjection) DeepCopyInto(out *ConfigMapProjection) { *out = *in @@ -965,67 +1015,6 @@ func (in *DaemonEndpoint) DeepCopy() *DaemonEndpoint { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DeleteOptions) DeepCopyInto(out *DeleteOptions) { - *out = *in - out.TypeMeta = in.TypeMeta - if in.GracePeriodSeconds != nil { - in, out := &in.GracePeriodSeconds, &out.GracePeriodSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } - } - if in.Preconditions != nil { - in, out := &in.Preconditions, &out.Preconditions - if *in == nil { - *out = nil - } else { - *out = new(Preconditions) - (*in).DeepCopyInto(*out) - } - } - if in.OrphanDependents != nil { - in, out := &in.OrphanDependents, &out.OrphanDependents - if *in == nil { - *out = nil - } else { - *out = new(bool) - **out = **in - } - } - if in.PropagationPolicy != nil { - in, out := &in.PropagationPolicy, &out.PropagationPolicy - if *in == nil { - *out = nil - } else { - *out = new(DeletionPropagation) - **out = **in - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DeleteOptions. -func (in *DeleteOptions) DeepCopy() *DeleteOptions { - if in == nil { - return nil - } - out := new(DeleteOptions) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *DeleteOptions) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DownwardAPIProjection) DeepCopyInto(out *DownwardAPIProjection) { *out = *in @@ -2141,40 +2130,6 @@ func (in *List) DeepCopyObject() runtime.Object { return nil } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ListOptions) DeepCopyInto(out *ListOptions) { - *out = *in - out.TypeMeta = in.TypeMeta - if in.TimeoutSeconds != nil { - in, out := &in.TimeoutSeconds, &out.TimeoutSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ListOptions. -func (in *ListOptions) DeepCopy() *ListOptions { - if in == nil { - return nil - } - out := new(ListOptions) - in.DeepCopyInto(out) - return out -} - -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *ListOptions) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c - } - return nil -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *LoadBalancerIngress) DeepCopyInto(out *LoadBalancerIngress) { *out = *in @@ -2455,13 +2410,12 @@ func (in *NodeCondition) DeepCopy() *NodeCondition { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NodeConfigSource) DeepCopyInto(out *NodeConfigSource) { *out = *in - out.TypeMeta = in.TypeMeta - if in.ConfigMapRef != nil { - in, out := &in.ConfigMapRef, &out.ConfigMapRef + if in.ConfigMap != nil { + in, out := &in.ConfigMap, &out.ConfigMap if *in == nil { *out = nil } else { - *out = new(ObjectReference) + *out = new(ConfigMapNodeConfigSource) **out = **in } } @@ -2478,12 +2432,47 @@ func (in *NodeConfigSource) DeepCopy() *NodeConfigSource { return out } -// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. -func (in *NodeConfigSource) DeepCopyObject() runtime.Object { - if c := in.DeepCopy(); c != nil { - return c +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeConfigStatus) DeepCopyInto(out *NodeConfigStatus) { + *out = *in + if in.Assigned != nil { + in, out := &in.Assigned, &out.Assigned + if *in == nil { + *out = nil + } else { + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) + } } - return nil + if in.Active != nil { + in, out := &in.Active, &out.Active + if *in == nil { + *out = nil + } else { + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) + } + } + if in.LastKnownGood != nil { + in, out := &in.LastKnownGood, &out.LastKnownGood + if *in == nil { + *out = nil + } else { + *out = new(NodeConfigSource) + (*in).DeepCopyInto(*out) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeConfigStatus. +func (in *NodeConfigStatus) DeepCopy() *NodeConfigStatus { + if in == nil { + return nil + } + out := new(NodeConfigStatus) + in.DeepCopyInto(out) + return out } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -2638,6 +2627,13 @@ func (in *NodeSelectorTerm) DeepCopyInto(out *NodeSelectorTerm) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.MatchFields != nil { + in, out := &in.MatchFields, &out.MatchFields + *out = make([]NodeSelectorRequirement, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -2731,6 +2727,15 @@ func (in *NodeStatus) DeepCopyInto(out *NodeStatus) { *out = make([]AttachedVolume, len(*in)) copy(*out, *in) } + if in.Config != nil { + in, out := &in.Config, &out.Config + if *in == nil { + *out = nil + } else { + *out = new(NodeConfigStatus) + (*in).DeepCopyInto(*out) + } + } return } @@ -2776,75 +2781,6 @@ func (in *ObjectFieldSelector) DeepCopy() *ObjectFieldSelector { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ObjectMeta) DeepCopyInto(out *ObjectMeta) { - *out = *in - in.CreationTimestamp.DeepCopyInto(&out.CreationTimestamp) - if in.DeletionTimestamp != nil { - in, out := &in.DeletionTimestamp, &out.DeletionTimestamp - if *in == nil { - *out = nil - } else { - *out = (*in).DeepCopy() - } - } - if in.DeletionGracePeriodSeconds != nil { - in, out := &in.DeletionGracePeriodSeconds, &out.DeletionGracePeriodSeconds - if *in == nil { - *out = nil - } else { - *out = new(int64) - **out = **in - } - } - if in.Labels != nil { - in, out := &in.Labels, &out.Labels - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.Annotations != nil { - in, out := &in.Annotations, &out.Annotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - if in.OwnerReferences != nil { - in, out := &in.OwnerReferences, &out.OwnerReferences - *out = make([]meta_v1.OwnerReference, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } - } - if in.Initializers != nil { - in, out := &in.Initializers, &out.Initializers - if *in == nil { - *out = nil - } else { - *out = new(meta_v1.Initializers) - (*in).DeepCopyInto(*out) - } - } - if in.Finalizers != nil { - in, out := &in.Finalizers, &out.Finalizers - *out = make([]string, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectMeta. -func (in *ObjectMeta) DeepCopy() *ObjectMeta { - if in == nil { - return nil - } - out := new(ObjectMeta) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ObjectReference) DeepCopyInto(out *ObjectReference) { *out = *in @@ -3180,8 +3116,8 @@ func (in *PersistentVolumeSource) DeepCopyInto(out *PersistentVolumeSource) { if *in == nil { *out = nil } else { - *out = new(CinderVolumeSource) - **out = **in + *out = new(CinderPersistentVolumeSource) + (*in).DeepCopyInto(*out) } } if in.CephFS != nil { @@ -3813,6 +3749,22 @@ func (in *PodProxyOptions) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PodReadinessGate) DeepCopyInto(out *PodReadinessGate) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodReadinessGate. +func (in *PodReadinessGate) DeepCopy() *PodReadinessGate { + if in == nil { + return nil + } + out := new(PodReadinessGate) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *PodSecurityContext) DeepCopyInto(out *PodSecurityContext) { *out = *in @@ -3866,6 +3818,11 @@ func (in *PodSecurityContext) DeepCopyInto(out *PodSecurityContext) { **out = **in } } + if in.Sysctls != nil { + in, out := &in.Sysctls, &out.Sysctls + *out = make([]Sysctl, len(*in)) + copy(*out, *in) + } return } @@ -4026,6 +3983,11 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { (*in).DeepCopyInto(*out) } } + if in.ReadinessGates != nil { + in, out := &in.ReadinessGates, &out.ReadinessGates + *out = make([]PodReadinessGate, len(*in)) + copy(*out, *in) + } return } @@ -4678,6 +4640,15 @@ func (in *ResourceQuotaSpec) DeepCopyInto(out *ResourceQuotaSpec) { *out = make([]ResourceQuotaScope, len(*in)) copy(*out, *in) } + if in.ScopeSelector != nil { + in, out := &in.ScopeSelector, &out.ScopeSelector + if *in == nil { + *out = nil + } else { + *out = new(ScopeSelector) + (*in).DeepCopyInto(*out) + } + } return } @@ -4817,6 +4788,50 @@ func (in *ScaleIOVolumeSource) DeepCopy() *ScaleIOVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScopeSelector) DeepCopyInto(out *ScopeSelector) { + *out = *in + if in.MatchExpressions != nil { + in, out := &in.MatchExpressions, &out.MatchExpressions + *out = make([]ScopedResourceSelectorRequirement, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScopeSelector. +func (in *ScopeSelector) DeepCopy() *ScopeSelector { + if in == nil { + return nil + } + out := new(ScopeSelector) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ScopedResourceSelectorRequirement) DeepCopyInto(out *ScopedResourceSelectorRequirement) { + *out = *in + if in.Values != nil { + in, out := &in.Values, &out.Values + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ScopedResourceSelectorRequirement. +func (in *ScopedResourceSelectorRequirement) DeepCopy() *ScopedResourceSelectorRequirement { + if in == nil { + return nil + } + out := new(ScopedResourceSelectorRequirement) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Secret) DeepCopyInto(out *Secret) { *out = *in @@ -5257,6 +5272,31 @@ func (in *ServiceAccountList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ServiceAccountTokenProjection) DeepCopyInto(out *ServiceAccountTokenProjection) { + *out = *in + if in.ExpirationSeconds != nil { + in, out := &in.ExpirationSeconds, &out.ExpirationSeconds + if *in == nil { + *out = nil + } else { + *out = new(int64) + **out = **in + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceAccountTokenProjection. +func (in *ServiceAccountTokenProjection) DeepCopy() *ServiceAccountTokenProjection { + if in == nil { + return nil + } + out := new(ServiceAccountTokenProjection) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ServiceList) DeepCopyInto(out *ServiceList) { *out = *in @@ -5553,6 +5593,50 @@ func (in *Toleration) DeepCopy() *Toleration { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TopologySelectorLabelRequirement) DeepCopyInto(out *TopologySelectorLabelRequirement) { + *out = *in + if in.Values != nil { + in, out := &in.Values, &out.Values + *out = make([]string, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TopologySelectorLabelRequirement. +func (in *TopologySelectorLabelRequirement) DeepCopy() *TopologySelectorLabelRequirement { + if in == nil { + return nil + } + out := new(TopologySelectorLabelRequirement) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TopologySelectorTerm) DeepCopyInto(out *TopologySelectorTerm) { + *out = *in + if in.MatchLabelExpressions != nil { + in, out := &in.MatchLabelExpressions, &out.MatchLabelExpressions + *out = make([]TopologySelectorLabelRequirement, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TopologySelectorTerm. +func (in *TopologySelectorTerm) DeepCopy() *TopologySelectorTerm { + if in == nil { + return nil + } + out := new(TopologySelectorTerm) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Volume) DeepCopyInto(out *Volume) { *out = *in @@ -5666,6 +5750,15 @@ func (in *VolumeProjection) DeepCopyInto(out *VolumeProjection) { (*in).DeepCopyInto(*out) } } + if in.ServiceAccountToken != nil { + in, out := &in.ServiceAccountToken, &out.ServiceAccountToken + if *in == nil { + *out = nil + } else { + *out = new(ServiceAccountTokenProjection) + (*in).DeepCopyInto(*out) + } + } return } @@ -5796,7 +5889,7 @@ func (in *VolumeSource) DeepCopyInto(out *VolumeSource) { *out = nil } else { *out = new(CinderVolumeSource) - **out = **in + (*in).DeepCopyInto(*out) } } if in.CephFS != nil { diff --git a/vendor/k8s.io/api/events/v1beta1/BUILD b/vendor/k8s.io/api/events/v1beta1/BUILD deleted file mode 100644 index 851874e78..000000000 --- a/vendor/k8s.io/api/events/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/events/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/events/v1beta1/generated.pb.go b/vendor/k8s.io/api/events/v1beta1/generated.pb.go index 9aac8420f..b0e313c4b 100644 --- a/vendor/k8s.io/api/events/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/events/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/events/v1beta1/generated.proto b/vendor/k8s.io/api/events/v1beta1/generated.proto index 0637f780a..60ee899ba 100644 --- a/vendor/k8s.io/api/events/v1beta1/generated.proto +++ b/vendor/k8s.io/api/events/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go index 17ec3d777..a15672c19 100644 --- a/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_Event = map[string]string{ "": "Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system.", "eventTime": "Required. Time when this Event was first observed.", diff --git a/vendor/k8s.io/api/events/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/events/v1beta1/zz_generated.deepcopy.go index 546d69e7e..9652044b3 100644 --- a/vendor/k8s.io/api/events/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/events/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/extensions/v1beta1/BUILD b/vendor/k8s.io/api/extensions/v1beta1/BUILD deleted file mode 100644 index 360ad999c..000000000 --- a/vendor/k8s.io/api/extensions/v1beta1/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/extensions/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go b/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go index fcb80615f..0604fb957 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/extensions/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -465,6 +465,14 @@ func (m *AllowedHostPath) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.PathPrefix))) i += copy(dAtA[i:], m.PathPrefix) + dAtA[i] = 0x10 + i++ + if m.ReadOnly { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ return i, nil } @@ -2249,6 +2257,40 @@ func (m *PodSecurityPolicySpec) MarshalTo(dAtA []byte) (int, error) { i += n } } + if len(m.AllowedUnsafeSysctls) > 0 { + for _, s := range m.AllowedUnsafeSysctls { + dAtA[i] = 0x9a + i++ + dAtA[i] = 0x1 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.ForbiddenSysctls) > 0 { + for _, s := range m.ForbiddenSysctls { + dAtA[i] = 0xa2 + i++ + dAtA[i] = 0x1 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -2818,6 +2860,7 @@ func (m *AllowedHostPath) Size() (n int) { _ = l l = len(m.PathPrefix) n += 1 + l + sovGenerated(uint64(l)) + n += 2 return n } @@ -3457,6 +3500,18 @@ func (m *PodSecurityPolicySpec) Size() (n int) { n += 2 + l + sovGenerated(uint64(l)) } } + if len(m.AllowedUnsafeSysctls) > 0 { + for _, s := range m.AllowedUnsafeSysctls { + l = len(s) + n += 2 + l + sovGenerated(uint64(l)) + } + } + if len(m.ForbiddenSysctls) > 0 { + for _, s := range m.ForbiddenSysctls { + l = len(s) + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -3677,6 +3732,7 @@ func (this *AllowedHostPath) String() string { } s := strings.Join([]string{`&AllowedHostPath{`, `PathPrefix:` + fmt.Sprintf("%v", this.PathPrefix) + `,`, + `ReadOnly:` + fmt.Sprintf("%v", this.ReadOnly) + `,`, `}`, }, "") return s @@ -4189,6 +4245,8 @@ func (this *PodSecurityPolicySpec) String() string { `AllowPrivilegeEscalation:` + valueToStringGenerated(this.AllowPrivilegeEscalation) + `,`, `AllowedHostPaths:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedHostPaths), "AllowedHostPath", "AllowedHostPath", 1), `&`, ``, 1) + `,`, `AllowedFlexVolumes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedFlexVolumes), "AllowedFlexVolume", "AllowedFlexVolume", 1), `&`, ``, 1) + `,`, + `AllowedUnsafeSysctls:` + fmt.Sprintf("%v", this.AllowedUnsafeSysctls) + `,`, + `ForbiddenSysctls:` + fmt.Sprintf("%v", this.ForbiddenSysctls) + `,`, `}`, }, "") return s @@ -4520,6 +4578,26 @@ func (m *AllowedHostPath) Unmarshal(dAtA []byte) error { } m.PathPrefix = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReadOnly = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -10306,6 +10384,64 @@ func (m *PodSecurityPolicySpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 19: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedUnsafeSysctls", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedUnsafeSysctls = append(m.AllowedUnsafeSysctls, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ForbiddenSysctls", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ForbiddenSysctls = append(m.ForbiddenSysctls, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -12285,229 +12421,233 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 3571 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x6f, 0x1c, 0x47, - 0x76, 0x57, 0xcf, 0x0c, 0x39, 0xc3, 0x47, 0xf1, 0xab, 0x28, 0x93, 0x63, 0xca, 0xe2, 0xc8, 0x6d, - 0x40, 0x91, 0x1c, 0x69, 0xc6, 0x92, 0x2d, 0x59, 0xb1, 0x10, 0x3b, 0x1c, 0x52, 0x1f, 0x74, 0xf8, - 0xa5, 0x1a, 0x52, 0x71, 0x8c, 0xc8, 0x71, 0x73, 0xa6, 0x38, 0x6c, 0xb1, 0xa7, 0xbb, 0xdd, 0x5d, - 0x4d, 0x73, 0x80, 0x20, 0xc8, 0x21, 0x08, 0x10, 0x20, 0x41, 0x92, 0x83, 0xf3, 0x71, 0x8b, 0x2f, - 0x39, 0x25, 0x48, 0x6e, 0xc9, 0xc1, 0x30, 0x10, 0xc0, 0x0b, 0x08, 0x0b, 0x2f, 0xe0, 0xdb, 0xfa, - 0x44, 0xac, 0xe9, 0xd3, 0x62, 0xff, 0x81, 0x85, 0x0e, 0x8b, 0x45, 0x55, 0x57, 0x7f, 0x77, 0x73, - 0x66, 0x68, 0x89, 0x58, 0x2c, 0xf6, 0xc6, 0xa9, 0xf7, 0xde, 0xef, 0xbd, 0x7a, 0xf5, 0xea, 0xbd, - 0xd7, 0x55, 0x45, 0xb8, 0xb7, 0x77, 0xdb, 0xae, 0xaa, 0x46, 0x6d, 0xcf, 0xd9, 0x26, 0x96, 0x4e, - 0x28, 0xb1, 0x6b, 0xfb, 0x44, 0x6f, 0x19, 0x56, 0x4d, 0x10, 0x14, 0x53, 0xad, 0x91, 0x03, 0x4a, - 0x74, 0x5b, 0x35, 0x74, 0xbb, 0xb6, 0x7f, 0x7d, 0x9b, 0x50, 0xe5, 0x7a, 0xad, 0x4d, 0x74, 0x62, - 0x29, 0x94, 0xb4, 0xaa, 0xa6, 0x65, 0x50, 0x03, 0x5d, 0x70, 0xd9, 0xab, 0x8a, 0xa9, 0x56, 0x03, - 0xf6, 0xaa, 0x60, 0x9f, 0xbb, 0xd6, 0x56, 0xe9, 0xae, 0xb3, 0x5d, 0x6d, 0x1a, 0x9d, 0x5a, 0xdb, - 0x68, 0x1b, 0x35, 0x2e, 0xb5, 0xed, 0xec, 0xf0, 0x5f, 0xfc, 0x07, 0xff, 0xcb, 0x45, 0x9b, 0x93, - 0x43, 0xca, 0x9b, 0x86, 0x45, 0x6a, 0xfb, 0x09, 0x8d, 0x73, 0x57, 0x42, 0x3c, 0xa6, 0xa1, 0xa9, - 0xcd, 0x6e, 0x96, 0x71, 0x73, 0x6f, 0x05, 0xac, 0x1d, 0xa5, 0xb9, 0xab, 0xea, 0xc4, 0xea, 0xd6, - 0xcc, 0xbd, 0x36, 0x97, 0xb5, 0x88, 0x6d, 0x38, 0x56, 0x93, 0x0c, 0x24, 0x65, 0xd7, 0x3a, 0x84, - 0x2a, 0x69, 0x66, 0xd5, 0xb2, 0xa4, 0x2c, 0x47, 0xa7, 0x6a, 0x27, 0xa9, 0xe6, 0x56, 0x2f, 0x01, - 0xbb, 0xb9, 0x4b, 0x3a, 0x4a, 0x42, 0xee, 0xcd, 0x2c, 0x39, 0x87, 0xaa, 0x5a, 0x4d, 0xd5, 0xa9, - 0x4d, 0xad, 0xb8, 0x90, 0x7c, 0x07, 0xa6, 0x16, 0x34, 0xcd, 0xf8, 0x94, 0xb4, 0xee, 0x69, 0xe4, - 0xe0, 0x91, 0xa1, 0x39, 0x1d, 0x82, 0x2e, 0xc1, 0x70, 0xcb, 0x52, 0xf7, 0x89, 0x55, 0x96, 0x2e, - 0x4a, 0x97, 0x47, 0xea, 0xe3, 0x4f, 0x0f, 0x2b, 0x67, 0x8e, 0x0e, 0x2b, 0xc3, 0x4b, 0x7c, 0x14, - 0x0b, 0xaa, 0x7c, 0x17, 0x26, 0x84, 0xf0, 0x03, 0xc3, 0xa6, 0x1b, 0x0a, 0xdd, 0x45, 0x37, 0x00, - 0x4c, 0x85, 0xee, 0x6e, 0x58, 0x64, 0x47, 0x3d, 0x10, 0xe2, 0x48, 0x88, 0xc3, 0x86, 0x4f, 0xc1, - 0x21, 0x2e, 0xf9, 0xdf, 0x24, 0x78, 0x79, 0xd1, 0xb1, 0xa9, 0xd1, 0x59, 0x25, 0xd4, 0x52, 0x9b, - 0x8b, 0x8e, 0x65, 0x11, 0x9d, 0x36, 0xa8, 0x42, 0x1d, 0x1b, 0x5d, 0x84, 0x82, 0xae, 0x74, 0x88, - 0xc0, 0x3a, 0x2b, 0xb0, 0x0a, 0x6b, 0x4a, 0x87, 0x60, 0x4e, 0x41, 0x1f, 0xc2, 0xd0, 0xbe, 0xa2, - 0x39, 0xa4, 0x9c, 0xbb, 0x28, 0x5d, 0x1e, 0xbd, 0x51, 0xad, 0x06, 0xa1, 0xe7, 0x3b, 0xa2, 0x6a, - 0xee, 0xb5, 0x79, 0x2c, 0x7a, 0xab, 0x5b, 0x7d, 0xe8, 0x28, 0x3a, 0x55, 0x69, 0xb7, 0x7e, 0x4e, - 0x40, 0x9e, 0x15, 0x7a, 0x1f, 0x31, 0x2c, 0xec, 0x42, 0xca, 0x7f, 0x09, 0x17, 0x32, 0x4d, 0x5b, - 0x51, 0x6d, 0x8a, 0x1e, 0xc3, 0x90, 0x4a, 0x49, 0xc7, 0x2e, 0x4b, 0x17, 0xf3, 0x97, 0x47, 0x6f, - 0xdc, 0xae, 0x1e, 0x1b, 0xf7, 0xd5, 0x4c, 0xb0, 0xfa, 0x98, 0x30, 0x63, 0x68, 0x99, 0xc1, 0x61, - 0x17, 0x55, 0xfe, 0x27, 0x09, 0x50, 0x58, 0x66, 0x53, 0xb1, 0xda, 0x84, 0xf6, 0xe1, 0x94, 0x3f, - 0xfd, 0x61, 0x4e, 0x99, 0x16, 0x90, 0xa3, 0xae, 0xc2, 0x88, 0x4f, 0x4c, 0x98, 0x49, 0x9a, 0xc4, - 0x9d, 0xf1, 0x28, 0xea, 0x8c, 0xeb, 0x03, 0x38, 0xc3, 0x45, 0xc9, 0xf0, 0xc2, 0x67, 0x39, 0x18, - 0x59, 0x52, 0x48, 0xc7, 0xd0, 0x1b, 0x84, 0xa2, 0x8f, 0xa1, 0xc4, 0x36, 0x5b, 0x4b, 0xa1, 0x0a, - 0x77, 0xc0, 0xe8, 0x8d, 0x37, 0x8e, 0x9b, 0x9d, 0x5d, 0x65, 0xdc, 0xd5, 0xfd, 0xeb, 0xd5, 0xf5, - 0xed, 0x27, 0xa4, 0x49, 0x57, 0x09, 0x55, 0x82, 0x98, 0x0c, 0xc6, 0xb0, 0x8f, 0x8a, 0xd6, 0xa0, - 0x60, 0x9b, 0xa4, 0x29, 0x7c, 0x77, 0xb5, 0xc7, 0x34, 0x7c, 0xcb, 0x1a, 0x26, 0x69, 0x06, 0x8b, - 0xc1, 0x7e, 0x61, 0x8e, 0x83, 0x1e, 0xc1, 0xb0, 0xcd, 0x57, 0xb9, 0x9c, 0x4f, 0xac, 0xc6, 0xf1, - 0x88, 0x6e, 0x6c, 0xf8, 0x1b, 0xd0, 0xfd, 0x8d, 0x05, 0x9a, 0xfc, 0xf3, 0x1c, 0x20, 0x9f, 0x77, - 0xd1, 0xd0, 0x5b, 0x2a, 0x55, 0x0d, 0x1d, 0xbd, 0x03, 0x05, 0xda, 0x35, 0xbd, 0xe8, 0xb8, 0xe4, - 0x19, 0xb4, 0xd9, 0x35, 0xc9, 0xb3, 0xc3, 0xca, 0x4c, 0x52, 0x82, 0x51, 0x30, 0x97, 0x41, 0x2b, - 0xbe, 0xa9, 0x39, 0x2e, 0xfd, 0x56, 0x54, 0xf5, 0xb3, 0xc3, 0x4a, 0x4a, 0x2e, 0xae, 0xfa, 0x48, - 0x51, 0x03, 0xd1, 0x3e, 0x20, 0x4d, 0xb1, 0xe9, 0xa6, 0xa5, 0xe8, 0xb6, 0xab, 0x49, 0xed, 0x10, - 0xe1, 0x84, 0xd7, 0xfb, 0x5b, 0x34, 0x26, 0x51, 0x9f, 0x13, 0x56, 0xa0, 0x95, 0x04, 0x1a, 0x4e, - 0xd1, 0xc0, 0x32, 0x98, 0x45, 0x14, 0xdb, 0xd0, 0xcb, 0x85, 0x68, 0x06, 0xc3, 0x7c, 0x14, 0x0b, - 0x2a, 0xba, 0x02, 0xc5, 0x0e, 0xb1, 0x6d, 0xa5, 0x4d, 0xca, 0x43, 0x9c, 0x71, 0x42, 0x30, 0x16, - 0x57, 0xdd, 0x61, 0xec, 0xd1, 0xe5, 0x2f, 0x24, 0x18, 0xf3, 0x3d, 0xc7, 0xa3, 0xfd, 0xcf, 0x12, - 0x71, 0x58, 0xed, 0x6f, 0x4a, 0x4c, 0x9a, 0x47, 0xe1, 0xa4, 0xd0, 0x56, 0xf2, 0x46, 0x42, 0x31, - 0xb8, 0xea, 0xed, 0xa5, 0x1c, 0xdf, 0x4b, 0x97, 0xfb, 0x0d, 0x99, 0x8c, 0x2d, 0xf4, 0xcf, 0x85, - 0x90, 0xf9, 0x2c, 0x34, 0xd1, 0x63, 0x28, 0xd9, 0x44, 0x23, 0x4d, 0x6a, 0x58, 0xc2, 0xfc, 0x37, - 0xfb, 0x34, 0x5f, 0xd9, 0x26, 0x5a, 0x43, 0x88, 0xd6, 0xcf, 0x32, 0xfb, 0xbd, 0x5f, 0xd8, 0x87, - 0x44, 0x0f, 0xa1, 0x44, 0x49, 0xc7, 0xd4, 0x14, 0xea, 0xe5, 0xa0, 0xd7, 0xc2, 0x53, 0x60, 0x91, - 0xc3, 0xc0, 0x36, 0x8c, 0xd6, 0xa6, 0x60, 0xe3, 0xdb, 0xc7, 0x77, 0x89, 0x37, 0x8a, 0x7d, 0x18, - 0xb4, 0x0f, 0xe3, 0x8e, 0xd9, 0x62, 0x9c, 0x94, 0xd5, 0xb0, 0x76, 0x57, 0x44, 0xd2, 0xad, 0x7e, - 0x7d, 0xb3, 0x15, 0x91, 0xae, 0xcf, 0x08, 0x5d, 0xe3, 0xd1, 0x71, 0x1c, 0xd3, 0x82, 0x16, 0x60, - 0xa2, 0xa3, 0xea, 0x98, 0x28, 0xad, 0x6e, 0x83, 0x34, 0x0d, 0xbd, 0x65, 0xf3, 0xb0, 0x1a, 0xaa, - 0xcf, 0x0a, 0x80, 0x89, 0xd5, 0x28, 0x19, 0xc7, 0xf9, 0xd1, 0xfb, 0x80, 0xbc, 0x69, 0xdc, 0x77, - 0x4b, 0xb0, 0x6a, 0xe8, 0x3c, 0xe6, 0xf2, 0x41, 0x70, 0x6f, 0x26, 0x38, 0x70, 0x8a, 0x14, 0x5a, - 0x81, 0x73, 0x16, 0xd9, 0x57, 0xd9, 0x1c, 0x1f, 0xa8, 0x36, 0x35, 0xac, 0xee, 0x8a, 0xda, 0x51, - 0x69, 0x79, 0x98, 0xdb, 0x54, 0x3e, 0x3a, 0xac, 0x9c, 0xc3, 0x29, 0x74, 0x9c, 0x2a, 0x25, 0xff, - 0xcb, 0x30, 0x4c, 0xc4, 0xf2, 0x0d, 0x7a, 0x04, 0x33, 0x4d, 0xb7, 0x38, 0xad, 0x39, 0x9d, 0x6d, - 0x62, 0x35, 0x9a, 0xbb, 0xa4, 0xe5, 0x68, 0xa4, 0xc5, 0x03, 0x65, 0xa8, 0x3e, 0x2f, 0x2c, 0x9e, - 0x59, 0x4c, 0xe5, 0xc2, 0x19, 0xd2, 0xcc, 0x0b, 0x3a, 0x1f, 0x5a, 0x55, 0x6d, 0xdb, 0xc7, 0xcc, - 0x71, 0x4c, 0xdf, 0x0b, 0x6b, 0x09, 0x0e, 0x9c, 0x22, 0xc5, 0x6c, 0x6c, 0x11, 0x5b, 0xb5, 0x48, - 0x2b, 0x6e, 0x63, 0x3e, 0x6a, 0xe3, 0x52, 0x2a, 0x17, 0xce, 0x90, 0x46, 0x37, 0x61, 0xd4, 0xd5, - 0xc6, 0xd7, 0x4f, 0x2c, 0xb4, 0x5f, 0x0e, 0xd7, 0x02, 0x12, 0x0e, 0xf3, 0xb1, 0xa9, 0x19, 0xdb, - 0x36, 0xb1, 0xf6, 0x49, 0x2b, 0x7b, 0x81, 0xd7, 0x13, 0x1c, 0x38, 0x45, 0x8a, 0x4d, 0xcd, 0x8d, - 0xc0, 0xc4, 0xd4, 0x86, 0xa3, 0x53, 0xdb, 0x4a, 0xe5, 0xc2, 0x19, 0xd2, 0x2c, 0x8e, 0x5d, 0x93, - 0x17, 0xf6, 0x15, 0x55, 0x53, 0xb6, 0x35, 0x52, 0x2e, 0x46, 0xe3, 0x78, 0x2d, 0x4a, 0xc6, 0x71, - 0x7e, 0x74, 0x1f, 0xa6, 0xdc, 0xa1, 0x2d, 0x5d, 0xf1, 0x41, 0x4a, 0x1c, 0xe4, 0x65, 0x01, 0x32, - 0xb5, 0x16, 0x67, 0xc0, 0x49, 0x19, 0xf4, 0x0e, 0x8c, 0x37, 0x0d, 0x4d, 0xe3, 0xf1, 0xb8, 0x68, - 0x38, 0x3a, 0x2d, 0x8f, 0x70, 0x14, 0xc4, 0xf6, 0xe3, 0x62, 0x84, 0x82, 0x63, 0x9c, 0x88, 0x00, - 0x34, 0xbd, 0x82, 0x63, 0x97, 0xa1, 0xaf, 0x5e, 0x23, 0x59, 0xf4, 0x82, 0x1e, 0xc0, 0x1f, 0xb2, - 0x71, 0x08, 0x58, 0xfe, 0xb1, 0x04, 0xb3, 0x19, 0xa9, 0x03, 0xbd, 0x17, 0x29, 0xb1, 0xbf, 0x1f, - 0x2b, 0xb1, 0xe7, 0x33, 0xc4, 0x42, 0x75, 0x56, 0x87, 0x31, 0x8b, 0xcd, 0x4a, 0x6f, 0xbb, 0x2c, - 0x22, 0x47, 0xde, 0xec, 0x31, 0x0d, 0x1c, 0x96, 0x09, 0x72, 0xfe, 0xd4, 0xd1, 0x61, 0x65, 0x2c, - 0x42, 0xc3, 0x51, 0x78, 0xf9, 0x5f, 0x73, 0x00, 0x4b, 0xc4, 0xd4, 0x8c, 0x6e, 0x87, 0xe8, 0xa7, - 0xd1, 0x43, 0xad, 0x47, 0x7a, 0xa8, 0x6b, 0xbd, 0x96, 0xc7, 0x37, 0x2d, 0xb3, 0x89, 0xfa, 0x93, - 0x58, 0x13, 0x55, 0xeb, 0x1f, 0xf2, 0xf8, 0x2e, 0xea, 0xa7, 0x79, 0x98, 0x0e, 0x98, 0x83, 0x36, - 0xea, 0x4e, 0x64, 0x8d, 0x7f, 0x2f, 0xb6, 0xc6, 0xb3, 0x29, 0x22, 0x2f, 0xac, 0x8f, 0x7a, 0xfe, - 0xfd, 0x0c, 0x7a, 0x02, 0xe3, 0xac, 0x71, 0x72, 0xc3, 0x83, 0xb7, 0x65, 0xc3, 0x03, 0xb7, 0x65, - 0x7e, 0x01, 0x5d, 0x89, 0x20, 0xe1, 0x18, 0x72, 0x46, 0x1b, 0x58, 0x7c, 0xd1, 0x6d, 0xa0, 0xfc, - 0xa5, 0x04, 0xe3, 0xc1, 0x32, 0x9d, 0x42, 0xd3, 0xb6, 0x16, 0x6d, 0xda, 0xae, 0xf4, 0x1d, 0xa2, - 0x19, 0x5d, 0xdb, 0x2f, 0x59, 0x83, 0xef, 0x33, 0xb1, 0x0d, 0xbe, 0xad, 0x34, 0xf7, 0xfa, 0xf8, - 0xfc, 0xfb, 0x4c, 0x02, 0x24, 0xaa, 0xc0, 0x82, 0xae, 0x1b, 0x54, 0x71, 0x73, 0xa5, 0x6b, 0xd6, - 0x72, 0xdf, 0x66, 0x79, 0x1a, 0xab, 0x5b, 0x09, 0xac, 0xbb, 0x3a, 0xb5, 0xba, 0xc1, 0x8a, 0x24, - 0x19, 0x70, 0x8a, 0x01, 0x48, 0x01, 0xb0, 0x04, 0xe6, 0xa6, 0x21, 0x36, 0xf2, 0xb5, 0x3e, 0x72, - 0x1e, 0x13, 0x58, 0x34, 0xf4, 0x1d, 0xb5, 0x1d, 0xa4, 0x1d, 0xec, 0x03, 0xe1, 0x10, 0xe8, 0xdc, - 0x5d, 0x98, 0xcd, 0xb0, 0x16, 0x4d, 0x42, 0x7e, 0x8f, 0x74, 0x5d, 0xb7, 0x61, 0xf6, 0x27, 0x3a, - 0x17, 0xfe, 0x4c, 0x1e, 0x11, 0x5f, 0xb8, 0xef, 0xe4, 0x6e, 0x4b, 0xf2, 0x17, 0x43, 0xe1, 0xd8, - 0xe1, 0x1d, 0xf3, 0x65, 0x28, 0x59, 0xc4, 0xd4, 0xd4, 0xa6, 0x62, 0x8b, 0x46, 0x88, 0x37, 0xbf, - 0x58, 0x8c, 0x61, 0x9f, 0x1a, 0xe9, 0xad, 0x73, 0x2f, 0xb6, 0xb7, 0xce, 0x3f, 0x9f, 0xde, 0xfa, - 0xcf, 0xa1, 0x64, 0x7b, 0x5d, 0x75, 0x81, 0x43, 0x5e, 0x1f, 0x20, 0xbf, 0x8a, 0x86, 0xda, 0x57, - 0xe0, 0xb7, 0xd2, 0x3e, 0x68, 0x5a, 0x13, 0x3d, 0x34, 0x60, 0x13, 0xfd, 0x5c, 0x1b, 0x5f, 0x96, - 0x53, 0x4d, 0xc5, 0xb1, 0x49, 0x8b, 0x27, 0xa2, 0x52, 0x90, 0x53, 0x37, 0xf8, 0x28, 0x16, 0x54, - 0xf4, 0x38, 0x12, 0xb2, 0xa5, 0x93, 0x84, 0xec, 0x78, 0x76, 0xb8, 0xa2, 0x2d, 0x98, 0x35, 0x2d, - 0xa3, 0x6d, 0x11, 0xdb, 0x5e, 0x22, 0x4a, 0x4b, 0x53, 0x75, 0xe2, 0xf9, 0xc7, 0xed, 0x88, 0xce, - 0x1f, 0x1d, 0x56, 0x66, 0x37, 0xd2, 0x59, 0x70, 0x96, 0xac, 0xfc, 0xb4, 0x00, 0x93, 0xf1, 0x0a, - 0x98, 0xd1, 0xa4, 0x4a, 0x27, 0x6a, 0x52, 0xaf, 0x86, 0x36, 0x83, 0xdb, 0xc1, 0xfb, 0xab, 0x9f, - 0xb2, 0x21, 0x16, 0x60, 0x42, 0x64, 0x03, 0x8f, 0x28, 0xda, 0x74, 0x7f, 0xf5, 0xb7, 0xa2, 0x64, - 0x1c, 0xe7, 0x67, 0xad, 0x67, 0xd0, 0x51, 0x7a, 0x20, 0x85, 0x68, 0xeb, 0xb9, 0x10, 0x67, 0xc0, - 0x49, 0x19, 0xb4, 0x0a, 0xd3, 0x8e, 0x9e, 0x84, 0x72, 0xa3, 0xf1, 0xbc, 0x80, 0x9a, 0xde, 0x4a, - 0xb2, 0xe0, 0x34, 0x39, 0xb4, 0x13, 0xe9, 0x46, 0x87, 0x79, 0x86, 0xbd, 0xd1, 0xf7, 0xde, 0xe9, - 0xbb, 0x1d, 0x45, 0x77, 0x60, 0xcc, 0xe2, 0xdf, 0x1d, 0x9e, 0xc1, 0x6e, 0xef, 0xfe, 0x92, 0x10, - 0x1b, 0xc3, 0x61, 0x22, 0x8e, 0xf2, 0xa6, 0xb4, 0xdb, 0xa5, 0x7e, 0xdb, 0x6d, 0xf9, 0xff, 0xa5, - 0x70, 0x11, 0xf2, 0x5b, 0xe0, 0x5e, 0xa7, 0x4c, 0x09, 0x89, 0x50, 0x77, 0x64, 0xa4, 0x77, 0xbf, - 0xb7, 0x06, 0xea, 0x7e, 0x83, 0xe2, 0xd9, 0xbb, 0xfd, 0xfd, 0x5c, 0x82, 0x99, 0x7b, 0x8d, 0xfb, - 0x96, 0xe1, 0x98, 0x9e, 0x39, 0xeb, 0xa6, 0xeb, 0xd7, 0xb7, 0xa1, 0x60, 0x39, 0x9a, 0x37, 0x8f, - 0xd7, 0xbc, 0x79, 0x60, 0x47, 0x63, 0xf3, 0x98, 0x8e, 0x49, 0xb9, 0x93, 0x60, 0x02, 0x68, 0x0d, - 0x86, 0x2d, 0x45, 0x6f, 0x13, 0xaf, 0xac, 0x5e, 0xea, 0x61, 0xfd, 0xf2, 0x12, 0x66, 0xec, 0xa1, - 0xe6, 0x8d, 0x4b, 0x63, 0x81, 0x22, 0xff, 0xbd, 0x04, 0x13, 0x0f, 0x36, 0x37, 0x37, 0x96, 0x75, - 0xbe, 0xa3, 0xf9, 0x79, 0xfa, 0x45, 0x28, 0x98, 0x0a, 0xdd, 0x8d, 0x57, 0x7a, 0x46, 0xc3, 0x9c, - 0x82, 0x3e, 0x80, 0x22, 0xcb, 0x24, 0x44, 0x6f, 0xf5, 0xd9, 0x6a, 0x0b, 0xf8, 0xba, 0x2b, 0x14, - 0x74, 0x88, 0x62, 0x00, 0x7b, 0x70, 0xf2, 0x1e, 0x9c, 0x0b, 0x99, 0xc3, 0xfc, 0xc1, 0x8f, 0x81, - 0x51, 0x03, 0x86, 0x98, 0x66, 0xef, 0x94, 0xb7, 0xd7, 0x61, 0x66, 0x6c, 0x4a, 0x41, 0xa7, 0xc3, - 0x7e, 0xd9, 0xd8, 0xc5, 0x92, 0x57, 0x61, 0x8c, 0x5f, 0x22, 0x18, 0x16, 0xe5, 0x6e, 0x41, 0x17, - 0x20, 0xdf, 0x51, 0x75, 0x51, 0x67, 0x47, 0x85, 0x4c, 0x9e, 0xd5, 0x08, 0x36, 0xce, 0xc9, 0xca, - 0x81, 0xc8, 0x3c, 0x01, 0x59, 0x39, 0xc0, 0x6c, 0x5c, 0xbe, 0x0f, 0x45, 0xe1, 0xee, 0x30, 0x50, - 0xfe, 0x78, 0xa0, 0x7c, 0x0a, 0xd0, 0x3a, 0x14, 0x97, 0x37, 0xea, 0x9a, 0xe1, 0x76, 0x5d, 0x4d, - 0xb5, 0x65, 0xc5, 0xd7, 0x62, 0x71, 0x79, 0x09, 0x63, 0x4e, 0x41, 0x32, 0x0c, 0x93, 0x83, 0x26, - 0x31, 0x29, 0x8f, 0x88, 0x91, 0x3a, 0xb0, 0x55, 0xbe, 0xcb, 0x47, 0xb0, 0xa0, 0xc8, 0xff, 0x90, - 0x83, 0xa2, 0x70, 0xc7, 0x29, 0x7c, 0x85, 0xad, 0x44, 0xbe, 0xc2, 0x5e, 0xef, 0x2f, 0x34, 0x32, - 0x3f, 0xc1, 0x36, 0x63, 0x9f, 0x60, 0x57, 0xfb, 0xc4, 0x3b, 0xfe, 0xfb, 0xeb, 0x7f, 0x24, 0x18, - 0x8f, 0x06, 0x25, 0xba, 0x09, 0xa3, 0xac, 0xe0, 0xa8, 0x4d, 0xb2, 0x16, 0xf4, 0xb9, 0xfe, 0x21, - 0x4c, 0x23, 0x20, 0xe1, 0x30, 0x1f, 0x6a, 0xfb, 0x62, 0x2c, 0x8e, 0xc4, 0xa4, 0xb3, 0x5d, 0xea, - 0x50, 0x55, 0xab, 0xba, 0x17, 0x63, 0xd5, 0x65, 0x9d, 0xae, 0x5b, 0x0d, 0x6a, 0xa9, 0x7a, 0x3b, - 0xa1, 0x88, 0x07, 0x65, 0x18, 0x59, 0xfe, 0x3f, 0x09, 0x46, 0x85, 0xc9, 0xa7, 0xf0, 0x55, 0xf1, - 0xc7, 0xd1, 0xaf, 0x8a, 0x4b, 0x7d, 0x6e, 0xf0, 0xf4, 0x4f, 0x8a, 0xff, 0x08, 0x4c, 0x67, 0x5b, - 0x9a, 0x45, 0xf5, 0xae, 0x61, 0xd3, 0x78, 0x54, 0xb3, 0xcd, 0x88, 0x39, 0x05, 0x39, 0x30, 0xa9, - 0xc6, 0x72, 0x80, 0x70, 0x6d, 0xad, 0x3f, 0x4b, 0x7c, 0xb1, 0x7a, 0x59, 0xc0, 0x4f, 0xc6, 0x29, - 0x38, 0xa1, 0x42, 0x26, 0x90, 0xe0, 0x42, 0x0f, 0xa1, 0xb0, 0x4b, 0xa9, 0x99, 0x72, 0x5e, 0xdd, - 0x23, 0xf3, 0x04, 0x26, 0x94, 0xf8, 0xec, 0x36, 0x37, 0x37, 0x30, 0x87, 0x92, 0x7f, 0x15, 0xf8, - 0xa3, 0xe1, 0xc6, 0xb8, 0x9f, 0x4f, 0xa5, 0x93, 0xe4, 0xd3, 0xd1, 0xb4, 0x5c, 0x8a, 0x1e, 0x40, - 0x9e, 0x6a, 0xfd, 0x7e, 0x16, 0x0a, 0xc4, 0xcd, 0x95, 0x46, 0x90, 0x90, 0x36, 0x57, 0x1a, 0x98, - 0x41, 0xa0, 0x75, 0x18, 0x62, 0xd5, 0x87, 0x6d, 0xc1, 0x7c, 0xff, 0x5b, 0x9a, 0xcd, 0x3f, 0x08, - 0x08, 0xf6, 0xcb, 0xc6, 0x2e, 0x8e, 0xfc, 0x09, 0x8c, 0x45, 0xf6, 0x29, 0xfa, 0x18, 0xce, 0x6a, - 0x86, 0xd2, 0xaa, 0x2b, 0x9a, 0xa2, 0x37, 0x89, 0x77, 0x39, 0x70, 0x29, 0xed, 0x0b, 0x63, 0x25, - 0xc4, 0x27, 0x76, 0xb9, 0x7f, 0x9d, 0x1a, 0xa6, 0xe1, 0x08, 0xa2, 0xac, 0x00, 0x04, 0x73, 0x44, - 0x15, 0x18, 0x62, 0x71, 0xe6, 0xd6, 0x93, 0x91, 0xfa, 0x08, 0xb3, 0x90, 0x85, 0x9f, 0x8d, 0xdd, - 0x71, 0x74, 0x03, 0xc0, 0x26, 0x4d, 0x8b, 0x50, 0x9e, 0x0c, 0x72, 0xd1, 0x4b, 0xe5, 0x86, 0x4f, - 0xc1, 0x21, 0x2e, 0xf9, 0x47, 0x12, 0x8c, 0xad, 0x11, 0xfa, 0xa9, 0x61, 0xed, 0x6d, 0xf0, 0xc7, - 0x00, 0xa7, 0x90, 0x6c, 0x71, 0x24, 0xd9, 0xbe, 0xd1, 0x63, 0x65, 0x22, 0xd6, 0x65, 0xa5, 0x5c, - 0xf9, 0x4b, 0x09, 0x66, 0x23, 0x9c, 0x77, 0x83, 0xad, 0xbb, 0x05, 0x43, 0xa6, 0x61, 0x51, 0xaf, - 0x10, 0x0f, 0xa4, 0x90, 0xa5, 0xb1, 0x50, 0x29, 0x66, 0x30, 0xd8, 0x45, 0x43, 0x2b, 0x90, 0xa3, - 0x86, 0x08, 0xd5, 0xc1, 0x30, 0x09, 0xb1, 0xea, 0x20, 0x30, 0x73, 0x9b, 0x06, 0xce, 0x51, 0x83, - 0x2d, 0x44, 0x39, 0xc2, 0x15, 0x4e, 0x3e, 0x2f, 0x68, 0x06, 0x18, 0x0a, 0x3b, 0x96, 0xd1, 0x39, - 0xf1, 0x1c, 0xfc, 0x85, 0xb8, 0x67, 0x19, 0x1d, 0xcc, 0xb1, 0xe4, 0xaf, 0x24, 0x98, 0x8a, 0x70, - 0x9e, 0x42, 0xe2, 0x7f, 0x18, 0x4d, 0xfc, 0x57, 0x07, 0x99, 0x48, 0x46, 0xfa, 0xff, 0x2a, 0x17, - 0x9b, 0x06, 0x9b, 0x30, 0xda, 0x81, 0x51, 0xd3, 0x68, 0x35, 0x9e, 0xc3, 0x75, 0xe0, 0x04, 0xab, - 0x9b, 0x1b, 0x01, 0x16, 0x0e, 0x03, 0xa3, 0x03, 0x98, 0xd2, 0x95, 0x0e, 0xb1, 0x4d, 0xa5, 0x49, - 0x1a, 0xcf, 0xe1, 0x80, 0xe4, 0x25, 0x7e, 0xdf, 0x10, 0x47, 0xc4, 0x49, 0x25, 0x68, 0x15, 0x8a, - 0xaa, 0xc9, 0xfb, 0x38, 0xd1, 0xbb, 0xf4, 0xac, 0xa2, 0x6e, 0xd7, 0xe7, 0xe6, 0x73, 0xf1, 0x03, - 0x7b, 0x18, 0xf2, 0x7f, 0xc6, 0xa3, 0x81, 0xc5, 0x1f, 0xba, 0x0f, 0x25, 0xfe, 0xac, 0xa6, 0x69, - 0x68, 0xde, 0xcd, 0x00, 0x5b, 0xd9, 0x0d, 0x31, 0xf6, 0xec, 0xb0, 0x72, 0x3e, 0xe5, 0xd0, 0xd7, - 0x23, 0x63, 0x5f, 0x18, 0xad, 0x41, 0xc1, 0xfc, 0x21, 0x1d, 0x0c, 0x2f, 0x72, 0xbc, 0x6d, 0xe1, - 0x38, 0xf2, 0x5f, 0xe7, 0x63, 0xe6, 0xf2, 0x52, 0xf7, 0xe4, 0xb9, 0xad, 0xba, 0xdf, 0x31, 0x65, - 0xae, 0xfc, 0x36, 0x14, 0x45, 0x85, 0x17, 0xc1, 0xfc, 0xf6, 0x20, 0xc1, 0x1c, 0xae, 0x62, 0xfe, - 0x07, 0x8b, 0x37, 0xe8, 0x01, 0xa3, 0x8f, 0x60, 0x98, 0xb8, 0x2a, 0xdc, 0xda, 0x78, 0x6b, 0x10, - 0x15, 0x41, 0x5e, 0x0d, 0x1a, 0x55, 0x31, 0x26, 0x50, 0xd1, 0x7b, 0xcc, 0x5f, 0x8c, 0x97, 0x7d, - 0x04, 0xda, 0xe5, 0x02, 0x2f, 0x57, 0x17, 0xdc, 0x69, 0xfb, 0xc3, 0xcf, 0x0e, 0x2b, 0x10, 0xfc, - 0xc4, 0x61, 0x09, 0xf9, 0x27, 0x12, 0x4c, 0x71, 0x0f, 0x35, 0x1d, 0x4b, 0xa5, 0xdd, 0x53, 0x2b, - 0x4c, 0x8f, 0x22, 0x85, 0xe9, 0xad, 0x1e, 0x6e, 0x49, 0x58, 0x98, 0x59, 0x9c, 0xbe, 0x96, 0xe0, - 0xa5, 0x04, 0xf7, 0x29, 0xe4, 0xc5, 0xad, 0x68, 0x5e, 0x7c, 0x63, 0xd0, 0x09, 0x65, 0xbd, 0x91, - 0x18, 0x4b, 0x99, 0x0e, 0xdf, 0x29, 0x37, 0x00, 0x4c, 0x4b, 0xdd, 0x57, 0x35, 0xd2, 0x16, 0x97, - 0xe0, 0xa5, 0xd0, 0xb3, 0x36, 0x9f, 0x82, 0x43, 0x5c, 0xc8, 0x86, 0x99, 0x16, 0xd9, 0x51, 0x1c, - 0x8d, 0x2e, 0xb4, 0x5a, 0x8b, 0x8a, 0xa9, 0x6c, 0xab, 0x9a, 0x4a, 0x55, 0x71, 0x5c, 0x30, 0x52, - 0xbf, 0xe3, 0x5e, 0x4e, 0xa7, 0x71, 0x3c, 0x3b, 0xac, 0x5c, 0x48, 0xbb, 0x1d, 0xf2, 0x58, 0xba, - 0x38, 0x03, 0x1a, 0x75, 0xa1, 0x6c, 0x91, 0x4f, 0x1c, 0xd5, 0x22, 0xad, 0x25, 0xcb, 0x30, 0x23, - 0x6a, 0xf3, 0x5c, 0xed, 0x1f, 0x1e, 0x1d, 0x56, 0xca, 0x38, 0x83, 0xa7, 0xb7, 0xe2, 0x4c, 0x78, - 0xf4, 0x04, 0xa6, 0x15, 0xf7, 0x35, 0x60, 0x44, 0xab, 0xbb, 0x4b, 0x6e, 0x1f, 0x1d, 0x56, 0xa6, - 0x17, 0x92, 0xe4, 0xde, 0x0a, 0xd3, 0x40, 0x51, 0x0d, 0x8a, 0xfb, 0xfc, 0xad, 0xa2, 0x5d, 0x1e, - 0xe2, 0xf8, 0xac, 0x10, 0x14, 0xdd, 0xe7, 0x8b, 0x0c, 0x73, 0xf8, 0x5e, 0x83, 0xef, 0x3e, 0x8f, - 0x8b, 0x7d, 0x50, 0xb2, 0x5e, 0x52, 0xec, 0x78, 0x7e, 0x62, 0x5c, 0x0a, 0xb2, 0xd6, 0x83, 0x80, - 0x84, 0xc3, 0x7c, 0xe8, 0x31, 0x8c, 0xec, 0x8a, 0x53, 0x09, 0xbb, 0x5c, 0xec, 0xab, 0x08, 0x47, - 0x4e, 0x31, 0xea, 0x53, 0x42, 0xc5, 0x88, 0x37, 0x6c, 0xe3, 0x00, 0x11, 0x5d, 0x81, 0x22, 0xff, - 0xb1, 0xbc, 0xc4, 0x8f, 0xe3, 0x4a, 0x41, 0x6e, 0x7b, 0xe0, 0x0e, 0x63, 0x8f, 0xee, 0xb1, 0x2e, - 0x6f, 0x2c, 0xf2, 0x63, 0xe1, 0x18, 0xeb, 0xf2, 0xc6, 0x22, 0xf6, 0xe8, 0xe8, 0x63, 0x28, 0xda, - 0x64, 0x45, 0xd5, 0x9d, 0x83, 0x32, 0xf4, 0x75, 0xa9, 0xdc, 0xb8, 0xcb, 0xb9, 0x63, 0x07, 0x63, - 0x81, 0x06, 0x41, 0xc7, 0x1e, 0x2c, 0xda, 0x85, 0x11, 0xcb, 0xd1, 0x17, 0xec, 0x2d, 0x9b, 0x58, - 0xe5, 0x51, 0xae, 0xa3, 0x57, 0x3a, 0xc7, 0x1e, 0x7f, 0x5c, 0x8b, 0xef, 0x21, 0x9f, 0x03, 0x07, - 0xe0, 0xe8, 0xef, 0x24, 0x40, 0xb6, 0x63, 0x9a, 0x1a, 0xe9, 0x10, 0x9d, 0x2a, 0x1a, 0x3f, 0x8b, - 0xb3, 0xcb, 0x67, 0xb9, 0xce, 0x3f, 0xea, 0x35, 0xaf, 0x84, 0x60, 0x5c, 0xb9, 0x7f, 0xe8, 0x9d, - 0x64, 0xc5, 0x29, 0x7a, 0x99, 0x6b, 0x77, 0x6c, 0xfe, 0x77, 0x79, 0xac, 0x2f, 0xd7, 0xa6, 0x9f, - 0x39, 0x06, 0xae, 0x15, 0x74, 0xec, 0xc1, 0xa2, 0x47, 0x30, 0x63, 0x11, 0xa5, 0xb5, 0xae, 0x6b, - 0x5d, 0x6c, 0x18, 0xf4, 0x9e, 0xaa, 0x11, 0xbb, 0x6b, 0x53, 0xd2, 0x29, 0x8f, 0xf3, 0x65, 0xf7, - 0xdf, 0x7e, 0xe0, 0x54, 0x2e, 0x9c, 0x21, 0x8d, 0x3a, 0x50, 0xf1, 0x52, 0x06, 0xdb, 0x4f, 0x7e, - 0xce, 0xba, 0x6b, 0x37, 0x15, 0xcd, 0xbd, 0x07, 0x98, 0xe0, 0x0a, 0x5e, 0x3b, 0x3a, 0xac, 0x54, - 0x96, 0x8e, 0x67, 0xc5, 0xbd, 0xb0, 0xd0, 0x07, 0x50, 0x56, 0xb2, 0xf4, 0x4c, 0x72, 0x3d, 0xaf, - 0xb0, 0x3c, 0x94, 0xa9, 0x20, 0x53, 0x1a, 0x51, 0x98, 0x54, 0xa2, 0x8f, 0x8e, 0xed, 0xf2, 0x54, - 0x5f, 0x07, 0x91, 0xb1, 0xb7, 0xca, 0xc1, 0x61, 0x44, 0x8c, 0x60, 0xe3, 0x84, 0x06, 0xf4, 0x17, - 0x80, 0x94, 0xf8, 0x3b, 0x69, 0xbb, 0x8c, 0xfa, 0x2a, 0x3f, 0x89, 0x07, 0xd6, 0x41, 0xd8, 0x25, - 0x48, 0x36, 0x4e, 0xd1, 0xc3, 0x1f, 0x6f, 0x88, 0xa3, 0xfc, 0xd3, 0x79, 0x00, 0x3b, 0xd8, 0xe3, - 0x8d, 0xc0, 0xb4, 0xe7, 0xf6, 0x78, 0x23, 0x04, 0x79, 0xfc, 0xe1, 0xe1, 0x2f, 0x72, 0x30, 0x1d, - 0x30, 0xf7, 0xfd, 0x78, 0x23, 0x45, 0xe4, 0x77, 0x8f, 0x60, 0x7b, 0x3f, 0x82, 0xfd, 0x52, 0x82, - 0xf1, 0xc0, 0x75, 0xbf, 0x79, 0x0f, 0x2a, 0x02, 0xdb, 0x32, 0x5a, 0xbc, 0xff, 0xce, 0x85, 0x27, - 0xf0, 0x5b, 0x7f, 0xab, 0xff, 0xc3, 0x5f, 0xae, 0xca, 0x5f, 0xe7, 0x61, 0x32, 0xbe, 0x1b, 0x23, - 0x97, 0xbf, 0x52, 0xcf, 0xcb, 0xdf, 0x0d, 0x38, 0xb7, 0xe3, 0x68, 0x5a, 0x97, 0xbb, 0x21, 0x74, - 0x03, 0xec, 0x5e, 0xde, 0xbc, 0x22, 0x24, 0xcf, 0xdd, 0x4b, 0xe1, 0xc1, 0xa9, 0x92, 0x19, 0x17, - 0xd9, 0xf9, 0x13, 0x5d, 0x64, 0x27, 0xee, 0x55, 0x0b, 0x03, 0xdc, 0xab, 0xa6, 0x5e, 0x4a, 0x0f, - 0x9d, 0xe0, 0x52, 0xfa, 0x24, 0xb7, 0xc8, 0x29, 0x49, 0xac, 0xe7, 0xa3, 0xc6, 0x57, 0x60, 0x4e, - 0x88, 0x51, 0x7e, 0xc1, 0xab, 0x53, 0xcb, 0xd0, 0x34, 0x62, 0x2d, 0x39, 0x9d, 0x4e, 0x57, 0x7e, - 0x17, 0xc6, 0xa3, 0x4f, 0x17, 0xdc, 0x95, 0x76, 0x5f, 0x4f, 0x88, 0x2b, 0xb4, 0xd0, 0x4a, 0xbb, - 0xe3, 0xd8, 0xe7, 0x90, 0xff, 0x46, 0x82, 0x99, 0xf4, 0x27, 0x8a, 0x48, 0x83, 0xf1, 0x8e, 0x72, - 0x10, 0x7e, 0x36, 0x2a, 0x9d, 0xf0, 0x70, 0x83, 0xdf, 0x59, 0xaf, 0x46, 0xb0, 0x70, 0x0c, 0x5b, - 0xfe, 0x5e, 0x82, 0xd9, 0x8c, 0xdb, 0xe2, 0xd3, 0xb5, 0x04, 0x7d, 0x08, 0xa5, 0x8e, 0x72, 0xd0, - 0x70, 0xac, 0x36, 0x39, 0xf1, 0x71, 0x0e, 0xcf, 0x18, 0xab, 0x02, 0x05, 0xfb, 0x78, 0xf2, 0xe7, - 0x12, 0x94, 0xb3, 0x1a, 0x6b, 0x74, 0x33, 0x72, 0xaf, 0xfd, 0x6a, 0xec, 0x5e, 0x7b, 0x2a, 0x21, - 0xf7, 0x82, 0x6e, 0xb5, 0xff, 0x4b, 0x82, 0x99, 0xf4, 0x0f, 0x0c, 0xf4, 0x66, 0xc4, 0xc2, 0x4a, - 0xcc, 0xc2, 0x89, 0x98, 0x94, 0xb0, 0xef, 0x23, 0x18, 0x17, 0x9f, 0x21, 0x02, 0x46, 0x78, 0x55, - 0x4e, 0xcb, 0x95, 0x02, 0xc2, 0x6b, 0xbb, 0xf9, 0x7a, 0x45, 0xc7, 0x70, 0x0c, 0x4d, 0xfe, 0xdb, - 0x1c, 0x0c, 0x35, 0x9a, 0x8a, 0x46, 0x4e, 0xa1, 0xcd, 0x7a, 0x3f, 0xd2, 0x66, 0xf5, 0xfa, 0x17, - 0x0f, 0x6e, 0x55, 0x66, 0x87, 0x85, 0x63, 0x1d, 0xd6, 0xeb, 0x7d, 0xa1, 0x1d, 0xdf, 0x5c, 0xfd, - 0x01, 0x8c, 0xf8, 0x4a, 0x07, 0xcb, 0xf9, 0xf2, 0xbf, 0xe7, 0x60, 0x34, 0xa4, 0x62, 0xc0, 0x8a, - 0xb1, 0x13, 0xa9, 0xb4, 0xfd, 0xfc, 0x63, 0x5d, 0x48, 0x57, 0xd5, 0xab, 0xad, 0xee, 0x13, 0xc5, - 0xe0, 0x51, 0x5a, 0xb2, 0xe4, 0xbe, 0x0b, 0xe3, 0x94, 0xff, 0xe3, 0x99, 0x7f, 0x08, 0x9a, 0xe7, - 0xb1, 0xe8, 0x3f, 0x6c, 0xdd, 0x8c, 0x50, 0x71, 0x8c, 0x7b, 0xee, 0x0e, 0x8c, 0x45, 0x94, 0x0d, - 0xf4, 0xc2, 0xf0, 0x7f, 0x25, 0x78, 0xb5, 0xe7, 0x27, 0x2a, 0xaa, 0x47, 0x36, 0x49, 0x35, 0xb6, - 0x49, 0xe6, 0xb3, 0x01, 0x5e, 0xdc, 0x4b, 0x95, 0xfa, 0xb5, 0xa7, 0xdf, 0xcd, 0x9f, 0xf9, 0xe6, - 0xbb, 0xf9, 0x33, 0xdf, 0x7e, 0x37, 0x7f, 0xe6, 0xaf, 0x8e, 0xe6, 0xa5, 0xa7, 0x47, 0xf3, 0xd2, - 0x37, 0x47, 0xf3, 0xd2, 0xb7, 0x47, 0xf3, 0xd2, 0xcf, 0x8e, 0xe6, 0xa5, 0x7f, 0xfc, 0x7e, 0xfe, - 0xcc, 0x87, 0x45, 0x01, 0xf7, 0xeb, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb1, 0xb3, 0xc8, 0xe2, 0x54, - 0x3c, 0x00, 0x00, + // 3637 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcb, 0x6f, 0x1c, 0x47, + 0x73, 0xd7, 0xec, 0x2e, 0xb9, 0xcb, 0xa2, 0xf8, 0x6a, 0xd2, 0xe4, 0x7e, 0x94, 0xc5, 0xd5, 0x37, + 0x06, 0x14, 0xc9, 0x91, 0x76, 0x2d, 0xd9, 0xd2, 0xa7, 0x58, 0x88, 0x6d, 0x2e, 0x29, 0x4a, 0x74, + 0xf8, 0x52, 0x2f, 0xa9, 0x38, 0x46, 0xe4, 0x78, 0xb8, 0xdb, 0x5c, 0x8e, 0x38, 0x3b, 0x33, 0x9e, + 0xe9, 0xa1, 0xb9, 0x40, 0x10, 0xe4, 0x10, 0x04, 0x08, 0x90, 0x20, 0xc9, 0xc1, 0x79, 0xdc, 0xe2, + 0x4b, 0x4e, 0x09, 0x92, 0x5b, 0x72, 0x30, 0x0c, 0x04, 0x70, 0x00, 0x21, 0x70, 0x00, 0xdf, 0xe2, + 0x13, 0x11, 0xd3, 0xa7, 0x20, 0xff, 0x40, 0xa0, 0x43, 0x10, 0x74, 0x4f, 0xcf, 0x7b, 0x86, 0xbb, + 0x4b, 0x4b, 0x44, 0x10, 0xe4, 0xc6, 0xed, 0xaa, 0xfa, 0x55, 0x75, 0x75, 0x75, 0x55, 0x4d, 0x77, + 0x13, 0x56, 0x0e, 0xee, 0xd9, 0x55, 0xd5, 0xa8, 0x1d, 0x38, 0xbb, 0xc4, 0xd2, 0x09, 0x25, 0x76, + 0xed, 0x90, 0xe8, 0x2d, 0xc3, 0xaa, 0x09, 0x82, 0x62, 0xaa, 0x35, 0x72, 0x44, 0x89, 0x6e, 0xab, + 0x86, 0x6e, 0xd7, 0x0e, 0x6f, 0xed, 0x12, 0xaa, 0xdc, 0xaa, 0xb5, 0x89, 0x4e, 0x2c, 0x85, 0x92, + 0x56, 0xd5, 0xb4, 0x0c, 0x6a, 0xa0, 0xcb, 0x2e, 0x7b, 0x55, 0x31, 0xd5, 0x6a, 0xc0, 0x5e, 0x15, + 0xec, 0xf3, 0x37, 0xdb, 0x2a, 0xdd, 0x77, 0x76, 0xab, 0x4d, 0xa3, 0x53, 0x6b, 0x1b, 0x6d, 0xa3, + 0xc6, 0xa5, 0x76, 0x9d, 0x3d, 0xfe, 0x8b, 0xff, 0xe0, 0x7f, 0xb9, 0x68, 0xf3, 0x72, 0x48, 0x79, + 0xd3, 0xb0, 0x48, 0xed, 0x30, 0xa1, 0x71, 0xfe, 0x7a, 0x88, 0xc7, 0x34, 0x34, 0xb5, 0xd9, 0xcd, + 0x32, 0x6e, 0xfe, 0x9d, 0x80, 0xb5, 0xa3, 0x34, 0xf7, 0x55, 0x9d, 0x58, 0xdd, 0x9a, 0x79, 0xd0, + 0xe6, 0xb2, 0x16, 0xb1, 0x0d, 0xc7, 0x6a, 0x92, 0x81, 0xa4, 0xec, 0x5a, 0x87, 0x50, 0x25, 0xcd, + 0xac, 0x5a, 0x96, 0x94, 0xe5, 0xe8, 0x54, 0xed, 0x24, 0xd5, 0xdc, 0xed, 0x25, 0x60, 0x37, 0xf7, + 0x49, 0x47, 0x49, 0xc8, 0xbd, 0x9d, 0x25, 0xe7, 0x50, 0x55, 0xab, 0xa9, 0x3a, 0xb5, 0xa9, 0x15, + 0x17, 0x92, 0xef, 0xc3, 0xd4, 0xa2, 0xa6, 0x19, 0x9f, 0x93, 0xd6, 0x8a, 0x46, 0x8e, 0x9e, 0x18, + 0x9a, 0xd3, 0x21, 0xe8, 0x2a, 0x0c, 0xb7, 0x2c, 0xf5, 0x90, 0x58, 0x65, 0xe9, 0x8a, 0x74, 0x6d, + 0xa4, 0x3e, 0xfe, 0xfc, 0xb8, 0x72, 0xe1, 0xe4, 0xb8, 0x32, 0xbc, 0xcc, 0x47, 0xb1, 0xa0, 0xca, + 0x36, 0x4c, 0x08, 0xe1, 0x47, 0x86, 0x4d, 0xb7, 0x14, 0xba, 0x8f, 0x6e, 0x03, 0x98, 0x0a, 0xdd, + 0xdf, 0xb2, 0xc8, 0x9e, 0x7a, 0x24, 0xc4, 0x91, 0x10, 0x87, 0x2d, 0x9f, 0x82, 0x43, 0x5c, 0xe8, + 0x06, 0x94, 0x2c, 0xa2, 0xb4, 0x36, 0x75, 0xad, 0x5b, 0xce, 0x5d, 0x91, 0xae, 0x95, 0xea, 0x93, + 0x42, 0xa2, 0x84, 0xc5, 0x38, 0xf6, 0x39, 0xe4, 0xbf, 0x94, 0xe0, 0x67, 0x4b, 0x8e, 0x4d, 0x8d, + 0xce, 0x3a, 0xa1, 0x96, 0xda, 0x5c, 0x72, 0x2c, 0x8b, 0xe8, 0xb4, 0x41, 0x15, 0xea, 0xd8, 0xe8, + 0x0a, 0x14, 0x74, 0xa5, 0x43, 0x84, 0xe6, 0x8b, 0x02, 0xa7, 0xb0, 0xa1, 0x74, 0x08, 0xe6, 0x14, + 0xf4, 0x31, 0x0c, 0x1d, 0x2a, 0x9a, 0x43, 0xb8, 0xaa, 0xd1, 0xdb, 0xd5, 0x6a, 0x10, 0xa8, 0xbe, + 0xdb, 0xaa, 0xe6, 0x41, 0x9b, 0x47, 0xae, 0x17, 0x0b, 0xd5, 0xc7, 0x8e, 0xa2, 0x53, 0x95, 0x76, + 0xeb, 0x33, 0x02, 0xf2, 0xa2, 0xd0, 0xfb, 0x84, 0x61, 0x61, 0x17, 0x52, 0xfe, 0x1d, 0xb8, 0x9c, + 0x69, 0xda, 0x9a, 0x6a, 0x53, 0xf4, 0x14, 0x86, 0x54, 0x4a, 0x3a, 0x76, 0x59, 0xba, 0x92, 0xbf, + 0x36, 0x7a, 0xfb, 0x5e, 0xf5, 0xd4, 0x5d, 0x52, 0xcd, 0x04, 0xab, 0x8f, 0x09, 0x33, 0x86, 0x56, + 0x19, 0x1c, 0x76, 0x51, 0xe5, 0x3f, 0x95, 0x00, 0x85, 0x65, 0xb6, 0x15, 0xab, 0x4d, 0x68, 0x1f, + 0x4e, 0xf9, 0x8d, 0x9f, 0xe6, 0x94, 0x69, 0x01, 0x39, 0xea, 0x2a, 0x8c, 0xf8, 0xc4, 0x84, 0xd9, + 0xa4, 0x49, 0xdc, 0x19, 0x4f, 0xa2, 0xce, 0xb8, 0x35, 0x80, 0x33, 0x5c, 0x94, 0x0c, 0x2f, 0x7c, + 0x91, 0x83, 0x91, 0x65, 0x85, 0x74, 0x0c, 0xbd, 0x41, 0x28, 0xfa, 0x14, 0x4a, 0x6c, 0x6b, 0xb6, + 0x14, 0xaa, 0x70, 0x07, 0x8c, 0xde, 0x7e, 0xeb, 0xb4, 0xd9, 0xd9, 0x55, 0xc6, 0x5d, 0x3d, 0xbc, + 0x55, 0xdd, 0xdc, 0x7d, 0x46, 0x9a, 0x74, 0x9d, 0x50, 0x25, 0x88, 0xe0, 0x60, 0x0c, 0xfb, 0xa8, + 0x68, 0x03, 0x0a, 0xb6, 0x49, 0x9a, 0xc2, 0x77, 0x37, 0x7a, 0x4c, 0xc3, 0xb7, 0xac, 0x61, 0x92, + 0x66, 0xb0, 0x18, 0xec, 0x17, 0xe6, 0x38, 0xe8, 0x09, 0x0c, 0xdb, 0x7c, 0x95, 0xcb, 0xf9, 0xc4, + 0x6a, 0x9c, 0x8e, 0xe8, 0xc6, 0x86, 0xbf, 0x5d, 0xdd, 0xdf, 0x58, 0xa0, 0xc9, 0xff, 0x91, 0x03, + 0xe4, 0xf3, 0x2e, 0x19, 0x7a, 0x4b, 0xa5, 0xaa, 0xa1, 0xa3, 0x77, 0xa1, 0x40, 0xbb, 0xa6, 0x17, + 0x1d, 0x57, 0x3d, 0x83, 0xb6, 0xbb, 0x26, 0x79, 0x71, 0x5c, 0x99, 0x4d, 0x4a, 0x30, 0x0a, 0xe6, + 0x32, 0x68, 0xcd, 0x37, 0x35, 0xc7, 0xa5, 0xdf, 0x89, 0xaa, 0x7e, 0x71, 0x5c, 0x49, 0xc9, 0xdc, + 0x55, 0x1f, 0x29, 0x6a, 0x20, 0x3a, 0x04, 0xa4, 0x29, 0x36, 0xdd, 0xb6, 0x14, 0xdd, 0x76, 0x35, + 0xa9, 0x1d, 0x22, 0x9c, 0xf0, 0x66, 0x7f, 0x8b, 0xc6, 0x24, 0xea, 0xf3, 0xc2, 0x0a, 0xb4, 0x96, + 0x40, 0xc3, 0x29, 0x1a, 0x58, 0xbe, 0xb3, 0x88, 0x62, 0x1b, 0x7a, 0xb9, 0x10, 0xcd, 0x77, 0x98, + 0x8f, 0x62, 0x41, 0x45, 0xd7, 0xa1, 0xd8, 0x21, 0xb6, 0xad, 0xb4, 0x49, 0x79, 0x88, 0x33, 0x4e, + 0x08, 0xc6, 0xe2, 0xba, 0x3b, 0x8c, 0x3d, 0xba, 0xfc, 0x95, 0x04, 0x63, 0xbe, 0xe7, 0x78, 0xb4, + 0xff, 0x66, 0x22, 0x0e, 0xab, 0xfd, 0x4d, 0x89, 0x49, 0xf3, 0x28, 0xf4, 0xb3, 0xa2, 0x37, 0x12, + 0x8a, 0xc1, 0x75, 0x6f, 0x2f, 0xe5, 0xf8, 0x5e, 0xba, 0xd6, 0x6f, 0xc8, 0x64, 0x6c, 0xa1, 0x3f, + 0x2b, 0x84, 0xcc, 0x67, 0xa1, 0x89, 0x9e, 0x42, 0xc9, 0x26, 0x1a, 0x69, 0x52, 0xc3, 0x12, 0xe6, + 0xbf, 0xdd, 0xa7, 0xf9, 0xca, 0x2e, 0xd1, 0x1a, 0x42, 0xb4, 0x7e, 0x91, 0xd9, 0xef, 0xfd, 0xc2, + 0x3e, 0x24, 0x7a, 0x0c, 0x25, 0x4a, 0x3a, 0xa6, 0xa6, 0x50, 0x2f, 0x07, 0xbd, 0x11, 0x9e, 0x02, + 0x8b, 0x1c, 0x06, 0xb6, 0x65, 0xb4, 0xb6, 0x05, 0x1b, 0xdf, 0x3e, 0xbe, 0x4b, 0xbc, 0x51, 0xec, + 0xc3, 0xa0, 0x43, 0x18, 0x77, 0xcc, 0x16, 0xe3, 0xa4, 0xac, 0xe2, 0xb5, 0xbb, 0x22, 0x92, 0xee, + 0xf6, 0xeb, 0x9b, 0x9d, 0x88, 0x74, 0x7d, 0x56, 0xe8, 0x1a, 0x8f, 0x8e, 0xe3, 0x98, 0x16, 0xb4, + 0x08, 0x13, 0x1d, 0x55, 0x67, 0x95, 0xab, 0xdb, 0x20, 0x4d, 0x43, 0x6f, 0xd9, 0x3c, 0xac, 0x86, + 0xea, 0x73, 0x02, 0x60, 0x62, 0x3d, 0x4a, 0xc6, 0x71, 0x7e, 0xf4, 0x21, 0x20, 0x6f, 0x1a, 0x0f, + 0xdd, 0x82, 0xad, 0x1a, 0x3a, 0x8f, 0xb9, 0x7c, 0x10, 0xdc, 0xdb, 0x09, 0x0e, 0x9c, 0x22, 0x85, + 0xd6, 0x60, 0xc6, 0x22, 0x87, 0x2a, 0x9b, 0xe3, 0x23, 0xd5, 0xa6, 0x86, 0xd5, 0x5d, 0x53, 0x3b, + 0x2a, 0x2d, 0x0f, 0x73, 0x9b, 0xca, 0x27, 0xc7, 0x95, 0x19, 0x9c, 0x42, 0xc7, 0xa9, 0x52, 0xf2, + 0x9f, 0x0f, 0xc3, 0x44, 0x2c, 0xdf, 0xa0, 0x27, 0x30, 0xdb, 0x74, 0x8b, 0xd3, 0x86, 0xd3, 0xd9, + 0x25, 0x56, 0xa3, 0xb9, 0x4f, 0x5a, 0x8e, 0x46, 0x5a, 0x3c, 0x50, 0x86, 0xea, 0x0b, 0xc2, 0xe2, + 0xd9, 0xa5, 0x54, 0x2e, 0x9c, 0x21, 0xcd, 0xbc, 0xa0, 0xf3, 0xa1, 0x75, 0xd5, 0xb6, 0x7d, 0xcc, + 0x1c, 0xc7, 0xf4, 0xbd, 0xb0, 0x91, 0xe0, 0xc0, 0x29, 0x52, 0xcc, 0xc6, 0x16, 0xb1, 0x55, 0x8b, + 0xb4, 0xe2, 0x36, 0xe6, 0xa3, 0x36, 0x2e, 0xa7, 0x72, 0xe1, 0x0c, 0x69, 0x74, 0x07, 0x46, 0x5d, + 0x6d, 0x7c, 0xfd, 0xc4, 0x42, 0xfb, 0xe5, 0x70, 0x23, 0x20, 0xe1, 0x30, 0x1f, 0x9b, 0x9a, 0xb1, + 0x6b, 0x13, 0xeb, 0x90, 0xb4, 0xb2, 0x17, 0x78, 0x33, 0xc1, 0x81, 0x53, 0xa4, 0xd8, 0xd4, 0xdc, + 0x08, 0x4c, 0x4c, 0x6d, 0x38, 0x3a, 0xb5, 0x9d, 0x54, 0x2e, 0x9c, 0x21, 0xcd, 0xe2, 0xd8, 0x35, + 0x79, 0xf1, 0x50, 0x51, 0x35, 0x65, 0x57, 0x23, 0xe5, 0x62, 0x34, 0x8e, 0x37, 0xa2, 0x64, 0x1c, + 0xe7, 0x47, 0x0f, 0x61, 0xca, 0x1d, 0xda, 0xd1, 0x15, 0x1f, 0xa4, 0xc4, 0x41, 0x7e, 0x26, 0x40, + 0xa6, 0x36, 0xe2, 0x0c, 0x38, 0x29, 0x83, 0xde, 0x85, 0xf1, 0xa6, 0xa1, 0x69, 0x3c, 0x1e, 0x97, + 0x0c, 0x47, 0xa7, 0xe5, 0x11, 0x8e, 0x82, 0xd8, 0x7e, 0x5c, 0x8a, 0x50, 0x70, 0x8c, 0x13, 0x11, + 0x80, 0xa6, 0x57, 0x70, 0xec, 0x32, 0xf4, 0xd5, 0x6b, 0x24, 0x8b, 0x5e, 0xd0, 0x03, 0xf8, 0x43, + 0x36, 0x0e, 0x01, 0xcb, 0xff, 0x22, 0xc1, 0x5c, 0x46, 0xea, 0x40, 0xef, 0x47, 0x4a, 0xec, 0x2f, + 0xc7, 0x4a, 0xec, 0xa5, 0x0c, 0xb1, 0x50, 0x9d, 0xd5, 0x61, 0xcc, 0x62, 0xb3, 0xd2, 0xdb, 0x2e, + 0x8b, 0xc8, 0x91, 0x77, 0x7a, 0x4c, 0x03, 0x87, 0x65, 0x82, 0x9c, 0x3f, 0x75, 0x72, 0x5c, 0x19, + 0x8b, 0xd0, 0x70, 0x14, 0x5e, 0xfe, 0x8b, 0x1c, 0xc0, 0x32, 0x31, 0x35, 0xa3, 0xdb, 0x21, 0xfa, + 0x79, 0xf4, 0x50, 0x9b, 0x91, 0x1e, 0xea, 0x66, 0xaf, 0xe5, 0xf1, 0x4d, 0xcb, 0x6c, 0xa2, 0x7e, + 0x3d, 0xd6, 0x44, 0xd5, 0xfa, 0x87, 0x3c, 0xbd, 0x8b, 0xfa, 0xb7, 0x3c, 0x4c, 0x07, 0xcc, 0x41, + 0x1b, 0x75, 0x3f, 0xb2, 0xc6, 0xbf, 0x14, 0x5b, 0xe3, 0xb9, 0x14, 0x91, 0x57, 0xd6, 0x47, 0xbd, + 0xfc, 0x7e, 0x06, 0x3d, 0x83, 0x71, 0xd6, 0x38, 0xb9, 0xe1, 0xc1, 0xdb, 0xb2, 0xe1, 0x81, 0xdb, + 0x32, 0xbf, 0x80, 0xae, 0x45, 0x90, 0x70, 0x0c, 0x39, 0xa3, 0x0d, 0x2c, 0xbe, 0xea, 0x36, 0x50, + 0xfe, 0x5a, 0x82, 0xf1, 0x60, 0x99, 0xce, 0xa1, 0x69, 0xdb, 0x88, 0x36, 0x6d, 0xd7, 0xfb, 0x0e, + 0xd1, 0x8c, 0xae, 0xed, 0xbf, 0x58, 0x83, 0xef, 0x33, 0xb1, 0x0d, 0xbe, 0xab, 0x34, 0x0f, 0xfa, + 0xf8, 0xfc, 0xfb, 0x42, 0x02, 0x24, 0xaa, 0xc0, 0xa2, 0xae, 0x1b, 0x54, 0x71, 0x73, 0xa5, 0x6b, + 0xd6, 0x6a, 0xdf, 0x66, 0x79, 0x1a, 0xab, 0x3b, 0x09, 0xac, 0x07, 0x3a, 0xb5, 0xba, 0xc1, 0x8a, + 0x24, 0x19, 0x70, 0x8a, 0x01, 0x48, 0x01, 0xb0, 0x04, 0xe6, 0xb6, 0x21, 0x36, 0xf2, 0xcd, 0x3e, + 0x72, 0x1e, 0x13, 0x58, 0x32, 0xf4, 0x3d, 0xb5, 0x1d, 0xa4, 0x1d, 0xec, 0x03, 0xe1, 0x10, 0xe8, + 0xfc, 0x03, 0x98, 0xcb, 0xb0, 0x16, 0x4d, 0x42, 0xfe, 0x80, 0x74, 0x5d, 0xb7, 0x61, 0xf6, 0x27, + 0x9a, 0x09, 0x7f, 0x26, 0x8f, 0x88, 0x2f, 0xdc, 0x77, 0x73, 0xf7, 0x24, 0xf9, 0xab, 0xa1, 0x70, + 0xec, 0xf0, 0x8e, 0xf9, 0x1a, 0x94, 0x2c, 0x62, 0x6a, 0x6a, 0x53, 0xb1, 0x45, 0x23, 0x74, 0xd1, + 0x3d, 0xd2, 0x70, 0xc7, 0xb0, 0x4f, 0x8d, 0xf4, 0xd6, 0xb9, 0x57, 0xdb, 0x5b, 0xe7, 0x5f, 0x4e, + 0x6f, 0xfd, 0x5b, 0x50, 0xb2, 0xbd, 0xae, 0xba, 0xc0, 0x21, 0x6f, 0x0d, 0x90, 0x5f, 0x45, 0x43, + 0xed, 0x2b, 0xf0, 0x5b, 0x69, 0x1f, 0x34, 0xad, 0x89, 0x1e, 0x1a, 0xb0, 0x89, 0x7e, 0xa9, 0x8d, + 0x2f, 0xcb, 0xa9, 0xa6, 0xe2, 0xd8, 0xa4, 0xc5, 0x13, 0x51, 0x29, 0xc8, 0xa9, 0x5b, 0x7c, 0x14, + 0x0b, 0x2a, 0x7a, 0x1a, 0x09, 0xd9, 0xd2, 0x59, 0x42, 0x76, 0x3c, 0x3b, 0x5c, 0xd1, 0x0e, 0xcc, + 0x99, 0x96, 0xd1, 0xb6, 0x88, 0x6d, 0x2f, 0x13, 0xa5, 0xa5, 0xa9, 0x3a, 0xf1, 0xfc, 0xe3, 0x76, + 0x44, 0x97, 0x4e, 0x8e, 0x2b, 0x73, 0x5b, 0xe9, 0x2c, 0x38, 0x4b, 0x56, 0x7e, 0x5e, 0x80, 0xc9, + 0x78, 0x05, 0xcc, 0x68, 0x52, 0xa5, 0x33, 0x35, 0xa9, 0x37, 0x42, 0x9b, 0xc1, 0xed, 0xe0, 0x43, + 0x67, 0x7c, 0x89, 0x0d, 0xb1, 0x08, 0x13, 0x22, 0x1b, 0x78, 0x44, 0xd1, 0xa6, 0xfb, 0xab, 0xbf, + 0x13, 0x25, 0xe3, 0x38, 0x3f, 0x6b, 0x3d, 0x83, 0x8e, 0xd2, 0x03, 0x29, 0x44, 0x5b, 0xcf, 0xc5, + 0x38, 0x03, 0x4e, 0xca, 0xa0, 0x75, 0x98, 0x76, 0xf4, 0x24, 0x94, 0x1b, 0x8d, 0x97, 0x04, 0xd4, + 0xf4, 0x4e, 0x92, 0x05, 0xa7, 0xc9, 0xa1, 0xbd, 0x48, 0x37, 0x3a, 0xcc, 0x33, 0xec, 0xed, 0xbe, + 0xf7, 0x4e, 0xdf, 0xed, 0x28, 0xba, 0x0f, 0x63, 0x16, 0xff, 0xee, 0xf0, 0x0c, 0x76, 0x7b, 0xf7, + 0xd7, 0x84, 0xd8, 0x18, 0x0e, 0x13, 0x71, 0x94, 0x37, 0xa5, 0xdd, 0x2e, 0xf5, 0xdb, 0x6e, 0xcb, + 0xff, 0x24, 0x85, 0x8b, 0x90, 0xdf, 0x02, 0xf7, 0x3a, 0x65, 0x4a, 0x48, 0x84, 0xba, 0x23, 0x23, + 0xbd, 0xfb, 0xbd, 0x3b, 0x50, 0xf7, 0x1b, 0x14, 0xcf, 0xde, 0xed, 0xef, 0x97, 0x12, 0xcc, 0xae, + 0x34, 0x1e, 0x5a, 0x86, 0x63, 0x7a, 0xe6, 0x6c, 0x9a, 0xae, 0x5f, 0x7f, 0x01, 0x05, 0xcb, 0xd1, + 0xbc, 0x79, 0xbc, 0xe1, 0xcd, 0x03, 0x3b, 0x1a, 0x9b, 0xc7, 0x74, 0x4c, 0xca, 0x9d, 0x04, 0x13, + 0x40, 0x1b, 0x30, 0x6c, 0x29, 0x7a, 0x9b, 0x78, 0x65, 0xf5, 0x6a, 0x0f, 0xeb, 0x57, 0x97, 0x31, + 0x63, 0x0f, 0x35, 0x6f, 0x5c, 0x1a, 0x0b, 0x14, 0xf9, 0x8f, 0x24, 0x98, 0x78, 0xb4, 0xbd, 0xbd, + 0xb5, 0xaa, 0xf3, 0x1d, 0xcd, 0x4f, 0xdf, 0xaf, 0x40, 0xc1, 0x54, 0xe8, 0x7e, 0xbc, 0xd2, 0x33, + 0x1a, 0xe6, 0x14, 0xf4, 0x11, 0x14, 0x59, 0x26, 0x21, 0x7a, 0xab, 0xcf, 0x56, 0x5b, 0xc0, 0xd7, + 0x5d, 0xa1, 0xa0, 0x43, 0x14, 0x03, 0xd8, 0x83, 0x93, 0x0f, 0x60, 0x26, 0x64, 0x0e, 0xf3, 0x07, + 0x3f, 0x06, 0x46, 0x0d, 0x18, 0x62, 0x9a, 0xbd, 0x53, 0xde, 0x5e, 0x87, 0x99, 0xb1, 0x29, 0x05, + 0x9d, 0x0e, 0xfb, 0x65, 0x63, 0x17, 0x4b, 0x5e, 0x87, 0x31, 0x7e, 0xe5, 0x60, 0x58, 0x94, 0xbb, + 0x05, 0x5d, 0x86, 0x7c, 0x47, 0xd5, 0x45, 0x9d, 0x1d, 0x15, 0x32, 0x79, 0x56, 0x23, 0xd8, 0x38, + 0x27, 0x2b, 0x47, 0x22, 0xf3, 0x04, 0x64, 0xe5, 0x08, 0xb3, 0x71, 0xf9, 0x21, 0x14, 0x85, 0xbb, + 0xc3, 0x40, 0xf9, 0xd3, 0x81, 0xf2, 0x29, 0x40, 0x9b, 0x50, 0x5c, 0xdd, 0xaa, 0x6b, 0x86, 0xdb, + 0x75, 0x35, 0xd5, 0x96, 0x15, 0x5f, 0x8b, 0xa5, 0xd5, 0x65, 0x8c, 0x39, 0x05, 0xc9, 0x30, 0x4c, + 0x8e, 0x9a, 0xc4, 0xa4, 0x3c, 0x22, 0x46, 0xea, 0xc0, 0x56, 0xf9, 0x01, 0x1f, 0xc1, 0x82, 0x22, + 0xff, 0x71, 0x0e, 0x8a, 0xc2, 0x1d, 0xe7, 0xf0, 0x15, 0xb6, 0x16, 0xf9, 0x0a, 0x7b, 0xb3, 0xbf, + 0xd0, 0xc8, 0xfc, 0x04, 0xdb, 0x8e, 0x7d, 0x82, 0xdd, 0xe8, 0x13, 0xef, 0xf4, 0xef, 0xaf, 0xbf, + 0x97, 0x60, 0x3c, 0x1a, 0x94, 0xe8, 0x0e, 0x8c, 0xb2, 0x82, 0xa3, 0x36, 0xc9, 0x46, 0xd0, 0xe7, + 0xfa, 0x87, 0x30, 0x8d, 0x80, 0x84, 0xc3, 0x7c, 0xa8, 0xed, 0x8b, 0xb1, 0x38, 0x12, 0x93, 0xce, + 0x76, 0xa9, 0x43, 0x55, 0xad, 0xea, 0x5e, 0xa3, 0x55, 0x57, 0x75, 0xba, 0x69, 0x35, 0xa8, 0xa5, + 0xea, 0xed, 0x84, 0x22, 0x1e, 0x94, 0x61, 0x64, 0xf9, 0x1f, 0x25, 0x18, 0x15, 0x26, 0x9f, 0xc3, + 0x57, 0xc5, 0xaf, 0x45, 0xbf, 0x2a, 0xae, 0xf6, 0xb9, 0xc1, 0xd3, 0x3f, 0x29, 0xfe, 0x3a, 0x30, + 0x9d, 0x6d, 0x69, 0x16, 0xd5, 0xfb, 0x86, 0x4d, 0xe3, 0x51, 0xcd, 0x36, 0x23, 0xe6, 0x14, 0xe4, + 0xc0, 0xa4, 0x1a, 0xcb, 0x01, 0xc2, 0xb5, 0xb5, 0xfe, 0x2c, 0xf1, 0xc5, 0xea, 0x65, 0x01, 0x3f, + 0x19, 0xa7, 0xe0, 0x84, 0x0a, 0x99, 0x40, 0x82, 0x0b, 0x3d, 0x86, 0xc2, 0x3e, 0xa5, 0x66, 0xca, + 0x79, 0x75, 0x8f, 0xcc, 0x13, 0x98, 0x50, 0xe2, 0xb3, 0xdb, 0xde, 0xde, 0xc2, 0x1c, 0x4a, 0xfe, + 0xef, 0xc0, 0x1f, 0x0d, 0x37, 0xc6, 0xfd, 0x7c, 0x2a, 0x9d, 0x25, 0x9f, 0x8e, 0xa6, 0xe5, 0x52, + 0xf4, 0x08, 0xf2, 0x54, 0xeb, 0xf7, 0xb3, 0x50, 0x20, 0x6e, 0xaf, 0x35, 0x82, 0x84, 0xb4, 0xbd, + 0xd6, 0xc0, 0x0c, 0x02, 0x6d, 0xc2, 0x10, 0xab, 0x3e, 0x6c, 0x0b, 0xe6, 0xfb, 0xdf, 0xd2, 0x6c, + 0xfe, 0x41, 0x40, 0xb0, 0x5f, 0x36, 0x76, 0x71, 0xe4, 0xcf, 0x60, 0x2c, 0xb2, 0x4f, 0xd1, 0xa7, + 0x70, 0x51, 0x33, 0x94, 0x56, 0x5d, 0xd1, 0x14, 0xbd, 0x49, 0xbc, 0xcb, 0x81, 0xab, 0x69, 0x5f, + 0x18, 0x6b, 0x21, 0x3e, 0xb1, 0xcb, 0xfd, 0xeb, 0xd4, 0x30, 0x0d, 0x47, 0x10, 0x65, 0x05, 0x20, + 0x98, 0x23, 0xaa, 0xc0, 0x10, 0x8b, 0x33, 0xb7, 0x9e, 0x8c, 0xd4, 0x47, 0x98, 0x85, 0x2c, 0xfc, + 0x6c, 0xec, 0x8e, 0xa3, 0xdb, 0x00, 0x36, 0x69, 0x5a, 0x84, 0xf2, 0x64, 0x90, 0x8b, 0x5e, 0x41, + 0x37, 0x7c, 0x0a, 0x0e, 0x71, 0xc9, 0xff, 0x2c, 0xc1, 0xd8, 0x06, 0xa1, 0x9f, 0x1b, 0xd6, 0xc1, + 0x16, 0x7f, 0x3a, 0x70, 0x0e, 0xc9, 0x16, 0x47, 0x92, 0xed, 0x5b, 0x3d, 0x56, 0x26, 0x62, 0x5d, + 0x56, 0xca, 0x95, 0xbf, 0x96, 0x60, 0x2e, 0xc2, 0xf9, 0x20, 0xd8, 0xba, 0x3b, 0x30, 0x64, 0x1a, + 0x16, 0xf5, 0x0a, 0xf1, 0x40, 0x0a, 0x59, 0x1a, 0x0b, 0x95, 0x62, 0x06, 0x83, 0x5d, 0x34, 0xb4, + 0x06, 0x39, 0x6a, 0x88, 0x50, 0x1d, 0x0c, 0x93, 0x10, 0xab, 0x0e, 0x02, 0x33, 0xb7, 0x6d, 0xe0, + 0x1c, 0x35, 0xd8, 0x42, 0x94, 0x23, 0x5c, 0xe1, 0xe4, 0xf3, 0x8a, 0x66, 0x80, 0xa1, 0xb0, 0x67, + 0x19, 0x9d, 0x33, 0xcf, 0xc1, 0x5f, 0x88, 0x15, 0xcb, 0xe8, 0x60, 0x8e, 0x25, 0x7f, 0x23, 0xc1, + 0x54, 0x84, 0xf3, 0x1c, 0x12, 0xff, 0xe3, 0x68, 0xe2, 0xbf, 0x31, 0xc8, 0x44, 0x32, 0xd2, 0xff, + 0x37, 0xb9, 0xd8, 0x34, 0xd8, 0x84, 0xd1, 0x1e, 0x8c, 0x9a, 0x46, 0xab, 0xf1, 0x12, 0xae, 0x03, + 0x27, 0x58, 0xdd, 0xdc, 0x0a, 0xb0, 0x70, 0x18, 0x18, 0x1d, 0xc1, 0x94, 0xae, 0x74, 0x88, 0x6d, + 0x2a, 0x4d, 0xd2, 0x78, 0x09, 0x07, 0x24, 0xaf, 0xf1, 0xfb, 0x86, 0x38, 0x22, 0x4e, 0x2a, 0x41, + 0xeb, 0x50, 0x54, 0x4d, 0xde, 0xc7, 0x89, 0xde, 0xa5, 0x67, 0x15, 0x75, 0xbb, 0x3e, 0x37, 0x9f, + 0x8b, 0x1f, 0xd8, 0xc3, 0x90, 0xff, 0x26, 0x1e, 0x0d, 0x2c, 0xfe, 0xd0, 0x43, 0x28, 0xf1, 0x47, + 0x38, 0x4d, 0x43, 0xf3, 0x6e, 0x06, 0xd8, 0xca, 0x6e, 0x89, 0xb1, 0x17, 0xc7, 0x95, 0x4b, 0x29, + 0x87, 0xbe, 0x1e, 0x19, 0xfb, 0xc2, 0x68, 0x03, 0x0a, 0xe6, 0x4f, 0xe9, 0x60, 0x78, 0x91, 0xe3, + 0x6d, 0x0b, 0xc7, 0x91, 0x7f, 0x2f, 0x1f, 0x33, 0x97, 0x97, 0xba, 0x67, 0x2f, 0x6d, 0xd5, 0xfd, + 0x8e, 0x29, 0x73, 0xe5, 0x77, 0xa1, 0x28, 0x2a, 0xbc, 0x08, 0xe6, 0x5f, 0x0c, 0x12, 0xcc, 0xe1, + 0x2a, 0xe6, 0x7f, 0xb0, 0x78, 0x83, 0x1e, 0x30, 0xfa, 0x04, 0x86, 0x89, 0xab, 0xc2, 0xad, 0x8d, + 0x77, 0x07, 0x51, 0x11, 0xe4, 0xd5, 0xa0, 0x51, 0x15, 0x63, 0x02, 0x15, 0xbd, 0xcf, 0xfc, 0xc5, + 0x78, 0xd9, 0x47, 0xa0, 0x5d, 0x2e, 0xf0, 0x72, 0x75, 0xd9, 0x9d, 0xb6, 0x3f, 0xfc, 0xe2, 0xb8, + 0x02, 0xc1, 0x4f, 0x1c, 0x96, 0x90, 0xff, 0x55, 0x82, 0x29, 0xee, 0xa1, 0xa6, 0x63, 0xa9, 0xb4, + 0x7b, 0x6e, 0x85, 0xe9, 0x49, 0xa4, 0x30, 0xbd, 0xd3, 0xc3, 0x2d, 0x09, 0x0b, 0x33, 0x8b, 0xd3, + 0xb7, 0x12, 0xbc, 0x96, 0xe0, 0x3e, 0x87, 0xbc, 0xb8, 0x13, 0xcd, 0x8b, 0x6f, 0x0d, 0x3a, 0xa1, + 0xac, 0xd6, 0x78, 0x3c, 0x65, 0x3a, 0x7c, 0xa7, 0xdc, 0x06, 0x30, 0x2d, 0xf5, 0x50, 0xd5, 0x48, + 0x5b, 0x5c, 0x82, 0x97, 0x42, 0x8f, 0xe0, 0x7c, 0x0a, 0x0e, 0x71, 0x21, 0x1b, 0x66, 0x5b, 0x64, + 0x4f, 0x71, 0x34, 0xba, 0xd8, 0x6a, 0x2d, 0x29, 0xa6, 0xb2, 0xab, 0x6a, 0x2a, 0x55, 0xc5, 0x71, + 0xc1, 0x48, 0xfd, 0xbe, 0x7b, 0x39, 0x9d, 0xc6, 0xf1, 0xe2, 0xb8, 0x72, 0x39, 0xed, 0x76, 0xc8, + 0x63, 0xe9, 0xe2, 0x0c, 0x68, 0xd4, 0x85, 0xb2, 0x45, 0x3e, 0x73, 0x54, 0x8b, 0xb4, 0x96, 0x2d, + 0xc3, 0x8c, 0xa8, 0xcd, 0x73, 0xb5, 0xbf, 0x7a, 0x72, 0x5c, 0x29, 0xe3, 0x0c, 0x9e, 0xde, 0x8a, + 0x33, 0xe1, 0xd1, 0x33, 0x98, 0x56, 0xdc, 0xb7, 0x83, 0x11, 0xad, 0xee, 0x2e, 0xb9, 0x77, 0x72, + 0x5c, 0x99, 0x5e, 0x4c, 0x92, 0x7b, 0x2b, 0x4c, 0x03, 0x45, 0x35, 0x28, 0x1e, 0xf2, 0x97, 0x8d, + 0x76, 0x79, 0x88, 0xe3, 0xb3, 0x42, 0x50, 0x74, 0x1f, 0x3b, 0x32, 0xcc, 0xe1, 0x95, 0x06, 0xdf, + 0x7d, 0x1e, 0x17, 0xfb, 0xa0, 0x64, 0xbd, 0xa4, 0xd8, 0xf1, 0xfc, 0xc4, 0xb8, 0x14, 0x64, 0xad, + 0x47, 0x01, 0x09, 0x87, 0xf9, 0xd0, 0x53, 0x18, 0xd9, 0x17, 0xa7, 0x12, 0x76, 0xb9, 0xd8, 0x57, + 0x11, 0x8e, 0x9c, 0x62, 0xd4, 0xa7, 0x84, 0x8a, 0x11, 0x6f, 0xd8, 0xc6, 0x01, 0x22, 0xba, 0x0e, + 0x45, 0xfe, 0x63, 0x75, 0x99, 0x1f, 0xc7, 0x95, 0x82, 0xdc, 0xf6, 0xc8, 0x1d, 0xc6, 0x1e, 0xdd, + 0x63, 0x5d, 0xdd, 0x5a, 0xe2, 0xc7, 0xc2, 0x31, 0xd6, 0xd5, 0xad, 0x25, 0xec, 0xd1, 0xd1, 0xa7, + 0x50, 0xb4, 0xc9, 0x9a, 0xaa, 0x3b, 0x47, 0x65, 0xe8, 0xeb, 0x52, 0xb9, 0xf1, 0x80, 0x73, 0xc7, + 0x0e, 0xc6, 0x02, 0x0d, 0x82, 0x8e, 0x3d, 0x58, 0xb4, 0x0f, 0x23, 0x96, 0xa3, 0x2f, 0xda, 0x3b, + 0x36, 0xb1, 0xca, 0xa3, 0x5c, 0x47, 0xaf, 0x74, 0x8e, 0x3d, 0xfe, 0xb8, 0x16, 0xdf, 0x43, 0x3e, + 0x07, 0x0e, 0xc0, 0xd1, 0x1f, 0x4a, 0x80, 0x6c, 0xc7, 0x34, 0x35, 0xd2, 0x21, 0x3a, 0x55, 0x34, + 0x7e, 0x16, 0x67, 0x97, 0x2f, 0x72, 0x9d, 0x1f, 0xf4, 0x9a, 0x57, 0x42, 0x30, 0xae, 0xdc, 0x3f, + 0xf4, 0x4e, 0xb2, 0xe2, 0x14, 0xbd, 0xcc, 0xb5, 0x7b, 0x36, 0xff, 0xbb, 0x3c, 0xd6, 0x97, 0x6b, + 0xd3, 0xcf, 0x1c, 0x03, 0xd7, 0x0a, 0x3a, 0xf6, 0x60, 0xd1, 0x13, 0x98, 0xf5, 0x1e, 0xc6, 0x62, + 0xc3, 0xa0, 0x2b, 0xaa, 0x46, 0xec, 0xae, 0x4d, 0x49, 0xa7, 0x3c, 0xce, 0x97, 0xdd, 0x7f, 0xfb, + 0x81, 0x53, 0xb9, 0x70, 0x86, 0x34, 0xea, 0x40, 0xc5, 0x4b, 0x19, 0x6c, 0x3f, 0xf9, 0x39, 0xeb, + 0x81, 0xdd, 0x54, 0x34, 0xf7, 0x1e, 0x60, 0x82, 0x2b, 0x78, 0xe3, 0xe4, 0xb8, 0x52, 0x59, 0x3e, + 0x9d, 0x15, 0xf7, 0xc2, 0x42, 0x1f, 0x41, 0x59, 0xc9, 0xd2, 0x33, 0xc9, 0xf5, 0xbc, 0xce, 0xf2, + 0x50, 0xa6, 0x82, 0x4c, 0x69, 0x44, 0x61, 0x52, 0x89, 0x3e, 0x51, 0xb6, 0xcb, 0x53, 0x7d, 0x1d, + 0x44, 0xc6, 0x5e, 0x36, 0x07, 0x87, 0x11, 0x31, 0x82, 0x8d, 0x13, 0x1a, 0xd0, 0x6f, 0x03, 0x52, + 0xe2, 0xaf, 0xaa, 0xed, 0x32, 0xea, 0xab, 0xfc, 0x24, 0x9e, 0x63, 0x07, 0x61, 0x97, 0x20, 0xd9, + 0x38, 0x45, 0x0f, 0x5a, 0x83, 0x19, 0x31, 0xba, 0xa3, 0xdb, 0xca, 0x1e, 0x69, 0x74, 0xed, 0x26, + 0xd5, 0xec, 0xf2, 0x34, 0xcf, 0x7d, 0xfc, 0xe2, 0x6b, 0x31, 0x85, 0x8e, 0x53, 0xa5, 0xd0, 0x07, + 0x30, 0xb9, 0x67, 0x58, 0xbb, 0x6a, 0xab, 0x45, 0x74, 0x0f, 0x69, 0x86, 0x23, 0xcd, 0x30, 0x6f, + 0xac, 0xc4, 0x68, 0x38, 0xc1, 0xcd, 0x1f, 0x93, 0x88, 0xab, 0x85, 0xf3, 0x79, 0x90, 0x3b, 0xd8, + 0x63, 0x92, 0xc0, 0xb4, 0x97, 0xf6, 0x98, 0x24, 0x04, 0x79, 0xfa, 0x61, 0xe6, 0x7f, 0xe6, 0x60, + 0x3a, 0x60, 0xee, 0xfb, 0x31, 0x49, 0x8a, 0xc8, 0xff, 0x3f, 0xca, 0xed, 0xfd, 0x28, 0xf7, 0x6b, + 0x09, 0xc6, 0x03, 0xd7, 0xfd, 0xef, 0x7b, 0xe0, 0x11, 0xd8, 0x96, 0xd1, 0x72, 0xfe, 0x5d, 0x2e, + 0x3c, 0x81, 0xff, 0xf3, 0xaf, 0x0c, 0x7e, 0xfa, 0x4b, 0x5a, 0xf9, 0xdb, 0x3c, 0x4c, 0xc6, 0x77, + 0x63, 0xe4, 0x32, 0x5a, 0xea, 0x79, 0x19, 0xbd, 0x05, 0x33, 0x7b, 0x8e, 0xa6, 0x75, 0xb9, 0x1b, + 0x42, 0x37, 0xd2, 0xee, 0x65, 0xd2, 0xeb, 0x42, 0x72, 0x66, 0x25, 0x85, 0x07, 0xa7, 0x4a, 0x66, + 0x5c, 0xac, 0xe7, 0xcf, 0x74, 0xb1, 0x9e, 0xb8, 0xe7, 0x2d, 0x0c, 0x70, 0xcf, 0x9b, 0x7a, 0x49, + 0x3e, 0x74, 0x86, 0x4b, 0xf2, 0xb3, 0xdc, 0x6a, 0xa7, 0x24, 0xb1, 0x9e, 0x8f, 0x2c, 0x5f, 0x87, + 0x79, 0x21, 0x46, 0xf9, 0x85, 0xb3, 0x4e, 0x2d, 0x43, 0xd3, 0x88, 0xb5, 0xec, 0x74, 0x3a, 0x5d, + 0xf9, 0x3d, 0x18, 0x8f, 0x3e, 0xa5, 0x70, 0x57, 0xda, 0x7d, 0xcd, 0x21, 0xae, 0xf4, 0x42, 0x2b, + 0xed, 0x8e, 0x63, 0x9f, 0x43, 0xfe, 0x7d, 0x09, 0x66, 0xd3, 0x9f, 0x4c, 0x22, 0x0d, 0xc6, 0x3b, + 0xca, 0x51, 0xf8, 0x19, 0xab, 0x74, 0xc6, 0xc3, 0x16, 0x7e, 0x87, 0xbe, 0x1e, 0xc1, 0xc2, 0x31, + 0x6c, 0xf9, 0x47, 0x09, 0xe6, 0x32, 0x6e, 0xaf, 0xcf, 0xd7, 0x12, 0xf4, 0x31, 0x94, 0x3a, 0xca, + 0x51, 0xc3, 0xb1, 0xda, 0xe4, 0xcc, 0xc7, 0x4b, 0x3c, 0x63, 0xac, 0x0b, 0x14, 0xec, 0xe3, 0xc9, + 0x5f, 0x4a, 0x50, 0xce, 0x6a, 0xf4, 0xd1, 0x9d, 0xc8, 0x3d, 0xfb, 0xcf, 0x63, 0xf7, 0xec, 0x53, + 0x09, 0xb9, 0x57, 0x74, 0xcb, 0xfe, 0xb7, 0x12, 0xcc, 0xa6, 0x7f, 0xf0, 0xa0, 0xb7, 0x23, 0x16, + 0x56, 0x62, 0x16, 0x4e, 0xc4, 0xa4, 0x84, 0x7d, 0x9f, 0xc0, 0xb8, 0xf8, 0x2c, 0x12, 0x30, 0xc2, + 0xab, 0x72, 0x5a, 0xae, 0x14, 0x10, 0xde, 0x67, 0x00, 0x5f, 0xaf, 0xe8, 0x18, 0x8e, 0xa1, 0xc9, + 0x7f, 0x90, 0x83, 0xa1, 0x46, 0x53, 0xd1, 0xc8, 0x39, 0xb4, 0x59, 0x1f, 0x46, 0xda, 0xac, 0x5e, + 0xff, 0x72, 0xc2, 0xad, 0xca, 0xec, 0xb0, 0x70, 0xac, 0xc3, 0x7a, 0xb3, 0x2f, 0xb4, 0xd3, 0x9b, + 0xab, 0x5f, 0x81, 0x11, 0x5f, 0xe9, 0x60, 0x39, 0x5f, 0xfe, 0xab, 0x1c, 0x8c, 0x86, 0x54, 0x0c, + 0x58, 0x31, 0xf6, 0x22, 0x95, 0xb6, 0x9f, 0x7f, 0xf4, 0x0b, 0xe9, 0xaa, 0x7a, 0xb5, 0xd5, 0x7d, + 0x32, 0x19, 0x3c, 0x92, 0x4b, 0x96, 0xdc, 0xf7, 0x60, 0x9c, 0xf2, 0x7f, 0x84, 0xf3, 0x0f, 0x65, + 0xf3, 0x3c, 0x16, 0xfd, 0x87, 0xb6, 0xdb, 0x11, 0x2a, 0x8e, 0x71, 0xcf, 0xdf, 0x87, 0xb1, 0x88, + 0xb2, 0x81, 0x5e, 0x3c, 0xfe, 0x83, 0x04, 0x3f, 0xef, 0xf9, 0xc9, 0x8c, 0xea, 0x91, 0x4d, 0x52, + 0x8d, 0x6d, 0x92, 0x85, 0x6c, 0x80, 0x57, 0xf7, 0x72, 0xa6, 0x7e, 0xf3, 0xf9, 0x0f, 0x0b, 0x17, + 0xbe, 0xfb, 0x61, 0xe1, 0xc2, 0xf7, 0x3f, 0x2c, 0x5c, 0xf8, 0xdd, 0x93, 0x05, 0xe9, 0xf9, 0xc9, + 0x82, 0xf4, 0xdd, 0xc9, 0x82, 0xf4, 0xfd, 0xc9, 0x82, 0xf4, 0xef, 0x27, 0x0b, 0xd2, 0x9f, 0xfc, + 0xb8, 0x70, 0xe1, 0xe3, 0xa2, 0x80, 0xfb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7b, 0xc2, 0x4a, + 0x40, 0x12, 0x3d, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/extensions/v1beta1/generated.proto b/vendor/k8s.io/api/extensions/v1beta1/generated.proto index 8308786d1..3a87fbe5e 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/generated.proto +++ b/vendor/k8s.io/api/extensions/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -33,15 +33,17 @@ import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; option go_package = "v1beta1"; // AllowedFlexVolume represents a single Flexvolume that is allowed to be used. +// Deprecated: use AllowedFlexVolume from policy API Group instead. message AllowedFlexVolume { - // Driver is the name of the Flexvolume driver. + // driver is the name of the Flexvolume driver. optional string driver = 1; } -// defines the host volume conditions that will be enabled by a policy +// AllowedHostPath defines the host volume conditions that will be enabled by a policy // for pods to use. It requires the path prefix to be defined. +// Deprecated: use AllowedHostPath from policy API Group instead. message AllowedHostPath { - // is the path prefix that the host volume must match. + // pathPrefix is the path prefix that the host volume must match. // It does not support `*`. // Trailing slashes are trimmed when validating the path prefix with a host path. // @@ -49,6 +51,10 @@ message AllowedHostPath { // `/foo` would allow `/foo`, `/foo/` and `/foo/bar` // `/foo` would not allow `/food` or `/etc/foo` optional string pathPrefix = 1; + + // when set to true, will allow host volumes matching the pathPrefix only if all volume mounts are readOnly. + // +optional + optional bool readOnly = 2; } message CustomMetricCurrentStatus { @@ -409,13 +415,14 @@ message DeploymentStrategy { } // FSGroupStrategyOptions defines the strategy type and options used to create the strategy. +// Deprecated: use FSGroupStrategyOptions from policy API Group instead. message FSGroupStrategyOptions { - // Rule is the strategy that will dictate what FSGroup is used in the SecurityContext. + // rule is the strategy that will dictate what FSGroup is used in the SecurityContext. // +optional optional string rule = 1; - // Ranges are the allowed ranges of fs groups. If you would like to force a single - // fs group then supply a single range with the same start and end. + // ranges are the allowed ranges of fs groups. If you would like to force a single + // fs group then supply a single range with the same start and end. Required for MustRunAs. // +optional repeated IDRange ranges = 2; } @@ -448,8 +455,9 @@ message HTTPIngressRuleValue { repeated HTTPIngressPath paths = 1; } -// Host Port Range defines a range of host ports that will be enabled by a policy +// HostPortRange defines a range of host ports that will be enabled by a policy // for pods to use. It requires both the start and end to be defined. +// Deprecated: use HostPortRange from policy API Group instead. message HostPortRange { // min is the start of the range, inclusive. optional int32 min = 1; @@ -458,12 +466,13 @@ message HostPortRange { optional int32 max = 2; } -// ID Range provides a min/max of an allowed range of IDs. +// IDRange provides a min/max of an allowed range of IDs. +// Deprecated: use IDRange from policy API Group instead. message IDRange { - // Min is the start of the range, inclusive. + // min is the start of the range, inclusive. optional int64 min = 1; - // Max is the end of the range, inclusive. + // max is the end of the range, inclusive. optional int64 max = 2; } @@ -678,20 +687,26 @@ message NetworkPolicyList { // DEPRECATED 1.9 - This group version of NetworkPolicyPeer is deprecated by networking/v1/NetworkPolicyPeer. message NetworkPolicyPeer { - // This is a label selector which selects Pods in this namespace. - // This field follows standard label selector semantics. - // If present but empty, this selector selects all pods in this namespace. + // This is a label selector which selects Pods. This field follows standard label + // selector semantics; if present but empty, it selects all pods. + // + // If NamespaceSelector is also set, then the NetworkPolicyPeer as a whole selects + // the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. + // Otherwise it selects the Pods matching PodSelector in the policy's own Namespace. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector podSelector = 1; - // Selects Namespaces using cluster scoped-labels. This - // matches all pods in all namespaces selected by this label selector. - // This field follows standard label selector semantics. - // If present but empty, this selector selects all namespaces. + // Selects Namespaces using cluster-scoped labels. This field follows standard label + // selector semantics; if present but empty, it selects all namespaces. + // + // If PodSelector is also set, then the NetworkPolicyPeer as a whole selects + // the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. + // Otherwise it selects all Pods in the Namespaces selected by NamespaceSelector. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector namespaceSelector = 2; - // IPBlock defines policy on a particular IPBlock + // IPBlock defines policy on a particular IPBlock. If this field is set then + // neither of the other fields can be. // +optional optional IPBlock ipBlock = 3; } @@ -755,8 +770,9 @@ message NetworkPolicySpec { repeated string policyTypes = 4; } -// Pod Security Policy governs the ability to make requests that affect the Security Context +// PodSecurityPolicy governs the ability to make requests that affect the Security Context // that will be applied to a pod and container. +// Deprecated: use PodSecurityPolicy from policy API Group instead. message PodSecurityPolicy { // Standard object's metadata. // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata @@ -768,43 +784,45 @@ message PodSecurityPolicy { optional PodSecurityPolicySpec spec = 2; } -// Pod Security Policy List is a list of PodSecurityPolicy objects. +// PodSecurityPolicyList is a list of PodSecurityPolicy objects. +// Deprecated: use PodSecurityPolicyList from policy API Group instead. message PodSecurityPolicyList { // Standard list metadata. // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - // Items is a list of schema objects. + // items is a list of schema objects. repeated PodSecurityPolicy items = 2; } -// Pod Security Policy Spec defines the policy enforced. +// PodSecurityPolicySpec defines the policy enforced. +// Deprecated: use PodSecurityPolicySpec from policy API Group instead. message PodSecurityPolicySpec { // privileged determines if a pod can request to be run as privileged. // +optional optional bool privileged = 1; - // DefaultAddCapabilities is the default set of capabilities that will be added to the container + // defaultAddCapabilities is the default set of capabilities that will be added to the container // unless the pod spec specifically drops the capability. You may not list a capability in both - // DefaultAddCapabilities and RequiredDropCapabilities. Capabilities added here are implicitly - // allowed, and need not be included in the AllowedCapabilities list. + // defaultAddCapabilities and requiredDropCapabilities. Capabilities added here are implicitly + // allowed, and need not be included in the allowedCapabilities list. // +optional repeated string defaultAddCapabilities = 2; - // RequiredDropCapabilities are the capabilities that will be dropped from the container. These + // requiredDropCapabilities are the capabilities that will be dropped from the container. These // are required to be dropped and cannot be added. // +optional repeated string requiredDropCapabilities = 3; - // AllowedCapabilities is a list of capabilities that can be requested to add to the container. + // allowedCapabilities is a list of capabilities that can be requested to add to the container. // Capabilities in this field may be added at the pod author's discretion. - // You must not list a capability in both AllowedCapabilities and RequiredDropCapabilities. + // You must not list a capability in both allowedCapabilities and requiredDropCapabilities. // +optional repeated string allowedCapabilities = 4; - // volumes is a white list of allowed volume plugins. Empty indicates that all plugins - // may be used. + // volumes is a white list of allowed volume plugins. Empty indicates that + // no volumes may be used. To allow all volumes you may use '*'. // +optional repeated string volumes = 5; @@ -830,13 +848,13 @@ message PodSecurityPolicySpec { // runAsUser is the strategy that will dictate the allowable RunAsUser values that may be set. optional RunAsUserStrategyOptions runAsUser = 11; - // SupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext. + // supplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext. optional SupplementalGroupsStrategyOptions supplementalGroups = 12; - // FSGroup is the strategy that will dictate what fs group is used by the SecurityContext. + // fsGroup is the strategy that will dictate what fs group is used by the SecurityContext. optional FSGroupStrategyOptions fsGroup = 13; - // ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file + // readOnlyRootFilesystem when set to true will force containers to run with a read only root file // system. If the container specifically requests to run with a non-read only root file system // the PSP should deny the pod. // If set to false the container may run with a read only root file system if it wishes but it @@ -844,25 +862,47 @@ message PodSecurityPolicySpec { // +optional optional bool readOnlyRootFilesystem = 14; - // DefaultAllowPrivilegeEscalation controls the default setting for whether a + // defaultAllowPrivilegeEscalation controls the default setting for whether a // process can gain more privileges than its parent process. // +optional optional bool defaultAllowPrivilegeEscalation = 15; - // AllowPrivilegeEscalation determines if a pod can request to allow + // allowPrivilegeEscalation determines if a pod can request to allow // privilege escalation. If unspecified, defaults to true. // +optional optional bool allowPrivilegeEscalation = 16; - // is a white list of allowed host paths. Empty indicates that all host paths may be used. + // allowedHostPaths is a white list of allowed host paths. Empty indicates + // that all host paths may be used. // +optional repeated AllowedHostPath allowedHostPaths = 17; - // AllowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all + // allowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all // Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes - // is allowed in the "Volumes" field. + // is allowed in the "volumes" field. // +optional repeated AllowedFlexVolume allowedFlexVolumes = 18; + + // allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. + // Each entry is either a plain sysctl name or ends in "*" in which case it is considered + // as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. + // Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection. + // + // Examples: + // e.g. "foo/*" allows "foo/bar", "foo/baz", etc. + // e.g. "foo.*" allows "foo.bar", "foo.baz", etc. + // +optional + repeated string allowedUnsafeSysctls = 19; + + // forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. + // Each entry is either a plain sysctl name or ends in "*" in which case it is considered + // as a prefix of forbidden sysctls. Single * means all sysctls are forbidden. + // + // Examples: + // e.g. "foo/*" forbids "foo/bar", "foo/baz", etc. + // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. + // +optional + repeated string forbiddenSysctls = 20; } // DEPRECATED - This group version of ReplicaSet is deprecated by apps/v1beta2/ReplicaSet. See the release notes for @@ -1041,19 +1081,22 @@ message RollingUpdateDeployment { optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxSurge = 2; } -// Run A sUser Strategy Options defines the strategy type and any options used to create the strategy. +// RunAsUserStrategyOptions defines the strategy type and any options used to create the strategy. +// Deprecated: use RunAsUserStrategyOptions from policy API Group instead. message RunAsUserStrategyOptions { - // Rule is the strategy that will dictate the allowable RunAsUser values that may be set. + // rule is the strategy that will dictate the allowable RunAsUser values that may be set. optional string rule = 1; - // Ranges are the allowed ranges of uids that may be used. + // ranges are the allowed ranges of uids that may be used. If you would like to force a single uid + // then supply a single range with the same start and end. Required for MustRunAs. // +optional repeated IDRange ranges = 2; } -// SELinux Strategy Options defines the strategy type and any options used to create the strategy. +// SELinuxStrategyOptions defines the strategy type and any options used to create the strategy. +// Deprecated: use SELinuxStrategyOptions from policy API Group instead. message SELinuxStrategyOptions { - // type is the strategy that will dictate the allowable labels that may be set. + // rule is the strategy that will dictate the allowable labels that may be set. optional string rule = 1; // seLinuxOptions required to run as; required for MustRunAs @@ -1104,13 +1147,14 @@ message ScaleStatus { } // SupplementalGroupsStrategyOptions defines the strategy type and options used to create the strategy. +// Deprecated: use SupplementalGroupsStrategyOptions from policy API Group instead. message SupplementalGroupsStrategyOptions { - // Rule is the strategy that will dictate what supplemental groups is used in the SecurityContext. + // rule is the strategy that will dictate what supplemental groups is used in the SecurityContext. // +optional optional string rule = 1; - // Ranges are the allowed ranges of supplemental groups. If you would like to force a single - // supplemental group then supply a single range with the same start and end. + // ranges are the allowed ranges of supplemental groups. If you would like to force a single + // supplemental group then supply a single range with the same start and end. Required for MustRunAs. // +optional repeated IDRange ranges = 2; } diff --git a/vendor/k8s.io/api/extensions/v1beta1/types.go b/vendor/k8s.io/api/extensions/v1beta1/types.go index c3d9f72d7..3a86ef43a 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types.go @@ -862,8 +862,9 @@ type ReplicaSetCondition struct { // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// Pod Security Policy governs the ability to make requests that affect the Security Context +// PodSecurityPolicy governs the ability to make requests that affect the Security Context // that will be applied to a pod and container. +// Deprecated: use PodSecurityPolicy from policy API Group instead. type PodSecurityPolicy struct { metav1.TypeMeta `json:",inline"` // Standard object's metadata. @@ -876,28 +877,29 @@ type PodSecurityPolicy struct { Spec PodSecurityPolicySpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` } -// Pod Security Policy Spec defines the policy enforced. +// PodSecurityPolicySpec defines the policy enforced. +// Deprecated: use PodSecurityPolicySpec from policy API Group instead. type PodSecurityPolicySpec struct { // privileged determines if a pod can request to be run as privileged. // +optional Privileged bool `json:"privileged,omitempty" protobuf:"varint,1,opt,name=privileged"` - // DefaultAddCapabilities is the default set of capabilities that will be added to the container + // defaultAddCapabilities is the default set of capabilities that will be added to the container // unless the pod spec specifically drops the capability. You may not list a capability in both - // DefaultAddCapabilities and RequiredDropCapabilities. Capabilities added here are implicitly - // allowed, and need not be included in the AllowedCapabilities list. + // defaultAddCapabilities and requiredDropCapabilities. Capabilities added here are implicitly + // allowed, and need not be included in the allowedCapabilities list. // +optional DefaultAddCapabilities []v1.Capability `json:"defaultAddCapabilities,omitempty" protobuf:"bytes,2,rep,name=defaultAddCapabilities,casttype=k8s.io/api/core/v1.Capability"` - // RequiredDropCapabilities are the capabilities that will be dropped from the container. These + // requiredDropCapabilities are the capabilities that will be dropped from the container. These // are required to be dropped and cannot be added. // +optional RequiredDropCapabilities []v1.Capability `json:"requiredDropCapabilities,omitempty" protobuf:"bytes,3,rep,name=requiredDropCapabilities,casttype=k8s.io/api/core/v1.Capability"` - // AllowedCapabilities is a list of capabilities that can be requested to add to the container. + // allowedCapabilities is a list of capabilities that can be requested to add to the container. // Capabilities in this field may be added at the pod author's discretion. - // You must not list a capability in both AllowedCapabilities and RequiredDropCapabilities. + // You must not list a capability in both allowedCapabilities and requiredDropCapabilities. // +optional AllowedCapabilities []v1.Capability `json:"allowedCapabilities,omitempty" protobuf:"bytes,4,rep,name=allowedCapabilities,casttype=k8s.io/api/core/v1.Capability"` - // volumes is a white list of allowed volume plugins. Empty indicates that all plugins - // may be used. + // volumes is a white list of allowed volume plugins. Empty indicates that + // no volumes may be used. To allow all volumes you may use '*'. // +optional Volumes []FSType `json:"volumes,omitempty" protobuf:"bytes,5,rep,name=volumes,casttype=FSType"` // hostNetwork determines if the policy allows the use of HostNetwork in the pod spec. @@ -916,39 +918,60 @@ type PodSecurityPolicySpec struct { SELinux SELinuxStrategyOptions `json:"seLinux" protobuf:"bytes,10,opt,name=seLinux"` // runAsUser is the strategy that will dictate the allowable RunAsUser values that may be set. RunAsUser RunAsUserStrategyOptions `json:"runAsUser" protobuf:"bytes,11,opt,name=runAsUser"` - // SupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext. + // supplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext. SupplementalGroups SupplementalGroupsStrategyOptions `json:"supplementalGroups" protobuf:"bytes,12,opt,name=supplementalGroups"` - // FSGroup is the strategy that will dictate what fs group is used by the SecurityContext. + // fsGroup is the strategy that will dictate what fs group is used by the SecurityContext. FSGroup FSGroupStrategyOptions `json:"fsGroup" protobuf:"bytes,13,opt,name=fsGroup"` - // ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file + // readOnlyRootFilesystem when set to true will force containers to run with a read only root file // system. If the container specifically requests to run with a non-read only root file system // the PSP should deny the pod. // If set to false the container may run with a read only root file system if it wishes but it // will not be forced to. // +optional ReadOnlyRootFilesystem bool `json:"readOnlyRootFilesystem,omitempty" protobuf:"varint,14,opt,name=readOnlyRootFilesystem"` - // DefaultAllowPrivilegeEscalation controls the default setting for whether a + // defaultAllowPrivilegeEscalation controls the default setting for whether a // process can gain more privileges than its parent process. // +optional DefaultAllowPrivilegeEscalation *bool `json:"defaultAllowPrivilegeEscalation,omitempty" protobuf:"varint,15,opt,name=defaultAllowPrivilegeEscalation"` - // AllowPrivilegeEscalation determines if a pod can request to allow + // allowPrivilegeEscalation determines if a pod can request to allow // privilege escalation. If unspecified, defaults to true. // +optional AllowPrivilegeEscalation *bool `json:"allowPrivilegeEscalation,omitempty" protobuf:"varint,16,opt,name=allowPrivilegeEscalation"` - // is a white list of allowed host paths. Empty indicates that all host paths may be used. + // allowedHostPaths is a white list of allowed host paths. Empty indicates + // that all host paths may be used. // +optional AllowedHostPaths []AllowedHostPath `json:"allowedHostPaths,omitempty" protobuf:"bytes,17,rep,name=allowedHostPaths"` - // AllowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all + // allowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all // Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes - // is allowed in the "Volumes" field. + // is allowed in the "volumes" field. // +optional AllowedFlexVolumes []AllowedFlexVolume `json:"allowedFlexVolumes,omitempty" protobuf:"bytes,18,rep,name=allowedFlexVolumes"` + // allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. + // Each entry is either a plain sysctl name or ends in "*" in which case it is considered + // as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. + // Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection. + // + // Examples: + // e.g. "foo/*" allows "foo/bar", "foo/baz", etc. + // e.g. "foo.*" allows "foo.bar", "foo.baz", etc. + // +optional + AllowedUnsafeSysctls []string `json:"allowedUnsafeSysctls,omitempty" protobuf:"bytes,19,rep,name=allowedUnsafeSysctls"` + // forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. + // Each entry is either a plain sysctl name or ends in "*" in which case it is considered + // as a prefix of forbidden sysctls. Single * means all sysctls are forbidden. + // + // Examples: + // e.g. "foo/*" forbids "foo/bar", "foo/baz", etc. + // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. + // +optional + ForbiddenSysctls []string `json:"forbiddenSysctls,omitempty" protobuf:"bytes,20,rep,name=forbiddenSysctls"` } -// defines the host volume conditions that will be enabled by a policy +// AllowedHostPath defines the host volume conditions that will be enabled by a policy // for pods to use. It requires the path prefix to be defined. +// Deprecated: use AllowedHostPath from policy API Group instead. type AllowedHostPath struct { - // is the path prefix that the host volume must match. + // pathPrefix is the path prefix that the host volume must match. // It does not support `*`. // Trailing slashes are trimmed when validating the path prefix with a host path. // @@ -956,9 +979,14 @@ type AllowedHostPath struct { // `/foo` would allow `/foo`, `/foo/` and `/foo/bar` // `/foo` would not allow `/food` or `/etc/foo` PathPrefix string `json:"pathPrefix,omitempty" protobuf:"bytes,1,rep,name=pathPrefix"` + + // when set to true, will allow host volumes matching the pathPrefix only if all volume mounts are readOnly. + // +optional + ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,2,opt,name=readOnly"` } -// FS Type gives strong typing to different file systems that are used by volumes. +// FSType gives strong typing to different file systems that are used by volumes. +// Deprecated: use FSType from policy API Group instead. type FSType string var ( @@ -987,13 +1015,15 @@ var ( ) // AllowedFlexVolume represents a single Flexvolume that is allowed to be used. +// Deprecated: use AllowedFlexVolume from policy API Group instead. type AllowedFlexVolume struct { - // Driver is the name of the Flexvolume driver. + // driver is the name of the Flexvolume driver. Driver string `json:"driver" protobuf:"bytes,1,opt,name=driver"` } -// Host Port Range defines a range of host ports that will be enabled by a policy +// HostPortRange defines a range of host ports that will be enabled by a policy // for pods to use. It requires both the start and end to be defined. +// Deprecated: use HostPortRange from policy API Group instead. type HostPortRange struct { // min is the start of the range, inclusive. Min int32 `json:"min" protobuf:"varint,1,opt,name=min"` @@ -1001,9 +1031,10 @@ type HostPortRange struct { Max int32 `json:"max" protobuf:"varint,2,opt,name=max"` } -// SELinux Strategy Options defines the strategy type and any options used to create the strategy. +// SELinuxStrategyOptions defines the strategy type and any options used to create the strategy. +// Deprecated: use SELinuxStrategyOptions from policy API Group instead. type SELinuxStrategyOptions struct { - // type is the strategy that will dictate the allowable labels that may be set. + // rule is the strategy that will dictate the allowable labels that may be set. Rule SELinuxStrategy `json:"rule" protobuf:"bytes,1,opt,name=rule,casttype=SELinuxStrategy"` // seLinuxOptions required to run as; required for MustRunAs // More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ @@ -1013,92 +1044,111 @@ type SELinuxStrategyOptions struct { // SELinuxStrategy denotes strategy types for generating SELinux options for a // Security Context. +// Deprecated: use SELinuxStrategy from policy API Group instead. type SELinuxStrategy string const ( - // container must have SELinux labels of X applied. + // SELinuxStrategyMustRunAs means that container must have SELinux labels of X applied. + // Deprecated: use SELinuxStrategyMustRunAs from policy API Group instead. SELinuxStrategyMustRunAs SELinuxStrategy = "MustRunAs" - // container may make requests for any SELinux context labels. + // SELinuxStrategyRunAsAny means that container may make requests for any SELinux context labels. + // Deprecated: use SELinuxStrategyRunAsAny from policy API Group instead. SELinuxStrategyRunAsAny SELinuxStrategy = "RunAsAny" ) -// Run A sUser Strategy Options defines the strategy type and any options used to create the strategy. +// RunAsUserStrategyOptions defines the strategy type and any options used to create the strategy. +// Deprecated: use RunAsUserStrategyOptions from policy API Group instead. type RunAsUserStrategyOptions struct { - // Rule is the strategy that will dictate the allowable RunAsUser values that may be set. + // rule is the strategy that will dictate the allowable RunAsUser values that may be set. Rule RunAsUserStrategy `json:"rule" protobuf:"bytes,1,opt,name=rule,casttype=RunAsUserStrategy"` - // Ranges are the allowed ranges of uids that may be used. + // ranges are the allowed ranges of uids that may be used. If you would like to force a single uid + // then supply a single range with the same start and end. Required for MustRunAs. // +optional Ranges []IDRange `json:"ranges,omitempty" protobuf:"bytes,2,rep,name=ranges"` } -// ID Range provides a min/max of an allowed range of IDs. +// IDRange provides a min/max of an allowed range of IDs. +// Deprecated: use IDRange from policy API Group instead. type IDRange struct { - // Min is the start of the range, inclusive. + // min is the start of the range, inclusive. Min int64 `json:"min" protobuf:"varint,1,opt,name=min"` - // Max is the end of the range, inclusive. + // max is the end of the range, inclusive. Max int64 `json:"max" protobuf:"varint,2,opt,name=max"` } // RunAsUserStrategy denotes strategy types for generating RunAsUser values for a // Security Context. +// Deprecated: use RunAsUserStrategy from policy API Group instead. type RunAsUserStrategy string const ( - // container must run as a particular uid. + // RunAsUserStrategyMustRunAs means that container must run as a particular uid. + // Deprecated: use RunAsUserStrategyMustRunAs from policy API Group instead. RunAsUserStrategyMustRunAs RunAsUserStrategy = "MustRunAs" - // container must run as a non-root uid + // RunAsUserStrategyMustRunAsNonRoot means that container must run as a non-root uid. + // Deprecated: use RunAsUserStrategyMustRunAsNonRoot from policy API Group instead. RunAsUserStrategyMustRunAsNonRoot RunAsUserStrategy = "MustRunAsNonRoot" - // container may make requests for any uid. + // RunAsUserStrategyRunAsAny means that container may make requests for any uid. + // Deprecated: use RunAsUserStrategyRunAsAny from policy API Group instead. RunAsUserStrategyRunAsAny RunAsUserStrategy = "RunAsAny" ) // FSGroupStrategyOptions defines the strategy type and options used to create the strategy. +// Deprecated: use FSGroupStrategyOptions from policy API Group instead. type FSGroupStrategyOptions struct { - // Rule is the strategy that will dictate what FSGroup is used in the SecurityContext. + // rule is the strategy that will dictate what FSGroup is used in the SecurityContext. // +optional Rule FSGroupStrategyType `json:"rule,omitempty" protobuf:"bytes,1,opt,name=rule,casttype=FSGroupStrategyType"` - // Ranges are the allowed ranges of fs groups. If you would like to force a single - // fs group then supply a single range with the same start and end. + // ranges are the allowed ranges of fs groups. If you would like to force a single + // fs group then supply a single range with the same start and end. Required for MustRunAs. // +optional Ranges []IDRange `json:"ranges,omitempty" protobuf:"bytes,2,rep,name=ranges"` } // FSGroupStrategyType denotes strategy types for generating FSGroup values for a // SecurityContext +// Deprecated: use FSGroupStrategyType from policy API Group instead. type FSGroupStrategyType string const ( - // container must have FSGroup of X applied. + // FSGroupStrategyMustRunAs meant that container must have FSGroup of X applied. + // Deprecated: use FSGroupStrategyMustRunAs from policy API Group instead. FSGroupStrategyMustRunAs FSGroupStrategyType = "MustRunAs" - // container may make requests for any FSGroup labels. + // FSGroupStrategyRunAsAny means that container may make requests for any FSGroup labels. + // Deprecated: use FSGroupStrategyRunAsAny from policy API Group instead. FSGroupStrategyRunAsAny FSGroupStrategyType = "RunAsAny" ) // SupplementalGroupsStrategyOptions defines the strategy type and options used to create the strategy. +// Deprecated: use SupplementalGroupsStrategyOptions from policy API Group instead. type SupplementalGroupsStrategyOptions struct { - // Rule is the strategy that will dictate what supplemental groups is used in the SecurityContext. + // rule is the strategy that will dictate what supplemental groups is used in the SecurityContext. // +optional Rule SupplementalGroupsStrategyType `json:"rule,omitempty" protobuf:"bytes,1,opt,name=rule,casttype=SupplementalGroupsStrategyType"` - // Ranges are the allowed ranges of supplemental groups. If you would like to force a single - // supplemental group then supply a single range with the same start and end. + // ranges are the allowed ranges of supplemental groups. If you would like to force a single + // supplemental group then supply a single range with the same start and end. Required for MustRunAs. // +optional Ranges []IDRange `json:"ranges,omitempty" protobuf:"bytes,2,rep,name=ranges"` } // SupplementalGroupsStrategyType denotes strategy types for determining valid supplemental // groups for a SecurityContext. +// Deprecated: use SupplementalGroupsStrategyType from policy API Group instead. type SupplementalGroupsStrategyType string const ( - // container must run as a particular gid. + // SupplementalGroupsStrategyMustRunAs means that container must run as a particular gid. + // Deprecated: use SupplementalGroupsStrategyMustRunAs from policy API Group instead. SupplementalGroupsStrategyMustRunAs SupplementalGroupsStrategyType = "MustRunAs" - // container may make requests for any gid. + // SupplementalGroupsStrategyRunAsAny means that container may make requests for any gid. + // Deprecated: use SupplementalGroupsStrategyRunAsAny from policy API Group instead. SupplementalGroupsStrategyRunAsAny SupplementalGroupsStrategyType = "RunAsAny" ) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// Pod Security Policy List is a list of PodSecurityPolicy objects. +// PodSecurityPolicyList is a list of PodSecurityPolicy objects. +// Deprecated: use PodSecurityPolicyList from policy API Group instead. type PodSecurityPolicyList struct { metav1.TypeMeta `json:",inline"` // Standard list metadata. @@ -1106,7 +1156,7 @@ type PodSecurityPolicyList struct { // +optional metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // Items is a list of schema objects. + // items is a list of schema objects. Items []PodSecurityPolicy `json:"items" protobuf:"bytes,2,rep,name=items"` } @@ -1256,22 +1306,26 @@ type IPBlock struct { // DEPRECATED 1.9 - This group version of NetworkPolicyPeer is deprecated by networking/v1/NetworkPolicyPeer. type NetworkPolicyPeer struct { - // Exactly one of the following must be specified. - - // This is a label selector which selects Pods in this namespace. - // This field follows standard label selector semantics. - // If present but empty, this selector selects all pods in this namespace. + // This is a label selector which selects Pods. This field follows standard label + // selector semantics; if present but empty, it selects all pods. + // + // If NamespaceSelector is also set, then the NetworkPolicyPeer as a whole selects + // the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. + // Otherwise it selects the Pods matching PodSelector in the policy's own Namespace. // +optional PodSelector *metav1.LabelSelector `json:"podSelector,omitempty" protobuf:"bytes,1,opt,name=podSelector"` - // Selects Namespaces using cluster scoped-labels. This - // matches all pods in all namespaces selected by this label selector. - // This field follows standard label selector semantics. - // If present but empty, this selector selects all namespaces. + // Selects Namespaces using cluster-scoped labels. This field follows standard label + // selector semantics; if present but empty, it selects all namespaces. + // + // If PodSelector is also set, then the NetworkPolicyPeer as a whole selects + // the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. + // Otherwise it selects all Pods in the Namespaces selected by NamespaceSelector. // +optional NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty" protobuf:"bytes,2,opt,name=namespaceSelector"` - // IPBlock defines policy on a particular IPBlock + // IPBlock defines policy on a particular IPBlock. If this field is set then + // neither of the other fields can be. // +optional IPBlock *IPBlock `json:"ipBlock,omitempty" protobuf:"bytes,3,rep,name=ipBlock"` } diff --git a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go index 236d934fa..d261b4247 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,10 +26,10 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_AllowedFlexVolume = map[string]string{ - "": "AllowedFlexVolume represents a single Flexvolume that is allowed to be used.", - "driver": "Driver is the name of the Flexvolume driver.", + "": "AllowedFlexVolume represents a single Flexvolume that is allowed to be used. Deprecated: use AllowedFlexVolume from policy API Group instead.", + "driver": "driver is the name of the Flexvolume driver.", } func (AllowedFlexVolume) SwaggerDoc() map[string]string { @@ -37,8 +37,9 @@ func (AllowedFlexVolume) SwaggerDoc() map[string]string { } var map_AllowedHostPath = map[string]string{ - "": "defines the host volume conditions that will be enabled by a policy for pods to use. It requires the path prefix to be defined.", - "pathPrefix": "is the path prefix that the host volume must match. It does not support `*`. Trailing slashes are trimmed when validating the path prefix with a host path.\n\nExamples: `/foo` would allow `/foo`, `/foo/` and `/foo/bar` `/foo` would not allow `/food` or `/etc/foo`", + "": "AllowedHostPath defines the host volume conditions that will be enabled by a policy for pods to use. It requires the path prefix to be defined. Deprecated: use AllowedHostPath from policy API Group instead.", + "pathPrefix": "pathPrefix is the path prefix that the host volume must match. It does not support `*`. Trailing slashes are trimmed when validating the path prefix with a host path.\n\nExamples: `/foo` would allow `/foo`, `/foo/` and `/foo/bar` `/foo` would not allow `/food` or `/etc/foo`", + "readOnly": "when set to true, will allow host volumes matching the pathPrefix only if all volume mounts are readOnly.", } func (AllowedHostPath) SwaggerDoc() map[string]string { @@ -229,9 +230,9 @@ func (DeploymentStrategy) SwaggerDoc() map[string]string { } var map_FSGroupStrategyOptions = map[string]string{ - "": "FSGroupStrategyOptions defines the strategy type and options used to create the strategy.", - "rule": "Rule is the strategy that will dictate what FSGroup is used in the SecurityContext.", - "ranges": "Ranges are the allowed ranges of fs groups. If you would like to force a single fs group then supply a single range with the same start and end.", + "": "FSGroupStrategyOptions defines the strategy type and options used to create the strategy. Deprecated: use FSGroupStrategyOptions from policy API Group instead.", + "rule": "rule is the strategy that will dictate what FSGroup is used in the SecurityContext.", + "ranges": "ranges are the allowed ranges of fs groups. If you would like to force a single fs group then supply a single range with the same start and end. Required for MustRunAs.", } func (FSGroupStrategyOptions) SwaggerDoc() map[string]string { @@ -258,7 +259,7 @@ func (HTTPIngressRuleValue) SwaggerDoc() map[string]string { } var map_HostPortRange = map[string]string{ - "": "Host Port Range defines a range of host ports that will be enabled by a policy for pods to use. It requires both the start and end to be defined.", + "": "HostPortRange defines a range of host ports that will be enabled by a policy for pods to use. It requires both the start and end to be defined. Deprecated: use HostPortRange from policy API Group instead.", "min": "min is the start of the range, inclusive.", "max": "max is the end of the range, inclusive.", } @@ -268,9 +269,9 @@ func (HostPortRange) SwaggerDoc() map[string]string { } var map_IDRange = map[string]string{ - "": "ID Range provides a min/max of an allowed range of IDs.", - "min": "Min is the start of the range, inclusive.", - "max": "Max is the end of the range, inclusive.", + "": "IDRange provides a min/max of an allowed range of IDs. Deprecated: use IDRange from policy API Group instead.", + "min": "min is the start of the range, inclusive.", + "max": "max is the end of the range, inclusive.", } func (IDRange) SwaggerDoc() map[string]string { @@ -407,9 +408,9 @@ func (NetworkPolicyList) SwaggerDoc() map[string]string { var map_NetworkPolicyPeer = map[string]string{ "": "DEPRECATED 1.9 - This group version of NetworkPolicyPeer is deprecated by networking/v1/NetworkPolicyPeer.", - "podSelector": "This is a label selector which selects Pods in this namespace. This field follows standard label selector semantics. If present but empty, this selector selects all pods in this namespace.", - "namespaceSelector": "Selects Namespaces using cluster scoped-labels. This matches all pods in all namespaces selected by this label selector. This field follows standard label selector semantics. If present but empty, this selector selects all namespaces.", - "ipBlock": "IPBlock defines policy on a particular IPBlock", + "podSelector": "This is a label selector which selects Pods. This field follows standard label selector semantics; if present but empty, it selects all pods.\n\nIf NamespaceSelector is also set, then the NetworkPolicyPeer as a whole selects the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. Otherwise it selects the Pods matching PodSelector in the policy's own Namespace.", + "namespaceSelector": "Selects Namespaces using cluster-scoped labels. This field follows standard label selector semantics; if present but empty, it selects all namespaces.\n\nIf PodSelector is also set, then the NetworkPolicyPeer as a whole selects the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. Otherwise it selects all Pods in the Namespaces selected by NamespaceSelector.", + "ipBlock": "IPBlock defines policy on a particular IPBlock. If this field is set then neither of the other fields can be.", } func (NetworkPolicyPeer) SwaggerDoc() map[string]string { @@ -439,7 +440,7 @@ func (NetworkPolicySpec) SwaggerDoc() map[string]string { } var map_PodSecurityPolicy = map[string]string{ - "": "Pod Security Policy governs the ability to make requests that affect the Security Context that will be applied to a pod and container.", + "": "PodSecurityPolicy governs the ability to make requests that affect the Security Context that will be applied to a pod and container. Deprecated: use PodSecurityPolicy from policy API Group instead.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", "spec": "spec defines the policy enforced.", } @@ -449,9 +450,9 @@ func (PodSecurityPolicy) SwaggerDoc() map[string]string { } var map_PodSecurityPolicyList = map[string]string{ - "": "Pod Security Policy List is a list of PodSecurityPolicy objects.", + "": "PodSecurityPolicyList is a list of PodSecurityPolicy objects. Deprecated: use PodSecurityPolicyList from policy API Group instead.", "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", - "items": "Items is a list of schema objects.", + "items": "items is a list of schema objects.", } func (PodSecurityPolicyList) SwaggerDoc() map[string]string { @@ -459,25 +460,27 @@ func (PodSecurityPolicyList) SwaggerDoc() map[string]string { } var map_PodSecurityPolicySpec = map[string]string{ - "": "Pod Security Policy Spec defines the policy enforced.", + "": "PodSecurityPolicySpec defines the policy enforced. Deprecated: use PodSecurityPolicySpec from policy API Group instead.", "privileged": "privileged determines if a pod can request to be run as privileged.", - "defaultAddCapabilities": "DefaultAddCapabilities is the default set of capabilities that will be added to the container unless the pod spec specifically drops the capability. You may not list a capability in both DefaultAddCapabilities and RequiredDropCapabilities. Capabilities added here are implicitly allowed, and need not be included in the AllowedCapabilities list.", - "requiredDropCapabilities": "RequiredDropCapabilities are the capabilities that will be dropped from the container. These are required to be dropped and cannot be added.", - "allowedCapabilities": "AllowedCapabilities is a list of capabilities that can be requested to add to the container. Capabilities in this field may be added at the pod author's discretion. You must not list a capability in both AllowedCapabilities and RequiredDropCapabilities.", - "volumes": "volumes is a white list of allowed volume plugins. Empty indicates that all plugins may be used.", + "defaultAddCapabilities": "defaultAddCapabilities is the default set of capabilities that will be added to the container unless the pod spec specifically drops the capability. You may not list a capability in both defaultAddCapabilities and requiredDropCapabilities. Capabilities added here are implicitly allowed, and need not be included in the allowedCapabilities list.", + "requiredDropCapabilities": "requiredDropCapabilities are the capabilities that will be dropped from the container. These are required to be dropped and cannot be added.", + "allowedCapabilities": "allowedCapabilities is a list of capabilities that can be requested to add to the container. Capabilities in this field may be added at the pod author's discretion. You must not list a capability in both allowedCapabilities and requiredDropCapabilities.", + "volumes": "volumes is a white list of allowed volume plugins. Empty indicates that no volumes may be used. To allow all volumes you may use '*'.", "hostNetwork": "hostNetwork determines if the policy allows the use of HostNetwork in the pod spec.", "hostPorts": "hostPorts determines which host port ranges are allowed to be exposed.", "hostPID": "hostPID determines if the policy allows the use of HostPID in the pod spec.", "hostIPC": "hostIPC determines if the policy allows the use of HostIPC in the pod spec.", "seLinux": "seLinux is the strategy that will dictate the allowable labels that may be set.", "runAsUser": "runAsUser is the strategy that will dictate the allowable RunAsUser values that may be set.", - "supplementalGroups": "SupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext.", - "fsGroup": "FSGroup is the strategy that will dictate what fs group is used by the SecurityContext.", - "readOnlyRootFilesystem": "ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.", - "defaultAllowPrivilegeEscalation": "DefaultAllowPrivilegeEscalation controls the default setting for whether a process can gain more privileges than its parent process.", - "allowPrivilegeEscalation": "AllowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.", - "allowedHostPaths": "is a white list of allowed host paths. Empty indicates that all host paths may be used.", - "allowedFlexVolumes": "AllowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the \"Volumes\" field.", + "supplementalGroups": "supplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext.", + "fsGroup": "fsGroup is the strategy that will dictate what fs group is used by the SecurityContext.", + "readOnlyRootFilesystem": "readOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.", + "defaultAllowPrivilegeEscalation": "defaultAllowPrivilegeEscalation controls the default setting for whether a process can gain more privileges than its parent process.", + "allowPrivilegeEscalation": "allowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.", + "allowedHostPaths": "allowedHostPaths is a white list of allowed host paths. Empty indicates that all host paths may be used.", + "allowedFlexVolumes": "allowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the \"volumes\" field.", + "allowedUnsafeSysctls": "allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection.\n\nExamples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc.", + "forbiddenSysctls": "forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden.\n\nExamples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc.", } func (PodSecurityPolicySpec) SwaggerDoc() map[string]string { @@ -581,9 +584,9 @@ func (RollingUpdateDeployment) SwaggerDoc() map[string]string { } var map_RunAsUserStrategyOptions = map[string]string{ - "": "Run A sUser Strategy Options defines the strategy type and any options used to create the strategy.", - "rule": "Rule is the strategy that will dictate the allowable RunAsUser values that may be set.", - "ranges": "Ranges are the allowed ranges of uids that may be used.", + "": "RunAsUserStrategyOptions defines the strategy type and any options used to create the strategy. Deprecated: use RunAsUserStrategyOptions from policy API Group instead.", + "rule": "rule is the strategy that will dictate the allowable RunAsUser values that may be set.", + "ranges": "ranges are the allowed ranges of uids that may be used. If you would like to force a single uid then supply a single range with the same start and end. Required for MustRunAs.", } func (RunAsUserStrategyOptions) SwaggerDoc() map[string]string { @@ -591,8 +594,8 @@ func (RunAsUserStrategyOptions) SwaggerDoc() map[string]string { } var map_SELinuxStrategyOptions = map[string]string{ - "": "SELinux Strategy Options defines the strategy type and any options used to create the strategy.", - "rule": "type is the strategy that will dictate the allowable labels that may be set.", + "": "SELinuxStrategyOptions defines the strategy type and any options used to create the strategy. Deprecated: use SELinuxStrategyOptions from policy API Group instead.", + "rule": "rule is the strategy that will dictate the allowable labels that may be set.", "seLinuxOptions": "seLinuxOptions required to run as; required for MustRunAs More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/", } @@ -632,9 +635,9 @@ func (ScaleStatus) SwaggerDoc() map[string]string { } var map_SupplementalGroupsStrategyOptions = map[string]string{ - "": "SupplementalGroupsStrategyOptions defines the strategy type and options used to create the strategy.", - "rule": "Rule is the strategy that will dictate what supplemental groups is used in the SecurityContext.", - "ranges": "Ranges are the allowed ranges of supplemental groups. If you would like to force a single supplemental group then supply a single range with the same start and end.", + "": "SupplementalGroupsStrategyOptions defines the strategy type and options used to create the strategy. Deprecated: use SupplementalGroupsStrategyOptions from policy API Group instead.", + "rule": "rule is the strategy that will dictate what supplemental groups is used in the SecurityContext.", + "ranges": "ranges are the allowed ranges of supplemental groups. If you would like to force a single supplemental group then supply a single range with the same start and end. Required for MustRunAs.", } func (SupplementalGroupsStrategyOptions) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go index de1970c8f..8ec2b1ff7 100644 --- a/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -1204,6 +1204,16 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { *out = make([]AllowedFlexVolume, len(*in)) copy(*out, *in) } + if in.AllowedUnsafeSysctls != nil { + in, out := &in.AllowedUnsafeSysctls, &out.AllowedUnsafeSysctls + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ForbiddenSysctls != nil { + in, out := &in.ForbiddenSysctls, &out.ForbiddenSysctls + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD b/vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD deleted file mode 100644 index 455205f7a..000000000 --- a/vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/imagepolicy/v1alpha1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.pb.go b/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.pb.go index f521979b7..fdd959e37 100644 --- a/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.proto b/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.proto index a19967cbe..24ea81d4e 100644 --- a/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/imagepolicy/v1alpha1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/imagepolicy/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/imagepolicy/v1alpha1/types_swagger_doc_generated.go index f4b26f5e8..129d63d08 100644 --- a/vendor/k8s.io/api/imagepolicy/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/imagepolicy/v1alpha1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1alpha1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_ImageReview = map[string]string{ "": "ImageReview checks if the set of images in a pod are allowed.", "spec": "Spec holds information about the pod being evaluated", diff --git a/vendor/k8s.io/api/imagepolicy/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/imagepolicy/v1alpha1/zz_generated.deepcopy.go index 50f314886..a41d89700 100644 --- a/vendor/k8s.io/api/imagepolicy/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/imagepolicy/v1alpha1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/networking/v1/BUILD b/vendor/k8s.io/api/networking/v1/BUILD deleted file mode 100644 index beb3afcaf..000000000 --- a/vendor/k8s.io/api/networking/v1/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/networking/v1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/networking/v1/generated.pb.go b/vendor/k8s.io/api/networking/v1/generated.pb.go index 05aaf1d9a..089d31963 100644 --- a/vendor/k8s.io/api/networking/v1/generated.pb.go +++ b/vendor/k8s.io/api/networking/v1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/networking/v1/generated.proto b/vendor/k8s.io/api/networking/v1/generated.proto index 06365ebe3..f52343cf6 100644 --- a/vendor/k8s.io/api/networking/v1/generated.proto +++ b/vendor/k8s.io/api/networking/v1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -111,22 +111,29 @@ message NetworkPolicyList { repeated NetworkPolicy items = 2; } -// NetworkPolicyPeer describes a peer to allow traffic from. Exactly one of its fields -// must be specified. +// NetworkPolicyPeer describes a peer to allow traffic from. Only certain combinations of +// fields are allowed message NetworkPolicyPeer { - // This is a label selector which selects Pods in this namespace. This field - // follows standard label selector semantics. If present but empty, this selector - // selects all pods in this namespace. + // This is a label selector which selects Pods. This field follows standard label + // selector semantics; if present but empty, it selects all pods. + // + // If NamespaceSelector is also set, then the NetworkPolicyPeer as a whole selects + // the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. + // Otherwise it selects the Pods matching PodSelector in the policy's own Namespace. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector podSelector = 1; - // Selects Namespaces using cluster scoped-labels. This matches all pods in all - // namespaces selected by this label selector. This field follows standard label - // selector semantics. If present but empty, this selector selects all namespaces. + // Selects Namespaces using cluster-scoped labels. This field follows standard label + // selector semantics; if present but empty, it selects all namespaces. + // + // If PodSelector is also set, then the NetworkPolicyPeer as a whole selects + // the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. + // Otherwise it selects all Pods in the Namespaces selected by NamespaceSelector. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelector namespaceSelector = 2; - // IPBlock defines policy on a particular IPBlock + // IPBlock defines policy on a particular IPBlock. If this field is set then + // neither of the other fields can be. // +optional optional IPBlock ipBlock = 3; } diff --git a/vendor/k8s.io/api/networking/v1/types.go b/vendor/k8s.io/api/networking/v1/types.go index 57bc8005e..e1b81fdc7 100644 --- a/vendor/k8s.io/api/networking/v1/types.go +++ b/vendor/k8s.io/api/networking/v1/types.go @@ -161,22 +161,29 @@ type IPBlock struct { Except []string `json:"except,omitempty" protobuf:"bytes,2,rep,name=except"` } -// NetworkPolicyPeer describes a peer to allow traffic from. Exactly one of its fields -// must be specified. +// NetworkPolicyPeer describes a peer to allow traffic from. Only certain combinations of +// fields are allowed type NetworkPolicyPeer struct { - // This is a label selector which selects Pods in this namespace. This field - // follows standard label selector semantics. If present but empty, this selector - // selects all pods in this namespace. + // This is a label selector which selects Pods. This field follows standard label + // selector semantics; if present but empty, it selects all pods. + // + // If NamespaceSelector is also set, then the NetworkPolicyPeer as a whole selects + // the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. + // Otherwise it selects the Pods matching PodSelector in the policy's own Namespace. // +optional PodSelector *metav1.LabelSelector `json:"podSelector,omitempty" protobuf:"bytes,1,opt,name=podSelector"` - // Selects Namespaces using cluster scoped-labels. This matches all pods in all - // namespaces selected by this label selector. This field follows standard label - // selector semantics. If present but empty, this selector selects all namespaces. + // Selects Namespaces using cluster-scoped labels. This field follows standard label + // selector semantics; if present but empty, it selects all namespaces. + // + // If PodSelector is also set, then the NetworkPolicyPeer as a whole selects + // the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. + // Otherwise it selects all Pods in the Namespaces selected by NamespaceSelector. // +optional NamespaceSelector *metav1.LabelSelector `json:"namespaceSelector,omitempty" protobuf:"bytes,2,opt,name=namespaceSelector"` - // IPBlock defines policy on a particular IPBlock + // IPBlock defines policy on a particular IPBlock. If this field is set then + // neither of the other fields can be. // +optional IPBlock *IPBlock `json:"ipBlock,omitempty" protobuf:"bytes,3,rep,name=ipBlock"` } diff --git a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go index ad0bafeac..af2553a9d 100644 --- a/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_IPBlock = map[string]string{ "": "IPBlock describes a particular CIDR (Ex. \"192.168.1.1/24\") that is allowed to the pods matched by a NetworkPolicySpec's podSelector. The except entry describes CIDRs that should not be included within this rule.", "cidr": "CIDR is a string representing the IP Block Valid examples are \"192.168.1.1/24\"", @@ -78,10 +78,10 @@ func (NetworkPolicyList) SwaggerDoc() map[string]string { } var map_NetworkPolicyPeer = map[string]string{ - "": "NetworkPolicyPeer describes a peer to allow traffic from. Exactly one of its fields must be specified.", - "podSelector": "This is a label selector which selects Pods in this namespace. This field follows standard label selector semantics. If present but empty, this selector selects all pods in this namespace.", - "namespaceSelector": "Selects Namespaces using cluster scoped-labels. This matches all pods in all namespaces selected by this label selector. This field follows standard label selector semantics. If present but empty, this selector selects all namespaces.", - "ipBlock": "IPBlock defines policy on a particular IPBlock", + "": "NetworkPolicyPeer describes a peer to allow traffic from. Only certain combinations of fields are allowed", + "podSelector": "This is a label selector which selects Pods. This field follows standard label selector semantics; if present but empty, it selects all pods.\n\nIf NamespaceSelector is also set, then the NetworkPolicyPeer as a whole selects the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. Otherwise it selects the Pods matching PodSelector in the policy's own Namespace.", + "namespaceSelector": "Selects Namespaces using cluster-scoped labels. This field follows standard label selector semantics; if present but empty, it selects all namespaces.\n\nIf PodSelector is also set, then the NetworkPolicyPeer as a whole selects the Pods matching PodSelector in the Namespaces selected by NamespaceSelector. Otherwise it selects all Pods in the Namespaces selected by NamespaceSelector.", + "ipBlock": "IPBlock defines policy on a particular IPBlock. If this field is set then neither of the other fields can be.", } func (NetworkPolicyPeer) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go index 8a7c1530e..0037638a8 100644 --- a/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/policy/v1beta1/BUILD b/vendor/k8s.io/api/policy/v1beta1/BUILD deleted file mode 100644 index d55d68e5d..000000000 --- a/vendor/k8s.io/api/policy/v1beta1/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/policy/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/policy/v1beta1/generated.pb.go b/vendor/k8s.io/api/policy/v1beta1/generated.pb.go index 24bbe8975..505fb0e03 100644 --- a/vendor/k8s.io/api/policy/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/policy/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -200,6 +200,14 @@ func (m *AllowedHostPath) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.PathPrefix))) i += copy(dAtA[i:], m.PathPrefix) + dAtA[i] = 0x10 + i++ + if m.ReadOnly { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ return i, nil } @@ -794,6 +802,40 @@ func (m *PodSecurityPolicySpec) MarshalTo(dAtA []byte) (int, error) { i += n } } + if len(m.AllowedUnsafeSysctls) > 0 { + for _, s := range m.AllowedUnsafeSysctls { + dAtA[i] = 0x9a + i++ + dAtA[i] = 0x1 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.ForbiddenSysctls) > 0 { + for _, s := range m.ForbiddenSysctls { + dAtA[i] = 0xa2 + i++ + dAtA[i] = 0x1 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -937,6 +979,7 @@ func (m *AllowedHostPath) Size() (n int) { _ = l l = len(m.PathPrefix) n += 1 + l + sovGenerated(uint64(l)) + n += 2 return n } @@ -1134,6 +1177,18 @@ func (m *PodSecurityPolicySpec) Size() (n int) { n += 2 + l + sovGenerated(uint64(l)) } } + if len(m.AllowedUnsafeSysctls) > 0 { + for _, s := range m.AllowedUnsafeSysctls { + l = len(s) + n += 2 + l + sovGenerated(uint64(l)) + } + } + if len(m.ForbiddenSysctls) > 0 { + for _, s := range m.ForbiddenSysctls { + l = len(s) + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -1206,6 +1261,7 @@ func (this *AllowedHostPath) String() string { } s := strings.Join([]string{`&AllowedHostPath{`, `PathPrefix:` + fmt.Sprintf("%v", this.PathPrefix) + `,`, + `ReadOnly:` + fmt.Sprintf("%v", this.ReadOnly) + `,`, `}`, }, "") return s @@ -1359,6 +1415,8 @@ func (this *PodSecurityPolicySpec) String() string { `AllowPrivilegeEscalation:` + valueToStringGenerated(this.AllowPrivilegeEscalation) + `,`, `AllowedHostPaths:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedHostPaths), "AllowedHostPath", "AllowedHostPath", 1), `&`, ``, 1) + `,`, `AllowedFlexVolumes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedFlexVolumes), "AllowedFlexVolume", "AllowedFlexVolume", 1), `&`, ``, 1) + `,`, + `AllowedUnsafeSysctls:` + fmt.Sprintf("%v", this.AllowedUnsafeSysctls) + `,`, + `ForbiddenSysctls:` + fmt.Sprintf("%v", this.ForbiddenSysctls) + `,`, `}`, }, "") return s @@ -1541,6 +1599,26 @@ func (m *AllowedHostPath) Unmarshal(dAtA []byte) error { } m.PathPrefix = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadOnly", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.ReadOnly = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3348,6 +3426,64 @@ func (m *PodSecurityPolicySpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 19: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedUnsafeSysctls", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedUnsafeSysctls = append(m.AllowedUnsafeSysctls, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ForbiddenSysctls", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ForbiddenSysctls = append(m.ForbiddenSysctls, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3811,106 +3947,110 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1605 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x4f, 0x6f, 0x1b, 0xb9, - 0x15, 0xf7, 0x58, 0xb6, 0x65, 0xd3, 0xf2, 0x3f, 0xba, 0x76, 0x27, 0x46, 0x23, 0x35, 0x0a, 0x50, - 0xa4, 0x41, 0x33, 0x8a, 0x9d, 0xa4, 0x35, 0x9a, 0xb6, 0xa8, 0xc7, 0xf2, 0xbf, 0x20, 0xae, 0x55, - 0x2a, 0x09, 0xda, 0x22, 0x2d, 0x4a, 0x69, 0x68, 0x89, 0xf1, 0x68, 0x66, 0x4a, 0x72, 0x14, 0xe9, - 0xd6, 0x43, 0x0f, 0x3d, 0xf6, 0x0b, 0xf4, 0x13, 0x14, 0x3d, 0xed, 0x97, 0xf0, 0x02, 0x8b, 0x45, - 0x8e, 0xc1, 0x1e, 0x84, 0x8d, 0x16, 0xfb, 0x25, 0x72, 0x5a, 0x0c, 0xc5, 0x91, 0x34, 0x33, 0x92, - 0x1c, 0x07, 0x48, 0x6e, 0x1a, 0xbe, 0xdf, 0xef, 0xf7, 0x1e, 0x1f, 0xc9, 0xc7, 0x47, 0x01, 0xf3, - 0x62, 0x97, 0x1b, 0xd4, 0x2d, 0x5c, 0xf8, 0x15, 0xc2, 0x1c, 0x22, 0x08, 0x2f, 0x34, 0x89, 0x63, - 0xb9, 0xac, 0xa0, 0x0c, 0xd8, 0xa3, 0x05, 0xcf, 0xb5, 0x69, 0xb5, 0x5d, 0x68, 0x6e, 0x57, 0x88, - 0xc0, 0xdb, 0x85, 0x1a, 0x71, 0x08, 0xc3, 0x82, 0x58, 0x86, 0xc7, 0x5c, 0xe1, 0xc2, 0x1b, 0x3d, - 0xa8, 0x81, 0x3d, 0x6a, 0xf4, 0xa0, 0x86, 0x82, 0x6e, 0xdd, 0xab, 0x51, 0x51, 0xf7, 0x2b, 0x46, - 0xd5, 0x6d, 0x14, 0x6a, 0x6e, 0xcd, 0x2d, 0x48, 0x46, 0xc5, 0x3f, 0x97, 0x5f, 0xf2, 0x43, 0xfe, - 0xea, 0x29, 0x6d, 0xe5, 0x87, 0x9c, 0x56, 0x5d, 0x46, 0x0a, 0xcd, 0x84, 0xb7, 0xad, 0x87, 0x03, - 0x4c, 0x03, 0x57, 0xeb, 0xd4, 0x21, 0xac, 0x5d, 0xf0, 0x2e, 0x6a, 0xc1, 0x00, 0x2f, 0x34, 0x88, - 0xc0, 0xa3, 0x58, 0x85, 0x71, 0x2c, 0xe6, 0x3b, 0x82, 0x36, 0x48, 0x82, 0xf0, 0xcb, 0xab, 0x08, - 0xbc, 0x5a, 0x27, 0x0d, 0x9c, 0xe0, 0x3d, 0x18, 0xc7, 0xf3, 0x05, 0xb5, 0x0b, 0xd4, 0x11, 0x5c, - 0xb0, 0x38, 0x29, 0xff, 0x18, 0xac, 0xed, 0xd9, 0xb6, 0xfb, 0x9a, 0x58, 0x87, 0x36, 0x69, 0xbd, - 0x70, 0x6d, 0xbf, 0x41, 0xe0, 0xcf, 0xc0, 0x9c, 0xc5, 0x68, 0x93, 0x30, 0x5d, 0xfb, 0xa9, 0x76, - 0x67, 0xc1, 0x5c, 0xbe, 0xec, 0xe4, 0xa6, 0xba, 0x9d, 0xdc, 0x5c, 0x51, 0x8e, 0x22, 0x65, 0xcd, - 0x1f, 0x80, 0x15, 0x45, 0x3e, 0x76, 0xb9, 0x28, 0x61, 0x51, 0x87, 0x3b, 0x00, 0x78, 0x58, 0xd4, - 0x4b, 0x8c, 0x9c, 0xd3, 0x96, 0xa2, 0x43, 0x45, 0x07, 0xa5, 0xbe, 0x05, 0x0d, 0xa1, 0xf2, 0xdf, - 0x68, 0x60, 0xfe, 0xa0, 0x49, 0xab, 0x82, 0xba, 0x0e, 0xfc, 0x3b, 0x98, 0x0f, 0x32, 0x69, 0x61, - 0x81, 0x25, 0x7d, 0x71, 0xe7, 0xbe, 0x31, 0x58, 0xe5, 0xfe, 0xc4, 0x0c, 0xef, 0xa2, 0x16, 0x0c, - 0x70, 0x23, 0x40, 0x1b, 0xcd, 0x6d, 0xe3, 0xac, 0xf2, 0x8a, 0x54, 0xc5, 0x29, 0x11, 0x78, 0xe0, - 0x70, 0x30, 0x86, 0xfa, 0xaa, 0xd0, 0x06, 0x4b, 0x16, 0xb1, 0x89, 0x20, 0x67, 0x5e, 0xe0, 0x91, - 0xeb, 0xd3, 0xd2, 0xcd, 0x83, 0x0f, 0x73, 0x53, 0x1c, 0xa6, 0x9a, 0x6b, 0xdd, 0x4e, 0x6e, 0x29, - 0x32, 0x84, 0xa2, 0xe2, 0xf9, 0xff, 0x6a, 0x60, 0xf3, 0xb0, 0x7c, 0xc4, 0x5c, 0xdf, 0x2b, 0x8b, - 0x20, 0xf3, 0xb5, 0xb6, 0x32, 0xc1, 0x5f, 0x81, 0x19, 0xe6, 0xdb, 0x44, 0x65, 0xe9, 0xb6, 0x0a, - 0x7a, 0x06, 0xf9, 0x36, 0x79, 0xdf, 0xc9, 0xad, 0xc7, 0x58, 0xcf, 0xda, 0x1e, 0x41, 0x92, 0x00, - 0x9f, 0x80, 0x39, 0x86, 0x9d, 0x1a, 0x09, 0x42, 0x4f, 0xdd, 0x59, 0xdc, 0xc9, 0x1b, 0x63, 0xcf, - 0x81, 0x71, 0x52, 0x44, 0x01, 0x74, 0xb0, 0x86, 0xf2, 0x93, 0x23, 0xa5, 0x90, 0x3f, 0x05, 0x4b, - 0x72, 0xf1, 0x5c, 0x26, 0xa4, 0x05, 0xde, 0x04, 0xa9, 0x06, 0x75, 0x64, 0x50, 0xb3, 0xe6, 0xa2, - 0x62, 0xa5, 0x4e, 0xa9, 0x83, 0x82, 0x71, 0x69, 0xc6, 0x2d, 0x99, 0xb3, 0x61, 0x33, 0x6e, 0xa1, - 0x60, 0x3c, 0x7f, 0x04, 0xd2, 0xca, 0xe3, 0xb0, 0x50, 0x6a, 0xb2, 0x50, 0x6a, 0x84, 0xd0, 0xff, - 0xa6, 0xc1, 0x7a, 0xc9, 0xb5, 0x8a, 0x94, 0x33, 0x5f, 0xe6, 0xcb, 0xf4, 0xad, 0x1a, 0x11, 0x9f, - 0x61, 0x7f, 0x3c, 0x03, 0x33, 0xdc, 0x23, 0x55, 0xb5, 0x2d, 0x76, 0x26, 0xe4, 0x76, 0x44, 0x7c, - 0x65, 0x8f, 0x54, 0xcd, 0x4c, 0xb8, 0x94, 0xc1, 0x17, 0x92, 0x6a, 0xf0, 0x25, 0x98, 0xe3, 0x02, - 0x0b, 0x9f, 0xeb, 0x29, 0xa9, 0xfb, 0xf0, 0x9a, 0xba, 0x92, 0x3b, 0x58, 0xc5, 0xde, 0x37, 0x52, - 0x9a, 0xf9, 0xaf, 0x34, 0xf0, 0xe3, 0x11, 0xac, 0xa7, 0x94, 0x0b, 0xf8, 0x32, 0x91, 0x31, 0xe3, - 0xc3, 0x32, 0x16, 0xb0, 0x65, 0xbe, 0x56, 0x95, 0xd7, 0xf9, 0x70, 0x64, 0x28, 0x5b, 0x65, 0x30, - 0x4b, 0x05, 0x69, 0x84, 0x5b, 0xd1, 0xb8, 0xde, 0xb4, 0xcc, 0x25, 0x25, 0x3d, 0x7b, 0x12, 0x88, - 0xa0, 0x9e, 0x56, 0xfe, 0xeb, 0xe9, 0x91, 0xd3, 0x09, 0xd2, 0x09, 0xcf, 0x41, 0xa6, 0x41, 0x9d, - 0xbd, 0x26, 0xa6, 0x36, 0xae, 0xa8, 0xd3, 0x33, 0x69, 0x13, 0x04, 0xd5, 0xcf, 0xe8, 0x55, 0x3f, - 0xe3, 0xc4, 0x11, 0x67, 0xac, 0x2c, 0x18, 0x75, 0x6a, 0xe6, 0x6a, 0xb7, 0x93, 0xcb, 0x9c, 0x0e, - 0x29, 0xa1, 0x88, 0x2e, 0xfc, 0x2b, 0x98, 0xe7, 0xc4, 0x26, 0x55, 0xe1, 0xb2, 0xeb, 0x55, 0x88, - 0xa7, 0xb8, 0x42, 0xec, 0xb2, 0xa2, 0x9a, 0x99, 0x20, 0x6f, 0xe1, 0x17, 0xea, 0x4b, 0x42, 0x1b, - 0x2c, 0x37, 0x70, 0xeb, 0xb9, 0x83, 0xfb, 0x13, 0x49, 0x7d, 0xe4, 0x44, 0x60, 0xb7, 0x93, 0x5b, - 0x3e, 0x8d, 0x68, 0xa1, 0x98, 0x76, 0xfe, 0xfb, 0x19, 0x70, 0x63, 0xec, 0xae, 0x82, 0x4f, 0x00, - 0x74, 0x2b, 0x9c, 0xb0, 0x26, 0xb1, 0x8e, 0x7a, 0xf7, 0x03, 0x75, 0xc3, 0x83, 0xbb, 0xa5, 0x16, - 0x08, 0x9e, 0x25, 0x10, 0x68, 0x04, 0x0b, 0xfe, 0x4b, 0x03, 0x4b, 0x56, 0xcf, 0x0d, 0xb1, 0x4a, - 0xae, 0x15, 0x6e, 0x8c, 0xa3, 0x8f, 0xd9, 0xef, 0x46, 0x71, 0x58, 0xe9, 0xc0, 0x11, 0xac, 0x6d, - 0x6e, 0xa8, 0x80, 0x96, 0x22, 0x36, 0x14, 0x75, 0x0a, 0x4f, 0x01, 0xb4, 0xfa, 0x92, 0x5c, 0xdd, - 0x52, 0x32, 0xc5, 0xb3, 0xe6, 0x4d, 0xa5, 0xb0, 0x11, 0xf1, 0x1b, 0x82, 0xd0, 0x08, 0x22, 0xfc, - 0x1d, 0x58, 0xae, 0xfa, 0x8c, 0x11, 0x47, 0x1c, 0x13, 0x6c, 0x8b, 0x7a, 0x5b, 0x9f, 0x91, 0x52, - 0x9b, 0x4a, 0x6a, 0x79, 0x3f, 0x62, 0x45, 0x31, 0x74, 0xc0, 0xb7, 0x08, 0xa7, 0x8c, 0x58, 0x21, - 0x7f, 0x36, 0xca, 0x2f, 0x46, 0xac, 0x28, 0x86, 0x86, 0xbb, 0x20, 0x43, 0x5a, 0x1e, 0xa9, 0x86, - 0x39, 0x9d, 0x93, 0xec, 0x1f, 0x29, 0x76, 0xe6, 0x60, 0xc8, 0x86, 0x22, 0xc8, 0x2d, 0x1b, 0xc0, - 0x64, 0x12, 0xe1, 0x2a, 0x48, 0x5d, 0x90, 0x76, 0xef, 0xe6, 0x41, 0xc1, 0x4f, 0xf8, 0x7b, 0x30, - 0xdb, 0xc4, 0xb6, 0x4f, 0xd4, 0x5e, 0xbf, 0xfb, 0x61, 0x7b, 0xfd, 0x19, 0x6d, 0x10, 0xd4, 0x23, - 0xfe, 0x7a, 0x7a, 0x57, 0xcb, 0x7f, 0xa9, 0x81, 0xb5, 0x92, 0x6b, 0x95, 0x49, 0xd5, 0x67, 0x54, - 0xb4, 0x4b, 0x72, 0x9d, 0x3f, 0x43, 0xcd, 0x46, 0x91, 0x9a, 0x7d, 0x7f, 0xf2, 0x5e, 0x8b, 0x46, - 0x37, 0xae, 0x62, 0xe7, 0x2f, 0x35, 0xb0, 0x91, 0x40, 0x7f, 0x86, 0x8a, 0xfa, 0xc7, 0x68, 0x45, - 0xfd, 0xc5, 0x75, 0x26, 0x33, 0xa6, 0x9e, 0xbe, 0xcf, 0x8c, 0x98, 0x8a, 0xac, 0xa6, 0x41, 0xbf, - 0xc6, 0x68, 0x93, 0xda, 0xa4, 0x46, 0x2c, 0x39, 0x99, 0xf9, 0xa1, 0x7e, 0xad, 0x6f, 0x41, 0x43, - 0x28, 0xc8, 0xc1, 0xa6, 0x45, 0xce, 0xb1, 0x6f, 0x8b, 0x3d, 0xcb, 0xda, 0xc7, 0x1e, 0xae, 0x50, - 0x9b, 0x0a, 0xaa, 0xda, 0x91, 0x05, 0xf3, 0x71, 0xb7, 0x93, 0xdb, 0x2c, 0x8e, 0x44, 0xbc, 0xef, - 0xe4, 0x6e, 0x26, 0x3b, 0x6d, 0xa3, 0x0f, 0x69, 0xa3, 0x31, 0xd2, 0xb0, 0x0d, 0x74, 0x46, 0xfe, - 0xe1, 0x07, 0x87, 0xa2, 0xc8, 0x5c, 0x2f, 0xe2, 0x36, 0x25, 0xdd, 0xfe, 0xb6, 0xdb, 0xc9, 0xe9, - 0x68, 0x0c, 0xe6, 0x6a, 0xc7, 0x63, 0xe5, 0xe1, 0x2b, 0xb0, 0x8e, 0x7b, 0x75, 0x20, 0xe2, 0x75, - 0x46, 0x7a, 0xdd, 0xed, 0x76, 0x72, 0xeb, 0x7b, 0x49, 0xf3, 0xd5, 0x0e, 0x47, 0x89, 0xc2, 0x02, - 0x48, 0x37, 0x65, 0x13, 0xce, 0xf5, 0x59, 0xa9, 0xbf, 0xd1, 0xed, 0xe4, 0xd2, 0xbd, 0xbe, 0x3c, - 0xd0, 0x9c, 0x3b, 0x2c, 0xcb, 0x46, 0x30, 0x44, 0xc1, 0x47, 0x60, 0xb1, 0xee, 0x72, 0xf1, 0x07, - 0x22, 0x5e, 0xbb, 0xec, 0x42, 0x16, 0x86, 0x79, 0x73, 0x5d, 0xad, 0xe0, 0xe2, 0xf1, 0xc0, 0x84, - 0x86, 0x71, 0xf0, 0xcf, 0x60, 0xa1, 0xae, 0xda, 0x3e, 0xae, 0xa7, 0xe5, 0x46, 0xbb, 0x33, 0x61, - 0xa3, 0x45, 0x5a, 0x44, 0x73, 0x4d, 0xc9, 0x2f, 0x84, 0xc3, 0x1c, 0x0d, 0xd4, 0xe0, 0xcf, 0x41, - 0x5a, 0x7e, 0x9c, 0x14, 0xf5, 0x79, 0x19, 0xcd, 0x8a, 0x82, 0xa7, 0x8f, 0x7b, 0xc3, 0x28, 0xb4, - 0x87, 0xd0, 0x93, 0xd2, 0xbe, 0xbe, 0x90, 0x84, 0x9e, 0x94, 0xf6, 0x51, 0x68, 0x87, 0x2f, 0x41, - 0x9a, 0x93, 0xa7, 0xd4, 0xf1, 0x5b, 0x3a, 0x90, 0x47, 0x6e, 0x7b, 0x42, 0xb8, 0xe5, 0x03, 0x89, - 0x8c, 0x35, 0xdc, 0x03, 0x75, 0x65, 0x47, 0xa1, 0x24, 0xb4, 0xc0, 0x02, 0xf3, 0x9d, 0x3d, 0xfe, - 0x9c, 0x13, 0xa6, 0x2f, 0x26, 0x6e, 0xfb, 0xb8, 0x3e, 0x0a, 0xb1, 0x71, 0x0f, 0xfd, 0xcc, 0xf4, - 0x11, 0x68, 0x20, 0x0c, 0xff, 0xad, 0x01, 0xc8, 0x7d, 0xcf, 0xb3, 0x49, 0x83, 0x38, 0x02, 0xdb, - 0xb2, 0xbf, 0xe7, 0x7a, 0x46, 0xfa, 0xfb, 0xcd, 0xa4, 0xf9, 0x24, 0x48, 0x71, 0xc7, 0xfd, 0x6b, - 0x3a, 0x09, 0x45, 0x23, 0x7c, 0x06, 0xe9, 0x3c, 0xe7, 0xf2, 0xb7, 0xbe, 0x74, 0x65, 0x3a, 0x47, - 0xbf, 0x5f, 0x06, 0xe9, 0x54, 0x76, 0x14, 0x4a, 0xc2, 0x17, 0x60, 0x93, 0x11, 0x6c, 0x9d, 0x39, - 0x76, 0x1b, 0xb9, 0xae, 0x38, 0xa4, 0x36, 0xe1, 0x6d, 0x2e, 0x48, 0x43, 0x5f, 0x96, 0xcb, 0x9c, - 0x55, 0xcc, 0x4d, 0x34, 0x12, 0x85, 0xc6, 0xb0, 0x61, 0x03, 0xe4, 0xc2, 0xf2, 0x10, 0x9c, 0x9d, - 0x7e, 0x7d, 0x3a, 0xe0, 0x55, 0x6c, 0xf7, 0xba, 0x96, 0x15, 0xe9, 0xe0, 0x76, 0xb7, 0x93, 0xcb, - 0x15, 0x27, 0x43, 0xd1, 0x55, 0x5a, 0xf0, 0x4f, 0x40, 0xc7, 0xe3, 0xfc, 0xac, 0x4a, 0x3f, 0x3f, - 0x09, 0x6a, 0xce, 0x58, 0x07, 0x63, 0xd9, 0xd0, 0x03, 0xab, 0x38, 0xfa, 0x72, 0xe6, 0xfa, 0x9a, - 0x3c, 0x85, 0x77, 0x27, 0xac, 0x43, 0xec, 0xb1, 0x6d, 0xea, 0x2a, 0x8d, 0xab, 0x31, 0x03, 0x47, - 0x09, 0x75, 0xd8, 0x02, 0x10, 0xc7, 0x1f, 0xfa, 0x5c, 0x87, 0x57, 0x5e, 0x31, 0x89, 0x7f, 0x07, - 0x06, 0x5b, 0x2d, 0x61, 0xe2, 0x68, 0x84, 0x8f, 0xe0, 0x05, 0xac, 0x8f, 0x3b, 0x30, 0xf0, 0x51, - 0xe4, 0x0d, 0x7c, 0x2b, 0xf6, 0x06, 0x5e, 0x4b, 0xf0, 0x3e, 0xc1, 0x0b, 0xf8, 0xff, 0x1a, 0xd8, - 0x1c, 0x5d, 0x30, 0xe0, 0x83, 0x48, 0x74, 0xb9, 0x58, 0x74, 0x2b, 0x31, 0x96, 0x8a, 0xed, 0x6f, - 0x60, 0x59, 0x95, 0x95, 0xe8, 0x1f, 0x0c, 0x91, 0x18, 0x83, 0xfb, 0x20, 0xe8, 0x08, 0x94, 0x44, - 0x78, 0xa4, 0x64, 0x2f, 0x1f, 0x1d, 0x43, 0x31, 0xb5, 0xfc, 0x17, 0x1a, 0xb8, 0x75, 0x65, 0x41, - 0x80, 0x66, 0x24, 0x74, 0x23, 0x16, 0x7a, 0x76, 0xbc, 0xc0, 0xa7, 0xf9, 0x9f, 0xc1, 0xbc, 0x77, - 0xf9, 0x2e, 0x3b, 0xf5, 0xe6, 0x5d, 0x76, 0xea, 0xed, 0xbb, 0xec, 0xd4, 0x3f, 0xbb, 0x59, 0xed, - 0xb2, 0x9b, 0xd5, 0xde, 0x74, 0xb3, 0xda, 0xdb, 0x6e, 0x56, 0xfb, 0xb6, 0x9b, 0xd5, 0xfe, 0xf3, - 0x5d, 0x76, 0xea, 0x2f, 0x69, 0x25, 0xf7, 0x43, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x7d, 0x0b, - 0x1d, 0x1e, 0x14, 0x00, 0x00, + // 1679 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x4f, 0x6f, 0x23, 0xb7, + 0x15, 0xf7, 0xac, 0x6c, 0x4b, 0xa6, 0x6d, 0xad, 0x4d, 0x7b, 0xdd, 0x89, 0xd1, 0xd5, 0x24, 0x0a, + 0x50, 0x6c, 0x83, 0x64, 0x14, 0x7b, 0x93, 0xd6, 0x68, 0xda, 0x22, 0x1e, 0xcb, 0xff, 0x02, 0xbb, + 0x56, 0xa9, 0xdd, 0xa0, 0x2d, 0xb6, 0x45, 0x29, 0x0d, 0x2d, 0x31, 0x1e, 0xcd, 0x4c, 0x49, 0x8e, + 0x22, 0xdd, 0x7a, 0xe8, 0xa1, 0xe8, 0xa9, 0x5f, 0xa0, 0x9f, 0xa0, 0xe8, 0xa9, 0x5f, 0xc2, 0x05, + 0x8a, 0x22, 0xc7, 0xa0, 0x07, 0xa1, 0xab, 0xa2, 0x5f, 0x22, 0xa7, 0x62, 0x28, 0x8e, 0xa4, 0xf9, + 0x23, 0x79, 0x1d, 0x60, 0xf7, 0xa6, 0xe1, 0xfb, 0xfd, 0x7e, 0xef, 0xf1, 0xf1, 0xf1, 0x91, 0x14, + 0xb0, 0x6e, 0x0e, 0xb8, 0x49, 0xbd, 0xca, 0x4d, 0xd0, 0x20, 0xcc, 0x25, 0x82, 0xf0, 0x4a, 0x97, + 0xb8, 0xb6, 0xc7, 0x2a, 0xca, 0x80, 0x7d, 0x5a, 0xf1, 0x3d, 0x87, 0x36, 0xfb, 0x95, 0xee, 0x5e, + 0x83, 0x08, 0xbc, 0x57, 0x69, 0x11, 0x97, 0x30, 0x2c, 0x88, 0x6d, 0xfa, 0xcc, 0x13, 0x1e, 0x7c, + 0x6b, 0x04, 0x35, 0xb1, 0x4f, 0xcd, 0x11, 0xd4, 0x54, 0xd0, 0xdd, 0x0f, 0x5a, 0x54, 0xb4, 0x83, + 0x86, 0xd9, 0xf4, 0x3a, 0x95, 0x96, 0xd7, 0xf2, 0x2a, 0x92, 0xd1, 0x08, 0xae, 0xe5, 0x97, 0xfc, + 0x90, 0xbf, 0x46, 0x4a, 0xbb, 0xe5, 0x29, 0xa7, 0x4d, 0x8f, 0x91, 0x4a, 0x37, 0xe5, 0x6d, 0xf7, + 0xa3, 0x09, 0xa6, 0x83, 0x9b, 0x6d, 0xea, 0x12, 0xd6, 0xaf, 0xf8, 0x37, 0xad, 0x70, 0x80, 0x57, + 0x3a, 0x44, 0xe0, 0x2c, 0x56, 0x65, 0x16, 0x8b, 0x05, 0xae, 0xa0, 0x1d, 0x92, 0x22, 0xfc, 0xe0, + 0x2e, 0x02, 0x6f, 0xb6, 0x49, 0x07, 0xa7, 0x78, 0x4f, 0x67, 0xf1, 0x02, 0x41, 0x9d, 0x0a, 0x75, + 0x05, 0x17, 0x2c, 0x49, 0x2a, 0x7f, 0x02, 0x36, 0x0f, 0x1d, 0xc7, 0xfb, 0x92, 0xd8, 0x27, 0x0e, + 0xe9, 0x7d, 0xee, 0x39, 0x41, 0x87, 0xc0, 0xef, 0x81, 0x65, 0x9b, 0xd1, 0x2e, 0x61, 0xba, 0xf6, + 0xb6, 0xf6, 0x64, 0xc5, 0x2a, 0xde, 0x0e, 0x8c, 0x85, 0xe1, 0xc0, 0x58, 0xae, 0xca, 0x51, 0xa4, + 0xac, 0x65, 0x0e, 0x1e, 0x2a, 0xf2, 0x99, 0xc7, 0x45, 0x0d, 0x8b, 0x36, 0xdc, 0x07, 0xc0, 0xc7, + 0xa2, 0x5d, 0x63, 0xe4, 0x9a, 0xf6, 0x14, 0x1d, 0x2a, 0x3a, 0xa8, 0x8d, 0x2d, 0x68, 0x0a, 0x05, + 0xdf, 0x07, 0x05, 0x46, 0xb0, 0x7d, 0xe5, 0x3a, 0x7d, 0xfd, 0xc1, 0xdb, 0xda, 0x93, 0x82, 0xb5, + 0xa1, 0x18, 0x05, 0xa4, 0xc6, 0xd1, 0x18, 0x51, 0xfe, 0xb7, 0x06, 0x0a, 0xc7, 0x5d, 0xda, 0x14, + 0xd4, 0x73, 0xe1, 0x6f, 0x41, 0x21, 0xcc, 0xbb, 0x8d, 0x05, 0x96, 0xce, 0x56, 0xf7, 0x3f, 0x34, + 0x27, 0x35, 0x31, 0x4e, 0x83, 0xe9, 0xdf, 0xb4, 0xc2, 0x01, 0x6e, 0x86, 0x68, 0xb3, 0xbb, 0x67, + 0x5e, 0x35, 0xbe, 0x20, 0x4d, 0x71, 0x49, 0x04, 0x9e, 0x84, 0x37, 0x19, 0x43, 0x63, 0x55, 0xe8, + 0x80, 0x75, 0x9b, 0x38, 0x44, 0x90, 0x2b, 0x3f, 0xf4, 0xc8, 0x65, 0x84, 0xab, 0xfb, 0x4f, 0x5f, + 0xcd, 0x4d, 0x75, 0x9a, 0x6a, 0x6d, 0x0e, 0x07, 0xc6, 0x7a, 0x6c, 0x08, 0xc5, 0xc5, 0xcb, 0x7f, + 0xd1, 0xc0, 0xce, 0x49, 0xfd, 0x94, 0x79, 0x81, 0x5f, 0x17, 0xe1, 0x3a, 0xb5, 0xfa, 0xca, 0x04, + 0x7f, 0x08, 0x16, 0x59, 0xe0, 0x10, 0x95, 0xd3, 0x77, 0x55, 0xd0, 0x8b, 0x28, 0x70, 0xc8, 0x37, + 0x03, 0x63, 0x2b, 0xc1, 0x7a, 0xd6, 0xf7, 0x09, 0x92, 0x04, 0xf8, 0x19, 0x58, 0x66, 0xd8, 0x6d, + 0x91, 0x30, 0xf4, 0xdc, 0x93, 0xd5, 0xfd, 0xb2, 0x39, 0x73, 0xd7, 0x98, 0xe7, 0x55, 0x14, 0x42, + 0x27, 0x2b, 0x2e, 0x3f, 0x39, 0x52, 0x0a, 0xe5, 0x4b, 0xb0, 0x2e, 0x97, 0xda, 0x63, 0x42, 0x5a, + 0xe0, 0x63, 0x90, 0xeb, 0x50, 0x57, 0x06, 0xb5, 0x64, 0xad, 0x2a, 0x56, 0xee, 0x92, 0xba, 0x28, + 0x1c, 0x97, 0x66, 0xdc, 0x93, 0x39, 0x9b, 0x36, 0xe3, 0x1e, 0x0a, 0xc7, 0xcb, 0xa7, 0x20, 0xaf, + 0x3c, 0x4e, 0x0b, 0xe5, 0xe6, 0x0b, 0xe5, 0x32, 0x84, 0xfe, 0xfa, 0x00, 0x6c, 0xd5, 0x3c, 0xbb, + 0x4a, 0x39, 0x0b, 0x64, 0xbe, 0xac, 0xc0, 0x6e, 0x11, 0xf1, 0x06, 0xea, 0xe3, 0x19, 0x58, 0xe4, + 0x3e, 0x69, 0xaa, 0xb2, 0xd8, 0x9f, 0x93, 0xdb, 0x8c, 0xf8, 0xea, 0x3e, 0x69, 0x5a, 0x6b, 0xd1, + 0x52, 0x86, 0x5f, 0x48, 0xaa, 0xc1, 0x17, 0x60, 0x99, 0x0b, 0x2c, 0x02, 0xae, 0xe7, 0xa4, 0xee, + 0x47, 0xf7, 0xd4, 0x95, 0xdc, 0xc9, 0x2a, 0x8e, 0xbe, 0x91, 0xd2, 0x2c, 0xff, 0x53, 0x03, 0xdf, + 0xc9, 0x60, 0x5d, 0x50, 0x2e, 0xe0, 0x8b, 0x54, 0xc6, 0xcc, 0x57, 0xcb, 0x58, 0xc8, 0x96, 0xf9, + 0x1a, 0x6f, 0xde, 0x68, 0x64, 0x2a, 0x5b, 0x75, 0xb0, 0x44, 0x05, 0xe9, 0x44, 0xa5, 0x68, 0xde, + 0x6f, 0x5a, 0xd6, 0xba, 0x92, 0x5e, 0x3a, 0x0f, 0x45, 0xd0, 0x48, 0xab, 0xfc, 0xaf, 0x07, 0x99, + 0xd3, 0x09, 0xd3, 0x09, 0xaf, 0xc1, 0x5a, 0x87, 0xba, 0x87, 0x5d, 0x4c, 0x1d, 0xdc, 0x50, 0xbb, + 0x67, 0x5e, 0x11, 0x84, 0xbd, 0xd2, 0x1c, 0xf5, 0x4a, 0xf3, 0xdc, 0x15, 0x57, 0xac, 0x2e, 0x18, + 0x75, 0x5b, 0xd6, 0xc6, 0x70, 0x60, 0xac, 0x5d, 0x4e, 0x29, 0xa1, 0x98, 0x2e, 0xfc, 0x35, 0x28, + 0x70, 0xe2, 0x90, 0xa6, 0xf0, 0xd8, 0xfd, 0x3a, 0xc4, 0x05, 0x6e, 0x10, 0xa7, 0xae, 0xa8, 0xd6, + 0x5a, 0x98, 0xb7, 0xe8, 0x0b, 0x8d, 0x25, 0xa1, 0x03, 0x8a, 0x1d, 0xdc, 0x7b, 0xee, 0xe2, 0xf1, + 0x44, 0x72, 0xdf, 0x72, 0x22, 0x70, 0x38, 0x30, 0x8a, 0x97, 0x31, 0x2d, 0x94, 0xd0, 0x2e, 0xff, + 0x6f, 0x11, 0xbc, 0x35, 0xb3, 0xaa, 0xe0, 0x67, 0x00, 0x7a, 0x0d, 0x4e, 0x58, 0x97, 0xd8, 0xa7, + 0xa3, 0xd3, 0x84, 0x7a, 0xd1, 0xc6, 0xdd, 0x55, 0x0b, 0x04, 0xaf, 0x52, 0x08, 0x94, 0xc1, 0x82, + 0x7f, 0xd0, 0xc0, 0xba, 0x3d, 0x72, 0x43, 0xec, 0x9a, 0x67, 0x47, 0x85, 0x71, 0xfa, 0x6d, 0xea, + 0xdd, 0xac, 0x4e, 0x2b, 0x1d, 0xbb, 0x82, 0xf5, 0xad, 0x47, 0x2a, 0xa0, 0xf5, 0x98, 0x0d, 0xc5, + 0x9d, 0xc2, 0x4b, 0x00, 0xed, 0xb1, 0x24, 0x57, 0x67, 0x9a, 0x4c, 0xf1, 0x92, 0xf5, 0x58, 0x29, + 0x3c, 0x8a, 0xf9, 0x8d, 0x40, 0x28, 0x83, 0x08, 0x7f, 0x0a, 0x8a, 0xcd, 0x80, 0x31, 0xe2, 0x8a, + 0x33, 0x82, 0x1d, 0xd1, 0xee, 0xeb, 0x8b, 0x52, 0x6a, 0x47, 0x49, 0x15, 0x8f, 0x62, 0x56, 0x94, + 0x40, 0x87, 0x7c, 0x9b, 0x70, 0xca, 0x88, 0x1d, 0xf1, 0x97, 0xe2, 0xfc, 0x6a, 0xcc, 0x8a, 0x12, + 0x68, 0x78, 0x00, 0xd6, 0x48, 0xcf, 0x27, 0xcd, 0x28, 0xa7, 0xcb, 0x92, 0xbd, 0xad, 0xd8, 0x6b, + 0xc7, 0x53, 0x36, 0x14, 0x43, 0xee, 0x3a, 0x00, 0xa6, 0x93, 0x08, 0x37, 0x40, 0xee, 0x86, 0xf4, + 0x47, 0x27, 0x0f, 0x0a, 0x7f, 0xc2, 0x4f, 0xc1, 0x52, 0x17, 0x3b, 0x01, 0x51, 0xb5, 0xfe, 0xde, + 0xab, 0xd5, 0xfa, 0x33, 0xda, 0x21, 0x68, 0x44, 0xfc, 0xd1, 0x83, 0x03, 0xad, 0xfc, 0x0f, 0x0d, + 0x6c, 0xd6, 0x3c, 0xbb, 0x4e, 0x9a, 0x01, 0xa3, 0xa2, 0x5f, 0x93, 0xeb, 0xfc, 0x06, 0x7a, 0x36, + 0x8a, 0xf5, 0xec, 0x0f, 0xe7, 0xd7, 0x5a, 0x3c, 0xba, 0x59, 0x1d, 0xbb, 0x7c, 0xab, 0x81, 0x47, + 0x29, 0xf4, 0x1b, 0xe8, 0xa8, 0x3f, 0x8f, 0x77, 0xd4, 0xf7, 0xef, 0x33, 0x99, 0x19, 0xfd, 0xf4, + 0x4f, 0xc5, 0x8c, 0xa9, 0xc8, 0x6e, 0x1a, 0xde, 0xee, 0x18, 0xed, 0x52, 0x87, 0xb4, 0x88, 0x2d, + 0x27, 0x53, 0x98, 0xba, 0xdd, 0x8d, 0x2d, 0x68, 0x0a, 0x05, 0x39, 0xd8, 0xb1, 0xc9, 0x35, 0x0e, + 0x1c, 0x71, 0x68, 0xdb, 0x47, 0xd8, 0xc7, 0x0d, 0xea, 0x50, 0x41, 0xd5, 0x75, 0x64, 0xc5, 0xfa, + 0x64, 0x38, 0x30, 0x76, 0xaa, 0x99, 0x88, 0x6f, 0x06, 0xc6, 0xe3, 0xf4, 0xbd, 0xdc, 0x1c, 0x43, + 0xfa, 0x68, 0x86, 0x34, 0xec, 0x03, 0x9d, 0x91, 0xdf, 0x05, 0xe1, 0xa6, 0xa8, 0x32, 0xcf, 0x8f, + 0xb9, 0xcd, 0x49, 0xb7, 0x3f, 0x19, 0x0e, 0x0c, 0x1d, 0xcd, 0xc0, 0xdc, 0xed, 0x78, 0xa6, 0x3c, + 0xfc, 0x02, 0x6c, 0xe1, 0x51, 0x1f, 0x88, 0x79, 0x5d, 0x94, 0x5e, 0x0f, 0x86, 0x03, 0x63, 0xeb, + 0x30, 0x6d, 0xbe, 0xdb, 0x61, 0x96, 0x28, 0xac, 0x80, 0x7c, 0x57, 0x5e, 0xd9, 0xb9, 0xbe, 0x24, + 0xf5, 0x1f, 0x0d, 0x07, 0x46, 0x7e, 0x74, 0x8b, 0x0f, 0x35, 0x97, 0x4f, 0xea, 0xf2, 0x22, 0x18, + 0xa1, 0xe0, 0xc7, 0x60, 0xb5, 0xed, 0x71, 0xf1, 0x33, 0x22, 0xbe, 0xf4, 0xd8, 0x8d, 0x6c, 0x0c, + 0x05, 0x6b, 0x4b, 0xad, 0xe0, 0xea, 0xd9, 0xc4, 0x84, 0xa6, 0x71, 0xf0, 0x97, 0x60, 0xa5, 0xad, + 0xae, 0x7d, 0x5c, 0xcf, 0xcb, 0x42, 0x7b, 0x32, 0xa7, 0xd0, 0x62, 0x57, 0x44, 0x6b, 0x53, 0xc9, + 0xaf, 0x44, 0xc3, 0x1c, 0x4d, 0xd4, 0xe0, 0xf7, 0x41, 0x5e, 0x7e, 0x9c, 0x57, 0xf5, 0x82, 0x8c, + 0xe6, 0xa1, 0x82, 0xe7, 0xcf, 0x46, 0xc3, 0x28, 0xb2, 0x47, 0xd0, 0xf3, 0xda, 0x91, 0xbe, 0x92, + 0x86, 0x9e, 0xd7, 0x8e, 0x50, 0x64, 0x87, 0x2f, 0x40, 0x9e, 0x93, 0x0b, 0xea, 0x06, 0x3d, 0x1d, + 0xc8, 0x2d, 0xb7, 0x37, 0x27, 0xdc, 0xfa, 0xb1, 0x44, 0x26, 0x2e, 0xdc, 0x13, 0x75, 0x65, 0x47, + 0x91, 0x24, 0xb4, 0xc1, 0x0a, 0x0b, 0xdc, 0x43, 0xfe, 0x9c, 0x13, 0xa6, 0xaf, 0xa6, 0x4e, 0xfb, + 0xa4, 0x3e, 0x8a, 0xb0, 0x49, 0x0f, 0xe3, 0xcc, 0x8c, 0x11, 0x68, 0x22, 0x0c, 0xff, 0xa8, 0x01, + 0xc8, 0x03, 0xdf, 0x77, 0x48, 0x87, 0xb8, 0x02, 0x3b, 0xf2, 0x7e, 0xcf, 0xf5, 0x35, 0xe9, 0xef, + 0xc7, 0xf3, 0xe6, 0x93, 0x22, 0x25, 0x1d, 0x8f, 0x8f, 0xe9, 0x34, 0x14, 0x65, 0xf8, 0x0c, 0xd3, + 0x79, 0xcd, 0xe5, 0x6f, 0x7d, 0xfd, 0xce, 0x74, 0x66, 0xbf, 0x5f, 0x26, 0xe9, 0x54, 0x76, 0x14, + 0x49, 0xc2, 0xcf, 0xc1, 0x4e, 0xf4, 0xba, 0x43, 0x9e, 0x27, 0x4e, 0xa8, 0x43, 0x78, 0x9f, 0x0b, + 0xd2, 0xd1, 0x8b, 0x72, 0x99, 0x4b, 0x8a, 0xb9, 0x83, 0x32, 0x51, 0x68, 0x06, 0x1b, 0x76, 0x80, + 0x11, 0xb5, 0x87, 0x70, 0xef, 0x8c, 0xfb, 0xd3, 0x31, 0x6f, 0x62, 0x67, 0x74, 0x6b, 0x79, 0x28, + 0x1d, 0xbc, 0x3b, 0x1c, 0x18, 0x46, 0x75, 0x3e, 0x14, 0xdd, 0xa5, 0x05, 0x7f, 0x01, 0x74, 0x3c, + 0xcb, 0xcf, 0x86, 0xf4, 0xf3, 0xdd, 0xb0, 0xe7, 0xcc, 0x74, 0x30, 0x93, 0x0d, 0x7d, 0xb0, 0x81, + 0xe3, 0xef, 0x6c, 0xae, 0x6f, 0xca, 0x5d, 0xf8, 0xde, 0x9c, 0x75, 0x48, 0x3c, 0xcd, 0x2d, 0x5d, + 0xa5, 0x71, 0x23, 0x61, 0xe0, 0x28, 0xa5, 0x0e, 0x7b, 0x00, 0xe2, 0xe4, 0xdf, 0x02, 0x5c, 0x87, + 0x77, 0x1e, 0x31, 0xa9, 0xff, 0x12, 0x26, 0xa5, 0x96, 0x32, 0x71, 0x94, 0xe1, 0x03, 0x5e, 0x80, + 0x6d, 0x35, 0xfa, 0xdc, 0xe5, 0xf8, 0x9a, 0xd4, 0xfb, 0xbc, 0x29, 0x1c, 0xae, 0x6f, 0xc9, 0xfe, + 0xa6, 0x0f, 0x07, 0xc6, 0xf6, 0x61, 0x86, 0x1d, 0x65, 0xb2, 0xe0, 0xa7, 0x60, 0xe3, 0xda, 0x63, + 0x0d, 0x6a, 0xdb, 0xc4, 0x8d, 0x94, 0xb6, 0xa5, 0xd2, 0x76, 0x98, 0x89, 0x93, 0x84, 0x0d, 0xa5, + 0xd0, 0xe1, 0x8b, 0x5c, 0x9f, 0xb5, 0x81, 0xe1, 0xc7, 0xb1, 0x37, 0xf9, 0x3b, 0x89, 0x37, 0xf9, + 0x66, 0x8a, 0xf7, 0x1a, 0x5e, 0xe4, 0x7f, 0xd3, 0xc0, 0x4e, 0x76, 0x03, 0x83, 0x4f, 0x63, 0xd1, + 0x19, 0x89, 0xe8, 0x1e, 0x26, 0x58, 0x2a, 0xb6, 0xdf, 0x80, 0xa2, 0x6a, 0x73, 0xf1, 0x3f, 0x3c, + 0x62, 0x31, 0x86, 0xe7, 0x53, 0x78, 0x43, 0x51, 0x12, 0xd1, 0x16, 0x97, 0x6f, 0x8b, 0xf8, 0x18, + 0x4a, 0xa8, 0x95, 0xff, 0xae, 0x81, 0x77, 0xee, 0x6c, 0x50, 0xd0, 0x8a, 0x85, 0x6e, 0x26, 0x42, + 0x2f, 0xcd, 0x16, 0x78, 0x3d, 0xff, 0x7b, 0x58, 0x1f, 0xdc, 0xbe, 0x2c, 0x2d, 0x7c, 0xf5, 0xb2, + 0xb4, 0xf0, 0xf5, 0xcb, 0xd2, 0xc2, 0xef, 0x87, 0x25, 0xed, 0x76, 0x58, 0xd2, 0xbe, 0x1a, 0x96, + 0xb4, 0xaf, 0x87, 0x25, 0xed, 0x3f, 0xc3, 0x92, 0xf6, 0xe7, 0xff, 0x96, 0x16, 0x7e, 0x95, 0x57, + 0x72, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x91, 0xe5, 0x7f, 0xdc, 0x14, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/policy/v1beta1/generated.proto b/vendor/k8s.io/api/policy/v1beta1/generated.proto index 514868a9f..1a14d946f 100644 --- a/vendor/k8s.io/api/policy/v1beta1/generated.proto +++ b/vendor/k8s.io/api/policy/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -32,14 +32,14 @@ option go_package = "v1beta1"; // AllowedFlexVolume represents a single Flexvolume that is allowed to be used. message AllowedFlexVolume { - // Driver is the name of the Flexvolume driver. + // driver is the name of the Flexvolume driver. optional string driver = 1; } -// defines the host volume conditions that will be enabled by a policy +// AllowedHostPath defines the host volume conditions that will be enabled by a policy // for pods to use. It requires the path prefix to be defined. message AllowedHostPath { - // is the path prefix that the host volume must match. + // pathPrefix is the path prefix that the host volume must match. // It does not support `*`. // Trailing slashes are trimmed when validating the path prefix with a host path. // @@ -47,6 +47,10 @@ message AllowedHostPath { // `/foo` would allow `/foo`, `/foo/` and `/foo/bar` // `/foo` would not allow `/food` or `/etc/foo` optional string pathPrefix = 1; + + // when set to true, will allow host volumes matching the pathPrefix only if all volume mounts are readOnly. + // +optional + optional bool readOnly = 2; } // Eviction evicts a pod from its node subject to certain policies and safety constraints. @@ -62,17 +66,17 @@ message Eviction { // FSGroupStrategyOptions defines the strategy type and options used to create the strategy. message FSGroupStrategyOptions { - // Rule is the strategy that will dictate what FSGroup is used in the SecurityContext. + // rule is the strategy that will dictate what FSGroup is used in the SecurityContext. // +optional optional string rule = 1; - // Ranges are the allowed ranges of fs groups. If you would like to force a single - // fs group then supply a single range with the same start and end. + // ranges are the allowed ranges of fs groups. If you would like to force a single + // fs group then supply a single range with the same start and end. Required for MustRunAs. // +optional repeated IDRange ranges = 2; } -// Host Port Range defines a range of host ports that will be enabled by a policy +// HostPortRange defines a range of host ports that will be enabled by a policy // for pods to use. It requires both the start and end to be defined. message HostPortRange { // min is the start of the range, inclusive. @@ -82,12 +86,12 @@ message HostPortRange { optional int32 max = 2; } -// ID Range provides a min/max of an allowed range of IDs. +// IDRange provides a min/max of an allowed range of IDs. message IDRange { - // Min is the start of the range, inclusive. + // min is the start of the range, inclusive. optional int64 min = 1; - // Max is the end of the range, inclusive. + // max is the end of the range, inclusive. optional int64 max = 2; } @@ -162,7 +166,7 @@ message PodDisruptionBudgetStatus { optional int32 expectedPods = 6; } -// Pod Security Policy governs the ability to make requests that affect the Security Context +// PodSecurityPolicy governs the ability to make requests that affect the Security Context // that will be applied to a pod and container. message PodSecurityPolicy { // Standard object's metadata. @@ -175,43 +179,43 @@ message PodSecurityPolicy { optional PodSecurityPolicySpec spec = 2; } -// Pod Security Policy List is a list of PodSecurityPolicy objects. +// PodSecurityPolicyList is a list of PodSecurityPolicy objects. message PodSecurityPolicyList { // Standard list metadata. // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - // Items is a list of schema objects. + // items is a list of schema objects. repeated PodSecurityPolicy items = 2; } -// Pod Security Policy Spec defines the policy enforced. +// PodSecurityPolicySpec defines the policy enforced. message PodSecurityPolicySpec { // privileged determines if a pod can request to be run as privileged. // +optional optional bool privileged = 1; - // DefaultAddCapabilities is the default set of capabilities that will be added to the container + // defaultAddCapabilities is the default set of capabilities that will be added to the container // unless the pod spec specifically drops the capability. You may not list a capability in both - // DefaultAddCapabilities and RequiredDropCapabilities. Capabilities added here are implicitly - // allowed, and need not be included in the AllowedCapabilities list. + // defaultAddCapabilities and requiredDropCapabilities. Capabilities added here are implicitly + // allowed, and need not be included in the allowedCapabilities list. // +optional repeated string defaultAddCapabilities = 2; - // RequiredDropCapabilities are the capabilities that will be dropped from the container. These + // requiredDropCapabilities are the capabilities that will be dropped from the container. These // are required to be dropped and cannot be added. // +optional repeated string requiredDropCapabilities = 3; - // AllowedCapabilities is a list of capabilities that can be requested to add to the container. + // allowedCapabilities is a list of capabilities that can be requested to add to the container. // Capabilities in this field may be added at the pod author's discretion. - // You must not list a capability in both AllowedCapabilities and RequiredDropCapabilities. + // You must not list a capability in both allowedCapabilities and requiredDropCapabilities. // +optional repeated string allowedCapabilities = 4; - // volumes is a white list of allowed volume plugins. Empty indicates that all plugins - // may be used. + // volumes is a white list of allowed volume plugins. Empty indicates that + // no volumes may be used. To allow all volumes you may use '*'. // +optional repeated string volumes = 5; @@ -237,13 +241,13 @@ message PodSecurityPolicySpec { // runAsUser is the strategy that will dictate the allowable RunAsUser values that may be set. optional RunAsUserStrategyOptions runAsUser = 11; - // SupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext. + // supplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext. optional SupplementalGroupsStrategyOptions supplementalGroups = 12; - // FSGroup is the strategy that will dictate what fs group is used by the SecurityContext. + // fsGroup is the strategy that will dictate what fs group is used by the SecurityContext. optional FSGroupStrategyOptions fsGroup = 13; - // ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file + // readOnlyRootFilesystem when set to true will force containers to run with a read only root file // system. If the container specifically requests to run with a non-read only root file system // the PSP should deny the pod. // If set to false the container may run with a read only root file system if it wishes but it @@ -251,40 +255,63 @@ message PodSecurityPolicySpec { // +optional optional bool readOnlyRootFilesystem = 14; - // DefaultAllowPrivilegeEscalation controls the default setting for whether a + // defaultAllowPrivilegeEscalation controls the default setting for whether a // process can gain more privileges than its parent process. // +optional optional bool defaultAllowPrivilegeEscalation = 15; - // AllowPrivilegeEscalation determines if a pod can request to allow + // allowPrivilegeEscalation determines if a pod can request to allow // privilege escalation. If unspecified, defaults to true. // +optional optional bool allowPrivilegeEscalation = 16; - // is a white list of allowed host paths. Empty indicates that all host paths may be used. + // allowedHostPaths is a white list of allowed host paths. Empty indicates + // that all host paths may be used. // +optional repeated AllowedHostPath allowedHostPaths = 17; - // AllowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all + // allowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all // Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes - // is allowed in the "Volumes" field. + // is allowed in the "volumes" field. // +optional repeated AllowedFlexVolume allowedFlexVolumes = 18; + + // allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. + // Each entry is either a plain sysctl name or ends in "*" in which case it is considered + // as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. + // Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection. + // + // Examples: + // e.g. "foo/*" allows "foo/bar", "foo/baz", etc. + // e.g. "foo.*" allows "foo.bar", "foo.baz", etc. + // +optional + repeated string allowedUnsafeSysctls = 19; + + // forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. + // Each entry is either a plain sysctl name or ends in "*" in which case it is considered + // as a prefix of forbidden sysctls. Single * means all sysctls are forbidden. + // + // Examples: + // e.g. "foo/*" forbids "foo/bar", "foo/baz", etc. + // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. + // +optional + repeated string forbiddenSysctls = 20; } -// Run A sUser Strategy Options defines the strategy type and any options used to create the strategy. +// RunAsUserStrategyOptions defines the strategy type and any options used to create the strategy. message RunAsUserStrategyOptions { - // Rule is the strategy that will dictate the allowable RunAsUser values that may be set. + // rule is the strategy that will dictate the allowable RunAsUser values that may be set. optional string rule = 1; - // Ranges are the allowed ranges of uids that may be used. + // ranges are the allowed ranges of uids that may be used. If you would like to force a single uid + // then supply a single range with the same start and end. Required for MustRunAs. // +optional repeated IDRange ranges = 2; } -// SELinux Strategy Options defines the strategy type and any options used to create the strategy. +// SELinuxStrategyOptions defines the strategy type and any options used to create the strategy. message SELinuxStrategyOptions { - // type is the strategy that will dictate the allowable labels that may be set. + // rule is the strategy that will dictate the allowable labels that may be set. optional string rule = 1; // seLinuxOptions required to run as; required for MustRunAs @@ -295,12 +322,12 @@ message SELinuxStrategyOptions { // SupplementalGroupsStrategyOptions defines the strategy type and options used to create the strategy. message SupplementalGroupsStrategyOptions { - // Rule is the strategy that will dictate what supplemental groups is used in the SecurityContext. + // rule is the strategy that will dictate what supplemental groups is used in the SecurityContext. // +optional optional string rule = 1; - // Ranges are the allowed ranges of supplemental groups. If you would like to force a single - // supplemental group then supply a single range with the same start and end. + // ranges are the allowed ranges of supplemental groups. If you would like to force a single + // supplemental group then supply a single range with the same start and end. Required for MustRunAs. // +optional repeated IDRange ranges = 2; } diff --git a/vendor/k8s.io/api/policy/v1beta1/types.go b/vendor/k8s.io/api/policy/v1beta1/types.go index 6cea9615f..ba1e4ff31 100644 --- a/vendor/k8s.io/api/policy/v1beta1/types.go +++ b/vendor/k8s.io/api/policy/v1beta1/types.go @@ -119,7 +119,7 @@ type Eviction struct { // +genclient:nonNamespaced // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// Pod Security Policy governs the ability to make requests that affect the Security Context +// PodSecurityPolicy governs the ability to make requests that affect the Security Context // that will be applied to a pod and container. type PodSecurityPolicy struct { metav1.TypeMeta `json:",inline"` @@ -133,28 +133,28 @@ type PodSecurityPolicy struct { Spec PodSecurityPolicySpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` } -// Pod Security Policy Spec defines the policy enforced. +// PodSecurityPolicySpec defines the policy enforced. type PodSecurityPolicySpec struct { // privileged determines if a pod can request to be run as privileged. // +optional Privileged bool `json:"privileged,omitempty" protobuf:"varint,1,opt,name=privileged"` - // DefaultAddCapabilities is the default set of capabilities that will be added to the container + // defaultAddCapabilities is the default set of capabilities that will be added to the container // unless the pod spec specifically drops the capability. You may not list a capability in both - // DefaultAddCapabilities and RequiredDropCapabilities. Capabilities added here are implicitly - // allowed, and need not be included in the AllowedCapabilities list. + // defaultAddCapabilities and requiredDropCapabilities. Capabilities added here are implicitly + // allowed, and need not be included in the allowedCapabilities list. // +optional DefaultAddCapabilities []v1.Capability `json:"defaultAddCapabilities,omitempty" protobuf:"bytes,2,rep,name=defaultAddCapabilities,casttype=k8s.io/api/core/v1.Capability"` - // RequiredDropCapabilities are the capabilities that will be dropped from the container. These + // requiredDropCapabilities are the capabilities that will be dropped from the container. These // are required to be dropped and cannot be added. // +optional RequiredDropCapabilities []v1.Capability `json:"requiredDropCapabilities,omitempty" protobuf:"bytes,3,rep,name=requiredDropCapabilities,casttype=k8s.io/api/core/v1.Capability"` - // AllowedCapabilities is a list of capabilities that can be requested to add to the container. + // allowedCapabilities is a list of capabilities that can be requested to add to the container. // Capabilities in this field may be added at the pod author's discretion. - // You must not list a capability in both AllowedCapabilities and RequiredDropCapabilities. + // You must not list a capability in both allowedCapabilities and requiredDropCapabilities. // +optional AllowedCapabilities []v1.Capability `json:"allowedCapabilities,omitempty" protobuf:"bytes,4,rep,name=allowedCapabilities,casttype=k8s.io/api/core/v1.Capability"` - // volumes is a white list of allowed volume plugins. Empty indicates that all plugins - // may be used. + // volumes is a white list of allowed volume plugins. Empty indicates that + // no volumes may be used. To allow all volumes you may use '*'. // +optional Volumes []FSType `json:"volumes,omitempty" protobuf:"bytes,5,rep,name=volumes,casttype=FSType"` // hostNetwork determines if the policy allows the use of HostNetwork in the pod spec. @@ -173,39 +173,59 @@ type PodSecurityPolicySpec struct { SELinux SELinuxStrategyOptions `json:"seLinux" protobuf:"bytes,10,opt,name=seLinux"` // runAsUser is the strategy that will dictate the allowable RunAsUser values that may be set. RunAsUser RunAsUserStrategyOptions `json:"runAsUser" protobuf:"bytes,11,opt,name=runAsUser"` - // SupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext. + // supplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext. SupplementalGroups SupplementalGroupsStrategyOptions `json:"supplementalGroups" protobuf:"bytes,12,opt,name=supplementalGroups"` - // FSGroup is the strategy that will dictate what fs group is used by the SecurityContext. + // fsGroup is the strategy that will dictate what fs group is used by the SecurityContext. FSGroup FSGroupStrategyOptions `json:"fsGroup" protobuf:"bytes,13,opt,name=fsGroup"` - // ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file + // readOnlyRootFilesystem when set to true will force containers to run with a read only root file // system. If the container specifically requests to run with a non-read only root file system // the PSP should deny the pod. // If set to false the container may run with a read only root file system if it wishes but it // will not be forced to. // +optional ReadOnlyRootFilesystem bool `json:"readOnlyRootFilesystem,omitempty" protobuf:"varint,14,opt,name=readOnlyRootFilesystem"` - // DefaultAllowPrivilegeEscalation controls the default setting for whether a + // defaultAllowPrivilegeEscalation controls the default setting for whether a // process can gain more privileges than its parent process. // +optional DefaultAllowPrivilegeEscalation *bool `json:"defaultAllowPrivilegeEscalation,omitempty" protobuf:"varint,15,opt,name=defaultAllowPrivilegeEscalation"` - // AllowPrivilegeEscalation determines if a pod can request to allow + // allowPrivilegeEscalation determines if a pod can request to allow // privilege escalation. If unspecified, defaults to true. // +optional AllowPrivilegeEscalation *bool `json:"allowPrivilegeEscalation,omitempty" protobuf:"varint,16,opt,name=allowPrivilegeEscalation"` - // is a white list of allowed host paths. Empty indicates that all host paths may be used. + // allowedHostPaths is a white list of allowed host paths. Empty indicates + // that all host paths may be used. // +optional AllowedHostPaths []AllowedHostPath `json:"allowedHostPaths,omitempty" protobuf:"bytes,17,rep,name=allowedHostPaths"` - // AllowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all + // allowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all // Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes - // is allowed in the "Volumes" field. + // is allowed in the "volumes" field. // +optional AllowedFlexVolumes []AllowedFlexVolume `json:"allowedFlexVolumes,omitempty" protobuf:"bytes,18,rep,name=allowedFlexVolumes"` + // allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. + // Each entry is either a plain sysctl name or ends in "*" in which case it is considered + // as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. + // Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection. + // + // Examples: + // e.g. "foo/*" allows "foo/bar", "foo/baz", etc. + // e.g. "foo.*" allows "foo.bar", "foo.baz", etc. + // +optional + AllowedUnsafeSysctls []string `json:"allowedUnsafeSysctls,omitempty" protobuf:"bytes,19,rep,name=allowedUnsafeSysctls"` + // forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. + // Each entry is either a plain sysctl name or ends in "*" in which case it is considered + // as a prefix of forbidden sysctls. Single * means all sysctls are forbidden. + // + // Examples: + // e.g. "foo/*" forbids "foo/bar", "foo/baz", etc. + // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. + // +optional + ForbiddenSysctls []string `json:"forbiddenSysctls,omitempty" protobuf:"bytes,20,rep,name=forbiddenSysctls"` } -// defines the host volume conditions that will be enabled by a policy +// AllowedHostPath defines the host volume conditions that will be enabled by a policy // for pods to use. It requires the path prefix to be defined. type AllowedHostPath struct { - // is the path prefix that the host volume must match. + // pathPrefix is the path prefix that the host volume must match. // It does not support `*`. // Trailing slashes are trimmed when validating the path prefix with a host path. // @@ -213,9 +233,13 @@ type AllowedHostPath struct { // `/foo` would allow `/foo`, `/foo/` and `/foo/bar` // `/foo` would not allow `/food` or `/etc/foo` PathPrefix string `json:"pathPrefix,omitempty" protobuf:"bytes,1,rep,name=pathPrefix"` + + // when set to true, will allow host volumes matching the pathPrefix only if all volume mounts are readOnly. + // +optional + ReadOnly bool `json:"readOnly,omitempty" protobuf:"varint,2,opt,name=readOnly"` } -// FS Type gives strong typing to different file systems that are used by volumes. +// FSType gives strong typing to different file systems that are used by volumes. type FSType string var ( @@ -245,11 +269,11 @@ var ( // AllowedFlexVolume represents a single Flexvolume that is allowed to be used. type AllowedFlexVolume struct { - // Driver is the name of the Flexvolume driver. + // driver is the name of the Flexvolume driver. Driver string `json:"driver" protobuf:"bytes,1,opt,name=driver"` } -// Host Port Range defines a range of host ports that will be enabled by a policy +// HostPortRange defines a range of host ports that will be enabled by a policy // for pods to use. It requires both the start and end to be defined. type HostPortRange struct { // min is the start of the range, inclusive. @@ -258,9 +282,9 @@ type HostPortRange struct { Max int32 `json:"max" protobuf:"varint,2,opt,name=max"` } -// SELinux Strategy Options defines the strategy type and any options used to create the strategy. +// SELinuxStrategyOptions defines the strategy type and any options used to create the strategy. type SELinuxStrategyOptions struct { - // type is the strategy that will dictate the allowable labels that may be set. + // rule is the strategy that will dictate the allowable labels that may be set. Rule SELinuxStrategy `json:"rule" protobuf:"bytes,1,opt,name=rule,casttype=SELinuxStrategy"` // seLinuxOptions required to run as; required for MustRunAs // More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ @@ -273,26 +297,27 @@ type SELinuxStrategyOptions struct { type SELinuxStrategy string const ( - // container must have SELinux labels of X applied. + // SELinuxStrategyMustRunAs means that container must have SELinux labels of X applied. SELinuxStrategyMustRunAs SELinuxStrategy = "MustRunAs" - // container may make requests for any SELinux context labels. + // SELinuxStrategyRunAsAny means that container may make requests for any SELinux context labels. SELinuxStrategyRunAsAny SELinuxStrategy = "RunAsAny" ) -// Run A sUser Strategy Options defines the strategy type and any options used to create the strategy. +// RunAsUserStrategyOptions defines the strategy type and any options used to create the strategy. type RunAsUserStrategyOptions struct { - // Rule is the strategy that will dictate the allowable RunAsUser values that may be set. + // rule is the strategy that will dictate the allowable RunAsUser values that may be set. Rule RunAsUserStrategy `json:"rule" protobuf:"bytes,1,opt,name=rule,casttype=RunAsUserStrategy"` - // Ranges are the allowed ranges of uids that may be used. + // ranges are the allowed ranges of uids that may be used. If you would like to force a single uid + // then supply a single range with the same start and end. Required for MustRunAs. // +optional Ranges []IDRange `json:"ranges,omitempty" protobuf:"bytes,2,rep,name=ranges"` } -// ID Range provides a min/max of an allowed range of IDs. +// IDRange provides a min/max of an allowed range of IDs. type IDRange struct { - // Min is the start of the range, inclusive. + // min is the start of the range, inclusive. Min int64 `json:"min" protobuf:"varint,1,opt,name=min"` - // Max is the end of the range, inclusive. + // max is the end of the range, inclusive. Max int64 `json:"max" protobuf:"varint,2,opt,name=max"` } @@ -301,21 +326,21 @@ type IDRange struct { type RunAsUserStrategy string const ( - // container must run as a particular uid. + // RunAsUserStrategyMustRunAs means that container must run as a particular uid. RunAsUserStrategyMustRunAs RunAsUserStrategy = "MustRunAs" - // container must run as a non-root uid + // RunAsUserStrategyMustRunAsNonRoot means that container must run as a non-root uid. RunAsUserStrategyMustRunAsNonRoot RunAsUserStrategy = "MustRunAsNonRoot" - // container may make requests for any uid. + // RunAsUserStrategyRunAsAny means that container may make requests for any uid. RunAsUserStrategyRunAsAny RunAsUserStrategy = "RunAsAny" ) // FSGroupStrategyOptions defines the strategy type and options used to create the strategy. type FSGroupStrategyOptions struct { - // Rule is the strategy that will dictate what FSGroup is used in the SecurityContext. + // rule is the strategy that will dictate what FSGroup is used in the SecurityContext. // +optional Rule FSGroupStrategyType `json:"rule,omitempty" protobuf:"bytes,1,opt,name=rule,casttype=FSGroupStrategyType"` - // Ranges are the allowed ranges of fs groups. If you would like to force a single - // fs group then supply a single range with the same start and end. + // ranges are the allowed ranges of fs groups. If you would like to force a single + // fs group then supply a single range with the same start and end. Required for MustRunAs. // +optional Ranges []IDRange `json:"ranges,omitempty" protobuf:"bytes,2,rep,name=ranges"` } @@ -325,19 +350,19 @@ type FSGroupStrategyOptions struct { type FSGroupStrategyType string const ( - // container must have FSGroup of X applied. + // FSGroupStrategyMustRunAs meant that container must have FSGroup of X applied. FSGroupStrategyMustRunAs FSGroupStrategyType = "MustRunAs" - // container may make requests for any FSGroup labels. + // FSGroupStrategyRunAsAny means that container may make requests for any FSGroup labels. FSGroupStrategyRunAsAny FSGroupStrategyType = "RunAsAny" ) // SupplementalGroupsStrategyOptions defines the strategy type and options used to create the strategy. type SupplementalGroupsStrategyOptions struct { - // Rule is the strategy that will dictate what supplemental groups is used in the SecurityContext. + // rule is the strategy that will dictate what supplemental groups is used in the SecurityContext. // +optional Rule SupplementalGroupsStrategyType `json:"rule,omitempty" protobuf:"bytes,1,opt,name=rule,casttype=SupplementalGroupsStrategyType"` - // Ranges are the allowed ranges of supplemental groups. If you would like to force a single - // supplemental group then supply a single range with the same start and end. + // ranges are the allowed ranges of supplemental groups. If you would like to force a single + // supplemental group then supply a single range with the same start and end. Required for MustRunAs. // +optional Ranges []IDRange `json:"ranges,omitempty" protobuf:"bytes,2,rep,name=ranges"` } @@ -347,15 +372,15 @@ type SupplementalGroupsStrategyOptions struct { type SupplementalGroupsStrategyType string const ( - // container must run as a particular gid. + // SupplementalGroupsStrategyMustRunAs means that container must run as a particular gid. SupplementalGroupsStrategyMustRunAs SupplementalGroupsStrategyType = "MustRunAs" - // container may make requests for any gid. + // SupplementalGroupsStrategyRunAsAny means that container may make requests for any gid. SupplementalGroupsStrategyRunAsAny SupplementalGroupsStrategyType = "RunAsAny" ) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -// Pod Security Policy List is a list of PodSecurityPolicy objects. +// PodSecurityPolicyList is a list of PodSecurityPolicy objects. type PodSecurityPolicyList struct { metav1.TypeMeta `json:",inline"` // Standard list metadata. @@ -363,6 +388,6 @@ type PodSecurityPolicyList struct { // +optional metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // Items is a list of schema objects. + // items is a list of schema objects. Items []PodSecurityPolicy `json:"items" protobuf:"bytes,2,rep,name=items"` } diff --git a/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go index 8c51518d4..122287645 100644 --- a/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,10 +26,10 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_AllowedFlexVolume = map[string]string{ "": "AllowedFlexVolume represents a single Flexvolume that is allowed to be used.", - "driver": "Driver is the name of the Flexvolume driver.", + "driver": "driver is the name of the Flexvolume driver.", } func (AllowedFlexVolume) SwaggerDoc() map[string]string { @@ -37,8 +37,9 @@ func (AllowedFlexVolume) SwaggerDoc() map[string]string { } var map_AllowedHostPath = map[string]string{ - "": "defines the host volume conditions that will be enabled by a policy for pods to use. It requires the path prefix to be defined.", - "pathPrefix": "is the path prefix that the host volume must match. It does not support `*`. Trailing slashes are trimmed when validating the path prefix with a host path.\n\nExamples: `/foo` would allow `/foo`, `/foo/` and `/foo/bar` `/foo` would not allow `/food` or `/etc/foo`", + "": "AllowedHostPath defines the host volume conditions that will be enabled by a policy for pods to use. It requires the path prefix to be defined.", + "pathPrefix": "pathPrefix is the path prefix that the host volume must match. It does not support `*`. Trailing slashes are trimmed when validating the path prefix with a host path.\n\nExamples: `/foo` would allow `/foo`, `/foo/` and `/foo/bar` `/foo` would not allow `/food` or `/etc/foo`", + "readOnly": "when set to true, will allow host volumes matching the pathPrefix only if all volume mounts are readOnly.", } func (AllowedHostPath) SwaggerDoc() map[string]string { @@ -57,8 +58,8 @@ func (Eviction) SwaggerDoc() map[string]string { var map_FSGroupStrategyOptions = map[string]string{ "": "FSGroupStrategyOptions defines the strategy type and options used to create the strategy.", - "rule": "Rule is the strategy that will dictate what FSGroup is used in the SecurityContext.", - "ranges": "Ranges are the allowed ranges of fs groups. If you would like to force a single fs group then supply a single range with the same start and end.", + "rule": "rule is the strategy that will dictate what FSGroup is used in the SecurityContext.", + "ranges": "ranges are the allowed ranges of fs groups. If you would like to force a single fs group then supply a single range with the same start and end. Required for MustRunAs.", } func (FSGroupStrategyOptions) SwaggerDoc() map[string]string { @@ -66,7 +67,7 @@ func (FSGroupStrategyOptions) SwaggerDoc() map[string]string { } var map_HostPortRange = map[string]string{ - "": "Host Port Range defines a range of host ports that will be enabled by a policy for pods to use. It requires both the start and end to be defined.", + "": "HostPortRange defines a range of host ports that will be enabled by a policy for pods to use. It requires both the start and end to be defined.", "min": "min is the start of the range, inclusive.", "max": "max is the end of the range, inclusive.", } @@ -76,9 +77,9 @@ func (HostPortRange) SwaggerDoc() map[string]string { } var map_IDRange = map[string]string{ - "": "ID Range provides a min/max of an allowed range of IDs.", - "min": "Min is the start of the range, inclusive.", - "max": "Max is the end of the range, inclusive.", + "": "IDRange provides a min/max of an allowed range of IDs.", + "min": "min is the start of the range, inclusive.", + "max": "max is the end of the range, inclusive.", } func (IDRange) SwaggerDoc() map[string]string { @@ -129,7 +130,7 @@ func (PodDisruptionBudgetStatus) SwaggerDoc() map[string]string { } var map_PodSecurityPolicy = map[string]string{ - "": "Pod Security Policy governs the ability to make requests that affect the Security Context that will be applied to a pod and container.", + "": "PodSecurityPolicy governs the ability to make requests that affect the Security Context that will be applied to a pod and container.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", "spec": "spec defines the policy enforced.", } @@ -139,9 +140,9 @@ func (PodSecurityPolicy) SwaggerDoc() map[string]string { } var map_PodSecurityPolicyList = map[string]string{ - "": "Pod Security Policy List is a list of PodSecurityPolicy objects.", + "": "PodSecurityPolicyList is a list of PodSecurityPolicy objects.", "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", - "items": "Items is a list of schema objects.", + "items": "items is a list of schema objects.", } func (PodSecurityPolicyList) SwaggerDoc() map[string]string { @@ -149,25 +150,27 @@ func (PodSecurityPolicyList) SwaggerDoc() map[string]string { } var map_PodSecurityPolicySpec = map[string]string{ - "": "Pod Security Policy Spec defines the policy enforced.", + "": "PodSecurityPolicySpec defines the policy enforced.", "privileged": "privileged determines if a pod can request to be run as privileged.", - "defaultAddCapabilities": "DefaultAddCapabilities is the default set of capabilities that will be added to the container unless the pod spec specifically drops the capability. You may not list a capability in both DefaultAddCapabilities and RequiredDropCapabilities. Capabilities added here are implicitly allowed, and need not be included in the AllowedCapabilities list.", - "requiredDropCapabilities": "RequiredDropCapabilities are the capabilities that will be dropped from the container. These are required to be dropped and cannot be added.", - "allowedCapabilities": "AllowedCapabilities is a list of capabilities that can be requested to add to the container. Capabilities in this field may be added at the pod author's discretion. You must not list a capability in both AllowedCapabilities and RequiredDropCapabilities.", - "volumes": "volumes is a white list of allowed volume plugins. Empty indicates that all plugins may be used.", + "defaultAddCapabilities": "defaultAddCapabilities is the default set of capabilities that will be added to the container unless the pod spec specifically drops the capability. You may not list a capability in both defaultAddCapabilities and requiredDropCapabilities. Capabilities added here are implicitly allowed, and need not be included in the allowedCapabilities list.", + "requiredDropCapabilities": "requiredDropCapabilities are the capabilities that will be dropped from the container. These are required to be dropped and cannot be added.", + "allowedCapabilities": "allowedCapabilities is a list of capabilities that can be requested to add to the container. Capabilities in this field may be added at the pod author's discretion. You must not list a capability in both allowedCapabilities and requiredDropCapabilities.", + "volumes": "volumes is a white list of allowed volume plugins. Empty indicates that no volumes may be used. To allow all volumes you may use '*'.", "hostNetwork": "hostNetwork determines if the policy allows the use of HostNetwork in the pod spec.", "hostPorts": "hostPorts determines which host port ranges are allowed to be exposed.", "hostPID": "hostPID determines if the policy allows the use of HostPID in the pod spec.", "hostIPC": "hostIPC determines if the policy allows the use of HostIPC in the pod spec.", "seLinux": "seLinux is the strategy that will dictate the allowable labels that may be set.", "runAsUser": "runAsUser is the strategy that will dictate the allowable RunAsUser values that may be set.", - "supplementalGroups": "SupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext.", - "fsGroup": "FSGroup is the strategy that will dictate what fs group is used by the SecurityContext.", - "readOnlyRootFilesystem": "ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.", - "defaultAllowPrivilegeEscalation": "DefaultAllowPrivilegeEscalation controls the default setting for whether a process can gain more privileges than its parent process.", - "allowPrivilegeEscalation": "AllowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.", - "allowedHostPaths": "is a white list of allowed host paths. Empty indicates that all host paths may be used.", - "allowedFlexVolumes": "AllowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the \"Volumes\" field.", + "supplementalGroups": "supplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext.", + "fsGroup": "fsGroup is the strategy that will dictate what fs group is used by the SecurityContext.", + "readOnlyRootFilesystem": "readOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.", + "defaultAllowPrivilegeEscalation": "defaultAllowPrivilegeEscalation controls the default setting for whether a process can gain more privileges than its parent process.", + "allowPrivilegeEscalation": "allowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.", + "allowedHostPaths": "allowedHostPaths is a white list of allowed host paths. Empty indicates that all host paths may be used.", + "allowedFlexVolumes": "allowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the \"volumes\" field.", + "allowedUnsafeSysctls": "allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection.\n\nExamples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc.", + "forbiddenSysctls": "forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden.\n\nExamples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc.", } func (PodSecurityPolicySpec) SwaggerDoc() map[string]string { @@ -175,9 +178,9 @@ func (PodSecurityPolicySpec) SwaggerDoc() map[string]string { } var map_RunAsUserStrategyOptions = map[string]string{ - "": "Run A sUser Strategy Options defines the strategy type and any options used to create the strategy.", - "rule": "Rule is the strategy that will dictate the allowable RunAsUser values that may be set.", - "ranges": "Ranges are the allowed ranges of uids that may be used.", + "": "RunAsUserStrategyOptions defines the strategy type and any options used to create the strategy.", + "rule": "rule is the strategy that will dictate the allowable RunAsUser values that may be set.", + "ranges": "ranges are the allowed ranges of uids that may be used. If you would like to force a single uid then supply a single range with the same start and end. Required for MustRunAs.", } func (RunAsUserStrategyOptions) SwaggerDoc() map[string]string { @@ -185,8 +188,8 @@ func (RunAsUserStrategyOptions) SwaggerDoc() map[string]string { } var map_SELinuxStrategyOptions = map[string]string{ - "": "SELinux Strategy Options defines the strategy type and any options used to create the strategy.", - "rule": "type is the strategy that will dictate the allowable labels that may be set.", + "": "SELinuxStrategyOptions defines the strategy type and any options used to create the strategy.", + "rule": "rule is the strategy that will dictate the allowable labels that may be set.", "seLinuxOptions": "seLinuxOptions required to run as; required for MustRunAs More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/", } @@ -196,8 +199,8 @@ func (SELinuxStrategyOptions) SwaggerDoc() map[string]string { var map_SupplementalGroupsStrategyOptions = map[string]string{ "": "SupplementalGroupsStrategyOptions defines the strategy type and options used to create the strategy.", - "rule": "Rule is the strategy that will dictate what supplemental groups is used in the SecurityContext.", - "ranges": "Ranges are the allowed ranges of supplemental groups. If you would like to force a single supplemental group then supply a single range with the same start and end.", + "rule": "rule is the strategy that will dictate what supplemental groups is used in the SecurityContext.", + "ranges": "ranges are the allowed ranges of supplemental groups. If you would like to force a single supplemental group then supply a single range with the same start and end. Required for MustRunAs.", } func (SupplementalGroupsStrategyOptions) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go index 8a770b2f0..1980bd161 100644 --- a/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -394,6 +394,16 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { *out = make([]AllowedFlexVolume, len(*in)) copy(*out, *in) } + if in.AllowedUnsafeSysctls != nil { + in, out := &in.AllowedUnsafeSysctls, &out.AllowedUnsafeSysctls + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ForbiddenSysctls != nil { + in, out := &in.ForbiddenSysctls, &out.ForbiddenSysctls + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/vendor/k8s.io/api/rbac/v1/BUILD b/vendor/k8s.io/api/rbac/v1/BUILD deleted file mode 100644 index 539afb7ae..000000000 --- a/vendor/k8s.io/api/rbac/v1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/rbac/v1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/rbac/v1/generated.pb.go b/vendor/k8s.io/api/rbac/v1/generated.pb.go index 5343731cc..6dd7d727b 100644 --- a/vendor/k8s.io/api/rbac/v1/generated.pb.go +++ b/vendor/k8s.io/api/rbac/v1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/rbac/v1/generated.proto b/vendor/k8s.io/api/rbac/v1/generated.proto index 2f8d863df..78aca15bc 100644 --- a/vendor/k8s.io/api/rbac/v1/generated.proto +++ b/vendor/k8s.io/api/rbac/v1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,6 +62,7 @@ message ClusterRoleBinding { optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; // Subjects holds references to the objects the role applies to. + // +optional repeated Subject subjects = 2; // RoleRef can only reference a ClusterRole in the global namespace. @@ -134,6 +135,7 @@ message RoleBinding { optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; // Subjects holds references to the objects the role applies to. + // +optional repeated Subject subjects = 2; // RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. diff --git a/vendor/k8s.io/api/rbac/v1/types.go b/vendor/k8s.io/api/rbac/v1/types.go index 91990548b..17163cbb2 100644 --- a/vendor/k8s.io/api/rbac/v1/types.go +++ b/vendor/k8s.io/api/rbac/v1/types.go @@ -124,7 +124,8 @@ type RoleBinding struct { metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Subjects holds references to the objects the role applies to. - Subjects []Subject `json:"subjects" protobuf:"bytes,2,rep,name=subjects"` + // +optional + Subjects []Subject `json:"subjects,omitempty" protobuf:"bytes,2,rep,name=subjects"` // RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. // If the RoleRef cannot be resolved, the Authorizer must return an error. @@ -199,7 +200,8 @@ type ClusterRoleBinding struct { metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Subjects holds references to the objects the role applies to. - Subjects []Subject `json:"subjects" protobuf:"bytes,2,rep,name=subjects"` + // +optional + Subjects []Subject `json:"subjects,omitempty" protobuf:"bytes,2,rep,name=subjects"` // RoleRef can only reference a ClusterRole in the global namespace. // If the RoleRef cannot be resolved, the Authorizer must return an error. diff --git a/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go index 280ae5a82..0ec20c88e 100644 --- a/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_AggregationRule = map[string]string{ "": "AggregationRule describes how to locate ClusterRoles to aggregate into the ClusterRole", "clusterRoleSelectors": "ClusterRoleSelectors holds a list of selectors which will be used to find ClusterRoles and create the rules. If any of the selectors match, then the ClusterRole's permissions will be added", diff --git a/vendor/k8s.io/api/rbac/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/rbac/v1/zz_generated.deepcopy.go index 0a2a4d08e..be1592f77 100644 --- a/vendor/k8s.io/api/rbac/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/rbac/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/rbac/v1alpha1/BUILD b/vendor/k8s.io/api/rbac/v1alpha1/BUILD deleted file mode 100644 index 68d7cdfbb..000000000 --- a/vendor/k8s.io/api/rbac/v1alpha1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/rbac/v1alpha1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go b/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go index c07cdc75d..b8cf5431a 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/rbac/v1alpha1/generated.proto b/vendor/k8s.io/api/rbac/v1alpha1/generated.proto index 41a193f55..d7b294863 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/rbac/v1alpha1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -61,6 +61,7 @@ message ClusterRoleBinding { optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; // Subjects holds references to the objects the role applies to. + // +optional repeated Subject subjects = 2; // RoleRef can only reference a ClusterRole in the global namespace. @@ -134,6 +135,7 @@ message RoleBinding { optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; // Subjects holds references to the objects the role applies to. + // +optional repeated Subject subjects = 2; // RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. diff --git a/vendor/k8s.io/api/rbac/v1alpha1/types.go b/vendor/k8s.io/api/rbac/v1alpha1/types.go index 843d998ec..398d6a169 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/types.go +++ b/vendor/k8s.io/api/rbac/v1alpha1/types.go @@ -126,7 +126,8 @@ type RoleBinding struct { metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Subjects holds references to the objects the role applies to. - Subjects []Subject `json:"subjects" protobuf:"bytes,2,rep,name=subjects"` + // +optional + Subjects []Subject `json:"subjects,omitempty" protobuf:"bytes,2,rep,name=subjects"` // RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. // If the RoleRef cannot be resolved, the Authorizer must return an error. @@ -201,7 +202,8 @@ type ClusterRoleBinding struct { metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Subjects holds references to the objects the role applies to. - Subjects []Subject `json:"subjects" protobuf:"bytes,2,rep,name=subjects"` + // +optional + Subjects []Subject `json:"subjects,omitempty" protobuf:"bytes,2,rep,name=subjects"` // RoleRef can only reference a ClusterRole in the global namespace. // If the RoleRef cannot be resolved, the Authorizer must return an error. diff --git a/vendor/k8s.io/api/rbac/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/rbac/v1alpha1/types_swagger_doc_generated.go index e56cd0f10..1d6ef30b0 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/rbac/v1alpha1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1alpha1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_AggregationRule = map[string]string{ "": "AggregationRule describes how to locate ClusterRoles to aggregate into the ClusterRole", "clusterRoleSelectors": "ClusterRoleSelectors holds a list of selectors which will be used to find ClusterRoles and create the rules. If any of the selectors match, then the ClusterRole's permissions will be added", diff --git a/vendor/k8s.io/api/rbac/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/rbac/v1alpha1/zz_generated.deepcopy.go index 562451cd6..1d29acff3 100644 --- a/vendor/k8s.io/api/rbac/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/rbac/v1alpha1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/rbac/v1beta1/BUILD b/vendor/k8s.io/api/rbac/v1beta1/BUILD deleted file mode 100644 index c9aa763f4..000000000 --- a/vendor/k8s.io/api/rbac/v1beta1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/rbac/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go b/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go index c2525e0df..e4ddbcde3 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/rbac/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/rbac/v1beta1/generated.proto b/vendor/k8s.io/api/rbac/v1beta1/generated.proto index aa9960b8e..494aff8b3 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/generated.proto +++ b/vendor/k8s.io/api/rbac/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,6 +62,7 @@ message ClusterRoleBinding { optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; // Subjects holds references to the objects the role applies to. + // +optional repeated Subject subjects = 2; // RoleRef can only reference a ClusterRole in the global namespace. @@ -135,6 +136,7 @@ message RoleBinding { optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; // Subjects holds references to the objects the role applies to. + // +optional repeated Subject subjects = 2; // RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. diff --git a/vendor/k8s.io/api/rbac/v1beta1/types.go b/vendor/k8s.io/api/rbac/v1beta1/types.go index 091fc1dc9..857b67a6f 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/types.go +++ b/vendor/k8s.io/api/rbac/v1beta1/types.go @@ -125,7 +125,8 @@ type RoleBinding struct { metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Subjects holds references to the objects the role applies to. - Subjects []Subject `json:"subjects" protobuf:"bytes,2,rep,name=subjects"` + // +optional + Subjects []Subject `json:"subjects,omitempty" protobuf:"bytes,2,rep,name=subjects"` // RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. // If the RoleRef cannot be resolved, the Authorizer must return an error. @@ -199,7 +200,8 @@ type ClusterRoleBinding struct { metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Subjects holds references to the objects the role applies to. - Subjects []Subject `json:"subjects" protobuf:"bytes,2,rep,name=subjects"` + // +optional + Subjects []Subject `json:"subjects,omitempty" protobuf:"bytes,2,rep,name=subjects"` // RoleRef can only reference a ClusterRole in the global namespace. // If the RoleRef cannot be resolved, the Authorizer must return an error. diff --git a/vendor/k8s.io/api/rbac/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/rbac/v1beta1/types_swagger_doc_generated.go index 6180d6d43..66dba6ca1 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/rbac/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_AggregationRule = map[string]string{ "": "AggregationRule describes how to locate ClusterRoles to aggregate into the ClusterRole", "clusterRoleSelectors": "ClusterRoleSelectors holds a list of selectors which will be used to find ClusterRoles and create the rules. If any of the selectors match, then the ClusterRole's permissions will be added", diff --git a/vendor/k8s.io/api/rbac/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/rbac/v1beta1/zz_generated.deepcopy.go index 0ef823a07..86fadd170 100644 --- a/vendor/k8s.io/api/rbac/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/rbac/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/roundtrip_test.go b/vendor/k8s.io/api/roundtrip_test.go new file mode 100644 index 000000000..5b82feb84 --- /dev/null +++ b/vendor/k8s.io/api/roundtrip_test.go @@ -0,0 +1,150 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package testing + +import ( + "math/rand" + "testing" + + admissionv1beta1 "k8s.io/api/admission/v1beta1" + admissionregv1alpha1 "k8s.io/api/admissionregistration/v1alpha1" + admissionregv1beta1 "k8s.io/api/admissionregistration/v1beta1" + appsv1 "k8s.io/api/apps/v1" + appsv1beta1 "k8s.io/api/apps/v1beta1" + appsv1beta2 "k8s.io/api/apps/v1beta2" + authenticationv1 "k8s.io/api/authentication/v1" + authenticationv1beta1 "k8s.io/api/authentication/v1beta1" + authorizationv1 "k8s.io/api/authorization/v1" + authorizationv1beta1 "k8s.io/api/authorization/v1beta1" + autoscalingv1 "k8s.io/api/autoscaling/v1" + autoscalingv2beta1 "k8s.io/api/autoscaling/v2beta1" + batchv1 "k8s.io/api/batch/v1" + batchv1beta1 "k8s.io/api/batch/v1beta1" + batchv2alpha1 "k8s.io/api/batch/v2alpha1" + certificatesv1beta1 "k8s.io/api/certificates/v1beta1" + corev1 "k8s.io/api/core/v1" + eventsv1beta1 "k8s.io/api/events/v1beta1" + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" + imagepolicyv1alpha1 "k8s.io/api/imagepolicy/v1alpha1" + networkingv1 "k8s.io/api/networking/v1" + policyv1beta1 "k8s.io/api/policy/v1beta1" + rbacv1 "k8s.io/api/rbac/v1" + rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" + rbacv1beta1 "k8s.io/api/rbac/v1beta1" + schedulingv1alpha1 "k8s.io/api/scheduling/v1alpha1" + schedulingv1beta1 "k8s.io/api/scheduling/v1beta1" + settingsv1alpha1 "k8s.io/api/settings/v1alpha1" + storagev1 "k8s.io/api/storage/v1" + storagev1alpha1 "k8s.io/api/storage/v1alpha1" + storagev1beta1 "k8s.io/api/storage/v1beta1" + + "k8s.io/apimachinery/pkg/api/testing/fuzzer" + "k8s.io/apimachinery/pkg/api/testing/roundtrip" + genericfuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" +) + +var groups = []runtime.SchemeBuilder{ + admissionv1beta1.SchemeBuilder, + admissionregv1alpha1.SchemeBuilder, + admissionregv1beta1.SchemeBuilder, + appsv1beta1.SchemeBuilder, + appsv1beta2.SchemeBuilder, + appsv1.SchemeBuilder, + authenticationv1beta1.SchemeBuilder, + authenticationv1.SchemeBuilder, + authorizationv1beta1.SchemeBuilder, + authorizationv1.SchemeBuilder, + autoscalingv1.SchemeBuilder, + autoscalingv2beta1.SchemeBuilder, + batchv2alpha1.SchemeBuilder, + batchv1beta1.SchemeBuilder, + batchv1.SchemeBuilder, + certificatesv1beta1.SchemeBuilder, + corev1.SchemeBuilder, + eventsv1beta1.SchemeBuilder, + extensionsv1beta1.SchemeBuilder, + imagepolicyv1alpha1.SchemeBuilder, + networkingv1.SchemeBuilder, + policyv1beta1.SchemeBuilder, + rbacv1alpha1.SchemeBuilder, + rbacv1beta1.SchemeBuilder, + rbacv1.SchemeBuilder, + schedulingv1alpha1.SchemeBuilder, + schedulingv1beta1.SchemeBuilder, + settingsv1alpha1.SchemeBuilder, + storagev1alpha1.SchemeBuilder, + storagev1beta1.SchemeBuilder, + storagev1.SchemeBuilder, +} + +func TestRoundTripExternalTypes(t *testing.T) { + for _, builder := range groups { + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + + builder.AddToScheme(scheme) + seed := rand.Int63() + // I'm only using the generic fuzzer funcs, but at some point in time we might need to + // switch to specialized. For now we're happy with the current serialization test. + fuzzer := fuzzer.FuzzerFor(genericfuzzer.Funcs, rand.NewSource(seed), codecs) + + roundtrip.RoundTripExternalTypes(t, scheme, codecs, fuzzer, nil) + } +} + +func TestFailRoundTrip(t *testing.T) { + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + groupVersion := schema.GroupVersion{Group: "broken", Version: "v1"} + builder := runtime.NewSchemeBuilder(func(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(groupVersion, &BrokenType{}) + metav1.AddToGroupVersion(scheme, groupVersion) + return nil + }) + builder.AddToScheme(scheme) + seed := rand.Int63() + fuzzer := fuzzer.FuzzerFor(genericfuzzer.Funcs, rand.NewSource(seed), codecs) + tmpT := new(testing.T) + roundtrip.RoundTripExternalTypes(tmpT, scheme, codecs, fuzzer, nil) + // It's very hacky way of making sure the DeepCopy is actually invoked inside RoundTripExternalTypes + // used in the other test. If for some reason this tests starts passing we need to fail b/c we're not testing + // the DeepCopy in the other method which we care so much about. + if !tmpT.Failed() { + t.Log("RoundTrip should've failed on DeepCopy but it did not!") + t.FailNow() + } +} + +type BrokenType struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Field1 string `json:"field1,omitempty"` + Field2 string `json:"field2,omitempty"` +} + +func (in *BrokenType) DeepCopy() *BrokenType { + return new(BrokenType) +} + +func (in *BrokenType) DeepCopyObject() runtime.Object { + return in.DeepCopy() +} diff --git a/vendor/k8s.io/api/scheduling/v1alpha1/BUILD b/vendor/k8s.io/api/scheduling/v1alpha1/BUILD deleted file mode 100644 index c8c197664..000000000 --- a/vendor/k8s.io/api/scheduling/v1alpha1/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/scheduling/v1alpha1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go b/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go index 39c0b9e6a..1f79d7f88 100644 --- a/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/scheduling/v1alpha1/generated.proto b/vendor/k8s.io/api/scheduling/v1alpha1/generated.proto index e964a76dd..7dc5cc841 100644 --- a/vendor/k8s.io/api/scheduling/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/scheduling/v1alpha1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/scheduling/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/scheduling/v1alpha1/types_swagger_doc_generated.go index 9080dd9d6..f406f4402 100644 --- a/vendor/k8s.io/api/scheduling/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/scheduling/v1alpha1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1alpha1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_PriorityClass = map[string]string{ "": "PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", diff --git a/vendor/k8s.io/api/scheduling/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/scheduling/v1alpha1/zz_generated.deepcopy.go index 51f8d0473..fe0c86040 100644 --- a/vendor/k8s.io/api/scheduling/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/scheduling/v1alpha1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apimachinery/doc.go b/vendor/k8s.io/api/scheduling/v1beta1/doc.go similarity index 65% rename from vendor/k8s.io/apimachinery/pkg/apimachinery/doc.go rename to vendor/k8s.io/api/scheduling/v1beta1/doc.go index b238454b2..f2dd1cfac 100644 --- a/vendor/k8s.io/apimachinery/pkg/apimachinery/doc.go +++ b/vendor/k8s.io/api/scheduling/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2014 The Kubernetes Authors. +Copyright 2018 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package apimachinery contains the generic API machinery code that -// is common to both server and clients. -// This package should never import specific API objects. -package apimachinery // import "k8s.io/apimachinery/pkg/apimachinery" +// +k8s:deepcopy-gen=package +// +k8s:openapi-gen=true + +// +groupName=scheduling.k8s.io +package v1beta1 // import "k8s.io/api/scheduling/v1beta1" diff --git a/vendor/k8s.io/api/scheduling/v1beta1/generated.pb.go b/vendor/k8s.io/api/scheduling/v1beta1/generated.pb.go new file mode 100644 index 000000000..c4fe85fe9 --- /dev/null +++ b/vendor/k8s.io/api/scheduling/v1beta1/generated.pb.go @@ -0,0 +1,641 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by protoc-gen-gogo. +// source: k8s.io/kubernetes/vendor/k8s.io/api/scheduling/v1beta1/generated.proto +// DO NOT EDIT! + +/* + Package v1beta1 is a generated protocol buffer package. + + It is generated from these files: + k8s.io/kubernetes/vendor/k8s.io/api/scheduling/v1beta1/generated.proto + + It has these top-level messages: + PriorityClass + PriorityClassList +*/ +package v1beta1 + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import strings "strings" +import reflect "reflect" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +func (m *PriorityClass) Reset() { *m = PriorityClass{} } +func (*PriorityClass) ProtoMessage() {} +func (*PriorityClass) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } + +func (m *PriorityClassList) Reset() { *m = PriorityClassList{} } +func (*PriorityClassList) ProtoMessage() {} +func (*PriorityClassList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } + +func init() { + proto.RegisterType((*PriorityClass)(nil), "k8s.io.api.scheduling.v1beta1.PriorityClass") + proto.RegisterType((*PriorityClassList)(nil), "k8s.io.api.scheduling.v1beta1.PriorityClassList") +} +func (m *PriorityClass) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PriorityClass) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) + n1, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + dAtA[i] = 0x10 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Value)) + dAtA[i] = 0x18 + i++ + if m.GlobalDefault { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Description))) + i += copy(dAtA[i:], m.Description) + return i, nil +} + +func (m *PriorityClassList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PriorityClassList) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) + n2, err := m.ListMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + if len(m.Items) > 0 { + for _, msg := range m.Items { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func encodeFixed64Generated(dAtA []byte, offset int, v uint64) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + dAtA[offset+4] = uint8(v >> 32) + dAtA[offset+5] = uint8(v >> 40) + dAtA[offset+6] = uint8(v >> 48) + dAtA[offset+7] = uint8(v >> 56) + return offset + 8 +} +func encodeFixed32Generated(dAtA []byte, offset int, v uint32) int { + dAtA[offset] = uint8(v) + dAtA[offset+1] = uint8(v >> 8) + dAtA[offset+2] = uint8(v >> 16) + dAtA[offset+3] = uint8(v >> 24) + return offset + 4 +} +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *PriorityClass) Size() (n int) { + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.Value)) + n += 2 + l = len(m.Description) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *PriorityClassList) Size() (n int) { + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func sovGenerated(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *PriorityClass) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PriorityClass{`, + `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `GlobalDefault:` + fmt.Sprintf("%v", this.GlobalDefault) + `,`, + `Description:` + fmt.Sprintf("%v", this.Description) + `,`, + `}`, + }, "") + return s +} +func (this *PriorityClassList) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PriorityClassList{`, + `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "PriorityClass", "PriorityClass", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *PriorityClass) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PriorityClass: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PriorityClass: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", 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 > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + m.Value = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Value |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GlobalDefault", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.GlobalDefault = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PriorityClassList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PriorityClassList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PriorityClassList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", 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 > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", 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 > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, PriorityClass{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenerated(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthGenerated + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipGenerated(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/api/scheduling/v1beta1/generated.proto", fileDescriptorGenerated) +} + +var fileDescriptorGenerated = []byte{ + // 462 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xbf, 0x8e, 0xd3, 0x4c, + 0x14, 0xc5, 0x3d, 0xd9, 0x2f, 0xfa, 0x82, 0xa3, 0x48, 0x60, 0x84, 0x64, 0x45, 0xc2, 0x6b, 0x2d, + 0x8d, 0x0b, 0x76, 0x86, 0x2c, 0x7f, 0x84, 0x44, 0x67, 0x56, 0x20, 0x24, 0x10, 0xe0, 0x82, 0x02, + 0x51, 0x30, 0xb6, 0xef, 0x3a, 0x43, 0x6c, 0x8f, 0x35, 0x73, 0x6d, 0x69, 0x3b, 0x6a, 0x2a, 0x1e, + 0x8a, 0x22, 0xe5, 0x96, 0x5b, 0xad, 0x88, 0x79, 0x11, 0x64, 0xc7, 0xac, 0x13, 0xa2, 0x05, 0x3a, + 0xcf, 0xb9, 0xe7, 0x77, 0x66, 0xee, 0x91, 0xcd, 0x67, 0x8b, 0xc7, 0x9a, 0x0a, 0xc9, 0x16, 0x65, + 0x08, 0x2a, 0x07, 0x04, 0xcd, 0x2a, 0xc8, 0x63, 0xa9, 0x58, 0x37, 0xe0, 0x85, 0x60, 0x3a, 0x9a, + 0x43, 0x5c, 0xa6, 0x22, 0x4f, 0x58, 0x35, 0x0b, 0x01, 0xf9, 0x8c, 0x25, 0x90, 0x83, 0xe2, 0x08, + 0x31, 0x2d, 0x94, 0x44, 0x69, 0xdd, 0x5e, 0xdb, 0x29, 0x2f, 0x04, 0xed, 0xed, 0xb4, 0xb3, 0x4f, + 0x0f, 0x13, 0x81, 0xf3, 0x32, 0xa4, 0x91, 0xcc, 0x58, 0x22, 0x13, 0xc9, 0x5a, 0x2a, 0x2c, 0x4f, + 0xda, 0x53, 0x7b, 0x68, 0xbf, 0xd6, 0x69, 0xd3, 0x07, 0xfd, 0xe5, 0x19, 0x8f, 0xe6, 0x22, 0x07, + 0x75, 0xca, 0x8a, 0x45, 0xd2, 0x08, 0x9a, 0x65, 0x80, 0x9c, 0x55, 0x3b, 0x6f, 0x98, 0xb2, 0xab, + 0x28, 0x55, 0xe6, 0x28, 0x32, 0xd8, 0x01, 0x1e, 0xfd, 0x0d, 0x68, 0x36, 0xc9, 0xf8, 0x0e, 0x77, + 0xff, 0x2a, 0xae, 0x44, 0x91, 0x32, 0x91, 0xa3, 0x46, 0xf5, 0x3b, 0x74, 0xf0, 0x65, 0x60, 0x4e, + 0xde, 0x28, 0x21, 0x95, 0xc0, 0xd3, 0xa7, 0x29, 0xd7, 0xda, 0xfa, 0x68, 0x8e, 0x9a, 0x55, 0x62, + 0x8e, 0xdc, 0x26, 0x2e, 0xf1, 0xc6, 0x47, 0xf7, 0x68, 0x5f, 0xe3, 0x65, 0x32, 0x2d, 0x16, 0x49, + 0x23, 0x68, 0xda, 0xb8, 0x69, 0x35, 0xa3, 0xaf, 0xc3, 0x4f, 0x10, 0xe1, 0x2b, 0x40, 0xee, 0x5b, + 0xcb, 0x8b, 0x7d, 0xa3, 0xbe, 0xd8, 0x37, 0x7b, 0x2d, 0xb8, 0x4c, 0xb5, 0xee, 0x98, 0xc3, 0x8a, + 0xa7, 0x25, 0xd8, 0x03, 0x97, 0x78, 0x43, 0x7f, 0xd2, 0x99, 0x87, 0xef, 0x1a, 0x31, 0x58, 0xcf, + 0xac, 0x27, 0xe6, 0x24, 0x49, 0x65, 0xc8, 0xd3, 0x63, 0x38, 0xe1, 0x65, 0x8a, 0xf6, 0x9e, 0x4b, + 0xbc, 0x91, 0x7f, 0xab, 0x33, 0x4f, 0x9e, 0x6f, 0x0e, 0x83, 0x6d, 0xaf, 0xf5, 0xd0, 0x1c, 0xc7, + 0xa0, 0x23, 0x25, 0x0a, 0x14, 0x32, 0xb7, 0xff, 0x73, 0x89, 0x77, 0xcd, 0xbf, 0xd9, 0xa1, 0xe3, + 0xe3, 0x7e, 0x14, 0x6c, 0xfa, 0x0e, 0xbe, 0x11, 0xf3, 0xc6, 0x56, 0x19, 0x2f, 0x85, 0x46, 0xeb, + 0xc3, 0x4e, 0x21, 0xf4, 0xdf, 0x0a, 0x69, 0xe8, 0xb6, 0x8e, 0xeb, 0xdd, 0xcd, 0xa3, 0x5f, 0xca, + 0x46, 0x19, 0x6f, 0xcd, 0xa1, 0x40, 0xc8, 0xb4, 0x3d, 0x70, 0xf7, 0xbc, 0xf1, 0xd1, 0x5d, 0xfa, + 0xc7, 0x5f, 0x96, 0x6e, 0x3d, 0xaf, 0xaf, 0xee, 0x45, 0x13, 0x11, 0xac, 0x93, 0xfc, 0xc3, 0xe5, + 0xca, 0x31, 0xce, 0x56, 0x8e, 0x71, 0xbe, 0x72, 0x8c, 0xcf, 0xb5, 0x43, 0x96, 0xb5, 0x43, 0xce, + 0x6a, 0x87, 0x9c, 0xd7, 0x0e, 0xf9, 0x5e, 0x3b, 0xe4, 0xeb, 0x0f, 0xc7, 0x78, 0xff, 0x7f, 0x17, + 0xf9, 0x33, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xb3, 0xc6, 0x7a, 0x6d, 0x03, 0x00, 0x00, +} diff --git a/vendor/k8s.io/api/scheduling/v1beta1/generated.proto b/vendor/k8s.io/api/scheduling/v1beta1/generated.proto new file mode 100644 index 000000000..fe7f21de8 --- /dev/null +++ b/vendor/k8s.io/api/scheduling/v1beta1/generated.proto @@ -0,0 +1,68 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + + +// This file was autogenerated by go-to-protobuf. Do not edit it manually! + +syntax = 'proto2'; + +package k8s.io.api.scheduling.v1beta1; + +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; +import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; + +// Package-wide variables from generator "generated". +option go_package = "v1beta1"; + +// PriorityClass defines mapping from a priority class name to the priority +// integer value. The value can be any valid integer. +message PriorityClass { + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // The value of this priority class. This is the actual priority that pods + // receive when they have the name of this class in their pod spec. + optional int32 value = 2; + + // globalDefault specifies whether this PriorityClass should be considered as + // the default priority for pods that do not have any priority class. + // Only one PriorityClass can be marked as `globalDefault`. However, if more than + // one PriorityClasses exists with their `globalDefault` field set to true, + // the smallest value of such global default PriorityClasses will be used as the default priority. + // +optional + optional bool globalDefault = 3; + + // description is an arbitrary string that usually provides guidelines on + // when this priority class should be used. + // +optional + optional string description = 4; +} + +// PriorityClassList is a collection of priority classes. +message PriorityClassList { + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // items is the list of PriorityClasses + repeated PriorityClass items = 2; +} + diff --git a/vendor/k8s.io/api/scheduling/v1beta1/register.go b/vendor/k8s.io/api/scheduling/v1beta1/register.go new file mode 100644 index 000000000..fb26557bb --- /dev/null +++ b/vendor/k8s.io/api/scheduling/v1beta1/register.go @@ -0,0 +1,52 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// GroupName is the group name use in this package +const GroupName = "scheduling.k8s.io" + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. + // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + localSchemeBuilder = &SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +// Adds the list of known types to the given scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &PriorityClass{}, + &PriorityClassList{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/vendor/k8s.io/api/scheduling/v1beta1/types.go b/vendor/k8s.io/api/scheduling/v1beta1/types.go new file mode 100644 index 000000000..a9aaa8665 --- /dev/null +++ b/vendor/k8s.io/api/scheduling/v1beta1/types.go @@ -0,0 +1,66 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// PriorityClass defines mapping from a priority class name to the priority +// integer value. The value can be any valid integer. +type PriorityClass struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // The value of this priority class. This is the actual priority that pods + // receive when they have the name of this class in their pod spec. + Value int32 `json:"value" protobuf:"bytes,2,opt,name=value"` + + // globalDefault specifies whether this PriorityClass should be considered as + // the default priority for pods that do not have any priority class. + // Only one PriorityClass can be marked as `globalDefault`. However, if more than + // one PriorityClasses exists with their `globalDefault` field set to true, + // the smallest value of such global default PriorityClasses will be used as the default priority. + // +optional + GlobalDefault bool `json:"globalDefault,omitempty" protobuf:"bytes,3,opt,name=globalDefault"` + + // description is an arbitrary string that usually provides guidelines on + // when this priority class should be used. + // +optional + Description string `json:"description,omitempty" protobuf:"bytes,4,opt,name=description"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// PriorityClassList is a collection of priority classes. +type PriorityClassList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // items is the list of PriorityClasses + Items []PriorityClass `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/vendor/k8s.io/api/scheduling/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/scheduling/v1beta1/types_swagger_doc_generated.go new file mode 100644 index 000000000..c18f54a82 --- /dev/null +++ b/vendor/k8s.io/api/scheduling/v1beta1/types_swagger_doc_generated.go @@ -0,0 +1,52 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +// This file contains a collection of methods that can be used from go-restful to +// generate Swagger API documentation for its models. Please read this PR for more +// information on the implementation: https://github.com/emicklei/go-restful/pull/215 +// +// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if +// they are on one line! For multiple line or blocks that you want to ignore use ---. +// Any context after a --- is ignored. +// +// Those methods can be generated by using hack/update-generated-swagger-docs.sh + +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_PriorityClass = map[string]string{ + "": "PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", + "value": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", + "globalDefault": "globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.", + "description": "description is an arbitrary string that usually provides guidelines on when this priority class should be used.", +} + +func (PriorityClass) SwaggerDoc() map[string]string { + return map_PriorityClass +} + +var map_PriorityClassList = map[string]string{ + "": "PriorityClassList is a collection of priority classes.", + "metadata": "Standard list metadata More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", + "items": "items is the list of PriorityClasses", +} + +func (PriorityClassList) SwaggerDoc() map[string]string { + return map_PriorityClassList +} + +// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/api/scheduling/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/scheduling/v1beta1/zz_generated.deepcopy.go new file mode 100644 index 000000000..6f68e4ac5 --- /dev/null +++ b/vendor/k8s.io/api/scheduling/v1beta1/zz_generated.deepcopy.go @@ -0,0 +1,84 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1beta1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PriorityClass) DeepCopyInto(out *PriorityClass) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PriorityClass. +func (in *PriorityClass) DeepCopy() *PriorityClass { + if in == nil { + return nil + } + out := new(PriorityClass) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PriorityClass) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PriorityClassList) DeepCopyInto(out *PriorityClassList) { + *out = *in + out.TypeMeta = in.TypeMeta + out.ListMeta = in.ListMeta + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]PriorityClass, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PriorityClassList. +func (in *PriorityClassList) DeepCopy() *PriorityClassList { + if in == nil { + return nil + } + out := new(PriorityClassList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *PriorityClassList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} diff --git a/vendor/k8s.io/api/settings/v1alpha1/BUILD b/vendor/k8s.io/api/settings/v1alpha1/BUILD deleted file mode 100644 index d7457427d..000000000 --- a/vendor/k8s.io/api/settings/v1alpha1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/settings/v1alpha1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/settings/v1alpha1/generated.pb.go b/vendor/k8s.io/api/settings/v1alpha1/generated.pb.go index bfc6a5a11..86a7f89a5 100644 --- a/vendor/k8s.io/api/settings/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/settings/v1alpha1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/settings/v1alpha1/generated.proto b/vendor/k8s.io/api/settings/v1alpha1/generated.proto index 098e8dd9b..887d2fa1b 100644 --- a/vendor/k8s.io/api/settings/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/settings/v1alpha1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/settings/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/settings/v1alpha1/types_swagger_doc_generated.go index 2a89e5566..508c452f1 100644 --- a/vendor/k8s.io/api/settings/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/settings/v1alpha1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1alpha1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_PodPreset = map[string]string{ "": "PodPreset is a policy resource that defines additional runtime requirements for a Pod.", } diff --git a/vendor/k8s.io/api/settings/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/settings/v1alpha1/zz_generated.deepcopy.go index 3fe7f6ca4..6397a88ab 100644 --- a/vendor/k8s.io/api/settings/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/settings/v1alpha1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/storage/v1/BUILD b/vendor/k8s.io/api/storage/v1/BUILD deleted file mode 100644 index 50a09f0eb..000000000 --- a/vendor/k8s.io/api/storage/v1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/storage/v1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/storage/v1/generated.pb.go b/vendor/k8s.io/api/storage/v1/generated.pb.go index 31988b70d..b13b03fc7 100644 --- a/vendor/k8s.io/api/storage/v1/generated.pb.go +++ b/vendor/k8s.io/api/storage/v1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -152,6 +152,18 @@ func (m *StorageClass) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(len(*m.VolumeBindingMode))) i += copy(dAtA[i:], *m.VolumeBindingMode) } + if len(m.AllowedTopologies) > 0 { + for _, msg := range m.AllowedTopologies { + dAtA[i] = 0x42 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -252,6 +264,12 @@ func (m *StorageClass) Size() (n int) { l = len(*m.VolumeBindingMode) n += 1 + l + sovGenerated(uint64(l)) } + if len(m.AllowedTopologies) > 0 { + for _, e := range m.AllowedTopologies { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -304,6 +322,7 @@ func (this *StorageClass) String() string { `MountOptions:` + fmt.Sprintf("%v", this.MountOptions) + `,`, `AllowVolumeExpansion:` + valueToStringGenerated(this.AllowVolumeExpansion) + `,`, `VolumeBindingMode:` + valueToStringGenerated(this.VolumeBindingMode) + `,`, + `AllowedTopologies:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedTopologies), "TopologySelectorTerm", "k8s_io_api_core_v1.TopologySelectorTerm", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -641,6 +660,37 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { s := VolumeBindingMode(dAtA[iNdEx:postIndex]) m.VolumeBindingMode = &s iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedTopologies", 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 > l { + return io.ErrUnexpectedEOF + } + m.AllowedTopologies = append(m.AllowedTopologies, k8s_io_api_core_v1.TopologySelectorTerm{}) + if err := m.AllowedTopologies[len(m.AllowedTopologies)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -883,44 +933,48 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 623 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x4f, 0x6f, 0xd3, 0x3c, - 0x18, 0x6f, 0xda, 0xb7, 0x2f, 0x9b, 0xbb, 0x89, 0x2e, 0x0c, 0x29, 0xea, 0x21, 0xa9, 0xc6, 0xa5, - 0x9a, 0x84, 0xb3, 0x6e, 0x03, 0x4d, 0x48, 0x20, 0x11, 0x34, 0x09, 0xa4, 0x4d, 0xab, 0x82, 0x34, - 0x21, 0xc4, 0x01, 0x37, 0x7d, 0xc8, 0x4c, 0x13, 0x3b, 0xb2, 0x9d, 0x40, 0x6f, 0x7c, 0x04, 0xce, - 0x7c, 0x14, 0x3e, 0xc1, 0x8e, 0x3b, 0xee, 0x14, 0xb1, 0xf0, 0x2d, 0x76, 0x42, 0x49, 0xca, 0x9a, - 0xad, 0x9d, 0xd8, 0x2d, 0xfe, 0xfd, 0xb3, 0x9f, 0x27, 0x3f, 0xf4, 0x62, 0xbc, 0x27, 0x31, 0xe5, - 0xf6, 0x38, 0x1e, 0x82, 0x60, 0xa0, 0x40, 0xda, 0x09, 0xb0, 0x11, 0x17, 0xf6, 0x94, 0x20, 0x11, - 0xb5, 0xa5, 0xe2, 0x82, 0xf8, 0x60, 0x27, 0x7d, 0xdb, 0x07, 0x06, 0x82, 0x28, 0x18, 0xe1, 0x48, - 0x70, 0xc5, 0xf5, 0x87, 0xa5, 0x0c, 0x93, 0x88, 0xe2, 0xa9, 0x0c, 0x27, 0xfd, 0xce, 0x63, 0x9f, - 0xaa, 0x93, 0x78, 0x88, 0x3d, 0x1e, 0xda, 0x3e, 0xf7, 0xb9, 0x5d, 0xa8, 0x87, 0xf1, 0xa7, 0xe2, - 0x54, 0x1c, 0x8a, 0xaf, 0x32, 0xa5, 0xb3, 0xb9, 0xf0, 0xb2, 0x21, 0x28, 0x32, 0x77, 0x63, 0x67, - 0x77, 0xa6, 0x0d, 0x89, 0x77, 0x42, 0x19, 0x88, 0x89, 0x1d, 0x8d, 0xfd, 0x1c, 0x90, 0x76, 0x08, - 0x8a, 0x2c, 0x78, 0x67, 0xc7, 0xbe, 0xcd, 0x25, 0x62, 0xa6, 0x68, 0x08, 0x73, 0x86, 0xa7, 0xff, - 0x32, 0x48, 0xef, 0x04, 0x42, 0x32, 0xe7, 0xdb, 0xb9, 0xcd, 0x17, 0x2b, 0x1a, 0xd8, 0x94, 0x29, - 0xa9, 0xc4, 0x4d, 0xd3, 0xc6, 0x8f, 0x26, 0x5a, 0x79, 0x5b, 0xce, 0xfd, 0x2a, 0x20, 0x52, 0xea, - 0x1f, 0xd1, 0x52, 0x3e, 0xc9, 0x88, 0x28, 0x62, 0x68, 0x5d, 0xad, 0xd7, 0xda, 0xde, 0xc2, 0xb3, - 0x4d, 0x5f, 0x05, 0xe3, 0x68, 0xec, 0xe7, 0x80, 0xc4, 0xb9, 0x1a, 0x27, 0x7d, 0x7c, 0x34, 0xfc, - 0x0c, 0x9e, 0x3a, 0x04, 0x45, 0x1c, 0xfd, 0x34, 0xb5, 0x6a, 0x59, 0x6a, 0xa1, 0x19, 0xe6, 0x5e, - 0xa5, 0xea, 0x4f, 0x50, 0x2b, 0x12, 0x3c, 0xa1, 0x92, 0x72, 0x06, 0xc2, 0xa8, 0x77, 0xb5, 0xde, - 0xb2, 0xf3, 0x60, 0x6a, 0x69, 0x0d, 0x66, 0x94, 0x5b, 0xd5, 0xe9, 0x3e, 0x42, 0x11, 0x11, 0x24, - 0x04, 0x05, 0x42, 0x1a, 0x8d, 0x6e, 0xa3, 0xd7, 0xda, 0xde, 0xc1, 0x0b, 0x4b, 0x80, 0xab, 0x13, - 0xe1, 0xc1, 0x95, 0x6b, 0x9f, 0x29, 0x31, 0x99, 0xbd, 0x6e, 0x46, 0xb8, 0x95, 0x68, 0x7d, 0x8c, - 0x56, 0x05, 0x78, 0x01, 0xa1, 0xe1, 0x80, 0x07, 0xd4, 0x9b, 0x18, 0xff, 0x15, 0x2f, 0xdc, 0xcf, - 0x52, 0x6b, 0xd5, 0xad, 0x12, 0x97, 0xa9, 0xb5, 0x55, 0xa9, 0x8f, 0xc7, 0x45, 0xde, 0x1d, 0x3c, - 0x00, 0x21, 0xa9, 0x54, 0xc0, 0xd4, 0x31, 0x0f, 0xe2, 0x10, 0xae, 0x79, 0xdc, 0xeb, 0xd9, 0xfa, - 0x2e, 0x5a, 0x09, 0x79, 0xcc, 0xd4, 0x51, 0xa4, 0x28, 0x67, 0xd2, 0x68, 0x76, 0x1b, 0xbd, 0x65, - 0xa7, 0x9d, 0xa5, 0xd6, 0xca, 0x61, 0x05, 0x77, 0xaf, 0xa9, 0xf4, 0x03, 0xb4, 0x4e, 0x82, 0x80, - 0x7f, 0x29, 0x2f, 0xd8, 0xff, 0x1a, 0x11, 0x96, 0x6f, 0xc9, 0xf8, 0xbf, 0xab, 0xf5, 0x96, 0x1c, - 0x23, 0x4b, 0xad, 0xf5, 0x97, 0x0b, 0x78, 0x77, 0xa1, 0x4b, 0x7f, 0x87, 0xd6, 0x92, 0x02, 0x72, - 0x28, 0x1b, 0x51, 0xe6, 0x1f, 0xf2, 0x11, 0x18, 0xf7, 0x8a, 0xa1, 0x37, 0xb3, 0xd4, 0x5a, 0x3b, - 0xbe, 0x49, 0x5e, 0x2e, 0x02, 0xdd, 0xf9, 0x90, 0xce, 0x73, 0x74, 0xff, 0xc6, 0xf6, 0xf5, 0x36, - 0x6a, 0x8c, 0x61, 0x52, 0x54, 0x6b, 0xd9, 0xcd, 0x3f, 0xf5, 0x75, 0xd4, 0x4c, 0x48, 0x10, 0x43, - 0xd9, 0x04, 0xb7, 0x3c, 0x3c, 0xab, 0xef, 0x69, 0x1b, 0x3f, 0x35, 0xd4, 0xae, 0xfe, 0xca, 0x03, - 0x2a, 0x95, 0xfe, 0x61, 0xae, 0xa0, 0xf8, 0x6e, 0x05, 0xcd, 0xdd, 0x45, 0x3d, 0xdb, 0xd3, 0x02, - 0x2c, 0xfd, 0x45, 0x2a, 0xe5, 0x7c, 0x8d, 0x9a, 0x54, 0x41, 0x28, 0x8d, 0x7a, 0x51, 0xb0, 0x47, - 0x77, 0x28, 0x98, 0xb3, 0x3a, 0xcd, 0x6b, 0xbe, 0xc9, 0x9d, 0x6e, 0x19, 0xe0, 0xf4, 0x4e, 0x2f, - 0xcc, 0xda, 0xd9, 0x85, 0x59, 0x3b, 0xbf, 0x30, 0x6b, 0xdf, 0x32, 0x53, 0x3b, 0xcd, 0x4c, 0xed, - 0x2c, 0x33, 0xb5, 0xf3, 0xcc, 0xd4, 0x7e, 0x65, 0xa6, 0xf6, 0xfd, 0xb7, 0x59, 0x7b, 0x5f, 0x4f, - 0xfa, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xee, 0x56, 0xcc, 0xfd, 0x0a, 0x05, 0x00, 0x00, + // 677 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xc1, 0x6e, 0xd3, 0x4a, + 0x14, 0x8d, 0x93, 0x97, 0xbe, 0x74, 0xd2, 0xea, 0x25, 0x7e, 0x45, 0x32, 0x59, 0x38, 0x51, 0xd9, + 0x44, 0x95, 0x18, 0x37, 0x6d, 0x41, 0x15, 0x12, 0x48, 0x35, 0xaa, 0x04, 0x52, 0xab, 0x46, 0x6e, + 0x55, 0x21, 0xc4, 0x82, 0x89, 0x73, 0x71, 0x87, 0xd8, 0x33, 0x66, 0x66, 0x6c, 0xc8, 0x8e, 0x1f, + 0x40, 0xe2, 0x7b, 0xf8, 0x82, 0x2e, 0xbb, 0xec, 0x2a, 0xa2, 0xe6, 0x2f, 0xba, 0x42, 0x76, 0x42, + 0xe3, 0x26, 0xa9, 0xe8, 0x6e, 0xe6, 0xdc, 0x73, 0xce, 0x9d, 0x3b, 0xf7, 0x5e, 0xf4, 0x62, 0xb0, + 0x2b, 0x31, 0xe5, 0xd6, 0x20, 0xea, 0x81, 0x60, 0xa0, 0x40, 0x5a, 0x31, 0xb0, 0x3e, 0x17, 0xd6, + 0x24, 0x40, 0x42, 0x6a, 0x49, 0xc5, 0x05, 0xf1, 0xc0, 0x8a, 0x3b, 0x96, 0x07, 0x0c, 0x04, 0x51, + 0xd0, 0xc7, 0xa1, 0xe0, 0x8a, 0xeb, 0x0f, 0xc6, 0x34, 0x4c, 0x42, 0x8a, 0x27, 0x34, 0x1c, 0x77, + 0x1a, 0x8f, 0x3d, 0xaa, 0xce, 0xa2, 0x1e, 0x76, 0x79, 0x60, 0x79, 0xdc, 0xe3, 0x56, 0xc6, 0xee, + 0x45, 0x1f, 0xb2, 0x5b, 0x76, 0xc9, 0x4e, 0x63, 0x97, 0xc6, 0x7a, 0x2e, 0x99, 0xcb, 0xc5, 0xa2, + 0x4c, 0x8d, 0x8d, 0x85, 0x0f, 0xea, 0x81, 0x22, 0xf3, 0xdc, 0x9d, 0x29, 0x37, 0x20, 0xee, 0x19, + 0x65, 0x20, 0x86, 0x56, 0x38, 0xf0, 0x52, 0x40, 0x5a, 0x01, 0x28, 0xb2, 0x28, 0x83, 0x75, 0x97, + 0x4a, 0x44, 0x4c, 0xd1, 0x00, 0xe6, 0x04, 0x4f, 0xff, 0x26, 0x90, 0xee, 0x19, 0x04, 0x64, 0x4e, + 0xb7, 0x7d, 0x97, 0x2e, 0x52, 0xd4, 0xb7, 0x28, 0x53, 0x52, 0x89, 0x59, 0xd1, 0xfa, 0xb7, 0x25, + 0xb4, 0x72, 0x3c, 0xae, 0xfb, 0xa5, 0x4f, 0xa4, 0xd4, 0xdf, 0xa3, 0x4a, 0x5a, 0x49, 0x9f, 0x28, + 0x62, 0x68, 0x2d, 0xad, 0x5d, 0xdd, 0xda, 0xc4, 0xd3, 0x6e, 0xdc, 0x18, 0xe3, 0x70, 0xe0, 0xa5, + 0x80, 0xc4, 0x29, 0x1b, 0xc7, 0x1d, 0x7c, 0xd4, 0xfb, 0x08, 0xae, 0x3a, 0x04, 0x45, 0x6c, 0xfd, + 0x7c, 0xd4, 0x2c, 0x24, 0xa3, 0x26, 0x9a, 0x62, 0xce, 0x8d, 0xab, 0xfe, 0x04, 0x55, 0x43, 0xc1, + 0x63, 0x2a, 0x29, 0x67, 0x20, 0x8c, 0x62, 0x4b, 0x6b, 0x2f, 0xdb, 0xff, 0x4f, 0x24, 0xd5, 0xee, + 0x34, 0xe4, 0xe4, 0x79, 0xba, 0x87, 0x50, 0x48, 0x04, 0x09, 0x40, 0x81, 0x90, 0x46, 0xa9, 0x55, + 0x6a, 0x57, 0xb7, 0xb6, 0xf1, 0xc2, 0x41, 0xc1, 0xf9, 0x8a, 0x70, 0xf7, 0x46, 0xb5, 0xcf, 0x94, + 0x18, 0x4e, 0x5f, 0x37, 0x0d, 0x38, 0x39, 0x6b, 0x7d, 0x80, 0x56, 0x05, 0xb8, 0x3e, 0xa1, 0x41, + 0x97, 0xfb, 0xd4, 0x1d, 0x1a, 0xff, 0x64, 0x2f, 0xdc, 0x4f, 0x46, 0xcd, 0x55, 0x27, 0x1f, 0xb8, + 0x1e, 0x35, 0x37, 0xe7, 0x47, 0x0c, 0x77, 0x41, 0x48, 0x2a, 0x15, 0x30, 0x75, 0xca, 0xfd, 0x28, + 0x80, 0x5b, 0x1a, 0xe7, 0xb6, 0xb7, 0xbe, 0x83, 0x56, 0x02, 0x1e, 0x31, 0x75, 0x14, 0x2a, 0xca, + 0x99, 0x34, 0xca, 0xad, 0x52, 0x7b, 0xd9, 0xae, 0x25, 0xa3, 0xe6, 0xca, 0x61, 0x0e, 0x77, 0x6e, + 0xb1, 0xf4, 0x03, 0xb4, 0x46, 0x7c, 0x9f, 0x7f, 0x1e, 0x27, 0xd8, 0xff, 0x12, 0x12, 0x96, 0xfe, + 0x92, 0xb1, 0xd4, 0xd2, 0xda, 0x15, 0xdb, 0x48, 0x46, 0xcd, 0xb5, 0xbd, 0x05, 0x71, 0x67, 0xa1, + 0x4a, 0x7f, 0x83, 0xea, 0x71, 0x06, 0xd9, 0x94, 0xf5, 0x29, 0xf3, 0x0e, 0x79, 0x1f, 0x8c, 0x7f, + 0xb3, 0xa2, 0x37, 0x92, 0x51, 0xb3, 0x7e, 0x3a, 0x1b, 0xbc, 0x5e, 0x04, 0x3a, 0xf3, 0x26, 0xfa, + 0x27, 0x54, 0xcf, 0x32, 0x42, 0xff, 0x84, 0x87, 0xdc, 0xe7, 0x1e, 0x05, 0x69, 0x54, 0xb2, 0xd6, + 0xb5, 0xf3, 0xad, 0x4b, 0xbf, 0x2e, 0xed, 0xdb, 0x84, 0x35, 0x3c, 0x06, 0x1f, 0x5c, 0xc5, 0xc5, + 0x09, 0x88, 0xc0, 0x7e, 0x38, 0xe9, 0x57, 0x7d, 0x6f, 0xd6, 0xca, 0x99, 0x77, 0x6f, 0x3c, 0x47, + 0xff, 0xcd, 0x34, 0x5c, 0xaf, 0xa1, 0xd2, 0x00, 0x86, 0xd9, 0x34, 0x2f, 0x3b, 0xe9, 0x51, 0x5f, + 0x43, 0xe5, 0x98, 0xf8, 0x11, 0x8c, 0x87, 0xcf, 0x19, 0x5f, 0x9e, 0x15, 0x77, 0xb5, 0xf5, 0x1f, + 0x1a, 0xaa, 0xe5, 0xa7, 0xe7, 0x80, 0x4a, 0xa5, 0xbf, 0x9b, 0xdb, 0x09, 0x7c, 0xbf, 0x9d, 0x48, + 0xd5, 0xd9, 0x46, 0xd4, 0x26, 0x35, 0x54, 0xfe, 0x20, 0xb9, 0x7d, 0x78, 0x85, 0xca, 0x54, 0x41, + 0x20, 0x8d, 0x62, 0xf6, 0x31, 0x8f, 0xee, 0x31, 0xd3, 0xf6, 0xea, 0xc4, 0xaf, 0xfc, 0x3a, 0x55, + 0x3a, 0x63, 0x03, 0xbb, 0x7d, 0x7e, 0x65, 0x16, 0x2e, 0xae, 0xcc, 0xc2, 0xe5, 0x95, 0x59, 0xf8, + 0x9a, 0x98, 0xda, 0x79, 0x62, 0x6a, 0x17, 0x89, 0xa9, 0x5d, 0x26, 0xa6, 0xf6, 0x33, 0x31, 0xb5, + 0xef, 0xbf, 0xcc, 0xc2, 0xdb, 0x62, 0xdc, 0xf9, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x0e, 0x67, 0x74, + 0x30, 0xa1, 0x05, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/storage/v1/generated.proto b/vendor/k8s.io/api/storage/v1/generated.proto index 72b3ceb83..cff642211 100644 --- a/vendor/k8s.io/api/storage/v1/generated.proto +++ b/vendor/k8s.io/api/storage/v1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ syntax = 'proto2'; package k8s.io.api.storage.v1; +import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/api/storage/v1beta1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; @@ -70,6 +71,14 @@ message StorageClass { // the VolumeScheduling feature. // +optional optional string volumeBindingMode = 7; + + // Restrict the node topologies where volumes can be dynamically provisioned. + // Each volume plugin defines its own supported topology specifications. + // An empty TopologySelectorTerm list means there is no topology restriction. + // This field is alpha-level and is only honored by servers that enable + // the DynamicProvisioningScheduling feature. + // +optional + repeated k8s.io.api.core.v1.TopologySelectorTerm allowedTopologies = 8; } // StorageClassList is a collection of storage classes. diff --git a/vendor/k8s.io/api/storage/v1/types.go b/vendor/k8s.io/api/storage/v1/types.go index 288d40abb..45bfa7681 100644 --- a/vendor/k8s.io/api/storage/v1/types.go +++ b/vendor/k8s.io/api/storage/v1/types.go @@ -66,6 +66,14 @@ type StorageClass struct { // the VolumeScheduling feature. // +optional VolumeBindingMode *VolumeBindingMode `json:"volumeBindingMode,omitempty" protobuf:"bytes,7,opt,name=volumeBindingMode"` + + // Restrict the node topologies where volumes can be dynamically provisioned. + // Each volume plugin defines its own supported topology specifications. + // An empty TopologySelectorTerm list means there is no topology restriction. + // This field is alpha-level and is only honored by servers that enable + // the DynamicProvisioningScheduling feature. + // +optional + AllowedTopologies []v1.TopologySelectorTerm `json:"allowedTopologies,omitempty" protobuf:"bytes,8,rep,name=allowedTopologies"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go index 3eb9bdab7..1d6587047 100644 --- a/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_StorageClass = map[string]string{ "": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", @@ -36,6 +36,7 @@ var map_StorageClass = map[string]string{ "mountOptions": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid.", "allowVolumeExpansion": "AllowVolumeExpansion shows whether the storage class allow volume expand", "volumeBindingMode": "VolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is alpha-level and is only honored by servers that enable the VolumeScheduling feature.", + "allowedTopologies": "Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is alpha-level and is only honored by servers that enable the DynamicProvisioningScheduling feature.", } func (StorageClass) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go index ccab05ccc..a1050134c 100644 --- a/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -69,6 +69,13 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) { **out = **in } } + if in.AllowedTopologies != nil { + in, out := &in.AllowedTopologies, &out.AllowedTopologies + *out = make([]core_v1.TopologySelectorTerm, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/vendor/k8s.io/api/storage/v1alpha1/BUILD b/vendor/k8s.io/api/storage/v1alpha1/BUILD deleted file mode 100644 index 98342a426..000000000 --- a/vendor/k8s.io/api/storage/v1alpha1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/storage/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go b/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go index 586a1b672..e1d5a3aac 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/api/storage/v1alpha1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/storage/v1alpha1/generated.proto b/vendor/k8s.io/api/storage/v1alpha1/generated.proto index 289ef5f3e..2f792a06c 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/generated.proto +++ b/vendor/k8s.io/api/storage/v1alpha1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go index faca8e939..32d7dcc52 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1alpha1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_VolumeAttachment = map[string]string{ "": "VolumeAttachment captures the intent to attach or detach the specified volume to/from the specified node.\n\nVolumeAttachment objects are non-namespaced.", "metadata": "Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", diff --git a/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go index 04221c67c..d1a53755b 100644 --- a/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/api/storage/v1beta1/BUILD b/vendor/k8s.io/api/storage/v1beta1/BUILD deleted file mode 100644 index e659e9de0..000000000 --- a/vendor/k8s.io/api/storage/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/api/storage/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/api/storage/v1beta1/generated.pb.go b/vendor/k8s.io/api/storage/v1beta1/generated.pb.go index 425d0e717..058702593 100644 --- a/vendor/k8s.io/api/storage/v1beta1/generated.pb.go +++ b/vendor/k8s.io/api/storage/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -188,6 +188,18 @@ func (m *StorageClass) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintGenerated(dAtA, i, uint64(len(*m.VolumeBindingMode))) i += copy(dAtA[i:], *m.VolumeBindingMode) } + if len(m.AllowedTopologies) > 0 { + for _, msg := range m.AllowedTopologies { + dAtA[i] = 0x42 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -524,6 +536,12 @@ func (m *StorageClass) Size() (n int) { l = len(*m.VolumeBindingMode) n += 1 + l + sovGenerated(uint64(l)) } + if len(m.AllowedTopologies) > 0 { + for _, e := range m.AllowedTopologies { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -657,6 +675,7 @@ func (this *StorageClass) String() string { `MountOptions:` + fmt.Sprintf("%v", this.MountOptions) + `,`, `AllowVolumeExpansion:` + valueToStringGenerated(this.AllowVolumeExpansion) + `,`, `VolumeBindingMode:` + valueToStringGenerated(this.VolumeBindingMode) + `,`, + `AllowedTopologies:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedTopologies), "TopologySelectorTerm", "k8s_io_api_core_v1.TopologySelectorTerm", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -1073,6 +1092,37 @@ func (m *StorageClass) Unmarshal(dAtA []byte) error { s := VolumeBindingMode(dAtA[iNdEx:postIndex]) m.VolumeBindingMode = &s iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedTopologies", 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 > l { + return io.ErrUnexpectedEOF + } + m.AllowedTopologies = append(m.AllowedTopologies, k8s_io_api_core_v1.TopologySelectorTerm{}) + if err := m.AllowedTopologies[len(m.AllowedTopologies)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -2145,67 +2195,69 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 977 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xcd, 0x6f, 0x1b, 0x45, - 0x14, 0xcf, 0xc6, 0xf9, 0x1c, 0x27, 0x34, 0x1d, 0x22, 0xb0, 0x7c, 0x58, 0x47, 0xbe, 0x60, 0xaa, - 0x66, 0xb7, 0x09, 0x05, 0x45, 0x48, 0x1c, 0xb2, 0x25, 0x07, 0x50, 0xdc, 0x86, 0x29, 0xaa, 0x50, - 0xc5, 0x81, 0xc9, 0xee, 0xab, 0x33, 0xd8, 0xfb, 0xa1, 0x99, 0x59, 0xd3, 0xdc, 0x38, 0x71, 0xe6, - 0xc4, 0x95, 0x0b, 0xff, 0x07, 0x47, 0x72, 0x42, 0x3d, 0xf6, 0x64, 0x91, 0xe5, 0xbf, 0x88, 0x38, - 0xa0, 0x99, 0x9d, 0x78, 0xd7, 0x5e, 0x5b, 0x4d, 0x7a, 0xe8, 0x2d, 0xf3, 0xde, 0xfb, 0xfd, 0xde, - 0xd7, 0xef, 0xad, 0x83, 0x1e, 0xf5, 0x0f, 0x84, 0xc3, 0x62, 0xb7, 0x9f, 0x9e, 0x02, 0x8f, 0x40, - 0x82, 0x70, 0x87, 0x10, 0x05, 0x31, 0x77, 0x8d, 0x83, 0x26, 0xcc, 0x15, 0x32, 0xe6, 0xb4, 0x07, - 0xee, 0x70, 0xef, 0x14, 0x24, 0xdd, 0x73, 0x7b, 0x10, 0x01, 0xa7, 0x12, 0x02, 0x27, 0xe1, 0xb1, - 0x8c, 0x71, 0x33, 0x8f, 0x75, 0x68, 0xc2, 0x1c, 0x13, 0xeb, 0x98, 0xd8, 0xe6, 0x6e, 0x8f, 0xc9, - 0xb3, 0xf4, 0xd4, 0xf1, 0xe3, 0xd0, 0xed, 0xc5, 0xbd, 0xd8, 0xd5, 0x90, 0xd3, 0xf4, 0x85, 0x7e, - 0xe9, 0x87, 0xfe, 0x2b, 0xa7, 0x6a, 0xb6, 0x4b, 0x69, 0xfd, 0x98, 0xab, 0x9c, 0xd3, 0xe9, 0x9a, - 0xdd, 0x22, 0x06, 0x5e, 0x4a, 0x88, 0x04, 0x8b, 0x23, 0xb1, 0x4b, 0x13, 0x26, 0x80, 0x0f, 0x81, - 0xbb, 0x49, 0xbf, 0xa7, 0x7c, 0x62, 0x32, 0x60, 0x5e, 0xf5, 0xcd, 0x87, 0x05, 0x5d, 0x48, 0xfd, - 0x33, 0x16, 0x01, 0x3f, 0x2f, 0x38, 0x42, 0x90, 0x74, 0x56, 0x11, 0xee, 0x3c, 0x14, 0x4f, 0x23, - 0xc9, 0x42, 0xa8, 0x00, 0x3e, 0x7b, 0x13, 0x40, 0xf8, 0x67, 0x10, 0xd2, 0x0a, 0xee, 0x93, 0x79, - 0xb8, 0x54, 0xb2, 0x81, 0xcb, 0x22, 0x29, 0x24, 0x9f, 0x06, 0xb5, 0x7f, 0x5f, 0x46, 0x1b, 0x4f, - 0xf3, 0x4d, 0x3c, 0x1a, 0x50, 0x21, 0xf0, 0x0f, 0x68, 0x4d, 0x75, 0x12, 0x50, 0x49, 0x1b, 0xd6, - 0x8e, 0xd5, 0xa9, 0xef, 0x3f, 0x70, 0x8a, 0xad, 0x8d, 0x89, 0x9d, 0xa4, 0xdf, 0x53, 0x06, 0xe1, - 0xa8, 0x68, 0x67, 0xb8, 0xe7, 0x3c, 0x39, 0xfd, 0x11, 0x7c, 0xd9, 0x05, 0x49, 0x3d, 0x7c, 0x31, - 0x6a, 0x2d, 0x64, 0xa3, 0x16, 0x2a, 0x6c, 0x64, 0xcc, 0x8a, 0x3f, 0x45, 0xf5, 0x84, 0xc7, 0x43, - 0xa6, 0x86, 0x0d, 0xbc, 0xb1, 0xb8, 0x63, 0x75, 0xd6, 0xbd, 0xf7, 0x0d, 0xa4, 0x7e, 0x52, 0xb8, - 0x48, 0x39, 0x0e, 0x0f, 0x10, 0x4a, 0x28, 0xa7, 0x21, 0x48, 0xe0, 0xa2, 0x51, 0xdb, 0xa9, 0x75, - 0xea, 0xfb, 0x07, 0xce, 0x7c, 0x41, 0x39, 0xe5, 0xb6, 0x9c, 0x93, 0x31, 0xf4, 0x28, 0x92, 0xfc, - 0xbc, 0x28, 0xb1, 0x70, 0x90, 0x12, 0x3f, 0xee, 0xa3, 0x4d, 0x0e, 0xfe, 0x80, 0xb2, 0xf0, 0x24, - 0x1e, 0x30, 0xff, 0xbc, 0xb1, 0xa4, 0xcb, 0x3c, 0xca, 0x46, 0xad, 0x4d, 0x52, 0x76, 0x5c, 0x8d, - 0x5a, 0x0f, 0xaa, 0x52, 0x74, 0x4e, 0x80, 0x0b, 0x26, 0x24, 0x44, 0xf2, 0x59, 0x3c, 0x48, 0x43, - 0x98, 0xc0, 0x90, 0x49, 0x6e, 0xfc, 0x10, 0x6d, 0x84, 0x71, 0x1a, 0xc9, 0x27, 0x89, 0x54, 0x02, - 0x6c, 0x2c, 0xef, 0xd4, 0x3a, 0xeb, 0xde, 0x56, 0x36, 0x6a, 0x6d, 0x74, 0x4b, 0x76, 0x32, 0x11, - 0x85, 0x8f, 0xd1, 0x36, 0x1d, 0x0c, 0xe2, 0x9f, 0xf2, 0x04, 0x47, 0x2f, 0x13, 0xaa, 0xf5, 0xdb, - 0x58, 0xd9, 0xb1, 0x3a, 0x6b, 0x5e, 0x23, 0x1b, 0xb5, 0xb6, 0x0f, 0x67, 0xf8, 0xc9, 0x4c, 0x14, - 0xfe, 0x0e, 0xdd, 0x1d, 0x6a, 0x93, 0xc7, 0xa2, 0x80, 0x45, 0xbd, 0x6e, 0x1c, 0x40, 0x63, 0x55, - 0x37, 0x7d, 0x2f, 0x1b, 0xb5, 0xee, 0x3e, 0x9b, 0x76, 0x5e, 0xcd, 0x32, 0x92, 0x2a, 0x49, 0xf3, - 0x0b, 0x74, 0x67, 0x6a, 0xfa, 0x78, 0x0b, 0xd5, 0xfa, 0x70, 0xae, 0xf5, 0xb5, 0x4e, 0xd4, 0x9f, - 0x78, 0x1b, 0x2d, 0x0f, 0xe9, 0x20, 0x85, 0x5c, 0x0e, 0x24, 0x7f, 0x7c, 0xbe, 0x78, 0x60, 0xb5, - 0xff, 0xb4, 0xd0, 0x56, 0x79, 0x95, 0xc7, 0x4c, 0x48, 0xfc, 0x7d, 0x45, 0xa5, 0xce, 0xcd, 0x54, - 0xaa, 0xd0, 0x5a, 0xa3, 0x5b, 0x46, 0x00, 0x6b, 0xd7, 0x96, 0x92, 0x42, 0xbb, 0x68, 0x99, 0x49, - 0x08, 0x45, 0x63, 0x51, 0xab, 0xac, 0x73, 0x53, 0x95, 0x79, 0x9b, 0x86, 0x74, 0xf9, 0x2b, 0x05, - 0x27, 0x39, 0x4b, 0xfb, 0x8f, 0x45, 0xb4, 0x95, 0x4f, 0xea, 0x50, 0x4a, 0xea, 0x9f, 0x85, 0x10, - 0xc9, 0x77, 0x70, 0x67, 0x04, 0x2d, 0x89, 0x04, 0x7c, 0x3d, 0xd1, 0x49, 0xf6, 0x4a, 0x13, 0xd3, - 0xd5, 0x3d, 0x4d, 0xc0, 0xf7, 0x36, 0x0c, 0xfb, 0x92, 0x7a, 0x11, 0xcd, 0x85, 0x9f, 0xa3, 0x15, - 0x21, 0xa9, 0x4c, 0xd5, 0x01, 0x2a, 0xd6, 0xfd, 0x5b, 0xb1, 0x6a, 0xa4, 0xf7, 0x9e, 0xe1, 0x5d, - 0xc9, 0xdf, 0xc4, 0x30, 0xb6, 0xff, 0xb2, 0xd0, 0xf6, 0x34, 0xe4, 0x1d, 0x2c, 0xfb, 0x9b, 0xc9, - 0x65, 0xdf, 0xbf, 0x4d, 0x47, 0x73, 0x16, 0xfe, 0x02, 0x7d, 0x50, 0xe9, 0x3d, 0x4e, 0xb9, 0x0f, - 0xea, 0x66, 0x93, 0xa9, 0x2f, 0xc3, 0x63, 0x1a, 0x42, 0x7e, 0x09, 0xf9, 0xcd, 0x9e, 0xcc, 0xf0, - 0x93, 0x99, 0xa8, 0xf6, 0xdf, 0x33, 0x26, 0xa6, 0x96, 0x85, 0xef, 0xa3, 0x35, 0xaa, 0x2d, 0xc0, - 0x0d, 0xf5, 0x78, 0x02, 0x87, 0xc6, 0x4e, 0xc6, 0x11, 0x7a, 0xa9, 0xba, 0x3c, 0x23, 0x95, 0xdb, - 0x2d, 0x55, 0x23, 0x4b, 0x4b, 0xd5, 0x6f, 0x62, 0x18, 0x55, 0x25, 0x51, 0x1c, 0xe4, 0x4d, 0xd6, - 0x26, 0x2b, 0x79, 0x6c, 0xec, 0x64, 0x1c, 0xd1, 0xfe, 0xaf, 0x36, 0x63, 0x72, 0x5a, 0x1d, 0xa5, - 0x96, 0x02, 0xdd, 0xd2, 0x5a, 0xa5, 0xa5, 0x60, 0xdc, 0x52, 0x80, 0x7f, 0xb3, 0x10, 0xa6, 0x63, - 0x8a, 0xee, 0xb5, 0x7a, 0xf2, 0x15, 0x7f, 0x7d, 0x7b, 0xd1, 0x3a, 0x87, 0x15, 0xb2, 0xfc, 0x77, - 0xa4, 0x69, 0x8a, 0xc0, 0xd5, 0x00, 0x32, 0xa3, 0x02, 0xcc, 0x50, 0x3d, 0xb7, 0x1e, 0x71, 0x1e, - 0x73, 0x73, 0x45, 0x1f, 0xbd, 0xb9, 0x20, 0x1d, 0xee, 0xd9, 0xea, 0x17, 0xf2, 0xb0, 0xc0, 0x5f, - 0x8d, 0x5a, 0xf5, 0x92, 0x9f, 0x94, 0xb9, 0x55, 0xaa, 0x00, 0x8a, 0x54, 0x4b, 0x6f, 0x91, 0xea, - 0x4b, 0x98, 0x9f, 0xaa, 0xc4, 0xdd, 0x3c, 0x42, 0x1f, 0xce, 0x19, 0xd0, 0xad, 0x3e, 0xf5, 0xbf, - 0x58, 0xa8, 0x9c, 0x03, 0x1f, 0xa3, 0x25, 0xf5, 0x0f, 0x8f, 0x39, 0xfa, 0x7b, 0x37, 0x3b, 0xfa, - 0x6f, 0x59, 0x08, 0xc5, 0xb7, 0x4b, 0xbd, 0x88, 0x66, 0xc1, 0x1f, 0xa3, 0xd5, 0x10, 0x84, 0xa0, - 0x3d, 0x93, 0xd9, 0xbb, 0x63, 0x82, 0x56, 0xbb, 0xb9, 0x99, 0x5c, 0xfb, 0xbd, 0xdd, 0x8b, 0x4b, - 0x7b, 0xe1, 0xd5, 0xa5, 0xbd, 0xf0, 0xfa, 0xd2, 0x5e, 0xf8, 0x39, 0xb3, 0xad, 0x8b, 0xcc, 0xb6, - 0x5e, 0x65, 0xb6, 0xf5, 0x3a, 0xb3, 0xad, 0x7f, 0x32, 0xdb, 0xfa, 0xf5, 0x5f, 0x7b, 0xe1, 0xf9, - 0xaa, 0x99, 0xdb, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4b, 0x7f, 0x8a, 0x3b, 0x1c, 0x0b, 0x00, - 0x00, + // 1022 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4d, 0x6f, 0x1b, 0x45, + 0x18, 0xce, 0xc6, 0xf9, 0x70, 0xc6, 0x09, 0x4d, 0x96, 0x08, 0x8c, 0x0f, 0x76, 0xe4, 0x0b, 0xa6, + 0x6a, 0x76, 0x9b, 0x50, 0x50, 0x84, 0xc4, 0xc1, 0x5b, 0x72, 0x00, 0xc5, 0x6d, 0x98, 0x44, 0x15, + 0xaa, 0x38, 0x30, 0xd9, 0x7d, 0xeb, 0x0c, 0xde, 0xdd, 0x59, 0x66, 0xc6, 0xa6, 0xb9, 0x71, 0xe2, + 0x8c, 0x38, 0xf0, 0x0b, 0xf8, 0x1f, 0x1c, 0xc9, 0x09, 0xf5, 0xd8, 0x93, 0x45, 0xcc, 0xbf, 0x88, + 0x38, 0xa0, 0x99, 0x9d, 0x78, 0xd7, 0x5e, 0x9b, 0x36, 0x3d, 0xf4, 0xe6, 0xf7, 0xe3, 0x79, 0xde, + 0xef, 0x59, 0xa3, 0x87, 0xbd, 0x03, 0xe1, 0x50, 0xe6, 0xf6, 0xfa, 0x67, 0xc0, 0x63, 0x90, 0x20, + 0xdc, 0x01, 0xc4, 0x01, 0xe3, 0xae, 0x31, 0x90, 0x84, 0xba, 0x42, 0x32, 0x4e, 0xba, 0xe0, 0x0e, + 0xf6, 0xce, 0x40, 0x92, 0x3d, 0xb7, 0x0b, 0x31, 0x70, 0x22, 0x21, 0x70, 0x12, 0xce, 0x24, 0xb3, + 0x6b, 0xa9, 0xaf, 0x43, 0x12, 0xea, 0x18, 0x5f, 0xc7, 0xf8, 0xd6, 0x76, 0xbb, 0x54, 0x9e, 0xf7, + 0xcf, 0x1c, 0x9f, 0x45, 0x6e, 0x97, 0x75, 0x99, 0xab, 0x21, 0x67, 0xfd, 0x67, 0x5a, 0xd2, 0x82, + 0xfe, 0x95, 0x52, 0xd5, 0x9a, 0xb9, 0xb0, 0x3e, 0xe3, 0x2a, 0xe6, 0x74, 0xb8, 0x5a, 0x27, 0xf3, + 0x81, 0xe7, 0x12, 0x62, 0x41, 0x59, 0x2c, 0x76, 0x49, 0x42, 0x05, 0xf0, 0x01, 0x70, 0x37, 0xe9, + 0x75, 0x95, 0x4d, 0x4c, 0x3a, 0xcc, 0xcb, 0xbe, 0xf6, 0x20, 0xa3, 0x8b, 0x88, 0x7f, 0x4e, 0x63, + 0xe0, 0x17, 0x19, 0x47, 0x04, 0x92, 0xcc, 0x4a, 0xc2, 0x9d, 0x87, 0xe2, 0xfd, 0x58, 0xd2, 0x08, + 0x0a, 0x80, 0x4f, 0x5f, 0x05, 0x10, 0xfe, 0x39, 0x44, 0xa4, 0x80, 0xfb, 0x78, 0x1e, 0xae, 0x2f, + 0x69, 0xe8, 0xd2, 0x58, 0x0a, 0xc9, 0xa7, 0x41, 0xcd, 0x5f, 0x57, 0xd0, 0xfa, 0x49, 0x3a, 0x89, + 0x87, 0x21, 0x11, 0xc2, 0xfe, 0x0e, 0x95, 0x55, 0x25, 0x01, 0x91, 0xa4, 0x6a, 0xed, 0x58, 0xad, + 0xca, 0xfe, 0x7d, 0x27, 0x9b, 0xda, 0x98, 0xd8, 0x49, 0x7a, 0x5d, 0xa5, 0x10, 0x8e, 0xf2, 0x76, + 0x06, 0x7b, 0xce, 0xe3, 0xb3, 0xef, 0xc1, 0x97, 0x1d, 0x90, 0xc4, 0xb3, 0x2f, 0x87, 0x8d, 0x85, + 0xd1, 0xb0, 0x81, 0x32, 0x1d, 0x1e, 0xb3, 0xda, 0x9f, 0xa0, 0x4a, 0xc2, 0xd9, 0x80, 0xaa, 0x66, + 0x03, 0xaf, 0x2e, 0xee, 0x58, 0xad, 0x35, 0xef, 0x5d, 0x03, 0xa9, 0x1c, 0x67, 0x26, 0x9c, 0xf7, + 0xb3, 0x43, 0x84, 0x12, 0xc2, 0x49, 0x04, 0x12, 0xb8, 0xa8, 0x96, 0x76, 0x4a, 0xad, 0xca, 0xfe, + 0x81, 0x33, 0x7f, 0xa1, 0x9c, 0x7c, 0x59, 0xce, 0xf1, 0x18, 0x7a, 0x18, 0x4b, 0x7e, 0x91, 0xa5, + 0x98, 0x19, 0x70, 0x8e, 0xdf, 0xee, 0xa1, 0x0d, 0x0e, 0x7e, 0x48, 0x68, 0x74, 0xcc, 0x42, 0xea, + 0x5f, 0x54, 0x97, 0x74, 0x9a, 0x87, 0xa3, 0x61, 0x63, 0x03, 0xe7, 0x0d, 0xd7, 0xc3, 0xc6, 0xfd, + 0xe2, 0x2a, 0x3a, 0xc7, 0xc0, 0x05, 0x15, 0x12, 0x62, 0xf9, 0x84, 0x85, 0xfd, 0x08, 0x26, 0x30, + 0x78, 0x92, 0xdb, 0x7e, 0x80, 0xd6, 0x23, 0xd6, 0x8f, 0xe5, 0xe3, 0x44, 0xaa, 0x05, 0xac, 0x2e, + 0xef, 0x94, 0x5a, 0x6b, 0xde, 0xe6, 0x68, 0xd8, 0x58, 0xef, 0xe4, 0xf4, 0x78, 0xc2, 0xcb, 0x3e, + 0x42, 0xdb, 0x24, 0x0c, 0xd9, 0x8f, 0x69, 0x80, 0xc3, 0xe7, 0x09, 0xd1, 0xfb, 0x5b, 0x5d, 0xd9, + 0xb1, 0x5a, 0x65, 0xaf, 0x3a, 0x1a, 0x36, 0xb6, 0xdb, 0x33, 0xec, 0x78, 0x26, 0xca, 0xfe, 0x06, + 0x6d, 0x0d, 0xb4, 0xca, 0xa3, 0x71, 0x40, 0xe3, 0x6e, 0x87, 0x05, 0x50, 0x5d, 0xd5, 0x45, 0xdf, + 0x1d, 0x0d, 0x1b, 0x5b, 0x4f, 0xa6, 0x8d, 0xd7, 0xb3, 0x94, 0xb8, 0x48, 0x62, 0xff, 0x80, 0xb6, + 0x74, 0x44, 0x08, 0x4e, 0x59, 0xc2, 0x42, 0xd6, 0xa5, 0x20, 0xaa, 0x65, 0x3d, 0xbf, 0x56, 0x7e, + 0x7e, 0xaa, 0x75, 0x6a, 0x91, 0x8c, 0xd7, 0xc5, 0x09, 0x84, 0xe0, 0x4b, 0xc6, 0x4f, 0x81, 0x47, + 0xde, 0x07, 0x66, 0x5e, 0x5b, 0xed, 0x69, 0x2a, 0x5c, 0x64, 0xaf, 0x7d, 0x8e, 0xee, 0x4c, 0x0d, + 0xdc, 0xde, 0x44, 0xa5, 0x1e, 0x5c, 0xe8, 0x95, 0x5e, 0xc3, 0xea, 0xa7, 0xbd, 0x8d, 0x96, 0x07, + 0x24, 0xec, 0x43, 0xba, 0x81, 0x38, 0x15, 0x3e, 0x5b, 0x3c, 0xb0, 0x9a, 0x7f, 0x58, 0x68, 0x33, + 0xbf, 0x3d, 0x47, 0x54, 0x48, 0xfb, 0xdb, 0xc2, 0x61, 0x38, 0xaf, 0x77, 0x18, 0x0a, 0xad, 0xcf, + 0x62, 0xd3, 0xd4, 0x50, 0xbe, 0xd1, 0xe4, 0x8e, 0xa2, 0x83, 0x96, 0xa9, 0x84, 0x48, 0x54, 0x17, + 0x8b, 0x8d, 0xf9, 0xbf, 0xc5, 0xf6, 0x36, 0x0c, 0xe9, 0xf2, 0x97, 0x0a, 0x8e, 0x53, 0x96, 0xe6, + 0xef, 0x8b, 0x68, 0x33, 0x1d, 0x4e, 0x5b, 0x4a, 0xe2, 0x9f, 0x47, 0x10, 0xcb, 0xb7, 0x70, 0xda, + 0x18, 0x2d, 0x89, 0x04, 0x7c, 0xdd, 0xd1, 0x49, 0xf6, 0x42, 0x11, 0xd3, 0xd9, 0x9d, 0x24, 0xe0, + 0x7b, 0xeb, 0x86, 0x7d, 0x49, 0x49, 0x58, 0x73, 0xd9, 0x4f, 0xd1, 0x8a, 0x90, 0x44, 0xf6, 0xd5, + 0xcd, 0x2b, 0xd6, 0xfd, 0x5b, 0xb1, 0x6a, 0xa4, 0xf7, 0x8e, 0xe1, 0x5d, 0x49, 0x65, 0x6c, 0x18, + 0x9b, 0x7f, 0x5a, 0x68, 0x7b, 0x1a, 0xf2, 0x16, 0x86, 0xfd, 0xf5, 0xe4, 0xb0, 0xef, 0xdd, 0xa6, + 0xa2, 0x39, 0x03, 0x7f, 0x86, 0xde, 0x2b, 0xd4, 0xce, 0xfa, 0xdc, 0x07, 0xf5, 0x4c, 0x24, 0x53, + 0x8f, 0xd1, 0x23, 0x12, 0x41, 0x7a, 0x09, 0xe9, 0x33, 0x71, 0x3c, 0xc3, 0x8e, 0x67, 0xa2, 0x9a, + 0x7f, 0xcd, 0xe8, 0x98, 0x1a, 0x96, 0x7d, 0x0f, 0x95, 0x89, 0xd6, 0x00, 0x37, 0xd4, 0xe3, 0x0e, + 0xb4, 0x8d, 0x1e, 0x8f, 0x3d, 0xf4, 0x50, 0x75, 0x7a, 0x66, 0x55, 0x6e, 0x37, 0x54, 0x8d, 0xcc, + 0x0d, 0x55, 0xcb, 0xd8, 0x30, 0xaa, 0x4c, 0x62, 0x16, 0xa4, 0x45, 0x96, 0x26, 0x33, 0x79, 0x64, + 0xf4, 0x78, 0xec, 0xd1, 0xfc, 0xb7, 0x34, 0xa3, 0x73, 0x7a, 0x3b, 0x72, 0x25, 0x05, 0xba, 0xa4, + 0x72, 0xa1, 0xa4, 0x60, 0x5c, 0x52, 0x60, 0xff, 0x66, 0x21, 0x9b, 0x8c, 0x29, 0x3a, 0x37, 0xdb, + 0x93, 0x8e, 0xf8, 0xab, 0xdb, 0x2f, 0xad, 0xd3, 0x2e, 0x90, 0xa5, 0x9f, 0xae, 0x9a, 0x49, 0xc2, + 0x2e, 0x3a, 0xe0, 0x19, 0x19, 0xd8, 0x14, 0x55, 0x52, 0xed, 0x21, 0xe7, 0x8c, 0x9b, 0x2b, 0xfa, + 0xf0, 0xd5, 0x09, 0x69, 0x77, 0xaf, 0xae, 0x3e, 0xca, 0xed, 0x0c, 0x7f, 0x3d, 0x6c, 0x54, 0x72, + 0x76, 0x9c, 0xe7, 0x56, 0xa1, 0x02, 0xc8, 0x42, 0x2d, 0xbd, 0x41, 0xa8, 0x2f, 0x60, 0x7e, 0xa8, + 0x1c, 0x77, 0xed, 0x10, 0xbd, 0x3f, 0xa7, 0x41, 0xb7, 0x7a, 0xea, 0x7f, 0xb6, 0x50, 0x3e, 0x86, + 0x7d, 0x84, 0x96, 0xd4, 0x7f, 0x2c, 0x73, 0xf4, 0x77, 0x5f, 0xef, 0xe8, 0x4f, 0x69, 0x04, 0xd9, + 0xdb, 0xa5, 0x24, 0xac, 0x59, 0xec, 0x8f, 0xd0, 0x6a, 0x04, 0x42, 0x90, 0xae, 0x89, 0xec, 0xdd, + 0x31, 0x4e, 0xab, 0x9d, 0x54, 0x8d, 0x6f, 0xec, 0xde, 0xee, 0xe5, 0x55, 0x7d, 0xe1, 0xc5, 0x55, + 0x7d, 0xe1, 0xe5, 0x55, 0x7d, 0xe1, 0xa7, 0x51, 0xdd, 0xba, 0x1c, 0xd5, 0xad, 0x17, 0xa3, 0xba, + 0xf5, 0x72, 0x54, 0xb7, 0xfe, 0x1e, 0xd5, 0xad, 0x5f, 0xfe, 0xa9, 0x2f, 0x3c, 0x5d, 0x35, 0x7d, + 0xfb, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xd8, 0xa9, 0x81, 0xd5, 0x8f, 0x0b, 0x00, 0x00, } diff --git a/vendor/k8s.io/api/storage/v1beta1/generated.proto b/vendor/k8s.io/api/storage/v1beta1/generated.proto index 1c6db8d41..32032b1a3 100644 --- a/vendor/k8s.io/api/storage/v1beta1/generated.proto +++ b/vendor/k8s.io/api/storage/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -71,6 +71,14 @@ message StorageClass { // the VolumeScheduling feature. // +optional optional string volumeBindingMode = 7; + + // Restrict the node topologies where volumes can be dynamically provisioned. + // Each volume plugin defines its own supported topology specifications. + // An empty TopologySelectorTerm list means there is no topology restriction. + // This field is alpha-level and is only honored by servers that enable + // the DynamicProvisioningScheduling feature. + // +optional + repeated k8s.io.api.core.v1.TopologySelectorTerm allowedTopologies = 8; } // StorageClassList is a collection of storage classes. diff --git a/vendor/k8s.io/api/storage/v1beta1/types.go b/vendor/k8s.io/api/storage/v1beta1/types.go index 99c9e4594..7ec1e908f 100644 --- a/vendor/k8s.io/api/storage/v1beta1/types.go +++ b/vendor/k8s.io/api/storage/v1beta1/types.go @@ -66,6 +66,14 @@ type StorageClass struct { // the VolumeScheduling feature. // +optional VolumeBindingMode *VolumeBindingMode `json:"volumeBindingMode,omitempty" protobuf:"bytes,7,opt,name=volumeBindingMode"` + + // Restrict the node topologies where volumes can be dynamically provisioned. + // Each volume plugin defines its own supported topology specifications. + // An empty TopologySelectorTerm list means there is no topology restriction. + // This field is alpha-level and is only honored by servers that enable + // the DynamicProvisioningScheduling feature. + // +optional + AllowedTopologies []v1.TopologySelectorTerm `json:"allowedTopologies,omitempty" protobuf:"bytes,8,rep,name=allowedTopologies"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go index c9c20c453..423e7f271 100644 --- a/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_StorageClass = map[string]string{ "": "StorageClass describes the parameters for a class of storage for which PersistentVolumes can be dynamically provisioned.\n\nStorageClasses are non-namespaced; the name of the storage class according to etcd is in ObjectMeta.Name.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", @@ -36,6 +36,7 @@ var map_StorageClass = map[string]string{ "mountOptions": "Dynamically provisioned PersistentVolumes of this storage class are created with these mountOptions, e.g. [\"ro\", \"soft\"]. Not validated - mount of the PVs will simply fail if one is invalid.", "allowVolumeExpansion": "AllowVolumeExpansion shows whether the storage class allow volume expand", "volumeBindingMode": "VolumeBindingMode indicates how PersistentVolumeClaims should be provisioned and bound. When unset, VolumeBindingImmediate is used. This field is alpha-level and is only honored by servers that enable the VolumeScheduling feature.", + "allowedTopologies": "Restrict the node topologies where volumes can be dynamically provisioned. Each volume plugin defines its own supported topology specifications. An empty TopologySelectorTerm list means there is no topology restriction. This field is alpha-level and is only honored by servers that enable the DynamicProvisioningScheduling feature.", } func (StorageClass) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go index 9a6a7266d..7c7c8fde5 100644 --- a/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -69,6 +69,13 @@ func (in *StorageClass) DeepCopyInto(out *StorageClass) { **out = **in } } + if in.AllowedTopologies != nil { + in, out := &in.AllowedTopologies, &out.AllowedTopologies + *out = make([]v1.TopologySelectorTerm, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/vendor/k8s.io/apiextensions-apiserver/BUILD b/vendor/k8s.io/apiextensions-apiserver/BUILD deleted file mode 100644 index 8092fcb82..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_binary", - "go_library", -) - -go_binary( - name = "apiextensions-apiserver", - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["main.go"], - importpath = "k8s.io/apiextensions-apiserver", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/logs:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/finalizer:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/controller/status:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/features:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/test/integration:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json b/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json index 242700330..8a3625b1b 100644 --- a/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json +++ b/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json @@ -1,7 +1,7 @@ { "ImportPath": "k8s.io/apiextensions-apiserver", "GoVersion": "go1.9", - "GodepVersion": "v79", + "GodepVersion": "v80", "Packages": [ "./..." ], @@ -372,7 +372,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "944e07253867aacae43c04b2e6a239005443f33a" + "Rev": "94e38aa1586e8a6c8a75770bddf5ff84c48a106b" }, { "ImportPath": "github.com/ghodss/yaml", @@ -436,35 +436,35 @@ }, { "ImportPath": "github.com/golang/protobuf/jsonpb", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/golang/protobuf/proto", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/golang/protobuf/protoc-gen-go/descriptor", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/golang/protobuf/ptypes", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/golang/protobuf/ptypes/any", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/golang/protobuf/ptypes/duration", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/golang/protobuf/ptypes/struct", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/golang/protobuf/ptypes/timestamp", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/google/btree", @@ -486,6 +486,14 @@ "ImportPath": "github.com/googleapis/gnostic/extensions", "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" }, + { + "ImportPath": "github.com/gregjones/httpcache", + "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" + }, + { + "ImportPath": "github.com/gregjones/httpcache/diskcache", + "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" + }, { "ImportPath": "github.com/grpc-ecosystem/go-grpc-prometheus", "Rev": "2500245aa6110c562d17020fb31a2c133d737799" @@ -510,10 +518,6 @@ "ImportPath": "github.com/hashicorp/golang-lru/simplelru", "Rev": "a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4" }, - { - "ImportPath": "github.com/howeyc/gopass", - "Rev": "bf9dde6d0d2c004a008c27aaee91170c786f6db8" - }, { "ImportPath": "github.com/imdario/mergo", "Rev": "6633656539c1639d9d78127b7d47c622b5d7b6dc" @@ -528,7 +532,7 @@ }, { "ImportPath": "github.com/json-iterator/go", - "Rev": "13f86432b882000a51c6e610c620974462691a97" + "Rev": "f2b4162afba35581b6d4a50d3b8f34e33c144682" }, { "ImportPath": "github.com/mailru/easyjson/buffer", @@ -546,10 +550,22 @@ "ImportPath": "github.com/matttproud/golang_protobuf_extensions/pbutil", "Rev": "fc2b8d3a73c4867e51861bbdd5ae3c1f0869dd6a" }, + { + "ImportPath": "github.com/modern-go/concurrent", + "Rev": "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" + }, + { + "ImportPath": "github.com/modern-go/reflect2", + "Rev": "05fbef0ca5da472bbf96c9322b84a53edc03c9fd" + }, { "ImportPath": "github.com/pborman/uuid", "Rev": "ca53cad383cad2479bbba7f7a1a05797ec1386e4" }, + { + "ImportPath": "github.com/peterbourgon/diskv", + "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" + }, { "ImportPath": "github.com/pmezard/go-difflib/difflib", "Rev": "d8ed2627bdf02c080bf22230dbb337003b7aba2d" @@ -584,19 +600,19 @@ }, { "ImportPath": "github.com/spf13/cobra", - "Rev": "93959269ad99e80983c9ba742a7e01203a4c0e4f" + "Rev": "c439c4fa093711d42e1b01acb1235b52004753c1" }, { "ImportPath": "github.com/spf13/pflag", - "Rev": "4c012f6dcd9546820e378d0bdda4d8fc772cdfea" + "Rev": "583c0c0531f06d5278b7d917446061adc344b5cd" }, { "ImportPath": "github.com/stretchr/testify/assert", - "Rev": "f6abca593680b2315d2075e0f5e2a9751e3f431a" + "Rev": "c679ae2cc0cb27ec3293fea7e254e47386f05d69" }, { "ImportPath": "github.com/stretchr/testify/require", - "Rev": "f6abca593680b2315d2075e0f5e2a9751e3f431a" + "Rev": "c679ae2cc0cb27ec3293fea7e254e47386f05d69" }, { "ImportPath": "github.com/ugorji/go/codec", @@ -608,15 +624,15 @@ }, { "ImportPath": "golang.org/x/crypto/bcrypt", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" + "Rev": "49796115aa4b964c318aad4f3084fdb41e9aa067" }, { "ImportPath": "golang.org/x/crypto/blowfish", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" + "Rev": "49796115aa4b964c318aad4f3084fdb41e9aa067" }, { "ImportPath": "golang.org/x/crypto/ssh/terminal", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" + "Rev": "49796115aa4b964c318aad4f3084fdb41e9aa067" }, { "ImportPath": "golang.org/x/net/context", @@ -800,1267 +816,1287 @@ }, { "ImportPath": "k8s.io/api/admission/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/admissionregistration/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/events/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" + }, + { + "ImportPath": "k8s.io/api/scheduling/v1beta1", + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/storage/v1alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta/table", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/testing", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/testing/fuzzer", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/testing/roundtrip", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation/path", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/apimachinery", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/announced", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/registered", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/validation", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/duration", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/rand", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/uuid", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/waitgroup", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apiserver/pkg/admission", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/configuration", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/initializer", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/metrics", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/initialization", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/config", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/errors", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" + }, + { + "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/generic", + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/namespace", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/request", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/rules", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/validating", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" - }, - { - "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/versioned", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/apiserver", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/apiserver/install", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/install", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/v1alpha1", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/v1beta1", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/validation", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/audit", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/audit/policy", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/authenticator", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/authenticatorfactory", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/group", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/anonymous", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/bearertoken", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/headerrequest", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/union", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/websocket", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/x509", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/serviceaccount", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/token/tokenfile", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/user", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/authorizer", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/authorizerfactory", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/union", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/discovery", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/filters", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/handlers", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/handlers/negotiation", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/handlers/responsewriters", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/metrics", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/openapi", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/request", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/features", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/generic", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/generic/registry", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/generic/testing", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/rest", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/rest/resttest", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/server", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/server/filters", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/server/healthz", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/server/httplog", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/server/mux", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/server/options", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/server/resourceconfig", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/server/routes", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/server/routes/data/swagger", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/server/storage", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/errors", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/etcdtest", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/metrics", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/testing", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/testing/testingcert", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/util", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd3", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd3/preflight", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/names", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/storagebackend", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/storagebackend/factory", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/testing", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/value", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/util/feature", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" - }, - { - "ImportPath": "k8s.io/apiserver/pkg/util/feature/testing", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/util/flag", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/util/flushwriter", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/util/logs", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" + }, + { + "ImportPath": "k8s.io/apiserver/pkg/util/openapi", + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/util/trace", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/util/webhook", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/pkg/util/wsstream", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/buffered", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/log", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" + }, + { + "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/truncate", + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/webhook", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/authenticator/token/webhook", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/authorizer/webhook", - "Rev": "5ae41ac86efd753e2ba012f097b83a914b268236" + "Rev": "01459b68eb5fee2dcf5ca0e29df8bcac89ead47b" }, { "ImportPath": "k8s.io/client-go/discovery", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/discovery/fake", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/dynamic", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/apps", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta2", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/batch", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/batch/v2alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/certificates", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/certificates/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/core", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/core/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/events", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/events/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/extensions", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/extensions/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/internalinterfaces", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/networking", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/networking/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/policy", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/policy/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/rbac", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/scheduling", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" + }, + { + "ImportPath": "k8s.io/client-go/informers/scheduling/v1beta1", + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/settings", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/settings/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/storage", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/scheme", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" + }, + { + "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1", + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta2", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/batch/v2alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/certificates/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/core/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/events/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/extensions/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/networking/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/policy/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" + }, + { + "ImportPath": "k8s.io/client-go/listers/scheduling/v1beta1", + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/settings/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" + }, + { + "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1", + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/pkg/version", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/plugin/pkg/client/auth/exec", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/rest", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/rest/watch", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" + }, + { + "ImportPath": "k8s.io/client-go/restmapper", + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/scale", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/scale/scheme", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsint", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsv1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsv1beta2", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/scale/scheme/autoscalingv1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/scale/scheme/extensionsint", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/scale/scheme/extensionsv1beta1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/testing", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/third_party/forked/golang/template", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/tools/auth", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/tools/cache", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/tools/metrics", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/tools/pager", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/tools/reference", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/transport", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/util/buffer", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/util/cert", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" + }, + { + "ImportPath": "k8s.io/client-go/util/connrotation", + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/util/flowcontrol", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/util/homedir", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/util/integer", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/util/jsonpath", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/util/retry", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/client-go/util/workqueue", - "Rev": "23781f4d6632d88e869066eaebb743857aa1ef9b" + "Rev": "7d04d0e2a0a1a4d4a1cd6baa432a2301492e4e65" }, { "ImportPath": "k8s.io/kube-openapi/pkg/builder", - "Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" + "Rev": "91cfa479c814065e420cee7ed227db0f63a5854e" }, { "ImportPath": "k8s.io/kube-openapi/pkg/common", - "Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" + "Rev": "91cfa479c814065e420cee7ed227db0f63a5854e" }, { "ImportPath": "k8s.io/kube-openapi/pkg/handler", - "Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" + "Rev": "91cfa479c814065e420cee7ed227db0f63a5854e" }, { "ImportPath": "k8s.io/kube-openapi/pkg/util", - "Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" + "Rev": "91cfa479c814065e420cee7ed227db0f63a5854e" }, { "ImportPath": "k8s.io/kube-openapi/pkg/util/proto", - "Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" + "Rev": "91cfa479c814065e420cee7ed227db0f63a5854e" } ] } diff --git a/vendor/k8s.io/apiextensions-apiserver/OWNERS b/vendor/k8s.io/apiextensions-apiserver/OWNERS index e0cd3186f..d9cb557fc 100644 --- a/vendor/k8s.io/apiextensions-apiserver/OWNERS +++ b/vendor/k8s.io/apiextensions-apiserver/OWNERS @@ -2,6 +2,7 @@ reviewers: - deads2k - sttts - enisoc +- mbohlool approvers: - deads2k - lavalamp diff --git a/vendor/k8s.io/apiextensions-apiserver/SECURITY_CONTACTS b/vendor/k8s.io/apiextensions-apiserver/SECURITY_CONTACTS new file mode 100644 index 000000000..0648a8ebf --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/SECURITY_CONTACTS @@ -0,0 +1,17 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +cjcullen +jessfraz +liggitt +philips +tallclair diff --git a/vendor/k8s.io/apiextensions-apiserver/artifacts/example/rc.yaml b/vendor/k8s.io/apiextensions-apiserver/artifacts/example/rc.yaml index 48058b058..86b5d3070 100644 --- a/vendor/k8s.io/apiextensions-apiserver/artifacts/example/rc.yaml +++ b/vendor/k8s.io/apiextensions-apiserver/artifacts/example/rc.yaml @@ -23,4 +23,4 @@ spec: - "--etcd-servers=http://localhost:2379" - "--audit-log-path=-" - name: etcd - image: quay.io/coreos/etcd:v3.2.14 + image: quay.io/coreos/etcd:v3.2.18 diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/BUILD deleted file mode 100644 index 9bf1895c2..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/BUILD +++ /dev/null @@ -1,19 +0,0 @@ -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/hack/update-codegen.sh b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/hack/update-codegen.sh index 3659ad330..ea26ad63c 100755 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/hack/update-codegen.sh +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/hack/update-codegen.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Copyright 2017 The Kubernetes Authors. # diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/hack/verify-codegen.sh b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/hack/verify-codegen.sh index 9cc02a5a4..d02a6fa39 100755 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/hack/verify-codegen.sh +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/hack/verify-codegen.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Copyright 2017 The Kubernetes Authors. # diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/BUILD deleted file mode 100644 index b600f9212..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["register.go"], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1/BUILD deleted file mode 100644 index 0379da4b1..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1/zz_generated.deepcopy.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1/zz_generated.deepcopy.go index a0399a5ca..50828809d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/BUILD deleted file mode 100644 index 0698e1f9a..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "clientset.go", - "doc.go", - ], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/clientset.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/clientset.go index 45745dd27..92ff15819 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/clientset.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/clientset.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,10 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + package versioned import ( - glog "github.com/golang/glog" crv1 "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" @@ -72,7 +73,6 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) if err != nil { - glog.Errorf("failed to create the DiscoveryClient: %v", err) return nil, err } return &cs, nil diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/doc.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/doc.go index 7d2f4d80d..41721ca52 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,5 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + // This package has the automatically generated clientset. package versioned diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/BUILD deleted file mode 100644 index 3620b1569..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "clientset_generated.go", - "doc.go", - "register.go", - ], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/discovery/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/clientset_generated.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/clientset_generated.go index 2a03c770e..28089890d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/clientset_generated.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/clientset_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + package fake import ( @@ -39,11 +41,20 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { } } - fakePtr := testing.Fake{} - fakePtr.AddReactor("*", "*", testing.ObjectReaction(o)) - fakePtr.AddWatchReactor("*", testing.DefaultWatchReactor(watch.NewFake(), nil)) + cs := &Clientset{} + cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake} + cs.AddReactor("*", "*", testing.ObjectReaction(o)) + cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { + gvr := action.GetResource() + ns := action.GetNamespace() + watch, err := o.Watch(gvr, ns) + if err != nil { + return false, nil, err + } + return true, watch, nil + }) - return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}} + return cs } // Clientset implements clientset.Interface. Meant to be embedded into a diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/doc.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/doc.go index 3fd8e1e2c..9b99e7167 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,5 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + // This package has the automatically generated fake clientset. package fake diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/register.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/register.go index 4e6435d2a..fdcedd4c5 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/register.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/register.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + package fake import ( @@ -49,5 +51,4 @@ func init() { // correctly. func AddToScheme(scheme *runtime.Scheme) { crv1.AddToScheme(scheme) - } diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme/BUILD deleted file mode 100644 index 8b8fa05a1..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme/doc.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme/doc.go index 3ec2200d0..7dc375616 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,5 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + // This package contains the scheme of the automatically generated clientset. package scheme diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme/register.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme/register.go index 311152e38..74d8fa4d0 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme/register.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme/register.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + package scheme import ( @@ -49,5 +51,4 @@ func init() { // correctly. func AddToScheme(scheme *runtime.Scheme) { crv1.AddToScheme(scheme) - } diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/BUILD deleted file mode 100644 index 25b9f2fc4..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "cr_client.go", - "doc.go", - "example.go", - "generated_expansion.go", - ], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/cr_client.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/cr_client.go index 8c662905c..04e3930e1 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/cr_client.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/cr_client.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + package v1 import ( @@ -28,7 +30,7 @@ type CrV1Interface interface { ExamplesGetter } -// CrV1Client is used to interact with features provided by the cr.client-go.k8s.io group. +// CrV1Client is used to interact with features provided by the cr.example.apiextensions.k8s.io group. type CrV1Client struct { restClient rest.Interface } diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/doc.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/doc.go index b6a2a4672..3af5d054f 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,5 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + // This package has the automatically generated typed clients. package v1 diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/example.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/example.go index 66e0e1cff..a0cc33852 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/example.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/example.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + package v1 import ( diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/BUILD deleted file mode 100644 index d9c1a5e6c..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_cr_client.go", - "fake_example.go", - ], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/doc.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/doc.go index c58fac35e..16f443990 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,5 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + // Package fake has the automatically generated clients. package fake diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/fake_cr_client.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/fake_cr_client.go index b3f6247c4..5ce902313 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/fake_cr_client.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/fake_cr_client.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + package fake import ( diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/fake_example.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/fake_example.go index 7a8dd94b9..2db7f5c1e 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/fake_example.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/fake_example.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + package fake import ( @@ -32,9 +34,9 @@ type FakeExamples struct { ns string } -var examplesResource = schema.GroupVersionResource{Group: "cr.client-go.k8s.io", Version: "v1", Resource: "examples"} +var examplesResource = schema.GroupVersionResource{Group: "cr.example.apiextensions.k8s.io", Version: "v1", Resource: "examples"} -var examplesKind = schema.GroupVersionKind{Group: "cr.client-go.k8s.io", Version: "v1", Kind: "Example"} +var examplesKind = schema.GroupVersionKind{Group: "cr.example.apiextensions.k8s.io", Version: "v1", Kind: "Example"} // Get takes name of the example, and returns the corresponding example object, and an error if there is any. func (c *FakeExamples) Get(name string, options v1.GetOptions) (result *cr_v1.Example, err error) { @@ -60,7 +62,7 @@ func (c *FakeExamples) List(opts v1.ListOptions) (result *cr_v1.ExampleList, err if label == nil { label = labels.Everything() } - list := &cr_v1.ExampleList{} + list := &cr_v1.ExampleList{ListMeta: obj.(*cr_v1.ExampleList).ListMeta} for _, item := range obj.(*cr_v1.ExampleList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/generated_expansion.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/generated_expansion.go index 70b162feb..755021ec4 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/generated_expansion.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,6 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ +// Code generated by client-gen. DO NOT EDIT. + package v1 type ExampleExpansion interface{} diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/BUILD deleted file mode 100644 index cd892cb07..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "factory.go", - "generic.go", - ], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/BUILD deleted file mode 100644 index 5d32d09b7..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/interface.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/interface.go index 9366da3be..0c633e3ef 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/interface.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was automatically generated by informer-gen +// Code generated by informer-gen. DO NOT EDIT. package cr @@ -30,15 +30,17 @@ type Interface interface { } type group struct { - internalinterfaces.SharedInformerFactory + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc } // New returns a new Interface. -func New(f internalinterfaces.SharedInformerFactory) Interface { - return &group{f} +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } // V1 returns a new v1.Interface. func (g *group) V1() v1.Interface { - return v1.New(g.SharedInformerFactory) + return v1.New(g.factory, g.namespace, g.tweakListOptions) } diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/BUILD deleted file mode 100644 index 8ac5ac14e..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "example.go", - "interface.go", - ], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/example.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/example.go index 39918ff5a..50b563d39 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/example.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/example.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,11 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was automatically generated by informer-gen +// Code generated by informer-gen. DO NOT EDIT. package v1 import ( + time "time" + cr_v1 "k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1" versioned "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned" internalinterfaces "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces" @@ -27,7 +29,6 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" watch "k8s.io/apimachinery/pkg/watch" cache "k8s.io/client-go/tools/cache" - time "time" ) // ExampleInformer provides access to a shared informer and lister for @@ -38,19 +39,34 @@ type ExampleInformer interface { } type exampleInformer struct { - factory internalinterfaces.SharedInformerFactory + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string } // NewExampleInformer constructs a new informer for Example type. // Always prefer using an informer factory to get a shared informer instead of getting an independent // one. This reduces memory footprint and number of connections to the server. func NewExampleInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredExampleInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredExampleInformer constructs a new informer for Example type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredExampleInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { return cache.NewSharedIndexInformer( &cache.ListWatch{ ListFunc: func(options meta_v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } return client.CrV1().Examples(namespace).List(options) }, WatchFunc: func(options meta_v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } return client.CrV1().Examples(namespace).Watch(options) }, }, @@ -60,12 +76,12 @@ func NewExampleInformer(client versioned.Interface, namespace string, resyncPeri ) } -func defaultExampleInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { - return NewExampleInformer(client, meta_v1.NamespaceAll, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) +func (f *exampleInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredExampleInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) } func (f *exampleInformer) Informer() cache.SharedIndexInformer { - return f.factory.InformerFor(&cr_v1.Example{}, defaultExampleInformer) + return f.factory.InformerFor(&cr_v1.Example{}, f.defaultInformer) } func (f *exampleInformer) Lister() v1.ExampleLister { diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/interface.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/interface.go index 0612ce3bd..96ee1514c 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/interface.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was automatically generated by informer-gen +// Code generated by informer-gen. DO NOT EDIT. package v1 @@ -29,15 +29,17 @@ type Interface interface { } type version struct { - internalinterfaces.SharedInformerFactory + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc } // New returns a new Interface. -func New(f internalinterfaces.SharedInformerFactory) Interface { - return &version{f} +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } // Examples returns a ExampleInformer. func (v *version) Examples() ExampleInformer { - return &exampleInformer{factory: v.SharedInformerFactory} + return &exampleInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/factory.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/factory.go index f9ae8be12..67c55af39 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/factory.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/factory.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,26 +14,34 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was automatically generated by informer-gen +// Code generated by informer-gen. DO NOT EDIT. package externalversions import ( - versioned "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned" - cr "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr" - internalinterfaces "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces" - runtime "k8s.io/apimachinery/pkg/runtime" - schema "k8s.io/apimachinery/pkg/runtime/schema" - cache "k8s.io/client-go/tools/cache" reflect "reflect" sync "sync" time "time" + + versioned "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned" + cr "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr" + internalinterfaces "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + cache "k8s.io/client-go/tools/cache" ) +// SharedInformerOption defines the functional option type for SharedInformerFactory. +type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory + type sharedInformerFactory struct { - client versioned.Interface - lock sync.Mutex - defaultResync time.Duration + client versioned.Interface + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc + lock sync.Mutex + defaultResync time.Duration + customResync map[reflect.Type]time.Duration informers map[reflect.Type]cache.SharedIndexInformer // startedInformers is used for tracking which informers have been started. @@ -41,14 +49,62 @@ type sharedInformerFactory struct { startedInformers map[reflect.Type]bool } -// NewSharedInformerFactory constructs a new instance of sharedInformerFactory +// WithCustomResyncConfig sets a custom resync period for the specified informer types. +func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + for k, v := range resyncConfig { + factory.customResync[reflect.TypeOf(k)] = v + } + return factory + } +} + +// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory. +func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.tweakListOptions = tweakListOptions + return factory + } +} + +// WithNamespace limits the SharedInformerFactory to the specified namespace. +func WithNamespace(namespace string) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.namespace = namespace + return factory + } +} + +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory { - return &sharedInformerFactory{ + return NewSharedInformerFactoryWithOptions(client, defaultResync) +} + +// NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory. +// Listers obtained via this SharedInformerFactory will be subject to the same filters +// as specified here. +// Deprecated: Please use NewSharedInformerFactoryWithOptions instead +func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory { + return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions)) +} + +// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options. +func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory { + factory := &sharedInformerFactory{ client: client, + namespace: v1.NamespaceAll, defaultResync: defaultResync, informers: make(map[reflect.Type]cache.SharedIndexInformer), startedInformers: make(map[reflect.Type]bool), + customResync: make(map[reflect.Type]time.Duration), } + + // Apply all options + for _, opt := range options { + factory = opt(factory) + } + + return factory } // Start initializes all requested informers. @@ -97,7 +153,13 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal if exists { return informer } - informer = newFunc(f.client, f.defaultResync) + + resyncPeriod, exists := f.customResync[informerType] + if !exists { + resyncPeriod = f.defaultResync + } + + informer = newFunc(f.client, resyncPeriod) f.informers[informerType] = informer return informer @@ -114,5 +176,5 @@ type SharedInformerFactory interface { } func (f *sharedInformerFactory) Cr() cr.Interface { - return cr.New(f) + return cr.New(f, f.namespace, f.tweakListOptions) } diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/generic.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/generic.go index 12390b7a9..2bf6c5a47 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/generic.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/generic.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,12 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was automatically generated by informer-gen +// Code generated by informer-gen. DO NOT EDIT. package externalversions import ( "fmt" + v1 "k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1" schema "k8s.io/apimachinery/pkg/runtime/schema" cache "k8s.io/client-go/tools/cache" @@ -51,7 +52,7 @@ func (f *genericInformer) Lister() cache.GenericLister { // TODO extend this to unknown resources with a client pool func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) { switch resource { - // Group=Cr, Version=V1 + // Group=cr.example.apiextensions.k8s.io, Version=v1 case v1.SchemeGroupVersion.WithResource("examples"): return &genericInformer{resource: resource.GroupResource(), informer: f.Cr().V1().Examples().Informer()}, nil diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces/BUILD deleted file mode 100644 index 20b878299..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["factory_interfaces.go"], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go index d8f00586b..5b81f037b 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,15 +14,17 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was automatically generated by informer-gen +// Code generated by informer-gen. DO NOT EDIT. package internalinterfaces import ( + time "time" + versioned "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" cache "k8s.io/client-go/tools/cache" - time "time" ) type NewInformerFunc func(versioned.Interface, time.Duration) cache.SharedIndexInformer @@ -32,3 +34,5 @@ type SharedInformerFactory interface { Start(stopCh <-chan struct{}) InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer } + +type TweakListOptionsFunc func(*v1.ListOptions) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/BUILD b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/BUILD deleted file mode 100644 index 69e2f3c92..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "example.go", - "expansion_generated.go", - ], - importpath = "k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/example.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/example.go index 554c9f2db..8a64d09cc 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/example.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/example.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was automatically generated by lister-gen +// Code generated by lister-gen. DO NOT EDIT. package v1 diff --git a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/expansion_generated.go b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/expansion_generated.go index 7397d6f6c..5291ebaec 100644 --- a/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/expansion_generated.go +++ b/vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was automatically generated by lister-gen +// Code generated by lister-gen. DO NOT EDIT. package v1 diff --git a/vendor/k8s.io/apiextensions-apiserver/hack/boilerplate.go.txt b/vendor/k8s.io/apiextensions-apiserver/hack/boilerplate.go.txt index 59e740c1e..b7c650da4 100644 --- a/vendor/k8s.io/apiextensions-apiserver/hack/boilerplate.go.txt +++ b/vendor/k8s.io/apiextensions-apiserver/hack/boilerplate.go.txt @@ -1,5 +1,5 @@ /* -Copyright YEAR The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/hack/build-image.sh b/vendor/k8s.io/apiextensions-apiserver/hack/build-image.sh index c9152a4de..d0d129078 100755 --- a/vendor/k8s.io/apiextensions-apiserver/hack/build-image.sh +++ b/vendor/k8s.io/apiextensions-apiserver/hack/build-image.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Copyright 2017 The Kubernetes Authors. # diff --git a/vendor/k8s.io/apiextensions-apiserver/hack/update-codegen.sh b/vendor/k8s.io/apiextensions-apiserver/hack/update-codegen.sh index 9c98ebf4d..a586b48e0 100755 --- a/vendor/k8s.io/apiextensions-apiserver/hack/update-codegen.sh +++ b/vendor/k8s.io/apiextensions-apiserver/hack/update-codegen.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Copyright 2017 The Kubernetes Authors. # diff --git a/vendor/k8s.io/apiextensions-apiserver/hack/verify-codegen.sh b/vendor/k8s.io/apiextensions-apiserver/hack/verify-codegen.sh index f5835c425..ab43ba23d 100755 --- a/vendor/k8s.io/apiextensions-apiserver/hack/verify-codegen.sh +++ b/vendor/k8s.io/apiextensions-apiserver/hack/verify-codegen.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Copyright 2017 The Kubernetes Authors. # diff --git a/vendor/k8s.io/apiextensions-apiserver/main.go b/vendor/k8s.io/apiextensions-apiserver/main.go index 7723e6513..09143ab6e 100644 --- a/vendor/k8s.io/apiextensions-apiserver/main.go +++ b/vendor/k8s.io/apiextensions-apiserver/main.go @@ -19,7 +19,6 @@ package main import ( "flag" "os" - "runtime" "github.com/golang/glog" @@ -32,10 +31,6 @@ func main() { logs.InitLogs() defer logs.FlushLogs() - if len(os.Getenv("GOMAXPROCS")) == 0 { - runtime.GOMAXPROCS(runtime.NumCPU()) - } - stopCh := genericapiserver.SetupSignalHandler() cmd := server.NewCommandStartCustomResourceDefinitionsServer(os.Stdout, os.Stderr, stopCh) cmd.Flags().AddGoFlagSet(flag.CommandLine) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD deleted file mode 100644 index b2ea73c41..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "deepcopy.go", - "doc.go", - "helpers.go", - "register.go", - "types.go", - "types_jsonschema.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go index dd9680c36..37b4d1df9 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/deepcopy.go @@ -16,6 +16,8 @@ limitations under the License. package apiextensions +import "k8s.io/apimachinery/pkg/runtime" + // TODO: Update this after a tag is created for interface fields in DeepCopy func (in *JSONSchemaProps) DeepCopy() *JSONSchemaProps { if in == nil { @@ -26,14 +28,14 @@ func (in *JSONSchemaProps) DeepCopy() *JSONSchemaProps { *out = *in if in.Default != nil { - defaultJSON := JSON(deepCopyJSON(*(in.Default))) + defaultJSON := JSON(runtime.DeepCopyJSONValue(*(in.Default))) out.Default = &(defaultJSON) } else { out.Default = nil } if in.Example != nil { - exampleJSON := JSON(deepCopyJSON(*(in.Example))) + exampleJSON := JSON(runtime.DeepCopyJSONValue(*(in.Example))) out.Example = &(exampleJSON) } else { out.Example = nil @@ -121,7 +123,7 @@ func (in *JSONSchemaProps) DeepCopy() *JSONSchemaProps { if in.Enum != nil { out.Enum = make([]JSON, len(in.Enum)) for i := range in.Enum { - out.Enum[i] = deepCopyJSON(in.Enum[i]) + out.Enum[i] = runtime.DeepCopyJSONValue(in.Enum[i]) } } @@ -258,22 +260,3 @@ func (in *JSONSchemaProps) DeepCopy() *JSONSchemaProps { return out } - -func deepCopyJSON(x interface{}) interface{} { - switch x := x.(type) { - case map[string]interface{}: - clone := make(map[string]interface{}, len(x)) - for k, v := range x { - clone[k] = deepCopyJSON(v) - } - return clone - case []interface{}: - clone := make([]interface{}, len(x)) - for i := range x { - clone[i] = deepCopyJSON(x[i]) - } - return clone - default: - return x - } -} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/BUILD deleted file mode 100644 index a6e5ed9df..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["fuzzer.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer", - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/fuzzer.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/fuzzer.go index a7cfb0ae7..ff8cc0334 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/fuzzer.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/fuzzer.go @@ -23,9 +23,12 @@ import ( "github.com/google/gofuzz" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" ) +var swaggerMetadataDescriptions = metav1.ObjectMeta{}.SwaggerDoc() + // Funcs returns the fuzzer functions for the apiextensions apis. func Funcs(codecs runtimeserializer.CodecFactory) []interface{} { return []interface{}{ @@ -42,6 +45,33 @@ func Funcs(codecs runtimeserializer.CodecFactory) []interface{} { if len(obj.Names.ListKind) == 0 && len(obj.Names.Kind) > 0 { obj.Names.ListKind = obj.Names.Kind + "List" } + if len(obj.Versions) == 0 && len(obj.Version) != 0 { + obj.Versions = []apiextensions.CustomResourceDefinitionVersion{ + { + Name: obj.Version, + Served: true, + Storage: true, + }, + } + } else if len(obj.Versions) != 0 { + obj.Version = obj.Versions[0].Name + } + if len(obj.AdditionalPrinterColumns) == 0 { + obj.AdditionalPrinterColumns = []apiextensions.CustomResourceColumnDefinition{ + {Name: "Age", Type: "date", Description: swaggerMetadataDescriptions["creationTimestamp"], JSONPath: ".metadata.creationTimestamp"}, + } + } + }, + func(obj *apiextensions.CustomResourceDefinition, c fuzz.Continue) { + c.FuzzNoCustom(obj) + + if len(obj.Status.StoredVersions) == 0 { + for _, v := range obj.Spec.Versions { + if v.Storage && !apiextensions.IsStoredVersion(obj, v.Name) { + obj.Status.StoredVersions = append(obj.Status.StoredVersions, v.Name) + } + } + } }, func(obj *apiextensions.JSONSchemaProps, c fuzz.Continue) { // we cannot use c.FuzzNoCustom because of the interface{} fields. So let's loop with reflection. @@ -81,6 +111,7 @@ func Funcs(codecs runtimeserializer.CodecFactory) []interface{} { }, func(obj *apiextensions.JSONSchemaPropsOrBool, c fuzz.Continue) { if c.RandBool() { + obj.Allows = true obj.Schema = &apiextensions.JSONSchemaProps{} c.Fuzz(obj.Schema) } else { diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/helpers.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/helpers.go index 8dc7f72d6..92cad7d9b 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/helpers.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/helpers.go @@ -17,6 +17,7 @@ limitations under the License. package apiextensions import ( + "fmt" "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -116,3 +117,33 @@ func CRDRemoveFinalizer(crd *CustomResourceDefinition, needle string) { } crd.Finalizers = newFinalizers } + +// HasServedCRDVersion returns true if `version` is in the list of CRD's versions and the Served flag is set. +func HasServedCRDVersion(crd *CustomResourceDefinition, version string) bool { + for _, v := range crd.Spec.Versions { + if v.Name == version { + return v.Served + } + } + return false +} + +// GetCRDStorageVersion returns the storage version for given CRD. +func GetCRDStorageVersion(crd *CustomResourceDefinition) (string, error) { + for _, v := range crd.Spec.Versions { + if v.Storage { + return v.Name, nil + } + } + // This should not happened if crd is valid + return "", fmt.Errorf("invalid CustomResourceDefinition, no storage version") +} + +func IsStoredVersion(crd *CustomResourceDefinition, version string) bool { + for _, v := range crd.Status.StoredVersions { + if version == v { + return true + } + } + return false +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/helpers_test.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/helpers_test.go index 1abb49815..df58a7cbf 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/helpers_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/helpers_test.go @@ -19,6 +19,7 @@ package apiextensions import ( "reflect" "testing" + "time" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -88,3 +89,333 @@ func TestCRDRemoveFinalizer(t *testing.T) { } } } + +func TestSetCRDCondition(t *testing.T) { + tests := []struct { + name string + crdCondition []CustomResourceDefinitionCondition + newCondition CustomResourceDefinitionCondition + expectedcrdCondition []CustomResourceDefinitionCondition + }{ + { + name: "test setCRDcondition when one condition", + crdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + }, + newCondition: CustomResourceDefinitionCondition{ + Type: Established, + Status: ConditionFalse, + Reason: "NotAccepted", + Message: "Not accepted", + LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC), + }, + expectedcrdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionFalse, + Reason: "NotAccepted", + Message: "Not accepted", + LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC), + }, + }, + }, + { + name: "test setCRDcondition when two condition", + crdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + { + Type: NamesAccepted, + Status: ConditionTrue, + Reason: "NoConflicts", + Message: "no conflicts found", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + }, + newCondition: CustomResourceDefinitionCondition{ + Type: NamesAccepted, + Status: ConditionFalse, + Reason: "Conflicts", + Message: "conflicts found", + LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC), + }, + expectedcrdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + { + Type: NamesAccepted, + Status: ConditionFalse, + Reason: "Conflicts", + Message: "conflicts found", + LastTransitionTime: metav1.Date(2018, 1, 2, 0, 0, 0, 0, time.UTC), + }, + }, + }, + { + name: "test setCRDcondition when condition needs to be appended", + crdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + }, + newCondition: CustomResourceDefinitionCondition{ + Type: Terminating, + Status: ConditionFalse, + Reason: "NeverEstablished", + Message: "resource was never established", + LastTransitionTime: metav1.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC), + }, + expectedcrdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + { + Type: Terminating, + Status: ConditionFalse, + Reason: "NeverEstablished", + Message: "resource was never established", + LastTransitionTime: metav1.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC), + }, + }, + }, + } + for _, tc := range tests { + crd := generateCRDwithCondition(tc.crdCondition) + SetCRDCondition(crd, tc.newCondition) + if len(tc.expectedcrdCondition) != len(crd.Status.Conditions) { + t.Errorf("%v expected %v, got %v", tc.name, tc.expectedcrdCondition, crd.Status.Conditions) + } + for i := range tc.expectedcrdCondition { + if !IsCRDConditionEquivalent(&tc.expectedcrdCondition[i], &crd.Status.Conditions[i]) { + t.Errorf("%v expected %v, got %v", tc.name, tc.expectedcrdCondition, crd.Status.Conditions) + } + } + } +} + +func TestRemoveCRDCondition(t *testing.T) { + tests := []struct { + name string + crdCondition []CustomResourceDefinitionCondition + conditionType CustomResourceDefinitionConditionType + expectedcrdCondition []CustomResourceDefinitionCondition + }{ + { + name: "test remove CRDCondition when the conditionType meets", + crdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + { + Type: NamesAccepted, + Status: ConditionTrue, + Reason: "NoConflicts", + Message: "no conflicts found", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + }, + conditionType: NamesAccepted, + expectedcrdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2011, 1, 2, 0, 0, 0, 0, time.UTC), + }, + }, + }, + { + name: "test remove CRDCondition when the conditionType not meets", + crdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + { + Type: NamesAccepted, + Status: ConditionTrue, + Reason: "NoConflicts", + Message: "no conflicts found", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + }, + conditionType: Terminating, + expectedcrdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + { + Type: NamesAccepted, + Status: ConditionTrue, + Reason: "NoConflicts", + Message: "no conflicts found", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + }, + }, + } + for _, tc := range tests { + crd := generateCRDwithCondition(tc.crdCondition) + RemoveCRDCondition(crd, tc.conditionType) + if len(tc.expectedcrdCondition) != len(crd.Status.Conditions) { + t.Errorf("%v expected %v, got %v", tc.name, tc.expectedcrdCondition, crd.Status.Conditions) + } + for i := range tc.expectedcrdCondition { + if !IsCRDConditionEquivalent(&tc.expectedcrdCondition[i], &crd.Status.Conditions[i]) { + t.Errorf("%v expected %v, got %v", tc.name, tc.expectedcrdCondition, crd.Status.Conditions) + } + } + } +} + +func TestIsCRDConditionPresentAndEqual(t *testing.T) { + tests := []struct { + name string + crdCondition []CustomResourceDefinitionCondition + conditionType CustomResourceDefinitionConditionType + status ConditionStatus + expectresult bool + }{ + { + name: "test CRDCondition is not Present", + crdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + { + Type: NamesAccepted, + Status: ConditionTrue, + Reason: "NoConflicts", + Message: "no conflicts found", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + }, + conditionType: Terminating, + status: ConditionTrue, + expectresult: false, + }, + { + name: "test CRDCondition is Present but not Equal", + crdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + { + Type: NamesAccepted, + Status: ConditionTrue, + Reason: "NoConflicts", + Message: "no conflicts found", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + }, + conditionType: Established, + status: ConditionFalse, + expectresult: false, + }, + { + name: "test CRDCondition is Present and Equal", + crdCondition: []CustomResourceDefinitionCondition{ + { + Type: Established, + Status: ConditionTrue, + Reason: "Accepted", + Message: "the initial names have been accepted", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + { + Type: NamesAccepted, + Status: ConditionTrue, + Reason: "NoConflicts", + Message: "no conflicts found", + LastTransitionTime: metav1.Date(2018, 1, 1, 0, 0, 0, 0, time.UTC), + }, + }, + conditionType: NamesAccepted, + status: ConditionTrue, + expectresult: true, + }, + } + for _, tc := range tests { + crd := generateCRDwithCondition(tc.crdCondition) + res := IsCRDConditionPresentAndEqual(crd, tc.conditionType, tc.status) + if res != tc.expectresult { + t.Errorf("%v expected %t, got %t", tc.name, tc.expectresult, res) + } + } +} + +func generateCRDwithCondition(conditions []CustomResourceDefinitionCondition) *CustomResourceDefinition { + testCRDObjectMeta := metav1.ObjectMeta{ + Name: "plural.group.com", + ResourceVersion: "12", + } + testCRDSpec := CustomResourceDefinitionSpec{ + Group: "group.com", + Version: "version", + Scope: ResourceScope("Cluster"), + Names: CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "kind", + ListKind: "listkind", + }, + } + testCRDAcceptedNames := CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "kind", + ListKind: "listkind", + } + return &CustomResourceDefinition{ + ObjectMeta: testCRDObjectMeta, + Spec: testCRDSpec, + Status: CustomResourceDefinitionStatus{ + AcceptedNames: testCRDAcceptedNames, + Conditions: conditions, + }, + } +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD deleted file mode 100644 index e7403207c..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["roundtrip_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/install.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/install.go index 25cee84d2..2fd04b77d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/install.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/install.go @@ -19,25 +19,13 @@ package install import ( "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - "k8s.io/apimachinery/pkg/apimachinery/announced" - "k8s.io/apimachinery/pkg/apimachinery/registered" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/util/sets" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) // Install registers the API group and adds types to a scheme -func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { - if err := announced.NewGroupMetaFactory( - &announced.GroupMetaFactoryArgs{ - GroupName: apiextensions.GroupName, - RootScopedKinds: sets.NewString("CustomResourceDefinition"), - VersionPreferenceOrder: []string{v1beta1.SchemeGroupVersion.Version}, - AddInternalObjectsToScheme: apiextensions.AddToScheme, - }, - announced.VersionToSchemeFunc{ - v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme, - }, - ).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil { - panic(err) - } +func Install(scheme *runtime.Scheme) { + utilruntime.Must(apiextensions.AddToScheme(scheme)) + utilruntime.Must(v1beta1.AddToScheme(scheme)) + utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion)) } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go index 0deb7cbd0..6fc75154f 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/types.go @@ -25,6 +25,9 @@ type CustomResourceDefinitionSpec struct { // Group is the group this resource belongs in Group string // Version is the version this resource belongs in + // Should be always first item in Versions field if provided. + // Optional, but at least one of Version or Versions must be set. + // Deprecated: Please use `Versions`. Version string // Names are the names used to describe this custom resource Names CustomResourceDefinitionNames @@ -34,6 +37,52 @@ type CustomResourceDefinitionSpec struct { Validation *CustomResourceValidation // Subresources describes the subresources for CustomResources Subresources *CustomResourceSubresources + // Versions is the list of all supported versions for this resource. + // If Version field is provided, this field is optional. + // Validation: All versions must use the same validation schema for now. i.e., top + // level Validation field is applied to all of these versions. + // Order: The version name will be used to compute the order. + // If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered + // lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version), + // then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first + // by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing + // major version, then minor version. An example sorted list of versions: + // v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10. + Versions []CustomResourceDefinitionVersion + // AdditionalPrinterColumns are additional columns shown e.g. in kubectl next to the name. Defaults to a created-at column. + AdditionalPrinterColumns []CustomResourceColumnDefinition +} + +type CustomResourceDefinitionVersion struct { + // Name is the version name, e.g. “v1â€, “v2beta1â€, etc. + Name string + // Served is a flag enabling/disabling this version from being served via REST APIs + Served bool + // Storage flags the version as storage version. There must be exactly one flagged + // as storage version. + Storage bool +} + +// CustomResourceColumnDefinition specifies a column for server side printing. +type CustomResourceColumnDefinition struct { + // name is a human readable name for the column. + Name string + // type is an OpenAPI type definition for this column. + // See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more. + Type string + // format is an optional OpenAPI type definition for this column. The 'name' format is applied + // to the primary identifier column to assist in clients identifying column is the resource name. + // See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more. + Format string + // description is a human readable description of this column. + Description string + // priority is an integer defining the relative importance of this column compared to others. Lower + // numbers are considered higher priority. Columns that may be omitted in limited space scenarios + // should be given a higher priority. + Priority int32 + + // JSONPath is a simple JSON path, i.e. without array notation. + JSONPath string } // CustomResourceDefinitionNames indicates the names to serve this CustomResourceDefinition @@ -115,6 +164,14 @@ type CustomResourceDefinitionStatus struct { // AcceptedNames are the names that are actually being used to serve discovery // They may be different than the names in spec. AcceptedNames CustomResourceDefinitionNames + + // StoredVersions are all versions of CustomResources that were ever persisted. Tracking these + // versions allows a migration path for stored versions in etcd. The field is mutable + // so the migration controller can first finish a migration to another version (i.e. + // that no old objects are left in the storage), and then remove the rest of the + // versions from this list. + // None of the versions in this list can be removed from the spec.Versions field. + StoredVersions []string } // CustomResourceCleanupFinalizer is the name of the finalizer which will delete instances of diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD deleted file mode 100644 index 972732d4a..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD +++ /dev/null @@ -1,68 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "deepcopy.go", - "defaults.go", - "doc.go", - "generated.pb.go", - "marshal.go", - "register.go", - "types.go", - "types_jsonschema.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = [ - "conversion_test.go", - "marshal_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go index 903773ae2..f6a114e2b 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/deepcopy.go @@ -236,22 +236,3 @@ func (in *JSONSchemaProps) DeepCopy() *JSONSchemaProps { return out } - -func deepCopyJSON(x interface{}) interface{} { - switch x := x.(type) { - case map[string]interface{}: - clone := make(map[string]interface{}, len(x)) - for k, v := range x { - clone[k] = deepCopyJSON(v) - } - return clone - case []interface{}: - clone := make([]interface{}, len(x)) - for i := range x { - clone[i] = deepCopyJSON(x[i]) - } - return clone - default: - return x - } -} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go index edffaed55..e3235e870 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/defaults.go @@ -19,9 +19,12 @@ package v1beta1 import ( "strings" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" ) +var swaggerMetadataDescriptions = metav1.ObjectMeta{}.SwaggerDoc() + func addDefaultingFuncs(scheme *runtime.Scheme) error { scheme.AddTypeDefaultingFunc(&CustomResourceDefinition{}, func(obj interface{}) { SetDefaults_CustomResourceDefinition(obj.(*CustomResourceDefinition)) }) // TODO figure out why I can't seem to get my defaulter generated @@ -31,6 +34,14 @@ func addDefaultingFuncs(scheme *runtime.Scheme) error { func SetDefaults_CustomResourceDefinition(obj *CustomResourceDefinition) { SetDefaults_CustomResourceDefinitionSpec(&obj.Spec) + if len(obj.Status.StoredVersions) == 0 { + for _, v := range obj.Spec.Versions { + if v.Storage { + obj.Status.StoredVersions = append(obj.Status.StoredVersions, v.Name) + break + } + } + } } func SetDefaults_CustomResourceDefinitionSpec(obj *CustomResourceDefinitionSpec) { @@ -43,4 +54,21 @@ func SetDefaults_CustomResourceDefinitionSpec(obj *CustomResourceDefinitionSpec) if len(obj.Names.ListKind) == 0 && len(obj.Names.Kind) > 0 { obj.Names.ListKind = obj.Names.Kind + "List" } + // If there is no list of versions, create on using deprecated Version field. + if len(obj.Versions) == 0 && len(obj.Version) != 0 { + obj.Versions = []CustomResourceDefinitionVersion{{ + Name: obj.Version, + Storage: true, + Served: true, + }} + } + // For backward compatibility set the version field to the first item in versions list. + if len(obj.Version) == 0 && len(obj.Versions) != 0 { + obj.Version = obj.Versions[0].Name + } + if len(obj.AdditionalPrinterColumns) == 0 { + obj.AdditionalPrinterColumns = []CustomResourceColumnDefinition{ + {Name: "Age", Type: "date", Description: swaggerMetadataDescriptions["creationTimestamp"], JSONPath: ".metadata.creationTimestamp"}, + } + } } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go index e7325da23..8e30403c8 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -25,12 +25,14 @@ limitations under the License. k8s.io/kubernetes/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto It has these top-level messages: + CustomResourceColumnDefinition CustomResourceDefinition CustomResourceDefinitionCondition CustomResourceDefinitionList CustomResourceDefinitionNames CustomResourceDefinitionSpec CustomResourceDefinitionStatus + CustomResourceDefinitionVersion CustomResourceSubresourceScale CustomResourceSubresourceStatus CustomResourceSubresources @@ -66,99 +68,113 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package +func (m *CustomResourceColumnDefinition) Reset() { *m = CustomResourceColumnDefinition{} } +func (*CustomResourceColumnDefinition) ProtoMessage() {} +func (*CustomResourceColumnDefinition) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{0} +} + func (m *CustomResourceDefinition) Reset() { *m = CustomResourceDefinition{} } func (*CustomResourceDefinition) ProtoMessage() {} func (*CustomResourceDefinition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{0} + return fileDescriptorGenerated, []int{1} } func (m *CustomResourceDefinitionCondition) Reset() { *m = CustomResourceDefinitionCondition{} } func (*CustomResourceDefinitionCondition) ProtoMessage() {} func (*CustomResourceDefinitionCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{1} + return fileDescriptorGenerated, []int{2} } func (m *CustomResourceDefinitionList) Reset() { *m = CustomResourceDefinitionList{} } func (*CustomResourceDefinitionList) ProtoMessage() {} func (*CustomResourceDefinitionList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{2} + return fileDescriptorGenerated, []int{3} } func (m *CustomResourceDefinitionNames) Reset() { *m = CustomResourceDefinitionNames{} } func (*CustomResourceDefinitionNames) ProtoMessage() {} func (*CustomResourceDefinitionNames) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{3} + return fileDescriptorGenerated, []int{4} } func (m *CustomResourceDefinitionSpec) Reset() { *m = CustomResourceDefinitionSpec{} } func (*CustomResourceDefinitionSpec) ProtoMessage() {} func (*CustomResourceDefinitionSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{4} + return fileDescriptorGenerated, []int{5} } func (m *CustomResourceDefinitionStatus) Reset() { *m = CustomResourceDefinitionStatus{} } func (*CustomResourceDefinitionStatus) ProtoMessage() {} func (*CustomResourceDefinitionStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{5} + return fileDescriptorGenerated, []int{6} +} + +func (m *CustomResourceDefinitionVersion) Reset() { *m = CustomResourceDefinitionVersion{} } +func (*CustomResourceDefinitionVersion) ProtoMessage() {} +func (*CustomResourceDefinitionVersion) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{7} } func (m *CustomResourceSubresourceScale) Reset() { *m = CustomResourceSubresourceScale{} } func (*CustomResourceSubresourceScale) ProtoMessage() {} func (*CustomResourceSubresourceScale) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{6} + return fileDescriptorGenerated, []int{8} } func (m *CustomResourceSubresourceStatus) Reset() { *m = CustomResourceSubresourceStatus{} } func (*CustomResourceSubresourceStatus) ProtoMessage() {} func (*CustomResourceSubresourceStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{7} + return fileDescriptorGenerated, []int{9} } func (m *CustomResourceSubresources) Reset() { *m = CustomResourceSubresources{} } func (*CustomResourceSubresources) ProtoMessage() {} func (*CustomResourceSubresources) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{8} + return fileDescriptorGenerated, []int{10} } func (m *CustomResourceValidation) Reset() { *m = CustomResourceValidation{} } func (*CustomResourceValidation) ProtoMessage() {} func (*CustomResourceValidation) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{9} + return fileDescriptorGenerated, []int{11} } func (m *ExternalDocumentation) Reset() { *m = ExternalDocumentation{} } func (*ExternalDocumentation) ProtoMessage() {} -func (*ExternalDocumentation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } +func (*ExternalDocumentation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } func (m *JSON) Reset() { *m = JSON{} } func (*JSON) ProtoMessage() {} -func (*JSON) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } +func (*JSON) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } func (m *JSONSchemaProps) Reset() { *m = JSONSchemaProps{} } func (*JSONSchemaProps) ProtoMessage() {} -func (*JSONSchemaProps) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} } +func (*JSONSchemaProps) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } func (m *JSONSchemaPropsOrArray) Reset() { *m = JSONSchemaPropsOrArray{} } func (*JSONSchemaPropsOrArray) ProtoMessage() {} -func (*JSONSchemaPropsOrArray) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} } +func (*JSONSchemaPropsOrArray) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} } func (m *JSONSchemaPropsOrBool) Reset() { *m = JSONSchemaPropsOrBool{} } func (*JSONSchemaPropsOrBool) ProtoMessage() {} -func (*JSONSchemaPropsOrBool) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} } +func (*JSONSchemaPropsOrBool) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} } func (m *JSONSchemaPropsOrStringArray) Reset() { *m = JSONSchemaPropsOrStringArray{} } func (*JSONSchemaPropsOrStringArray) ProtoMessage() {} func (*JSONSchemaPropsOrStringArray) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{15} + return fileDescriptorGenerated, []int{17} } func init() { + proto.RegisterType((*CustomResourceColumnDefinition)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceColumnDefinition") proto.RegisterType((*CustomResourceDefinition)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinition") proto.RegisterType((*CustomResourceDefinitionCondition)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionCondition") proto.RegisterType((*CustomResourceDefinitionList)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionList") proto.RegisterType((*CustomResourceDefinitionNames)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionNames") proto.RegisterType((*CustomResourceDefinitionSpec)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionSpec") proto.RegisterType((*CustomResourceDefinitionStatus)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionStatus") + proto.RegisterType((*CustomResourceDefinitionVersion)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceDefinitionVersion") proto.RegisterType((*CustomResourceSubresourceScale)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceScale") proto.RegisterType((*CustomResourceSubresourceStatus)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresourceStatus") proto.RegisterType((*CustomResourceSubresources)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.CustomResourceSubresources") @@ -170,6 +186,47 @@ func init() { proto.RegisterType((*JSONSchemaPropsOrBool)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrBool") proto.RegisterType((*JSONSchemaPropsOrStringArray)(nil), "k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1beta1.JSONSchemaPropsOrStringArray") } +func (m *CustomResourceColumnDefinition) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CustomResourceColumnDefinition) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Format))) + i += copy(dAtA[i:], m.Format) + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Description))) + i += copy(dAtA[i:], m.Description) + dAtA[i] = 0x28 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Priority)) + dAtA[i] = 0x32 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.JSONPath))) + i += copy(dAtA[i:], m.JSONPath) + return i, nil +} + func (m *CustomResourceDefinition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -411,6 +468,30 @@ func (m *CustomResourceDefinitionSpec) MarshalTo(dAtA []byte) (int, error) { } i += n8 } + if len(m.Versions) > 0 { + for _, msg := range m.Versions { + dAtA[i] = 0x3a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.AdditionalPrinterColumns) > 0 { + for _, msg := range m.AdditionalPrinterColumns { + dAtA[i] = 0x42 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -449,6 +530,59 @@ func (m *CustomResourceDefinitionStatus) MarshalTo(dAtA []byte) (int, error) { return 0, err } i += n9 + if len(m.StoredVersions) > 0 { + for _, s := range m.StoredVersions { + dAtA[i] = 0x1a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *CustomResourceDefinitionVersion) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CustomResourceDefinitionVersion) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + dAtA[i] = 0x10 + i++ + if m.Served { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + dAtA[i] = 0x18 + i++ + if m.Storage { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ return i, nil } @@ -1184,6 +1318,23 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return offset + 1 } +func (m *CustomResourceColumnDefinition) Size() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Format) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Description) + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.Priority)) + l = len(m.JSONPath) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *CustomResourceDefinition) Size() (n int) { var l int _ = l @@ -1271,6 +1422,18 @@ func (m *CustomResourceDefinitionSpec) Size() (n int) { l = m.Subresources.Size() n += 1 + l + sovGenerated(uint64(l)) } + if len(m.Versions) > 0 { + for _, e := range m.Versions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + if len(m.AdditionalPrinterColumns) > 0 { + for _, e := range m.AdditionalPrinterColumns { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -1285,6 +1448,22 @@ func (m *CustomResourceDefinitionStatus) Size() (n int) { } l = m.AcceptedNames.Size() n += 1 + l + sovGenerated(uint64(l)) + if len(m.StoredVersions) > 0 { + for _, s := range m.StoredVersions { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *CustomResourceDefinitionVersion) Size() (n int) { + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + n += 2 return n } @@ -1556,6 +1735,21 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *CustomResourceColumnDefinition) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CustomResourceColumnDefinition{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Format:` + fmt.Sprintf("%v", this.Format) + `,`, + `Description:` + fmt.Sprintf("%v", this.Description) + `,`, + `Priority:` + fmt.Sprintf("%v", this.Priority) + `,`, + `JSONPath:` + fmt.Sprintf("%v", this.JSONPath) + `,`, + `}`, + }, "") + return s +} func (this *CustomResourceDefinition) String() string { if this == nil { return "nil" @@ -1619,6 +1813,8 @@ func (this *CustomResourceDefinitionSpec) String() string { `Scope:` + fmt.Sprintf("%v", this.Scope) + `,`, `Validation:` + strings.Replace(fmt.Sprintf("%v", this.Validation), "CustomResourceValidation", "CustomResourceValidation", 1) + `,`, `Subresources:` + strings.Replace(fmt.Sprintf("%v", this.Subresources), "CustomResourceSubresources", "CustomResourceSubresources", 1) + `,`, + `Versions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Versions), "CustomResourceDefinitionVersion", "CustomResourceDefinitionVersion", 1), `&`, ``, 1) + `,`, + `AdditionalPrinterColumns:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AdditionalPrinterColumns), "CustomResourceColumnDefinition", "CustomResourceColumnDefinition", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -1630,6 +1826,19 @@ func (this *CustomResourceDefinitionStatus) String() string { s := strings.Join([]string{`&CustomResourceDefinitionStatus{`, `Conditions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Conditions), "CustomResourceDefinitionCondition", "CustomResourceDefinitionCondition", 1), `&`, ``, 1) + `,`, `AcceptedNames:` + strings.Replace(strings.Replace(this.AcceptedNames.String(), "CustomResourceDefinitionNames", "CustomResourceDefinitionNames", 1), `&`, ``, 1) + `,`, + `StoredVersions:` + fmt.Sprintf("%v", this.StoredVersions) + `,`, + `}`, + }, "") + return s +} +func (this *CustomResourceDefinitionVersion) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&CustomResourceDefinitionVersion{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Served:` + fmt.Sprintf("%v", this.Served) + `,`, + `Storage:` + fmt.Sprintf("%v", this.Storage) + `,`, `}`, }, "") return s @@ -1823,6 +2032,220 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *CustomResourceColumnDefinition) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CustomResourceColumnDefinition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CustomResourceColumnDefinition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Format", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Format = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Priority", wireType) + } + m.Priority = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Priority |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JSONPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.JSONPath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CustomResourceDefinition) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2706,6 +3129,68 @@ func (m *CustomResourceDefinitionSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Versions", 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 > l { + return io.ErrUnexpectedEOF + } + m.Versions = append(m.Versions, CustomResourceDefinitionVersion{}) + if err := m.Versions[len(m.Versions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AdditionalPrinterColumns", 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 > l { + return io.ErrUnexpectedEOF + } + m.AdditionalPrinterColumns = append(m.AdditionalPrinterColumns, CustomResourceColumnDefinition{}) + if err := m.AdditionalPrinterColumns[len(m.AdditionalPrinterColumns)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -2817,6 +3302,154 @@ func (m *CustomResourceDefinitionStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StoredVersions", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StoredVersions = append(m.StoredVersions, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CustomResourceDefinitionVersion) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CustomResourceDefinitionVersion: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CustomResourceDefinitionVersion: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Served", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Served = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Storage", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Storage = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -5241,137 +5874,150 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 2102 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xcb, 0x6f, 0x63, 0x49, - 0xd5, 0x4f, 0xd9, 0x79, 0x56, 0x92, 0x49, 0x52, 0xdd, 0xe9, 0xef, 0x76, 0xbe, 0x6e, 0x3b, 0xf1, - 0x30, 0xa3, 0x00, 0xd3, 0x36, 0x3d, 0x0f, 0x66, 0x40, 0x62, 0x11, 0x27, 0x01, 0xf5, 0x90, 0x74, - 0xa2, 0x72, 0x77, 0x23, 0x98, 0x67, 0xe5, 0xba, 0xec, 0x54, 0xe7, 0xbe, 0xfa, 0x56, 0x5d, 0x77, - 0x22, 0x01, 0xe2, 0xa1, 0x11, 0x12, 0x12, 0x0f, 0x41, 0x6f, 0x90, 0xd8, 0x80, 0xc4, 0x06, 0x21, - 0x58, 0xc0, 0x92, 0x25, 0x8b, 0x5e, 0x8e, 0xc4, 0x66, 0x56, 0x16, 0x6d, 0xfe, 0x05, 0x24, 0xa4, - 0xac, 0x50, 0x3d, 0xee, 0xcb, 0x8e, 0x67, 0x5a, 0x1a, 0x7b, 0x7a, 0xe7, 0x7b, 0x5e, 0xbf, 0x5f, - 0x9d, 0x3a, 0x75, 0xea, 0x94, 0x61, 0xeb, 0xe4, 0x0d, 0x5e, 0x65, 0x7e, 0xed, 0x24, 0x3a, 0xa2, - 0xa1, 0x47, 0x05, 0xe5, 0xb5, 0x0e, 0xf5, 0x9a, 0x7e, 0x58, 0x33, 0x0a, 0x12, 0x30, 0x7a, 0x2a, - 0xa8, 0xc7, 0x99, 0xef, 0xf1, 0x1b, 0x24, 0x60, 0x9c, 0x86, 0x1d, 0x1a, 0xd6, 0x82, 0x93, 0xb6, - 0xd4, 0xf1, 0xbc, 0x41, 0xad, 0x73, 0xf3, 0x88, 0x0a, 0x72, 0xb3, 0xd6, 0xa6, 0x1e, 0x0d, 0x89, - 0xa0, 0xcd, 0x6a, 0x10, 0xfa, 0xc2, 0x47, 0x5f, 0xd3, 0xe1, 0xaa, 0x39, 0xeb, 0xf7, 0x92, 0x70, - 0xd5, 0xe0, 0xa4, 0x2d, 0x75, 0x3c, 0x6f, 0x50, 0x35, 0xe1, 0xd6, 0x6e, 0xb4, 0x99, 0x38, 0x8e, - 0x8e, 0xaa, 0xb6, 0xef, 0xd6, 0xda, 0x7e, 0xdb, 0xaf, 0xa9, 0xa8, 0x47, 0x51, 0x4b, 0x7d, 0xa9, - 0x0f, 0xf5, 0x4b, 0xa3, 0xad, 0xbd, 0x9a, 0x92, 0x77, 0x89, 0x7d, 0xcc, 0x3c, 0x1a, 0x9e, 0xa5, - 0x8c, 0x5d, 0x2a, 0x48, 0xad, 0x33, 0xc0, 0x71, 0xad, 0x36, 0xcc, 0x2b, 0x8c, 0x3c, 0xc1, 0x5c, - 0x3a, 0xe0, 0xf0, 0xe5, 0x4f, 0x72, 0xe0, 0xf6, 0x31, 0x75, 0xc9, 0x80, 0xdf, 0x2b, 0xc3, 0xfc, - 0x22, 0xc1, 0x9c, 0x1a, 0xf3, 0x04, 0x17, 0x61, 0xbf, 0x53, 0xe5, 0xc7, 0x45, 0x68, 0x6d, 0x47, - 0x5c, 0xf8, 0x2e, 0xa6, 0xdc, 0x8f, 0x42, 0x9b, 0xee, 0xd0, 0x16, 0xf3, 0x98, 0x60, 0xbe, 0x87, - 0xde, 0x87, 0xb3, 0x72, 0x55, 0x4d, 0x22, 0x88, 0x05, 0xd6, 0xc1, 0xe6, 0xfc, 0xcb, 0x5f, 0xaa, - 0xa6, 0x19, 0x4f, 0x40, 0xd2, 0x34, 0x4b, 0xeb, 0x6a, 0xe7, 0x66, 0xf5, 0xe0, 0xe8, 0x3e, 0xb5, - 0xc5, 0x3e, 0x15, 0xa4, 0x8e, 0x1e, 0x77, 0xcb, 0x13, 0xbd, 0x6e, 0x19, 0xa6, 0x32, 0x9c, 0x44, - 0x45, 0xdf, 0x83, 0x93, 0x3c, 0xa0, 0xb6, 0x55, 0x50, 0xd1, 0xdf, 0xaa, 0x7e, 0xaa, 0xfd, 0xac, - 0x0e, 0x5b, 0x48, 0x23, 0xa0, 0x76, 0x7d, 0xc1, 0x10, 0x99, 0x94, 0x5f, 0x58, 0xc1, 0xa2, 0x0f, - 0x00, 0x9c, 0xe6, 0x82, 0x88, 0x88, 0x5b, 0x45, 0xc5, 0xe0, 0x9d, 0x71, 0x31, 0x50, 0x20, 0xf5, - 0xe7, 0x0c, 0x87, 0x69, 0xfd, 0x8d, 0x0d, 0x78, 0xe5, 0x3f, 0x05, 0xb8, 0x31, 0xcc, 0x75, 0xdb, - 0xf7, 0x9a, 0x7a, 0x3b, 0x6e, 0xc1, 0x49, 0x71, 0x16, 0x50, 0xb5, 0x15, 0x73, 0xf5, 0xd7, 0xe2, - 0xf5, 0xdc, 0x39, 0x0b, 0xe8, 0x79, 0xb7, 0xfc, 0xc2, 0x27, 0x06, 0x90, 0x86, 0x58, 0x85, 0x40, - 0x5f, 0x49, 0xd6, 0x5d, 0x50, 0xc1, 0x36, 0xf2, 0xc4, 0xce, 0xbb, 0xe5, 0xa5, 0xc4, 0x2d, 0xcf, - 0x15, 0x75, 0x20, 0x72, 0x08, 0x17, 0x77, 0x42, 0xe2, 0x71, 0x1d, 0x96, 0xb9, 0xd4, 0xa4, 0xef, - 0x0b, 0x4f, 0x57, 0x1e, 0xd2, 0xa3, 0xbe, 0x66, 0x20, 0xd1, 0xde, 0x40, 0x34, 0x7c, 0x01, 0x02, - 0x7a, 0x11, 0x4e, 0x87, 0x94, 0x70, 0xdf, 0xb3, 0x26, 0x15, 0xe5, 0x24, 0x97, 0x58, 0x49, 0xb1, - 0xd1, 0xa2, 0xcf, 0xc3, 0x19, 0x97, 0x72, 0x4e, 0xda, 0xd4, 0x9a, 0x52, 0x86, 0x4b, 0xc6, 0x70, - 0x66, 0x5f, 0x8b, 0x71, 0xac, 0xaf, 0x9c, 0x03, 0x78, 0x6d, 0x58, 0xd6, 0xf6, 0x18, 0x17, 0xe8, - 0xed, 0x81, 0x03, 0x50, 0x7d, 0xba, 0x15, 0x4a, 0x6f, 0x55, 0xfe, 0xcb, 0x06, 0x7c, 0x36, 0x96, - 0x64, 0x8a, 0xff, 0xbb, 0x70, 0x8a, 0x09, 0xea, 0xca, 0x3d, 0x28, 0x6e, 0xce, 0xbf, 0xfc, 0xad, - 0x31, 0xd5, 0x5e, 0x7d, 0xd1, 0x70, 0x98, 0xba, 0x25, 0xd1, 0xb0, 0x06, 0xad, 0xfc, 0xa1, 0x00, - 0xaf, 0x0f, 0x73, 0xb9, 0x4d, 0x5c, 0xca, 0x65, 0xc6, 0x03, 0x27, 0x0a, 0x89, 0x63, 0x2a, 0x2e, - 0xc9, 0xf8, 0xa1, 0x92, 0x62, 0xa3, 0x45, 0x2f, 0xc1, 0x59, 0xce, 0xbc, 0x76, 0xe4, 0x90, 0xd0, - 0x94, 0x53, 0xb2, 0xea, 0x86, 0x91, 0xe3, 0xc4, 0x02, 0x55, 0x21, 0xe4, 0xc7, 0x7e, 0x28, 0x14, - 0x86, 0x55, 0x5c, 0x2f, 0xca, 0xc8, 0xb2, 0x41, 0x34, 0x12, 0x29, 0xce, 0x58, 0xa0, 0x75, 0x38, - 0x79, 0xc2, 0xbc, 0xa6, 0xd9, 0xf5, 0xe4, 0x14, 0x7f, 0x93, 0x79, 0x4d, 0xac, 0x34, 0x12, 0xdf, - 0x61, 0x5c, 0x48, 0x89, 0xd9, 0xf2, 0x5c, 0xd6, 0x95, 0x65, 0x62, 0x21, 0xf1, 0x6d, 0x22, 0x68, - 0xdb, 0x0f, 0x19, 0xe5, 0xd6, 0x74, 0x8a, 0xbf, 0x9d, 0x48, 0x71, 0xc6, 0xa2, 0xf2, 0x8f, 0xc9, - 0xe1, 0x45, 0x22, 0x5b, 0x09, 0x7a, 0x1e, 0x4e, 0xb5, 0x43, 0x3f, 0x0a, 0x4c, 0x96, 0x92, 0x6c, - 0x7f, 0x43, 0x0a, 0xb1, 0xd6, 0xc9, 0xaa, 0xec, 0xd0, 0x50, 0x6e, 0x98, 0x49, 0x51, 0x52, 0x95, - 0xf7, 0xb4, 0x18, 0xc7, 0x7a, 0xf4, 0x43, 0x00, 0xa7, 0x3c, 0x93, 0x1c, 0x59, 0x72, 0x6f, 0x8f, - 0xa9, 0x2e, 0x54, 0x7a, 0x53, 0xba, 0x3a, 0xf3, 0x1a, 0x19, 0xbd, 0x0a, 0xa7, 0xb8, 0xed, 0x07, - 0xd4, 0x64, 0xbd, 0x14, 0x1b, 0x35, 0xa4, 0xf0, 0xbc, 0x5b, 0x5e, 0x8c, 0xc3, 0x29, 0x01, 0xd6, - 0xc6, 0xe8, 0x27, 0x00, 0xc2, 0x0e, 0x71, 0x58, 0x93, 0xc8, 0xf8, 0x6a, 0x2f, 0x46, 0x5d, 0xd6, - 0xf7, 0x92, 0xf0, 0x7a, 0xd3, 0xd2, 0x6f, 0x9c, 0x81, 0x46, 0xbf, 0x00, 0x70, 0x81, 0x47, 0x47, - 0xa1, 0xf1, 0x92, 0xfb, 0x2c, 0xb9, 0x7c, 0x7b, 0xa4, 0x5c, 0x1a, 0x19, 0x80, 0xfa, 0x72, 0xaf, - 0x5b, 0x5e, 0xc8, 0x4a, 0x70, 0x8e, 0x40, 0xe5, 0x9f, 0x05, 0x58, 0xfa, 0xf8, 0xdb, 0x01, 0x3d, - 0x02, 0x10, 0xda, 0x71, 0xd7, 0xe5, 0x16, 0x50, 0x5d, 0xe1, 0xfd, 0x31, 0xed, 0x7e, 0xd2, 0xde, - 0xd3, 0x1b, 0x3a, 0x11, 0xc9, 0x03, 0x90, 0xfc, 0x46, 0xbf, 0x01, 0x70, 0x91, 0xd8, 0x36, 0x0d, - 0x04, 0x6d, 0xea, 0x43, 0x5b, 0xf8, 0x0c, 0xea, 0x72, 0xd5, 0xb0, 0x5a, 0xdc, 0xca, 0x42, 0xe3, - 0x3c, 0x93, 0xca, 0x7f, 0x41, 0x7f, 0x56, 0x33, 0x5b, 0xd0, 0xb0, 0x89, 0x43, 0xd1, 0x0e, 0x5c, - 0x96, 0x77, 0x3d, 0xa6, 0x81, 0xc3, 0x6c, 0xc2, 0x0f, 0x89, 0x38, 0x36, 0x27, 0xd5, 0x32, 0x10, - 0xcb, 0x8d, 0x3e, 0x3d, 0x1e, 0xf0, 0x40, 0x6f, 0x42, 0xa4, 0xef, 0xbf, 0x5c, 0x1c, 0x7d, 0x94, - 0x93, 0x9b, 0xac, 0x31, 0x60, 0x81, 0x2f, 0xf0, 0x42, 0xdb, 0x70, 0xc5, 0x21, 0x47, 0xd4, 0x69, - 0x50, 0x87, 0xda, 0xc2, 0x0f, 0x55, 0xa8, 0xa2, 0x0a, 0xb5, 0xda, 0xeb, 0x96, 0x57, 0xf6, 0xfa, - 0x95, 0x78, 0xd0, 0xbe, 0xb2, 0x01, 0xcb, 0xc3, 0x17, 0xae, 0xa7, 0x8a, 0xdf, 0x15, 0xe0, 0xda, - 0xf0, 0x8a, 0x45, 0x3f, 0x4a, 0x87, 0x1f, 0x7d, 0xb7, 0xbd, 0x3b, 0xae, 0xd3, 0x61, 0xa6, 0x1f, - 0x38, 0x38, 0xf9, 0xa0, 0xef, 0xcb, 0x46, 0x43, 0x1c, 0x6a, 0x6a, 0xea, 0x9d, 0xb1, 0x51, 0x90, - 0x20, 0xf5, 0x39, 0xdd, 0xc3, 0x88, 0xa3, 0x5a, 0x16, 0x71, 0x68, 0xe5, 0x8f, 0xa0, 0x7f, 0xfe, - 0x4d, 0x3b, 0x0a, 0xfa, 0x19, 0x80, 0x4b, 0x7e, 0x40, 0xbd, 0xad, 0xc3, 0x5b, 0xf7, 0x5e, 0x69, - 0xa8, 0xa9, 0xdb, 0xa4, 0xea, 0xf6, 0xa7, 0xe4, 0xf9, 0x66, 0xe3, 0xe0, 0xb6, 0x0e, 0x78, 0x18, - 0xfa, 0x01, 0xaf, 0x5f, 0xea, 0x75, 0xcb, 0x4b, 0x07, 0x79, 0x28, 0xdc, 0x8f, 0x5d, 0x71, 0xe1, - 0xea, 0xee, 0xa9, 0xa0, 0xa1, 0x47, 0x9c, 0x1d, 0xdf, 0x8e, 0x5c, 0xea, 0x09, 0x4d, 0xf4, 0x35, - 0x38, 0xdf, 0xa4, 0xdc, 0x0e, 0x59, 0xa0, 0x1a, 0xaf, 0x2e, 0xef, 0x4b, 0xa6, 0x2c, 0xe7, 0x77, - 0x52, 0x15, 0xce, 0xda, 0xa1, 0xeb, 0xb0, 0x18, 0x85, 0x8e, 0xa9, 0xe2, 0x79, 0x63, 0x5e, 0xbc, - 0x8b, 0xf7, 0xb0, 0x94, 0x57, 0x36, 0xe0, 0xa4, 0xe4, 0x89, 0xae, 0xc2, 0x62, 0x48, 0x1e, 0xaa, - 0xa8, 0x0b, 0xf5, 0x19, 0x69, 0x82, 0xc9, 0x43, 0x2c, 0x65, 0x95, 0x3f, 0x5d, 0x83, 0x4b, 0x7d, - 0x6b, 0x41, 0x6b, 0xb0, 0xc0, 0x9a, 0x86, 0x03, 0x34, 0x41, 0x0b, 0xb7, 0x76, 0x70, 0x81, 0x35, - 0xd1, 0xeb, 0x70, 0x5a, 0xbf, 0x5e, 0x0c, 0x68, 0x39, 0x99, 0x3b, 0x95, 0x54, 0xde, 0x2c, 0x69, - 0x38, 0x49, 0xc4, 0x98, 0x2b, 0x0e, 0xb4, 0x65, 0x4e, 0x89, 0xe6, 0x40, 0x5b, 0x58, 0xca, 0xfa, - 0x17, 0x3f, 0xf9, 0x94, 0x8b, 0x5f, 0x37, 0xd3, 0xf4, 0x54, 0x7e, 0xae, 0xc8, 0x0c, 0xc9, 0x2f, - 0xc2, 0xe9, 0x96, 0x1f, 0xba, 0x44, 0xa8, 0xdb, 0x23, 0x33, 0xff, 0x7c, 0x5d, 0x49, 0xb1, 0xd1, - 0xca, 0x01, 0x40, 0x30, 0xe1, 0x50, 0x6b, 0x26, 0x3f, 0x00, 0xdc, 0x91, 0x42, 0xac, 0x75, 0xe8, - 0x3e, 0x9c, 0x69, 0xd2, 0x16, 0x89, 0x1c, 0x61, 0xcd, 0xaa, 0x12, 0xda, 0x1e, 0x41, 0x09, 0xd5, - 0xe7, 0xe5, 0x04, 0xb1, 0xa3, 0xe3, 0xe2, 0x18, 0x00, 0xbd, 0x00, 0x67, 0x5c, 0x72, 0xca, 0xdc, - 0xc8, 0xb5, 0xe6, 0xd6, 0xc1, 0x26, 0xd0, 0x66, 0xfb, 0x5a, 0x84, 0x63, 0x9d, 0xec, 0x8c, 0xf4, - 0xd4, 0x76, 0x22, 0xce, 0x3a, 0xd4, 0x28, 0x2d, 0xb8, 0x0e, 0x36, 0x67, 0xd3, 0xce, 0xb8, 0xdb, - 0xa7, 0xc7, 0x03, 0x1e, 0x0a, 0x8c, 0x79, 0xca, 0x79, 0x3e, 0x03, 0xa6, 0x45, 0x38, 0xd6, 0xe5, - 0xc1, 0x8c, 0xfd, 0xc2, 0x30, 0x30, 0xe3, 0x3c, 0xe0, 0x81, 0xbe, 0x08, 0xe7, 0x5c, 0x72, 0xba, - 0x47, 0xbd, 0xb6, 0x38, 0xb6, 0x16, 0xd7, 0xc1, 0x66, 0xb1, 0xbe, 0xd8, 0xeb, 0x96, 0xe7, 0xf6, - 0x63, 0x21, 0x4e, 0xf5, 0xca, 0x98, 0x79, 0xc6, 0xf8, 0xb9, 0x8c, 0x71, 0x2c, 0xc4, 0xa9, 0x5e, - 0x0e, 0x68, 0x01, 0x11, 0xf2, 0x70, 0x59, 0x4b, 0xf9, 0x01, 0xed, 0x50, 0x8b, 0x71, 0xac, 0x47, - 0x9b, 0x70, 0xd6, 0x25, 0xa7, 0x6a, 0x98, 0xb6, 0x96, 0x55, 0xd8, 0x05, 0x39, 0x6b, 0xee, 0x1b, - 0x19, 0x4e, 0xb4, 0xca, 0x92, 0x79, 0xda, 0x72, 0x25, 0x63, 0x69, 0x64, 0x38, 0xd1, 0xca, 0x22, - 0x8e, 0x3c, 0xf6, 0x20, 0xa2, 0xda, 0x18, 0xa9, 0xcc, 0x24, 0x45, 0x7c, 0x37, 0x55, 0xe1, 0xac, - 0x9d, 0x1c, 0x66, 0xdd, 0xc8, 0x11, 0x2c, 0x70, 0xe8, 0x41, 0xcb, 0xba, 0xa4, 0xf2, 0xaf, 0xe6, - 0xa2, 0xfd, 0x44, 0x8a, 0x33, 0x16, 0x88, 0xc2, 0x49, 0xea, 0x45, 0xae, 0x75, 0x59, 0xcd, 0x16, - 0x23, 0x29, 0xc1, 0xe4, 0xe4, 0xec, 0x7a, 0x91, 0x8b, 0x55, 0x78, 0xf4, 0x3a, 0x5c, 0x74, 0xc9, - 0xa9, 0x6c, 0x07, 0x34, 0x14, 0x72, 0xcc, 0x5e, 0x55, 0x8b, 0x5f, 0x91, 0xf7, 0xf9, 0x7e, 0x56, - 0x81, 0xf3, 0x76, 0xca, 0x91, 0x79, 0x19, 0xc7, 0x2b, 0x19, 0xc7, 0xac, 0x02, 0xe7, 0xed, 0x64, - 0xa6, 0x43, 0xfa, 0x20, 0x62, 0x21, 0x6d, 0x5a, 0xff, 0xa7, 0x66, 0x7a, 0x95, 0x69, 0x6c, 0x64, - 0x38, 0xd1, 0xa2, 0x4e, 0xfc, 0xea, 0xb2, 0xd4, 0x31, 0xbc, 0x3b, 0xda, 0x4e, 0x7e, 0x10, 0x6e, - 0x85, 0x21, 0x39, 0xd3, 0x37, 0x4d, 0xf6, 0xbd, 0x85, 0x38, 0x9c, 0x22, 0x8e, 0x73, 0xd0, 0xb2, - 0xae, 0xaa, 0xdc, 0x8f, 0xfa, 0x06, 0x49, 0xba, 0xce, 0x96, 0x04, 0xc1, 0x1a, 0x4b, 0x82, 0xfa, - 0x9e, 0x2c, 0x8d, 0xb5, 0xf1, 0x82, 0x1e, 0x48, 0x10, 0xac, 0xb1, 0xd4, 0x4a, 0xbd, 0xb3, 0x83, - 0x96, 0xf5, 0xff, 0x63, 0x5e, 0xa9, 0x04, 0xc1, 0x1a, 0x0b, 0x31, 0x58, 0xf4, 0x7c, 0x61, 0x5d, - 0x1b, 0xcb, 0xf5, 0xac, 0x2e, 0x9c, 0xdb, 0xbe, 0xc0, 0x12, 0x03, 0xfd, 0x0a, 0x40, 0x18, 0xa4, - 0x25, 0x7a, 0x5d, 0xad, 0xf2, 0xdd, 0xd1, 0x42, 0x56, 0xd3, 0xda, 0xde, 0xf5, 0x44, 0x78, 0x96, - 0x4e, 0xe9, 0x99, 0x33, 0x90, 0x61, 0x81, 0x7e, 0x0f, 0xe0, 0x65, 0xd2, 0xd4, 0x33, 0x3b, 0x71, - 0x32, 0x27, 0xa8, 0xa4, 0x32, 0x72, 0x67, 0xd4, 0x65, 0x5e, 0xf7, 0x7d, 0xa7, 0x6e, 0xf5, 0xba, - 0xe5, 0xcb, 0x5b, 0x17, 0xa0, 0xe2, 0x0b, 0xb9, 0xa0, 0x3f, 0x03, 0xb8, 0x62, 0xba, 0x68, 0x86, - 0x61, 0x59, 0x25, 0x90, 0x8e, 0x3a, 0x81, 0xfd, 0x38, 0x3a, 0x8f, 0x57, 0x4d, 0x1e, 0x57, 0x06, - 0xf4, 0x78, 0x90, 0x1a, 0xfa, 0x1b, 0x80, 0x0b, 0x4d, 0x1a, 0x50, 0xaf, 0x49, 0x3d, 0x5b, 0x72, - 0x5d, 0x1f, 0xc9, 0xa3, 0xac, 0x9f, 0xeb, 0x4e, 0x06, 0x42, 0xd3, 0xac, 0x1a, 0x9a, 0x0b, 0x59, - 0xd5, 0x79, 0xb7, 0x7c, 0x25, 0x75, 0xcd, 0x6a, 0x70, 0x8e, 0x25, 0xfa, 0x35, 0x80, 0x4b, 0xe9, - 0x06, 0xe8, 0x2b, 0x65, 0x63, 0x8c, 0x75, 0xa0, 0xc6, 0xd7, 0xad, 0x3c, 0x20, 0xee, 0x67, 0x80, - 0xfe, 0x02, 0xe4, 0xa4, 0x16, 0x3f, 0xf3, 0xb8, 0x55, 0x51, 0xb9, 0x7c, 0x6f, 0xe4, 0xb9, 0x4c, - 0x10, 0x74, 0x2a, 0x5f, 0x4a, 0x47, 0xc1, 0x44, 0x73, 0xde, 0x2d, 0xaf, 0x66, 0x33, 0x99, 0x28, - 0x70, 0x96, 0x21, 0xfa, 0x29, 0x80, 0x0b, 0x34, 0x9d, 0xb8, 0xb9, 0xf5, 0xfc, 0x48, 0x92, 0x78, - 0xe1, 0x10, 0xaf, 0xff, 0x41, 0xc8, 0xa8, 0x38, 0xce, 0x61, 0xcb, 0x09, 0x92, 0x9e, 0x12, 0x37, - 0x70, 0xa8, 0xf5, 0xb9, 0x11, 0x4f, 0x90, 0xbb, 0x3a, 0x2e, 0x8e, 0x01, 0xd6, 0xe4, 0xcb, 0xa7, - 0xef, 0xe4, 0xa0, 0x65, 0x58, 0x3c, 0xa1, 0x67, 0x7a, 0xb0, 0xc7, 0xf2, 0x27, 0x6a, 0xc2, 0xa9, - 0x0e, 0x71, 0xa2, 0xf8, 0xf1, 0x36, 0xe2, 0xae, 0x8b, 0x75, 0xf0, 0xaf, 0x16, 0xde, 0x00, 0x6b, - 0x8f, 0x00, 0xbc, 0x72, 0xf1, 0x81, 0x7e, 0xa6, 0xb4, 0x7e, 0x0b, 0xe0, 0xca, 0xc0, 0xd9, 0xbd, - 0x80, 0xd1, 0x83, 0x3c, 0xa3, 0xb7, 0x46, 0x7d, 0x08, 0x1b, 0x22, 0x64, 0x5e, 0x5b, 0x4d, 0x1e, - 0x59, 0x7a, 0x3f, 0x07, 0x70, 0xb9, 0xff, 0x38, 0x3c, 0xcb, 0x7c, 0x55, 0x1e, 0x15, 0xe0, 0x95, - 0x8b, 0x07, 0x26, 0x14, 0x26, 0x2f, 0xc3, 0xf1, 0xbc, 0xb0, 0x61, 0xfa, 0xca, 0x4c, 0x1e, 0x95, - 0x1f, 0x00, 0x38, 0x7f, 0x3f, 0xb1, 0x8b, 0xff, 0x87, 0x1f, 0xf9, 0xdb, 0x3e, 0xee, 0x3f, 0xa9, - 0x82, 0xe3, 0x2c, 0x6e, 0xe5, 0xaf, 0x00, 0xae, 0x5e, 0xd8, 0x58, 0xe5, 0x13, 0x94, 0x38, 0x8e, - 0xff, 0x50, 0xff, 0x45, 0x33, 0x9b, 0x3e, 0x41, 0xb7, 0x94, 0x14, 0x1b, 0x6d, 0x26, 0x7b, 0x85, - 0xcf, 0x2a, 0x7b, 0x95, 0xbf, 0x03, 0x78, 0xed, 0xe3, 0x2a, 0xf1, 0x99, 0x6c, 0xe9, 0x26, 0x9c, - 0x35, 0x43, 0xd1, 0x99, 0xda, 0x4e, 0xf3, 0x0e, 0x30, 0x4d, 0xe3, 0x0c, 0x27, 0xda, 0xfa, 0x8d, - 0xc7, 0x4f, 0x4a, 0x13, 0x1f, 0x3e, 0x29, 0x4d, 0x7c, 0xf4, 0xa4, 0x34, 0xf1, 0x83, 0x5e, 0x09, - 0x3c, 0xee, 0x95, 0xc0, 0x87, 0xbd, 0x12, 0xf8, 0xa8, 0x57, 0x02, 0xff, 0xea, 0x95, 0xc0, 0x2f, - 0xff, 0x5d, 0x9a, 0xf8, 0xce, 0x8c, 0x01, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0a, 0x6f, - 0x04, 0x49, 0xd3, 0x1e, 0x00, 0x00, + // 2306 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xdd, 0x6f, 0x5b, 0x49, + 0x15, 0xef, 0xb5, 0xe3, 0xc4, 0x19, 0x27, 0x4d, 0x32, 0x6d, 0xca, 0x6d, 0x68, 0xed, 0xd4, 0x65, + 0x57, 0x01, 0xb6, 0x36, 0xed, 0xee, 0xb2, 0xcb, 0x4a, 0x3c, 0xc4, 0x49, 0x41, 0x5d, 0x9a, 0x26, + 0x1a, 0xb7, 0x45, 0xb0, 0x9f, 0x13, 0x7b, 0xe2, 0xdc, 0xe6, 0x7e, 0x75, 0x66, 0xae, 0x9b, 0x48, + 0x80, 0xf8, 0xd0, 0x0a, 0x09, 0x01, 0x0b, 0x6c, 0x85, 0x84, 0xc4, 0x0b, 0x48, 0xbc, 0x20, 0x04, + 0x0f, 0xf0, 0x06, 0x7f, 0x40, 0x1f, 0xf7, 0x71, 0x9f, 0x2c, 0x6a, 0xfe, 0x05, 0x24, 0xa4, 0x3c, + 0xa1, 0xf9, 0xb8, 0x73, 0xef, 0xb5, 0xe3, 0x6d, 0xb5, 0x6b, 0x6f, 0xdf, 0x7c, 0xcf, 0x39, 0x73, + 0x7e, 0xbf, 0x39, 0x73, 0xe6, 0xcc, 0x39, 0x09, 0xd8, 0x3b, 0x78, 0x95, 0xd5, 0x9c, 0xa0, 0x7e, + 0x10, 0xed, 0x12, 0xea, 0x13, 0x4e, 0x58, 0xbd, 0x4b, 0xfc, 0x76, 0x40, 0xeb, 0x5a, 0x81, 0x43, + 0x87, 0x1c, 0x72, 0xe2, 0x33, 0x27, 0xf0, 0xd9, 0x15, 0x1c, 0x3a, 0x8c, 0xd0, 0x2e, 0xa1, 0xf5, + 0xf0, 0xa0, 0x23, 0x74, 0x2c, 0x6b, 0x50, 0xef, 0x5e, 0xdd, 0x25, 0x1c, 0x5f, 0xad, 0x77, 0x88, + 0x4f, 0x28, 0xe6, 0xa4, 0x5d, 0x0b, 0x69, 0xc0, 0x03, 0xf8, 0x75, 0xe5, 0xae, 0x96, 0xb1, 0x7e, + 0xc7, 0xb8, 0xab, 0x85, 0x07, 0x1d, 0xa1, 0x63, 0x59, 0x83, 0x9a, 0x76, 0xb7, 0x72, 0xa5, 0xe3, + 0xf0, 0xfd, 0x68, 0xb7, 0xd6, 0x0a, 0xbc, 0x7a, 0x27, 0xe8, 0x04, 0x75, 0xe9, 0x75, 0x37, 0xda, + 0x93, 0x5f, 0xf2, 0x43, 0xfe, 0x52, 0x68, 0x2b, 0x2f, 0x25, 0xe4, 0x3d, 0xdc, 0xda, 0x77, 0x7c, + 0x42, 0x8f, 0x12, 0xc6, 0x1e, 0xe1, 0xb8, 0xde, 0x1d, 0xe2, 0xb8, 0x52, 0x1f, 0xb5, 0x8a, 0x46, + 0x3e, 0x77, 0x3c, 0x32, 0xb4, 0xe0, 0xab, 0x4f, 0x5a, 0xc0, 0x5a, 0xfb, 0xc4, 0xc3, 0x43, 0xeb, + 0x5e, 0x1c, 0xb5, 0x2e, 0xe2, 0x8e, 0x5b, 0x77, 0x7c, 0xce, 0x38, 0x1d, 0x5c, 0x54, 0xfd, 0x20, + 0x07, 0xca, 0x1b, 0x11, 0xe3, 0x81, 0x87, 0x08, 0x0b, 0x22, 0xda, 0x22, 0x1b, 0x81, 0x1b, 0x79, + 0xfe, 0x26, 0xd9, 0x73, 0x7c, 0x87, 0x3b, 0x81, 0x0f, 0x57, 0xc1, 0x94, 0x8f, 0x3d, 0x62, 0x5b, + 0xab, 0xd6, 0xda, 0x6c, 0x63, 0xee, 0x51, 0xaf, 0x72, 0xaa, 0xdf, 0xab, 0x4c, 0xdd, 0xc2, 0x1e, + 0x41, 0x52, 0x23, 0x2c, 0xf8, 0x51, 0x48, 0xec, 0x5c, 0xd6, 0xe2, 0xf6, 0x51, 0x48, 0x90, 0xd4, + 0xc0, 0xe7, 0xc1, 0xf4, 0x5e, 0x40, 0x3d, 0xcc, 0xed, 0xbc, 0xb4, 0x39, 0xad, 0x6d, 0xa6, 0xbf, + 0x21, 0xa5, 0x48, 0x6b, 0xe1, 0xcb, 0xa0, 0xd4, 0x26, 0xac, 0x45, 0x9d, 0x50, 0x40, 0xdb, 0x53, + 0xd2, 0xf8, 0x8c, 0x36, 0x2e, 0x6d, 0x26, 0x2a, 0x94, 0xb6, 0x83, 0x2f, 0x80, 0x62, 0x48, 0x9d, + 0x80, 0x3a, 0xfc, 0xc8, 0x2e, 0xac, 0x5a, 0x6b, 0x85, 0xc6, 0xa2, 0x5e, 0x53, 0xdc, 0xd1, 0x72, + 0x64, 0x2c, 0xe0, 0x2a, 0x28, 0xbe, 0xde, 0xdc, 0xbe, 0xb5, 0x83, 0xf9, 0xbe, 0x3d, 0x2d, 0x11, + 0xa6, 0x84, 0x35, 0x2a, 0xde, 0xd3, 0xd2, 0xea, 0x4f, 0xf2, 0xc0, 0xce, 0x46, 0x25, 0x15, 0x8f, + 0x77, 0x41, 0x51, 0x9c, 0x75, 0x1b, 0x73, 0x2c, 0x63, 0x52, 0xba, 0xf6, 0x95, 0x5a, 0x92, 0x87, + 0x26, 0xf4, 0x49, 0xf2, 0x09, 0xeb, 0x5a, 0xf7, 0x6a, 0x6d, 0x7b, 0xf7, 0x1e, 0x69, 0xf1, 0x2d, + 0xc2, 0x71, 0x03, 0x6a, 0x7a, 0x20, 0x91, 0x21, 0xe3, 0x15, 0x7e, 0x1f, 0x4c, 0xb1, 0x90, 0xb4, + 0x64, 0x3c, 0x4b, 0xd7, 0xde, 0xa8, 0x7d, 0xaa, 0x2c, 0xaf, 0x8d, 0xda, 0x48, 0x33, 0x24, 0xad, + 0xe4, 0xb0, 0xc4, 0x17, 0x92, 0xb0, 0xf0, 0x3d, 0x0b, 0x4c, 0x33, 0x8e, 0x79, 0xc4, 0xe4, 0x69, + 0x95, 0xae, 0xbd, 0x35, 0x29, 0x06, 0x12, 0x24, 0x49, 0x06, 0xf5, 0x8d, 0x34, 0x78, 0xf5, 0xbf, + 0x39, 0x70, 0x69, 0xd4, 0xd2, 0x8d, 0xc0, 0x6f, 0xab, 0xe3, 0xb8, 0xa1, 0x93, 0x4f, 0xa5, 0xe7, + 0xcb, 0xe9, 0xe4, 0x3b, 0xee, 0x55, 0x9e, 0x7b, 0xa2, 0x83, 0x54, 0x96, 0x7e, 0xcd, 0xec, 0x5b, + 0x65, 0xf2, 0xa5, 0x2c, 0xb1, 0xe3, 0x5e, 0x65, 0xc1, 0x2c, 0xcb, 0x72, 0x85, 0x5d, 0x00, 0x5d, + 0xcc, 0xf8, 0x6d, 0x8a, 0x7d, 0xa6, 0xdc, 0x3a, 0x1e, 0xd1, 0xe1, 0xfb, 0xd2, 0xd3, 0xa5, 0x87, + 0x58, 0xd1, 0x58, 0xd1, 0x90, 0xf0, 0xe6, 0x90, 0x37, 0x74, 0x02, 0x82, 0xb8, 0x58, 0x94, 0x60, + 0x66, 0xee, 0x8a, 0x89, 0x25, 0x92, 0x52, 0xa4, 0xb5, 0xf0, 0x8b, 0x60, 0xc6, 0x23, 0x8c, 0xe1, + 0x0e, 0x91, 0x17, 0x64, 0xb6, 0xb1, 0xa0, 0x0d, 0x67, 0xb6, 0x94, 0x18, 0xc5, 0xfa, 0xea, 0xb1, + 0x05, 0x2e, 0x8c, 0x8a, 0xda, 0x4d, 0x87, 0x71, 0xf8, 0xe6, 0xd0, 0x05, 0xa8, 0x3d, 0xdd, 0x0e, + 0xc5, 0x6a, 0x99, 0xfe, 0xe6, 0x76, 0xc6, 0x92, 0x54, 0xf2, 0x7f, 0x0f, 0x14, 0x1c, 0x4e, 0x3c, + 0x71, 0x06, 0xf9, 0xb5, 0xd2, 0xb5, 0x6f, 0x4f, 0x28, 0xf7, 0x1a, 0xf3, 0x9a, 0x43, 0xe1, 0x86, + 0x40, 0x43, 0x0a, 0xb4, 0xfa, 0xa7, 0x1c, 0xb8, 0x38, 0x6a, 0x89, 0xa8, 0x78, 0x4c, 0x44, 0x3c, + 0x74, 0x23, 0x8a, 0x5d, 0x9d, 0x71, 0x26, 0xe2, 0x3b, 0x52, 0x8a, 0xb4, 0x56, 0xd4, 0x24, 0xe6, + 0xf8, 0x9d, 0xc8, 0xc5, 0x54, 0xa7, 0x93, 0xd9, 0x75, 0x53, 0xcb, 0x91, 0xb1, 0x80, 0x35, 0x00, + 0xd8, 0x7e, 0x40, 0xb9, 0xc4, 0xb0, 0xf3, 0xab, 0x79, 0xe1, 0x59, 0x14, 0x88, 0xa6, 0x91, 0xa2, + 0x94, 0x85, 0x28, 0xb9, 0x07, 0x8e, 0xdf, 0xd6, 0xa7, 0x6e, 0x6e, 0xf1, 0xb7, 0x1c, 0xbf, 0x8d, + 0xa4, 0x46, 0xe0, 0xbb, 0x0e, 0xe3, 0x42, 0xa2, 0x8f, 0x3c, 0x13, 0x75, 0x69, 0x69, 0x2c, 0x04, + 0x7e, 0x0b, 0x73, 0xd2, 0x09, 0xa8, 0x43, 0x98, 0x3d, 0x9d, 0xe0, 0x6f, 0x18, 0x29, 0x4a, 0x59, + 0x54, 0x7f, 0x3d, 0x33, 0x3a, 0x49, 0x44, 0x29, 0x81, 0x97, 0x41, 0xa1, 0x43, 0x83, 0x28, 0xd4, + 0x51, 0x32, 0xd1, 0xfe, 0xa6, 0x10, 0x22, 0xa5, 0x13, 0x59, 0xd9, 0x25, 0x54, 0x1c, 0x98, 0x0e, + 0x91, 0xc9, 0xca, 0xbb, 0x4a, 0x8c, 0x62, 0x3d, 0xfc, 0x91, 0x05, 0x0a, 0xbe, 0x0e, 0x8e, 0x48, + 0xb9, 0x37, 0x27, 0x94, 0x17, 0x32, 0xbc, 0x09, 0x5d, 0x15, 0x79, 0x85, 0x0c, 0x5f, 0x02, 0x05, + 0xd6, 0x0a, 0x42, 0xa2, 0xa3, 0x5e, 0x8e, 0x8d, 0x9a, 0x42, 0x78, 0xdc, 0xab, 0xcc, 0xc7, 0xee, + 0xa4, 0x00, 0x29, 0x63, 0xf8, 0x53, 0x0b, 0x80, 0x2e, 0x76, 0x9d, 0x36, 0x96, 0x6f, 0x5a, 0x41, + 0xd2, 0x1f, 0x6f, 0x5a, 0xdf, 0x35, 0xee, 0xd5, 0xa1, 0x25, 0xdf, 0x28, 0x05, 0x0d, 0xdf, 0xb7, + 0xc0, 0x1c, 0x8b, 0x76, 0xa9, 0x5e, 0xc5, 0xe4, 0xeb, 0x57, 0xba, 0xf6, 0x9d, 0xb1, 0x72, 0x69, + 0xa6, 0x00, 0x1a, 0x8b, 0xfd, 0x5e, 0x65, 0x2e, 0x2d, 0x41, 0x19, 0x02, 0xf0, 0xe7, 0x16, 0x28, + 0xea, 0x13, 0x66, 0xf6, 0x8c, 0xbc, 0xf0, 0x6f, 0x4f, 0xe8, 0x60, 0x75, 0x46, 0x25, 0xb7, 0x40, + 0x0b, 0x18, 0x32, 0x0c, 0xe0, 0x3f, 0x2d, 0x60, 0xe3, 0xb6, 0x2a, 0xf0, 0xd8, 0xdd, 0xa1, 0x8e, + 0xcf, 0x09, 0x55, 0x0d, 0x11, 0xb3, 0x8b, 0x92, 0xde, 0x78, 0xdf, 0xc2, 0xc1, 0x66, 0xab, 0xb1, + 0xaa, 0xd9, 0xd9, 0xeb, 0x23, 0x68, 0xa0, 0x91, 0x04, 0xab, 0xef, 0xe7, 0x07, 0x7b, 0xb9, 0xc1, + 0xa7, 0x16, 0x3e, 0xb4, 0x00, 0x68, 0xc5, 0x4f, 0x18, 0xb3, 0x2d, 0xb9, 0xa5, 0x77, 0x27, 0x14, + 0x71, 0xf3, 0x56, 0x26, 0xed, 0x8e, 0x11, 0x89, 0x6a, 0x62, 0x7e, 0xc3, 0xdf, 0x59, 0x60, 0x1e, + 0xb7, 0x5a, 0x24, 0xe4, 0xa4, 0xad, 0x2a, 0x60, 0xee, 0x33, 0xb8, 0xe4, 0xcb, 0x9a, 0xd5, 0xfc, + 0x7a, 0x1a, 0x1a, 0x65, 0x99, 0xc0, 0xd7, 0xc0, 0x69, 0xc6, 0x03, 0x4a, 0xda, 0x71, 0xbe, 0xe8, + 0xea, 0x0c, 0xfb, 0xbd, 0xca, 0xe9, 0x66, 0x46, 0x83, 0x06, 0x2c, 0xab, 0xbf, 0xb5, 0x40, 0xe5, + 0x09, 0xf9, 0xf8, 0x14, 0xed, 0xf5, 0xf3, 0x60, 0x5a, 0x6e, 0xb7, 0x2d, 0xa3, 0x52, 0x4c, 0xf5, + 0x4b, 0x52, 0x8a, 0xb4, 0x56, 0x54, 0x53, 0x81, 0x2f, 0xde, 0xf8, 0xbc, 0x34, 0x34, 0xd5, 0xb4, + 0xa9, 0xc4, 0x28, 0xd6, 0x57, 0xff, 0x67, 0x0d, 0xa6, 0x4a, 0xea, 0x92, 0x36, 0x5b, 0xd8, 0x25, + 0x70, 0x13, 0x2c, 0x8a, 0x6e, 0x10, 0x91, 0xd0, 0x75, 0x5a, 0x98, 0xc9, 0x6e, 0x59, 0x71, 0xb4, + 0xb5, 0xdb, 0xc5, 0xe6, 0x80, 0x1e, 0x0d, 0xad, 0x80, 0xaf, 0x03, 0xa8, 0x3a, 0xa4, 0x8c, 0x1f, + 0x55, 0xec, 0x4d, 0xaf, 0xd3, 0x1c, 0xb2, 0x40, 0x27, 0xac, 0x82, 0x1b, 0x60, 0xc9, 0xc5, 0xbb, + 0xc4, 0x6d, 0x12, 0x97, 0xb4, 0x78, 0x40, 0xa5, 0x2b, 0x35, 0x4f, 0x2c, 0xf7, 0x7b, 0x95, 0xa5, + 0x9b, 0x83, 0x4a, 0x34, 0x6c, 0x5f, 0xbd, 0x34, 0x78, 0x22, 0xe9, 0x8d, 0xab, 0xbe, 0xf3, 0x0f, + 0x39, 0xb0, 0x32, 0xba, 0xa6, 0xc1, 0x1f, 0x27, 0xed, 0xb1, 0xea, 0x7e, 0xde, 0x9e, 0x54, 0xfd, + 0xd4, 0xfd, 0x31, 0x18, 0xee, 0x8d, 0xe1, 0x0f, 0xc4, 0x53, 0x84, 0x5d, 0xa2, 0x2f, 0xca, 0x5b, + 0x13, 0xa3, 0x20, 0x40, 0x1a, 0xb3, 0xea, 0x95, 0xc3, 0xae, 0x7c, 0xd4, 0xb0, 0x4b, 0xaa, 0x7f, + 0xb6, 0x06, 0x27, 0xa4, 0xe4, 0xcd, 0x81, 0xbf, 0xb0, 0xc0, 0x42, 0x10, 0x12, 0x7f, 0x7d, 0xe7, + 0xc6, 0xdd, 0x17, 0x9b, 0x72, 0x5a, 0xd5, 0xa1, 0xba, 0xf5, 0x29, 0x79, 0x8a, 0xb9, 0x4d, 0x39, + 0xdc, 0xa1, 0x41, 0xc8, 0x1a, 0x67, 0xfa, 0xbd, 0xca, 0xc2, 0x76, 0x16, 0x0a, 0x0d, 0x62, 0x57, + 0x3d, 0xb0, 0x7c, 0xfd, 0x90, 0x13, 0xea, 0x63, 0x77, 0x33, 0x68, 0x45, 0x1e, 0xf1, 0xb9, 0x22, + 0x3a, 0x30, 0x6e, 0x5a, 0x4f, 0x39, 0x6e, 0x5e, 0x04, 0xf9, 0x88, 0xba, 0x3a, 0x8b, 0x4b, 0xda, + 0x3c, 0x7f, 0x07, 0xdd, 0x44, 0x42, 0x5e, 0xbd, 0x04, 0xa6, 0x04, 0x4f, 0x78, 0x1e, 0xe4, 0x29, + 0x7e, 0x20, 0xbd, 0xce, 0x35, 0x66, 0x84, 0x09, 0xc2, 0x0f, 0x90, 0x90, 0x55, 0xff, 0x72, 0x01, + 0x2c, 0x0c, 0xec, 0x05, 0xae, 0x80, 0x9c, 0xd3, 0xd6, 0x1c, 0x80, 0x76, 0x9a, 0xbb, 0xb1, 0x89, + 0x72, 0x4e, 0x1b, 0xbe, 0x02, 0xa6, 0xd5, 0xd4, 0xaf, 0x41, 0x2b, 0xa6, 0x04, 0x48, 0xa9, 0xe8, + 0x3d, 0x12, 0x77, 0x82, 0x88, 0x36, 0x97, 0x1c, 0xc8, 0x9e, 0xbe, 0x25, 0x8a, 0x03, 0xd9, 0x43, + 0x42, 0xf6, 0x49, 0x67, 0xed, 0x78, 0xd8, 0x2f, 0x3c, 0xc5, 0xb0, 0x3f, 0xfd, 0xb1, 0xc3, 0xfe, + 0x65, 0x50, 0xe0, 0x0e, 0x77, 0x89, 0x3d, 0x93, 0x6d, 0x11, 0x6f, 0x0b, 0x21, 0x52, 0x3a, 0x78, + 0x0f, 0xcc, 0xb4, 0xc9, 0x1e, 0x8e, 0x5c, 0x6e, 0x17, 0x65, 0x0a, 0x6d, 0x8c, 0x21, 0x85, 0x1a, + 0x25, 0x51, 0x15, 0x37, 0x95, 0x5f, 0x14, 0x03, 0xc0, 0xe7, 0xc0, 0x8c, 0x87, 0x0f, 0x1d, 0x2f, + 0xf2, 0xec, 0xd9, 0x55, 0x6b, 0xcd, 0x52, 0x66, 0x5b, 0x4a, 0x84, 0x62, 0x9d, 0xa8, 0x8c, 0xe4, + 0xb0, 0xe5, 0x46, 0xcc, 0xe9, 0x12, 0xad, 0xb4, 0x81, 0x2c, 0xb8, 0xa6, 0x32, 0x5e, 0x1f, 0xd0, + 0xa3, 0xa1, 0x15, 0x12, 0xcc, 0xf1, 0xe5, 0xe2, 0x52, 0x0a, 0x4c, 0x89, 0x50, 0xac, 0xcb, 0x82, + 0x69, 0xfb, 0xb9, 0x51, 0x60, 0x7a, 0xf1, 0xd0, 0x0a, 0xf8, 0x65, 0x30, 0xeb, 0xe1, 0xc3, 0x9b, + 0xc4, 0xef, 0xf0, 0x7d, 0x7b, 0x7e, 0xd5, 0x5a, 0xcb, 0x37, 0xe6, 0xfb, 0xbd, 0xca, 0xec, 0x56, + 0x2c, 0x44, 0x89, 0x5e, 0x1a, 0x3b, 0xbe, 0x36, 0x3e, 0x9d, 0x32, 0x8e, 0x85, 0x28, 0xd1, 0x8b, + 0x47, 0x27, 0xc4, 0x5c, 0x5c, 0x2e, 0x7b, 0x21, 0xdb, 0xc2, 0xef, 0x28, 0x31, 0x8a, 0xf5, 0x70, + 0x0d, 0x14, 0x3d, 0x7c, 0x28, 0xc7, 0x2d, 0x7b, 0x51, 0xba, 0x9d, 0x13, 0x7d, 0xd8, 0x96, 0x96, + 0x21, 0xa3, 0x95, 0x96, 0x8e, 0xaf, 0x2c, 0x97, 0x52, 0x96, 0x5a, 0x86, 0x8c, 0x56, 0x24, 0x71, + 0xe4, 0x3b, 0xf7, 0x23, 0xa2, 0x8c, 0xa1, 0x8c, 0x8c, 0x49, 0xe2, 0x3b, 0x89, 0x0a, 0xa5, 0xed, + 0xc4, 0xb8, 0xe3, 0x45, 0x2e, 0x77, 0x42, 0x97, 0x6c, 0xef, 0xd9, 0x67, 0x64, 0xfc, 0x65, 0xe7, + 0xbc, 0x65, 0xa4, 0x28, 0x65, 0x01, 0x09, 0x98, 0x22, 0x7e, 0xe4, 0xd9, 0x67, 0x65, 0xc3, 0x34, + 0x96, 0x14, 0x34, 0x37, 0xe7, 0xba, 0x1f, 0x79, 0x48, 0xba, 0x87, 0xaf, 0x80, 0x79, 0x0f, 0x1f, + 0x8a, 0x72, 0x40, 0x28, 0x17, 0x83, 0xd8, 0xb2, 0xdc, 0xfc, 0x92, 0x68, 0x52, 0xb6, 0xd2, 0x0a, + 0x94, 0xb5, 0x93, 0x0b, 0x1d, 0x3f, 0xb5, 0xf0, 0x5c, 0x6a, 0x61, 0x5a, 0x81, 0xb2, 0x76, 0x22, + 0xd2, 0x94, 0xdc, 0x8f, 0x1c, 0x4a, 0xda, 0xf6, 0xe7, 0x64, 0x5f, 0x23, 0x23, 0x8d, 0xb4, 0x0c, + 0x19, 0x2d, 0xec, 0xc6, 0x73, 0xb9, 0x2d, 0xaf, 0xe1, 0x9d, 0xf1, 0x56, 0xf2, 0x6d, 0xba, 0x4e, + 0x29, 0x3e, 0x52, 0x2f, 0x4d, 0x7a, 0x22, 0x87, 0x0c, 0x14, 0xb0, 0xeb, 0x6e, 0xef, 0xd9, 0xe7, + 0x65, 0xec, 0xc7, 0xfd, 0x82, 0x98, 0xaa, 0xb3, 0x2e, 0x40, 0x90, 0xc2, 0x12, 0xa0, 0x81, 0x2f, + 0x52, 0x63, 0x65, 0xb2, 0xa0, 0xdb, 0x02, 0x04, 0x29, 0x2c, 0xb9, 0x53, 0xff, 0x68, 0x7b, 0xcf, + 0xfe, 0xfc, 0x84, 0x77, 0x2a, 0x40, 0x90, 0xc2, 0x82, 0x0e, 0xc8, 0xfb, 0x01, 0xb7, 0x2f, 0x4c, + 0xe4, 0x79, 0x96, 0x0f, 0xce, 0xad, 0x80, 0x23, 0x81, 0x01, 0x7f, 0x63, 0x01, 0x10, 0x26, 0x29, + 0x7a, 0x71, 0x2c, 0xe3, 0xde, 0x00, 0x64, 0x2d, 0xc9, 0xed, 0xeb, 0x3e, 0xa7, 0x47, 0xc9, 0xe8, + 0x91, 0xba, 0x03, 0x29, 0x16, 0xf0, 0x8f, 0x16, 0x38, 0x9b, 0x9e, 0xa8, 0x0c, 0xbd, 0xb2, 0x8c, + 0xc8, 0xed, 0x71, 0xa7, 0x79, 0x23, 0x08, 0xdc, 0x86, 0xdd, 0xef, 0x55, 0xce, 0xae, 0x9f, 0x80, + 0x8a, 0x4e, 0xe4, 0x02, 0xff, 0x6a, 0x81, 0x25, 0x5d, 0x45, 0x53, 0x0c, 0x2b, 0x32, 0x80, 0x64, + 0xdc, 0x01, 0x1c, 0xc4, 0x51, 0x71, 0x3c, 0xaf, 0xe3, 0xb8, 0x34, 0xa4, 0x47, 0xc3, 0xd4, 0xe0, + 0x3f, 0x2c, 0x30, 0xd7, 0x26, 0x21, 0xf1, 0xdb, 0xc4, 0x6f, 0x09, 0xae, 0xab, 0x63, 0x99, 0x34, + 0x07, 0xb9, 0x6e, 0xa6, 0x20, 0x14, 0xcd, 0x9a, 0xa6, 0x39, 0x97, 0x56, 0x1d, 0xf7, 0x2a, 0xe7, + 0x92, 0xa5, 0x69, 0x0d, 0xca, 0xb0, 0x84, 0x1f, 0x58, 0x60, 0x21, 0x39, 0x00, 0xf5, 0xa4, 0x5c, + 0x9a, 0x60, 0x1e, 0xc8, 0xf6, 0x75, 0x3d, 0x0b, 0x88, 0x06, 0x19, 0xc0, 0xbf, 0x59, 0xa2, 0x53, + 0x8b, 0xe7, 0x46, 0x66, 0x57, 0x65, 0x2c, 0xdf, 0x19, 0x7b, 0x2c, 0x0d, 0x82, 0x0a, 0xe5, 0x0b, + 0x49, 0x2b, 0x68, 0x34, 0xc7, 0xbd, 0xca, 0x72, 0x3a, 0x92, 0x46, 0x81, 0xd2, 0x0c, 0xe1, 0xcf, + 0x2c, 0x30, 0x47, 0x92, 0x8e, 0x9b, 0xd9, 0x97, 0xc7, 0x12, 0xc4, 0x13, 0x9b, 0x78, 0xf5, 0x37, + 0xa6, 0x94, 0x8a, 0xa1, 0x0c, 0xb6, 0xe8, 0x20, 0xc9, 0x21, 0xf6, 0x42, 0x97, 0xd8, 0x5f, 0x18, + 0x73, 0x07, 0x79, 0x5d, 0xf9, 0x45, 0x31, 0xc0, 0x8a, 0x98, 0x7c, 0x06, 0x6e, 0x0e, 0x5c, 0x04, + 0xf9, 0x03, 0x72, 0xa4, 0x1a, 0x7b, 0x24, 0x7e, 0xc2, 0x36, 0x28, 0x74, 0xb1, 0x1b, 0xc5, 0xc3, + 0xdb, 0x98, 0xab, 0x2e, 0x52, 0xce, 0x5f, 0xcb, 0xbd, 0x6a, 0xad, 0x3c, 0xb4, 0xc0, 0xb9, 0x93, + 0x2f, 0xf4, 0x33, 0xa5, 0xf5, 0x7b, 0x0b, 0x2c, 0x0d, 0xdd, 0xdd, 0x13, 0x18, 0xdd, 0xcf, 0x32, + 0x7a, 0x63, 0xdc, 0x97, 0xb0, 0xc9, 0xa9, 0xe3, 0x77, 0x64, 0xe7, 0x91, 0xa6, 0xf7, 0x4b, 0x0b, + 0x2c, 0x0e, 0x5e, 0x87, 0x67, 0x19, 0xaf, 0xea, 0xc3, 0x1c, 0x38, 0x77, 0x72, 0xc3, 0x04, 0xa9, + 0x99, 0x0c, 0x27, 0x33, 0x61, 0x83, 0x64, 0xca, 0x34, 0x43, 0xe5, 0x7b, 0x16, 0x28, 0xdd, 0x33, + 0x76, 0xf1, 0x7f, 0x6a, 0xc6, 0x3e, 0xdb, 0xc7, 0xf5, 0x27, 0x51, 0x30, 0x94, 0xc6, 0xad, 0xfe, + 0xdd, 0x02, 0xcb, 0x27, 0x16, 0x56, 0x31, 0x82, 0x62, 0xd7, 0x0d, 0x1e, 0xa8, 0x3f, 0xd1, 0xa4, + 0xfe, 0x64, 0xb6, 0x2e, 0xa5, 0x48, 0x6b, 0x53, 0xd1, 0xcb, 0x7d, 0x56, 0xd1, 0xab, 0xfe, 0xcb, + 0x02, 0x17, 0x3e, 0x2e, 0x13, 0x9f, 0xc9, 0x91, 0xae, 0x81, 0xa2, 0x6e, 0x8a, 0x8e, 0xe4, 0x71, + 0xea, 0x39, 0x40, 0x17, 0x0d, 0xf9, 0xdf, 0x73, 0xf5, 0xab, 0x71, 0xe5, 0xd1, 0xe3, 0xf2, 0xa9, + 0x0f, 0x1f, 0x97, 0x4f, 0x7d, 0xf4, 0xb8, 0x7c, 0xea, 0x87, 0xfd, 0xb2, 0xf5, 0xa8, 0x5f, 0xb6, + 0x3e, 0xec, 0x97, 0xad, 0x8f, 0xfa, 0x65, 0xeb, 0xdf, 0xfd, 0xb2, 0xf5, 0xab, 0xff, 0x94, 0x4f, + 0x7d, 0x77, 0x46, 0x83, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x9e, 0x11, 0xe8, 0x41, 0x0b, 0x22, + 0x00, 0x00, } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto index 46cfd1ca7..2a75484ff 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -29,6 +29,32 @@ import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1beta1"; +// CustomResourceColumnDefinition specifies a column for server side printing. +message CustomResourceColumnDefinition { + // name is a human readable name for the column. + optional string name = 1; + + // type is an OpenAPI type definition for this column. + // See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more. + optional string type = 2; + + // format is an optional OpenAPI type definition for this column. The 'name' format is applied + // to the primary identifier column to assist in clients identifying column is the resource name. + // See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more. + optional string format = 3; + + // description is a human readable description of this column. + optional string description = 4; + + // priority is an integer defining the relative importance of this column compared to others. Lower + // numbers are considered higher priority. Columns that may be omitted in limited space scenarios + // should be given a higher priority. + optional int32 priority = 5; + + // JSONPath is a simple JSON path, i.e. with array notation. + optional string JSONPath = 6; +} + // CustomResourceDefinition represents a resource that should be exposed on the API server. Its name MUST be in the format // <.spec.name>.<.spec.group>. message CustomResourceDefinition { @@ -100,6 +126,10 @@ message CustomResourceDefinitionSpec { optional string group = 1; // Version is the version this resource belongs in + // Should be always first item in Versions field if provided. + // Optional, but at least one of Version or Versions must be set. + // Deprecated: Please use `Versions`. + // +optional optional string version = 2; // Names are the names used to describe this custom resource @@ -113,10 +143,24 @@ message CustomResourceDefinitionSpec { optional CustomResourceValidation validation = 5; // Subresources describes the subresources for CustomResources - // This field is alpha-level and should only be sent to servers that enable - // subresources via the CustomResourceSubresources feature gate. // +optional optional CustomResourceSubresources subresources = 6; + + // Versions is the list of all supported versions for this resource. + // If Version field is provided, this field is optional. + // Validation: All versions must use the same validation schema for now. i.e., top + // level Validation field is applied to all of these versions. + // Order: The version name will be used to compute the order. + // If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered + // lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version), + // then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first + // by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing + // major version, then minor version. An example sorted list of versions: + // v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10. + repeated CustomResourceDefinitionVersion versions = 7; + + // AdditionalPrinterColumns are additional columns shown e.g. in kubectl next to the name. Defaults to a created-at column. + repeated CustomResourceColumnDefinition additionalPrinterColumns = 8; } // CustomResourceDefinitionStatus indicates the state of the CustomResourceDefinition @@ -127,6 +171,26 @@ message CustomResourceDefinitionStatus { // AcceptedNames are the names that are actually being used to serve discovery // They may be different than the names in spec. optional CustomResourceDefinitionNames acceptedNames = 2; + + // StoredVersions are all versions of CustomResources that were ever persisted. Tracking these + // versions allows a migration path for stored versions in etcd. The field is mutable + // so the migration controller can first finish a migration to another version (i.e. + // that no old objects are left in the storage), and then remove the rest of the + // versions from this list. + // None of the versions in this list can be removed from the spec.Versions field. + repeated string storedVersions = 3; +} + +message CustomResourceDefinitionVersion { + // Name is the version name, e.g. “v1â€, “v2beta1â€, etc. + optional string name = 1; + + // Served is a flag enabling/disabling this version from being served via REST APIs + optional bool served = 2; + + // Storage flags the version as storage version. There must be exactly one + // flagged as storage version. + optional bool storage = 3; } // CustomResourceSubresourceScale defines how to serve the scale subresource for CustomResources. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/marshal.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/marshal.go index d8f9f164e..9a8fad3b7 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/marshal.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/marshal.go @@ -45,6 +45,7 @@ func (s *JSONSchemaPropsOrBool) UnmarshalJSON(data []byte) error { if err := json.Unmarshal(data, &sch); err != nil { return err } + nw.Allows = true nw.Schema = &sch case len(data) == 4 && string(data) == "true": nw.Allows = true diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/marshal_test.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/marshal_test.go index 0c6d4d4b5..99065ff95 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/marshal_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/marshal_test.go @@ -34,13 +34,13 @@ func TestJSONSchemaPropsOrBoolUnmarshalJSON(t *testing.T) { }{ {`{}`, JSONSchemaPropsOrBoolHolder{}}, - {`{"val1": {}}`, JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{Schema: &JSONSchemaProps{}}}}, - {`{"val1": {"type":"string"}}`, JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{Schema: &JSONSchemaProps{Type: "string"}}}}, + {`{"val1": {}}`, JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{Allows: true, Schema: &JSONSchemaProps{}}}}, + {`{"val1": {"type":"string"}}`, JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{Allows: true, Schema: &JSONSchemaProps{Type: "string"}}}}, {`{"val1": false}`, JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{}}}, {`{"val1": true}`, JSONSchemaPropsOrBoolHolder{JSPoB: JSONSchemaPropsOrBool{Allows: true}}}, - {`{"val2": {}}`, JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{Schema: &JSONSchemaProps{}}}}, - {`{"val2": {"type":"string"}}`, JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{Schema: &JSONSchemaProps{Type: "string"}}}}, + {`{"val2": {}}`, JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{Allows: true, Schema: &JSONSchemaProps{}}}}, + {`{"val2": {"type":"string"}}`, JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{Allows: true, Schema: &JSONSchemaProps{Type: "string"}}}}, {`{"val2": false}`, JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{}}}, {`{"val2": true}`, JSONSchemaPropsOrBoolHolder{JSPoBOmitEmpty: &JSONSchemaPropsOrBool{Allows: true}}}, } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go index 3a4da9aea..2080cc821 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types.go @@ -25,7 +25,11 @@ type CustomResourceDefinitionSpec struct { // Group is the group this resource belongs in Group string `json:"group" protobuf:"bytes,1,opt,name=group"` // Version is the version this resource belongs in - Version string `json:"version" protobuf:"bytes,2,opt,name=version"` + // Should be always first item in Versions field if provided. + // Optional, but at least one of Version or Versions must be set. + // Deprecated: Please use `Versions`. + // +optional + Version string `json:"version,omitempty" protobuf:"bytes,2,opt,name=version"` // Names are the names used to describe this custom resource Names CustomResourceDefinitionNames `json:"names" protobuf:"bytes,3,opt,name=names"` // Scope indicates whether this resource is cluster or namespace scoped. Default is namespaced @@ -34,10 +38,54 @@ type CustomResourceDefinitionSpec struct { // +optional Validation *CustomResourceValidation `json:"validation,omitempty" protobuf:"bytes,5,opt,name=validation"` // Subresources describes the subresources for CustomResources - // This field is alpha-level and should only be sent to servers that enable - // subresources via the CustomResourceSubresources feature gate. // +optional Subresources *CustomResourceSubresources `json:"subresources,omitempty" protobuf:"bytes,6,opt,name=subresources"` + // Versions is the list of all supported versions for this resource. + // If Version field is provided, this field is optional. + // Validation: All versions must use the same validation schema for now. i.e., top + // level Validation field is applied to all of these versions. + // Order: The version name will be used to compute the order. + // If the version string is "kube-like", it will sort above non "kube-like" version strings, which are ordered + // lexicographically. "Kube-like" versions start with a "v", then are followed by a number (the major version), + // then optionally the string "alpha" or "beta" and another number (the minor version). These are sorted first + // by GA > beta > alpha (where GA is a version with no suffix such as beta or alpha), and then by comparing + // major version, then minor version. An example sorted list of versions: + // v10, v2, v1, v11beta2, v10beta3, v3beta1, v12alpha1, v11alpha2, foo1, foo10. + Versions []CustomResourceDefinitionVersion `json:"versions,omitempty" protobuf:"bytes,7,rep,name=versions"` + // AdditionalPrinterColumns are additional columns shown e.g. in kubectl next to the name. Defaults to a created-at column. + AdditionalPrinterColumns []CustomResourceColumnDefinition `json:"additionalPrinterColumns,omitempty" protobuf:"bytes,8,rep,name=additionalPrinterColumns"` +} + +type CustomResourceDefinitionVersion struct { + // Name is the version name, e.g. “v1â€, “v2beta1â€, etc. + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + // Served is a flag enabling/disabling this version from being served via REST APIs + Served bool `json:"served" protobuf:"varint,2,opt,name=served"` + // Storage flags the version as storage version. There must be exactly one + // flagged as storage version. + Storage bool `json:"storage" protobuf:"varint,3,opt,name=storage"` +} + +// CustomResourceColumnDefinition specifies a column for server side printing. +type CustomResourceColumnDefinition struct { + // name is a human readable name for the column. + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + // type is an OpenAPI type definition for this column. + // See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more. + Type string `json:"type" protobuf:"bytes,2,opt,name=type"` + // format is an optional OpenAPI type definition for this column. The 'name' format is applied + // to the primary identifier column to assist in clients identifying column is the resource name. + // See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more. + Format string `json:"format,omitempty" protobuf:"bytes,3,opt,name=format"` + // description is a human readable description of this column. + Description string `json:"description,omitempty" protobuf:"bytes,4,opt,name=description"` + // priority is an integer defining the relative importance of this column compared to others. Lower + // numbers are considered higher priority. Columns that may be omitted in limited space scenarios + // should be given a higher priority. + Priority int32 `json:"priority,omitempty" protobuf:"bytes,5,opt,name=priority"` + + // JSONPath is a simple JSON path, i.e. with array notation. + JSONPath string `json:"JSONPath" protobuf:"bytes,6,opt,name=JSONPath"` } // CustomResourceDefinitionNames indicates the names to serve this CustomResourceDefinition @@ -119,6 +167,14 @@ type CustomResourceDefinitionStatus struct { // AcceptedNames are the names that are actually being used to serve discovery // They may be different than the names in spec. AcceptedNames CustomResourceDefinitionNames `json:"acceptedNames" protobuf:"bytes,2,opt,name=acceptedNames"` + + // StoredVersions are all versions of CustomResources that were ever persisted. Tracking these + // versions allows a migration path for stored versions in etcd. The field is mutable + // so the migration controller can first finish a migration to another version (i.e. + // that no old objects are left in the storage), and then remove the rest of the + // versions from this list. + // None of the versions in this list can be removed from the spec.Versions field. + StoredVersions []string `json:"storedVersions" protobuf:"bytes,3,rep,name=storedVersions"` } // CustomResourceCleanupFinalizer is the name of the finalizer which will delete instances of diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go index 9edd276d8..9776731cf 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/types_jsonschema.go @@ -62,6 +62,19 @@ type JSON struct { Raw []byte `protobuf:"bytes,1,opt,name=raw"` } +// OpenAPISchemaType is used by the kube-openapi generator when constructing +// the OpenAPI spec of this type. +// +// See: https://github.com/kubernetes/kube-openapi/tree/master/pkg/generators +func (_ JSON) OpenAPISchemaType() []string { + // TODO: return actual types when anyOf is supported + return []string{} +} + +// OpenAPISchemaFormat is used by the kube-openapi generator when constructing +// the OpenAPI spec of this type. +func (_ JSON) OpenAPISchemaFormat() string { return "" } + // JSONSchemaURL represents a schema url. type JSONSchemaURL string @@ -72,6 +85,19 @@ type JSONSchemaPropsOrArray struct { JSONSchemas []JSONSchemaProps `protobuf:"bytes,2,rep,name=jSONSchemas"` } +// OpenAPISchemaType is used by the kube-openapi generator when constructing +// the OpenAPI spec of this type. +// +// See: https://github.com/kubernetes/kube-openapi/tree/master/pkg/generators +func (_ JSONSchemaPropsOrArray) OpenAPISchemaType() []string { + // TODO: return actual types when anyOf is supported + return []string{} +} + +// OpenAPISchemaFormat is used by the kube-openapi generator when constructing +// the OpenAPI spec of this type. +func (_ JSONSchemaPropsOrArray) OpenAPISchemaFormat() string { return "" } + // JSONSchemaPropsOrBool represents JSONSchemaProps or a boolean value. // Defaults to true for the boolean property. type JSONSchemaPropsOrBool struct { @@ -79,6 +105,19 @@ type JSONSchemaPropsOrBool struct { Schema *JSONSchemaProps `protobuf:"bytes,2,opt,name=schema"` } +// OpenAPISchemaType is used by the kube-openapi generator when constructing +// the OpenAPI spec of this type. +// +// See: https://github.com/kubernetes/kube-openapi/tree/master/pkg/generators +func (_ JSONSchemaPropsOrBool) OpenAPISchemaType() []string { + // TODO: return actual types when anyOf is supported + return []string{} +} + +// OpenAPISchemaFormat is used by the kube-openapi generator when constructing +// the OpenAPI spec of this type. +func (_ JSONSchemaPropsOrBool) OpenAPISchemaFormat() string { return "" } + // JSONSchemaDependencies represent a dependencies property. type JSONSchemaDependencies map[string]JSONSchemaPropsOrStringArray @@ -88,6 +127,19 @@ type JSONSchemaPropsOrStringArray struct { Property []string `protobuf:"bytes,2,rep,name=property"` } +// OpenAPISchemaType is used by the kube-openapi generator when constructing +// the OpenAPI spec of this type. +// +// See: https://github.com/kubernetes/kube-openapi/tree/master/pkg/generators +func (_ JSONSchemaPropsOrStringArray) OpenAPISchemaType() []string { + // TODO: return actual types when anyOf is supported + return []string{} +} + +// OpenAPISchemaFormat is used by the kube-openapi generator when constructing +// the OpenAPI spec of this type. +func (_ JSONSchemaPropsOrStringArray) OpenAPISchemaFormat() string { return "" } + // JSONSchemaDefinitions contains the models explicitly defined in this spec. type JSONSchemaDefinitions map[string]JSONSchemaProps diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go index 6cd42fe5b..bcb2527c8 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.conversion.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -36,6 +36,8 @@ func init() { // Public to allow building arbitrary schemes. func RegisterConversions(scheme *runtime.Scheme) error { return scheme.AddGeneratedConversionFuncs( + Convert_v1beta1_CustomResourceColumnDefinition_To_apiextensions_CustomResourceColumnDefinition, + Convert_apiextensions_CustomResourceColumnDefinition_To_v1beta1_CustomResourceColumnDefinition, Convert_v1beta1_CustomResourceDefinition_To_apiextensions_CustomResourceDefinition, Convert_apiextensions_CustomResourceDefinition_To_v1beta1_CustomResourceDefinition, Convert_v1beta1_CustomResourceDefinitionCondition_To_apiextensions_CustomResourceDefinitionCondition, @@ -48,6 +50,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_apiextensions_CustomResourceDefinitionSpec_To_v1beta1_CustomResourceDefinitionSpec, Convert_v1beta1_CustomResourceDefinitionStatus_To_apiextensions_CustomResourceDefinitionStatus, Convert_apiextensions_CustomResourceDefinitionStatus_To_v1beta1_CustomResourceDefinitionStatus, + Convert_v1beta1_CustomResourceDefinitionVersion_To_apiextensions_CustomResourceDefinitionVersion, + Convert_apiextensions_CustomResourceDefinitionVersion_To_v1beta1_CustomResourceDefinitionVersion, Convert_v1beta1_CustomResourceSubresourceScale_To_apiextensions_CustomResourceSubresourceScale, Convert_apiextensions_CustomResourceSubresourceScale_To_v1beta1_CustomResourceSubresourceScale, Convert_v1beta1_CustomResourceSubresourceStatus_To_apiextensions_CustomResourceSubresourceStatus, @@ -71,6 +75,36 @@ func RegisterConversions(scheme *runtime.Scheme) error { ) } +func autoConvert_v1beta1_CustomResourceColumnDefinition_To_apiextensions_CustomResourceColumnDefinition(in *CustomResourceColumnDefinition, out *apiextensions.CustomResourceColumnDefinition, s conversion.Scope) error { + out.Name = in.Name + out.Type = in.Type + out.Format = in.Format + out.Description = in.Description + out.Priority = in.Priority + out.JSONPath = in.JSONPath + return nil +} + +// Convert_v1beta1_CustomResourceColumnDefinition_To_apiextensions_CustomResourceColumnDefinition is an autogenerated conversion function. +func Convert_v1beta1_CustomResourceColumnDefinition_To_apiextensions_CustomResourceColumnDefinition(in *CustomResourceColumnDefinition, out *apiextensions.CustomResourceColumnDefinition, s conversion.Scope) error { + return autoConvert_v1beta1_CustomResourceColumnDefinition_To_apiextensions_CustomResourceColumnDefinition(in, out, s) +} + +func autoConvert_apiextensions_CustomResourceColumnDefinition_To_v1beta1_CustomResourceColumnDefinition(in *apiextensions.CustomResourceColumnDefinition, out *CustomResourceColumnDefinition, s conversion.Scope) error { + out.Name = in.Name + out.Type = in.Type + out.Format = in.Format + out.Description = in.Description + out.Priority = in.Priority + out.JSONPath = in.JSONPath + return nil +} + +// Convert_apiextensions_CustomResourceColumnDefinition_To_v1beta1_CustomResourceColumnDefinition is an autogenerated conversion function. +func Convert_apiextensions_CustomResourceColumnDefinition_To_v1beta1_CustomResourceColumnDefinition(in *apiextensions.CustomResourceColumnDefinition, out *CustomResourceColumnDefinition, s conversion.Scope) error { + return autoConvert_apiextensions_CustomResourceColumnDefinition_To_v1beta1_CustomResourceColumnDefinition(in, out, s) +} + func autoConvert_v1beta1_CustomResourceDefinition_To_apiextensions_CustomResourceDefinition(in *CustomResourceDefinition, out *apiextensions.CustomResourceDefinition, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta if err := Convert_v1beta1_CustomResourceDefinitionSpec_To_apiextensions_CustomResourceDefinitionSpec(&in.Spec, &out.Spec, s); err != nil { @@ -220,6 +254,8 @@ func autoConvert_v1beta1_CustomResourceDefinitionSpec_To_apiextensions_CustomRes out.Validation = nil } out.Subresources = (*apiextensions.CustomResourceSubresources)(unsafe.Pointer(in.Subresources)) + out.Versions = *(*[]apiextensions.CustomResourceDefinitionVersion)(unsafe.Pointer(&in.Versions)) + out.AdditionalPrinterColumns = *(*[]apiextensions.CustomResourceColumnDefinition)(unsafe.Pointer(&in.AdditionalPrinterColumns)) return nil } @@ -245,6 +281,8 @@ func autoConvert_apiextensions_CustomResourceDefinitionSpec_To_v1beta1_CustomRes out.Validation = nil } out.Subresources = (*CustomResourceSubresources)(unsafe.Pointer(in.Subresources)) + out.Versions = *(*[]CustomResourceDefinitionVersion)(unsafe.Pointer(&in.Versions)) + out.AdditionalPrinterColumns = *(*[]CustomResourceColumnDefinition)(unsafe.Pointer(&in.AdditionalPrinterColumns)) return nil } @@ -258,6 +296,7 @@ func autoConvert_v1beta1_CustomResourceDefinitionStatus_To_apiextensions_CustomR if err := Convert_v1beta1_CustomResourceDefinitionNames_To_apiextensions_CustomResourceDefinitionNames(&in.AcceptedNames, &out.AcceptedNames, s); err != nil { return err } + out.StoredVersions = *(*[]string)(unsafe.Pointer(&in.StoredVersions)) return nil } @@ -271,6 +310,7 @@ func autoConvert_apiextensions_CustomResourceDefinitionStatus_To_v1beta1_CustomR if err := Convert_apiextensions_CustomResourceDefinitionNames_To_v1beta1_CustomResourceDefinitionNames(&in.AcceptedNames, &out.AcceptedNames, s); err != nil { return err } + out.StoredVersions = *(*[]string)(unsafe.Pointer(&in.StoredVersions)) return nil } @@ -279,6 +319,30 @@ func Convert_apiextensions_CustomResourceDefinitionStatus_To_v1beta1_CustomResou return autoConvert_apiextensions_CustomResourceDefinitionStatus_To_v1beta1_CustomResourceDefinitionStatus(in, out, s) } +func autoConvert_v1beta1_CustomResourceDefinitionVersion_To_apiextensions_CustomResourceDefinitionVersion(in *CustomResourceDefinitionVersion, out *apiextensions.CustomResourceDefinitionVersion, s conversion.Scope) error { + out.Name = in.Name + out.Served = in.Served + out.Storage = in.Storage + return nil +} + +// Convert_v1beta1_CustomResourceDefinitionVersion_To_apiextensions_CustomResourceDefinitionVersion is an autogenerated conversion function. +func Convert_v1beta1_CustomResourceDefinitionVersion_To_apiextensions_CustomResourceDefinitionVersion(in *CustomResourceDefinitionVersion, out *apiextensions.CustomResourceDefinitionVersion, s conversion.Scope) error { + return autoConvert_v1beta1_CustomResourceDefinitionVersion_To_apiextensions_CustomResourceDefinitionVersion(in, out, s) +} + +func autoConvert_apiextensions_CustomResourceDefinitionVersion_To_v1beta1_CustomResourceDefinitionVersion(in *apiextensions.CustomResourceDefinitionVersion, out *CustomResourceDefinitionVersion, s conversion.Scope) error { + out.Name = in.Name + out.Served = in.Served + out.Storage = in.Storage + return nil +} + +// Convert_apiextensions_CustomResourceDefinitionVersion_To_v1beta1_CustomResourceDefinitionVersion is an autogenerated conversion function. +func Convert_apiextensions_CustomResourceDefinitionVersion_To_v1beta1_CustomResourceDefinitionVersion(in *apiextensions.CustomResourceDefinitionVersion, out *CustomResourceDefinitionVersion, s conversion.Scope) error { + return autoConvert_apiextensions_CustomResourceDefinitionVersion_To_v1beta1_CustomResourceDefinitionVersion(in, out, s) +} + func autoConvert_v1beta1_CustomResourceSubresourceScale_To_apiextensions_CustomResourceSubresourceScale(in *CustomResourceSubresourceScale, out *apiextensions.CustomResourceSubresourceScale, s conversion.Scope) error { out.SpecReplicasPath = in.SpecReplicasPath out.StatusReplicasPath = in.StatusReplicasPath diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.deepcopy.go index 35c3a0b75..d2c1cebf2 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -24,6 +24,22 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CustomResourceColumnDefinition) DeepCopyInto(out *CustomResourceColumnDefinition) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomResourceColumnDefinition. +func (in *CustomResourceColumnDefinition) DeepCopy() *CustomResourceColumnDefinition { + if in == nil { + return nil + } + out := new(CustomResourceColumnDefinition) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CustomResourceDefinition) DeepCopyInto(out *CustomResourceDefinition) { *out = *in @@ -150,6 +166,16 @@ func (in *CustomResourceDefinitionSpec) DeepCopyInto(out *CustomResourceDefiniti (*in).DeepCopyInto(*out) } } + if in.Versions != nil { + in, out := &in.Versions, &out.Versions + *out = make([]CustomResourceDefinitionVersion, len(*in)) + copy(*out, *in) + } + if in.AdditionalPrinterColumns != nil { + in, out := &in.AdditionalPrinterColumns, &out.AdditionalPrinterColumns + *out = make([]CustomResourceColumnDefinition, len(*in)) + copy(*out, *in) + } return } @@ -174,6 +200,11 @@ func (in *CustomResourceDefinitionStatus) DeepCopyInto(out *CustomResourceDefini } } in.AcceptedNames.DeepCopyInto(&out.AcceptedNames) + if in.StoredVersions != nil { + in, out := &in.StoredVersions, &out.StoredVersions + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -187,6 +218,22 @@ func (in *CustomResourceDefinitionStatus) DeepCopy() *CustomResourceDefinitionSt return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CustomResourceDefinitionVersion) DeepCopyInto(out *CustomResourceDefinitionVersion) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomResourceDefinitionVersion. +func (in *CustomResourceDefinitionVersion) DeepCopy() *CustomResourceDefinitionVersion { + if in == nil { + return nil + } + out := new(CustomResourceDefinitionVersion) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CustomResourceSubresourceScale) DeepCopyInto(out *CustomResourceSubresourceScale) { *out = *in diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go index 546f33eda..f65f47a03 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/zz_generated.defaults.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD deleted file mode 100644 index b641b6093..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go index 713fcfa90..1179226dd 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation.go @@ -22,6 +22,7 @@ import ( "strings" genericvalidation "k8s.io/apimachinery/pkg/api/validation" + "k8s.io/apimachinery/pkg/util/sets" validationutil "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" utilfeature "k8s.io/apiserver/pkg/util/feature" @@ -31,6 +32,11 @@ import ( apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" ) +var ( + printerColumnDatatypes = sets.NewString("integer", "number", "string", "boolean", "date") + customResourceColumnDefinitionFormats = sets.NewString("int32", "int64", "float", "double", "byte", "date", "date-time", "password") +) + // ValidateCustomResourceDefinition statically validates func ValidateCustomResourceDefinition(obj *apiextensions.CustomResourceDefinition) field.ErrorList { nameValidationFn := func(name string, prefix bool) []string { @@ -45,6 +51,7 @@ func ValidateCustomResourceDefinition(obj *apiextensions.CustomResourceDefinitio allErrs := genericvalidation.ValidateObjectMeta(&obj.ObjectMeta, false, nameValidationFn, field.NewPath("metadata")) allErrs = append(allErrs, ValidateCustomResourceDefinitionSpec(&obj.Spec, field.NewPath("spec"))...) allErrs = append(allErrs, ValidateCustomResourceDefinitionStatus(&obj.Status, field.NewPath("status"))...) + allErrs = append(allErrs, ValidateCustomResourceDefinitionStoredVersions(obj.Status.StoredVersions, obj.Spec.Versions, field.NewPath("status").Child("storedVersions"))...) return allErrs } @@ -53,6 +60,34 @@ func ValidateCustomResourceDefinitionUpdate(obj, oldObj *apiextensions.CustomRes allErrs := genericvalidation.ValidateObjectMetaUpdate(&obj.ObjectMeta, &oldObj.ObjectMeta, field.NewPath("metadata")) allErrs = append(allErrs, ValidateCustomResourceDefinitionSpecUpdate(&obj.Spec, &oldObj.Spec, apiextensions.IsCRDConditionTrue(oldObj, apiextensions.Established), field.NewPath("spec"))...) allErrs = append(allErrs, ValidateCustomResourceDefinitionStatus(&obj.Status, field.NewPath("status"))...) + allErrs = append(allErrs, ValidateCustomResourceDefinitionStoredVersions(obj.Status.StoredVersions, obj.Spec.Versions, field.NewPath("status").Child("storedVersions"))...) + return allErrs +} + +// ValidateCustomResourceDefinitionStoredVersions statically validates +func ValidateCustomResourceDefinitionStoredVersions(storedVersions []string, versions []apiextensions.CustomResourceDefinitionVersion, fldPath *field.Path) field.ErrorList { + if len(storedVersions) == 0 { + return field.ErrorList{field.Invalid(fldPath, storedVersions, "must have at least one stored version")} + } + allErrs := field.ErrorList{} + storedVersionsMap := map[string]int{} + for i, v := range storedVersions { + storedVersionsMap[v] = i + } + for _, v := range versions { + _, ok := storedVersionsMap[v.Name] + if v.Storage && !ok { + allErrs = append(allErrs, field.Invalid(fldPath, v, "must have the storage version "+v.Name)) + } + if ok { + delete(storedVersionsMap, v.Name) + } + } + + for v, i := range storedVersionsMap { + allErrs = append(allErrs, field.Invalid(fldPath.Index(i), v, "must appear in spec.versions")) + } + return allErrs } @@ -75,12 +110,6 @@ func ValidateCustomResourceDefinitionSpec(spec *apiextensions.CustomResourceDefi allErrs = append(allErrs, field.Invalid(fldPath.Child("group"), spec.Group, "should be a domain with at least one dot")) } - if len(spec.Version) == 0 { - allErrs = append(allErrs, field.Required(fldPath.Child("version"), "")) - } else if errs := validationutil.IsDNS1035Label(spec.Version); len(errs) > 0 { - allErrs = append(allErrs, field.Invalid(fldPath.Child("version"), spec.Version, strings.Join(errs, ","))) - } - switch spec.Scope { case "": allErrs = append(allErrs, field.Required(fldPath.Child("scope"), "")) @@ -89,6 +118,37 @@ func ValidateCustomResourceDefinitionSpec(spec *apiextensions.CustomResourceDefi allErrs = append(allErrs, field.NotSupported(fldPath.Child("scope"), spec.Scope, []string{string(apiextensions.ClusterScoped), string(apiextensions.NamespaceScoped)})) } + storageFlagCount := 0 + versionsMap := map[string]bool{} + uniqueNames := true + for i, version := range spec.Versions { + if version.Storage { + storageFlagCount++ + } + if versionsMap[version.Name] { + uniqueNames = false + } else { + versionsMap[version.Name] = true + } + if errs := validationutil.IsDNS1035Label(version.Name); len(errs) > 0 { + allErrs = append(allErrs, field.Invalid(fldPath.Child("versions").Index(i).Child("name"), spec.Versions[i].Name, strings.Join(errs, ","))) + } + } + if !uniqueNames { + allErrs = append(allErrs, field.Invalid(fldPath.Child("versions"), spec.Versions, "must contain unique version names")) + } + if storageFlagCount != 1 { + allErrs = append(allErrs, field.Invalid(fldPath.Child("versions"), spec.Versions, "must have exactly one version marked as storage version")) + } + if len(spec.Version) != 0 { + if errs := validationutil.IsDNS1035Label(spec.Version); len(errs) > 0 { + allErrs = append(allErrs, field.Invalid(fldPath.Child("version"), spec.Version, strings.Join(errs, ","))) + } + if len(spec.Versions) >= 1 && spec.Versions[0].Name != spec.Version { + allErrs = append(allErrs, field.Invalid(fldPath.Child("version"), spec.Version, "must match the first version in spec.versions")) + } + } + // in addition to the basic name restrictions, some names are required for spec, but not for status if len(spec.Names.Plural) == 0 { allErrs = append(allErrs, field.Required(fldPath.Child("names", "plural"), "")) @@ -106,7 +166,11 @@ func ValidateCustomResourceDefinitionSpec(spec *apiextensions.CustomResourceDefi allErrs = append(allErrs, ValidateCustomResourceDefinitionNames(&spec.Names, fldPath.Child("names"))...) if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceValidation) { - allErrs = append(allErrs, ValidateCustomResourceDefinitionValidation(spec.Validation, fldPath.Child("validation"))...) + statusEnabled := false + if spec.Subresources != nil && spec.Subresources.Status != nil { + statusEnabled = true + } + allErrs = append(allErrs, ValidateCustomResourceDefinitionValidation(spec.Validation, statusEnabled, fldPath.Child("validation"))...) } else if spec.Validation != nil { allErrs = append(allErrs, field.Forbidden(fldPath.Child("validation"), "disabled by feature-gate CustomResourceValidation")) } @@ -117,6 +181,12 @@ func ValidateCustomResourceDefinitionSpec(spec *apiextensions.CustomResourceDefi allErrs = append(allErrs, field.Forbidden(fldPath.Child("subresources"), "disabled by feature-gate CustomResourceSubresources")) } + for i := range spec.AdditionalPrinterColumns { + if errs := ValidateCustomResourceColumnDefinition(&spec.AdditionalPrinterColumns[i], fldPath.Child("columns").Index(i)); len(errs) > 0 { + allErrs = append(allErrs, errs...) + } + } + return allErrs } @@ -126,7 +196,6 @@ func ValidateCustomResourceDefinitionSpecUpdate(spec, oldSpec *apiextensions.Cus if established { // these effect the storage and cannot be changed therefore - allErrs = append(allErrs, genericvalidation.ValidateImmutableField(spec.Version, oldSpec.Version, fldPath.Child("version"))...) allErrs = append(allErrs, genericvalidation.ValidateImmutableField(spec.Scope, oldSpec.Scope, fldPath.Child("scope"))...) allErrs = append(allErrs, genericvalidation.ValidateImmutableField(spec.Names.Kind, oldSpec.Names.Kind, fldPath.Child("names", "kind"))...) } @@ -181,13 +250,40 @@ func ValidateCustomResourceDefinitionNames(names *apiextensions.CustomResourceDe return allErrs } +// ValidateCustomResourceColumnDefinition statically validates a printer column. +func ValidateCustomResourceColumnDefinition(col *apiextensions.CustomResourceColumnDefinition, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + if len(col.Name) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("header"), "")) + } + + if len(col.Type) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("type"), fmt.Sprintf("must be one of %s", strings.Join(printerColumnDatatypes.List(), ",")))) + } else if !printerColumnDatatypes.Has(col.Type) { + allErrs = append(allErrs, field.Invalid(fldPath.Child("type"), col.Type, fmt.Sprintf("must be one of %s", strings.Join(printerColumnDatatypes.List(), ",")))) + } + + if len(col.Format) > 0 && !customResourceColumnDefinitionFormats.Has(col.Format) { + allErrs = append(allErrs, field.Invalid(fldPath.Child("format"), col.Format, fmt.Sprintf("must be one of %s", strings.Join(customResourceColumnDefinitionFormats.List(), ",")))) + } + + if len(col.JSONPath) == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("path"), "")) + } else if errs := validateSimpleJSONPath(col.JSONPath, fldPath.Child("path")); len(errs) > 0 { + allErrs = append(allErrs, errs...) + } + + return allErrs +} + // specStandardValidator applies validations for different OpenAPI specification versions. type specStandardValidator interface { validate(spec *apiextensions.JSONSchemaProps, fldPath *field.Path) field.ErrorList } // ValidateCustomResourceDefinitionValidation statically validates -func ValidateCustomResourceDefinitionValidation(customResourceValidation *apiextensions.CustomResourceValidation, fldPath *field.Path) field.ErrorList { +func ValidateCustomResourceDefinitionValidation(customResourceValidation *apiextensions.CustomResourceValidation, statusSubresourceEnabled bool, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} if customResourceValidation == nil { @@ -195,21 +291,19 @@ func ValidateCustomResourceDefinitionValidation(customResourceValidation *apiext } if schema := customResourceValidation.OpenAPIV3Schema; schema != nil { - // if subresources are enabled, only properties is allowed inside the root schema - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) { + // if subresources are enabled, only "properties", "required" and "description" are allowed inside the root schema + if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && statusSubresourceEnabled { v := reflect.ValueOf(schema).Elem() - fieldsPresent := 0 - for i := 0; i < v.NumField(); i++ { - field := v.Field(i).Interface() - if !reflect.DeepEqual(field, reflect.Zero(reflect.TypeOf(field)).Interface()) { - fieldsPresent++ + // skip zero values + if value := v.Field(i).Interface(); reflect.DeepEqual(value, reflect.Zero(reflect.TypeOf(value)).Interface()) { + continue } - } - if fieldsPresent > 1 || (fieldsPresent == 1 && v.FieldByName("Properties").IsNil()) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("openAPIV3Schema"), *schema, fmt.Sprintf("if subresources for custom resources are enabled, only properties can be used at the root of the schema"))) - return allErrs + if name := v.Type().Field(i).Name; name != "Properties" && name != "Required" && name != "Description" { + allErrs = append(allErrs, field.Invalid(fldPath.Child("openAPIV3Schema"), *schema, fmt.Sprintf(`must only have "properties", "required" or "description" at the root if the status subresource is enabled`))) + break + } } } @@ -240,38 +334,24 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch allErrs = append(allErrs, field.Forbidden(fldPath.Child("uniqueItems"), "uniqueItems cannot be set to true since the runtime complexity becomes quadratic")) } - // additionalProperties contradicts Kubernetes API convention to ignore unknown fields + // additionalProperties and properties are mutual exclusive because otherwise they + // contradict Kubernetes' API convention to ignore unknown fields. + // + // In other words: + // - properties are for structs, + // - additionalProperties are for map[string]interface{} + // + // Note: when patternProperties is added to OpenAPI some day, this will have to be + // restricted like additionalProperties. if schema.AdditionalProperties != nil { - if schema.AdditionalProperties.Allows == false { - allErrs = append(allErrs, field.Forbidden(fldPath.Child("additionalProperties"), "additionalProperties cannot be set to false")) + if len(schema.Properties) != 0 { + if schema.AdditionalProperties.Allows == false || schema.AdditionalProperties.Schema != nil { + allErrs = append(allErrs, field.Forbidden(fldPath.Child("additionalProperties"), "additionalProperties and properties are mutual exclusive")) + } } allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.AdditionalProperties.Schema, fldPath.Child("additionalProperties"), ssv)...) } - if schema.AdditionalItems != nil { - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.AdditionalItems.Schema, fldPath.Child("additionalItems"), ssv)...) - } - - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.Not, fldPath.Child("not"), ssv)...) - - if len(schema.AllOf) != 0 { - for _, jsonSchema := range schema.AllOf { - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("allOf"), ssv)...) - } - } - - if len(schema.OneOf) != 0 { - for _, jsonSchema := range schema.OneOf { - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("oneOf"), ssv)...) - } - } - - if len(schema.AnyOf) != 0 { - for _, jsonSchema := range schema.AnyOf { - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("anyOf"), ssv)...) - } - } - if len(schema.Properties) != 0 { for property, jsonSchema := range schema.Properties { allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("properties").Key(property), ssv)...) @@ -284,6 +364,30 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch } } + if schema.AdditionalItems != nil { + allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.AdditionalItems.Schema, fldPath.Child("additionalItems"), ssv)...) + } + + allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.Not, fldPath.Child("not"), ssv)...) + + if len(schema.AllOf) != 0 { + for i, jsonSchema := range schema.AllOf { + allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("allOf").Index(i), ssv)...) + } + } + + if len(schema.OneOf) != 0 { + for i, jsonSchema := range schema.OneOf { + allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("oneOf").Index(i), ssv)...) + } + } + + if len(schema.AnyOf) != 0 { + for i, jsonSchema := range schema.AnyOf { + allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("anyOf").Index(i), ssv)...) + } + } + if len(schema.Definitions) != 0 { for definition, jsonSchema := range schema.Definitions { allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("definitions").Key(definition), ssv)...) @@ -293,8 +397,8 @@ func ValidateCustomResourceDefinitionOpenAPISchema(schema *apiextensions.JSONSch if schema.Items != nil { allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(schema.Items.Schema, fldPath.Child("items"), ssv)...) if len(schema.Items.JSONSchemas) != 0 { - for _, jsonSchema := range schema.Items.JSONSchemas { - allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("items"), ssv)...) + for i, jsonSchema := range schema.Items.JSONSchemas { + allErrs = append(allErrs, ValidateCustomResourceDefinitionOpenAPISchema(&jsonSchema, fldPath.Child("items").Index(i), ssv)...) } } } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go index dd712c94f..68dc8aaed 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/validation_test.go @@ -41,17 +41,159 @@ func unsupported(path ...string) validationMatch { func immutable(path ...string) validationMatch { return validationMatch{path: field.NewPath(path[0], path[1:]...), errorType: field.ErrorTypeInvalid} } +func forbidden(path ...string) validationMatch { + return validationMatch{path: field.NewPath(path[0], path[1:]...), errorType: field.ErrorTypeForbidden} +} func (v validationMatch) matches(err *field.Error) bool { return err.Type == v.errorType && err.Field == v.path.String() } func TestValidateCustomResourceDefinition(t *testing.T) { + singleVersionList := []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: true, + }, + } tests := []struct { name string resource *apiextensions.CustomResourceDefinition errors []validationMatch }{ + { + name: "no_storage_version", + resource: &apiextensions.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "plural.group.com"}, + Spec: apiextensions.CustomResourceDefinitionSpec{ + Group: "group.com", + Scope: apiextensions.ResourceScope("Cluster"), + Names: apiextensions.CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "Plural", + ListKind: "PluralList", + }, + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: false, + }, + { + Name: "version2", + Served: true, + Storage: false, + }, + }, + }, + Status: apiextensions.CustomResourceDefinitionStatus{ + StoredVersions: []string{"version"}, + }, + }, + errors: []validationMatch{ + invalid("spec", "versions"), + }, + }, + { + name: "multiple_storage_version", + resource: &apiextensions.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "plural.group.com"}, + Spec: apiextensions.CustomResourceDefinitionSpec{ + Group: "group.com", + Scope: apiextensions.ResourceScope("Cluster"), + Names: apiextensions.CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "Plural", + ListKind: "PluralList", + }, + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: true, + }, + { + Name: "version2", + Served: true, + Storage: true, + }, + }, + }, + Status: apiextensions.CustomResourceDefinitionStatus{ + StoredVersions: []string{"version"}, + }, + }, + errors: []validationMatch{ + invalid("spec", "versions"), + invalid("status", "storedVersions"), + }, + }, + { + name: "missing_storage_version_in_stored_versions", + resource: &apiextensions.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "plural.group.com"}, + Spec: apiextensions.CustomResourceDefinitionSpec{ + Group: "group.com", + Scope: apiextensions.ResourceScope("Cluster"), + Names: apiextensions.CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "Plural", + ListKind: "PluralList", + }, + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: false, + }, + { + Name: "version2", + Served: true, + Storage: true, + }, + }, + }, + Status: apiextensions.CustomResourceDefinitionStatus{ + StoredVersions: []string{"version"}, + }, + }, + errors: []validationMatch{ + invalid("status", "storedVersions"), + }, + }, + { + name: "empty_stored_version", + resource: &apiextensions.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "plural.group.com"}, + Spec: apiextensions.CustomResourceDefinitionSpec{ + Group: "group.com", + Scope: apiextensions.ResourceScope("Cluster"), + Names: apiextensions.CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "Plural", + ListKind: "PluralList", + }, + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: true, + }, + }, + }, + Status: apiextensions.CustomResourceDefinitionStatus{ + StoredVersions: []string{}, + }, + }, + errors: []validationMatch{ + invalid("status", "storedVersions"), + }, + }, { name: "mismatched name", resource: &apiextensions.CustomResourceDefinition{ @@ -64,8 +206,9 @@ func TestValidateCustomResourceDefinition(t *testing.T) { }, }, errors: []validationMatch{ + invalid("status", "storedVersions"), invalid("metadata", "name"), - required("spec", "version"), + invalid("spec", "versions"), required("spec", "scope"), required("spec", "names", "singular"), required("spec", "names", "kind"), @@ -78,9 +221,10 @@ func TestValidateCustomResourceDefinition(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "plural.group.com"}, }, errors: []validationMatch{ + invalid("status", "storedVersions"), invalid("metadata", "name"), + invalid("spec", "versions"), required("spec", "group"), - required("spec", "version"), required("spec", "scope"), required("spec", "names", "plural"), required("spec", "names", "singular"), @@ -113,9 +257,9 @@ func TestValidateCustomResourceDefinition(t *testing.T) { }, }, errors: []validationMatch{ + invalid("status", "storedVersions"), invalid("metadata", "name"), invalid("spec", "group"), - invalid("spec", "version"), unsupported("spec", "scope"), invalid("spec", "names", "plural"), invalid("spec", "names", "singular"), @@ -127,6 +271,8 @@ func TestValidateCustomResourceDefinition(t *testing.T) { invalid("status", "acceptedNames", "kind"), invalid("status", "acceptedNames", "listKind"), // invalid format invalid("status", "acceptedNames", "listKind"), // kind == listKind + invalid("spec", "versions"), + invalid("spec", "version"), }, }, { @@ -134,8 +280,9 @@ func TestValidateCustomResourceDefinition(t *testing.T) { resource: &apiextensions.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{Name: "plural.group"}, Spec: apiextensions.CustomResourceDefinitionSpec{ - Group: "group.c(*&om", - Version: "version", + Group: "group.c(*&om", + Version: "version", + Versions: singleVersionList, Names: apiextensions.CustomResourceDefinitionNames{ Plural: "plural", Singular: "singular", @@ -150,6 +297,7 @@ func TestValidateCustomResourceDefinition(t *testing.T) { Kind: "matching", ListKind: "matching", }, + StoredVersions: []string{"version"}, }, }, errors: []validationMatch{ @@ -160,6 +308,70 @@ func TestValidateCustomResourceDefinition(t *testing.T) { invalid("status", "acceptedNames", "listKind"), }, }, + { + name: "additionalProperties and properties forbidden", + resource: &apiextensions.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "plural.group.com"}, + Spec: apiextensions.CustomResourceDefinitionSpec{ + Group: "group.com", + Version: "version", + Versions: singleVersionList, + Scope: apiextensions.NamespaceScoped, + Names: apiextensions.CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "Plural", + ListKind: "PluralList", + }, + Validation: &apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensions.JSONSchemaProps{ + "foo": {}, + }, + AdditionalProperties: &apiextensions.JSONSchemaPropsOrBool{Allows: false}, + }, + }, + }, + Status: apiextensions.CustomResourceDefinitionStatus{ + StoredVersions: []string{"version"}, + }, + }, + errors: []validationMatch{ + forbidden("spec", "validation", "openAPIV3Schema", "additionalProperties"), + }, + }, + { + name: "additionalProperties without properties allowed (map[string]string)", + resource: &apiextensions.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "plural.group.com"}, + Spec: apiextensions.CustomResourceDefinitionSpec{ + Group: "group.com", + Version: "version", + Versions: singleVersionList, + Scope: apiextensions.NamespaceScoped, + Names: apiextensions.CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "Plural", + ListKind: "PluralList", + }, + Validation: &apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + AdditionalProperties: &apiextensions.JSONSchemaPropsOrBool{ + Allows: true, + Schema: &apiextensions.JSONSchemaProps{ + Type: "string", + }, + }, + }, + }, + }, + Status: apiextensions.CustomResourceDefinitionStatus{ + StoredVersions: []string{"version"}, + }, + }, + errors: []validationMatch{}, + }, } for _, tc := range tests { @@ -206,7 +418,14 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Spec: apiextensions.CustomResourceDefinitionSpec{ Group: "group.com", Version: "version", - Scope: apiextensions.ResourceScope("Cluster"), + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: true, + }, + }, + Scope: apiextensions.ResourceScope("Cluster"), Names: apiextensions.CustomResourceDefinitionNames{ Plural: "plural", Singular: "singular", @@ -231,7 +450,14 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Spec: apiextensions.CustomResourceDefinitionSpec{ Group: "group.com", Version: "version", - Scope: apiextensions.ResourceScope("Cluster"), + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: true, + }, + }, + Scope: apiextensions.ResourceScope("Cluster"), Names: apiextensions.CustomResourceDefinitionNames{ Plural: "plural", Singular: "singular", @@ -246,6 +472,7 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Kind: "kind", ListKind: "listkind", }, + StoredVersions: []string{"version"}, }, }, errors: []validationMatch{}, @@ -260,7 +487,14 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Spec: apiextensions.CustomResourceDefinitionSpec{ Group: "group.com", Version: "version", - Scope: apiextensions.ResourceScope("Cluster"), + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: true, + }, + }, + Scope: apiextensions.ResourceScope("Cluster"), Names: apiextensions.CustomResourceDefinitionNames{ Plural: "plural", Singular: "singular", @@ -288,7 +522,14 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Spec: apiextensions.CustomResourceDefinitionSpec{ Group: "group.com", Version: "version", - Scope: apiextensions.ResourceScope("Cluster"), + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: true, + }, + }, + Scope: apiextensions.ResourceScope("Cluster"), Names: apiextensions.CustomResourceDefinitionNames{ Plural: "plural", Singular: "singular", @@ -303,10 +544,91 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Kind: "kind", ListKind: "listkind", }, + StoredVersions: []string{"version"}, }, }, errors: []validationMatch{}, }, + { + name: "version-deleted", + old: &apiextensions.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{ + Name: "plural.group.com", + ResourceVersion: "42", + }, + Spec: apiextensions.CustomResourceDefinitionSpec{ + Group: "group.com", + Version: "version", + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: true, + }, + { + Name: "version2", + Served: true, + Storage: false, + }, + }, + Scope: apiextensions.ResourceScope("Cluster"), + Names: apiextensions.CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "kind", + ListKind: "listkind", + }, + }, + Status: apiextensions.CustomResourceDefinitionStatus{ + AcceptedNames: apiextensions.CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "kind", + ListKind: "listkind", + }, + StoredVersions: []string{"version", "version2"}, + Conditions: []apiextensions.CustomResourceDefinitionCondition{ + {Type: apiextensions.Established, Status: apiextensions.ConditionTrue}, + }, + }, + }, + resource: &apiextensions.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{ + Name: "plural.group.com", + ResourceVersion: "42", + }, + Spec: apiextensions.CustomResourceDefinitionSpec{ + Group: "group.com", + Version: "version", + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: true, + }, + }, + Scope: apiextensions.ResourceScope("Cluster"), + Names: apiextensions.CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "kind", + ListKind: "listkind", + }, + }, + Status: apiextensions.CustomResourceDefinitionStatus{ + AcceptedNames: apiextensions.CustomResourceDefinitionNames{ + Plural: "plural", + Singular: "singular", + Kind: "kind", + ListKind: "listkind", + }, + StoredVersions: []string{"version", "version2"}, + }, + }, + errors: []validationMatch{ + invalid("status", "storedVersions[1]"), + }, + }, { name: "changes", old: &apiextensions.CustomResourceDefinition{ @@ -317,7 +639,14 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Spec: apiextensions.CustomResourceDefinitionSpec{ Group: "group.com", Version: "version", - Scope: apiextensions.ResourceScope("Cluster"), + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: true, + }, + }, + Scope: apiextensions.ResourceScope("Cluster"), Names: apiextensions.CustomResourceDefinitionNames{ Plural: "plural", Singular: "singular", @@ -345,7 +674,14 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Spec: apiextensions.CustomResourceDefinitionSpec{ Group: "abc.com", Version: "version2", - Scope: apiextensions.ResourceScope("Namespaced"), + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version2", + Served: true, + Storage: true, + }, + }, + Scope: apiextensions.ResourceScope("Namespaced"), Names: apiextensions.CustomResourceDefinitionNames{ Plural: "plural2", Singular: "singular2", @@ -360,6 +696,7 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Kind: "kind2", ListKind: "listkind2", }, + StoredVersions: []string{"version2"}, }, }, errors: []validationMatch{ @@ -377,7 +714,14 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Spec: apiextensions.CustomResourceDefinitionSpec{ Group: "group.com", Version: "version", - Scope: apiextensions.ResourceScope("Cluster"), + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version", + Served: true, + Storage: true, + }, + }, + Scope: apiextensions.ResourceScope("Cluster"), Names: apiextensions.CustomResourceDefinitionNames{ Plural: "plural", Singular: "singular", @@ -405,7 +749,14 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Spec: apiextensions.CustomResourceDefinitionSpec{ Group: "abc.com", Version: "version2", - Scope: apiextensions.ResourceScope("Namespaced"), + Versions: []apiextensions.CustomResourceDefinitionVersion{ + { + Name: "version2", + Served: true, + Storage: true, + }, + }, + Scope: apiextensions.ResourceScope("Namespaced"), Names: apiextensions.CustomResourceDefinitionNames{ Plural: "plural2", Singular: "singular2", @@ -420,11 +771,11 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { Kind: "kind2", ListKind: "listkind2", }, + StoredVersions: []string{"version2"}, }, }, errors: []validationMatch{ immutable("spec", "group"), - immutable("spec", "version"), immutable("spec", "scope"), immutable("spec", "names", "kind"), immutable("spec", "names", "plural"), @@ -458,3 +809,69 @@ func TestValidateCustomResourceDefinitionUpdate(t *testing.T) { } } } + +func TestValidateCustomResourceDefinitionValidation(t *testing.T) { + tests := []struct { + name string + input apiextensions.CustomResourceValidation + statusEnabled bool + wantError bool + }{ + { + name: "empty", + input: apiextensions.CustomResourceValidation{}, + wantError: false, + }, + { + name: "empty with status", + input: apiextensions.CustomResourceValidation{}, + statusEnabled: true, + wantError: false, + }, + { + name: "root type without status", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "object", + }, + }, + statusEnabled: false, + wantError: false, + }, + { + name: "root type with status", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Type: "object", + }, + }, + statusEnabled: true, + wantError: true, + }, + { + name: "properties, required and description with status", + input: apiextensions.CustomResourceValidation{ + OpenAPIV3Schema: &apiextensions.JSONSchemaProps{ + Properties: map[string]apiextensions.JSONSchemaProps{ + "spec": {}, + "status": {}, + }, + Required: []string{"spec", "status"}, + Description: "This is a description", + }, + }, + statusEnabled: true, + wantError: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := ValidateCustomResourceDefinitionValidation(&tt.input, tt.statusEnabled, field.NewPath("spec", "validation")) + if !tt.wantError && len(got) > 0 { + t.Errorf("Expected no error, but got: %v", got) + } else if tt.wantError && len(got) == 0 { + t.Error("Expected error, but got none") + } + }) + } +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/zz_generated.deepcopy.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/zz_generated.deepcopy.go index ea3af6976..145b3c5d7 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -24,6 +24,22 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CustomResourceColumnDefinition) DeepCopyInto(out *CustomResourceColumnDefinition) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomResourceColumnDefinition. +func (in *CustomResourceColumnDefinition) DeepCopy() *CustomResourceColumnDefinition { + if in == nil { + return nil + } + out := new(CustomResourceColumnDefinition) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CustomResourceDefinition) DeepCopyInto(out *CustomResourceDefinition) { *out = *in @@ -150,6 +166,16 @@ func (in *CustomResourceDefinitionSpec) DeepCopyInto(out *CustomResourceDefiniti (*in).DeepCopyInto(*out) } } + if in.Versions != nil { + in, out := &in.Versions, &out.Versions + *out = make([]CustomResourceDefinitionVersion, len(*in)) + copy(*out, *in) + } + if in.AdditionalPrinterColumns != nil { + in, out := &in.AdditionalPrinterColumns, &out.AdditionalPrinterColumns + *out = make([]CustomResourceColumnDefinition, len(*in)) + copy(*out, *in) + } return } @@ -174,6 +200,11 @@ func (in *CustomResourceDefinitionStatus) DeepCopyInto(out *CustomResourceDefini } } in.AcceptedNames.DeepCopyInto(&out.AcceptedNames) + if in.StoredVersions != nil { + in, out := &in.StoredVersions, &out.StoredVersions + *out = make([]string, len(*in)) + copy(*out, *in) + } return } @@ -187,6 +218,22 @@ func (in *CustomResourceDefinitionStatus) DeepCopy() *CustomResourceDefinitionSt return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *CustomResourceDefinitionVersion) DeepCopyInto(out *CustomResourceDefinitionVersion) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomResourceDefinitionVersion. +func (in *CustomResourceDefinitionVersion) DeepCopy() *CustomResourceDefinitionVersion { + if in == nil { + return nil + } + out := new(CustomResourceDefinitionVersion) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CustomResourceSubresourceScale) DeepCopyInto(out *CustomResourceSubresourceScale) { *out = *in diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD deleted file mode 100644 index 09d21156d..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD +++ /dev/null @@ -1,99 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "apiserver.go", - "customresource_discovery.go", - "customresource_discovery_controller.go", - "customresource_handler.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver", - deps = [ - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/go-openapi/strfmt:go_default_library", - "//vendor/github.com/go-openapi/validate:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/controller/status:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/version:go_default_library", - "//vendor/k8s.io/apiserver/pkg/admission:go_default_library", - "//vendor/k8s.io/apiserver/pkg/endpoints/discovery:go_default_library", - "//vendor/k8s.io/apiserver/pkg/endpoints/handlers:go_default_library", - "//vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", - "//vendor/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", - "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server/storage:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/scale:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme/autoscalingv1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/util/workqueue:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["customresource_handler_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go index 1415ff8d9..f1fc89ba9 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go @@ -19,13 +19,8 @@ package apiserver import ( "fmt" "net/http" - "os" "time" - "github.com/golang/glog" - - "k8s.io/apimachinery/pkg/apimachinery/announced" - "k8s.io/apimachinery/pkg/apimachinery/registered" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -42,21 +37,19 @@ import ( "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset" internalinformers "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion" + "k8s.io/apiextensions-apiserver/pkg/controller/establish" "k8s.io/apiextensions-apiserver/pkg/controller/finalizer" "k8s.io/apiextensions-apiserver/pkg/controller/status" "k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition" - // make sure the generated client works _ "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" _ "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions" _ "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion" ) var ( - groupFactoryRegistry = make(announced.APIGroupFactoryRegistry) - Registry = registered.NewOrDie("") - Scheme = runtime.NewScheme() - Codecs = serializer.NewCodecFactory(Scheme) + Scheme = runtime.NewScheme() + Codecs = serializer.NewCodecFactory(Scheme) // if you modify this, make sure you update the crEncoder unversionedVersion = schema.GroupVersion{Group: "", Version: "v1"} @@ -71,7 +64,7 @@ var ( ) func init() { - install.Install(groupFactoryRegistry, Registry, Scheme) + install.Install(Scheme) // we need to add the options to empty v1 metav1.AddToGroupVersion(Scheme, schema.GroupVersion{Group: "", Version: "v1"}) @@ -81,6 +74,10 @@ func init() { type ExtraConfig struct { CRDRESTOptionsGetter genericregistry.RESTOptionsGetter + + // MasterCount is used to detect whether cluster is HA, and if it is + // the CRD Establishing will be hold by 5 seconds. + MasterCount int } type Config struct { @@ -133,9 +130,8 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) } apiResourceConfig := c.GenericConfig.MergedResourceConfig - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiextensions.GroupName, Registry, Scheme, metav1.ParameterCodec, Codecs) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiextensions.GroupName, Scheme, metav1.ParameterCodec, Codecs) if apiResourceConfig.VersionEnabled(v1beta1.SchemeGroupVersion) { - apiGroupInfo.GroupMeta.GroupVersion = v1beta1.SchemeGroupVersion storage := map[string]rest.Storage{} // customresourcedefinitions customResourceDefintionStorage := customresourcedefinition.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) @@ -153,16 +149,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) if err != nil { // it's really bad that this is leaking here, but until we can fix the test (which I'm pretty sure isn't even testing what it wants to test), // we need to be able to move forward - kubeAPIVersions := os.Getenv("KUBE_API_VERSIONS") - if len(kubeAPIVersions) == 0 { - return nil, fmt.Errorf("failed to create clientset: %v", err) - } - - // KUBE_API_VERSIONS is used in test-update-storage-objects.sh, disabling a number of API - // groups. This leads to a nil client above and undefined behaviour further down. - // - // TODO: get rid of KUBE_API_VERSIONS or define sane behaviour if set - glog.Errorf("Failed to create clientset with KUBE_API_VERSIONS=%q. KUBE_API_VERSIONS is only for testing. Things will break.", kubeAPIVersions) + return nil, fmt.Errorf("failed to create clientset: %v", err) } s.Informers = internalinformers.NewSharedInformerFactory(crdClient, 5*time.Minute) @@ -179,24 +166,21 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) discovery: map[string]*discovery.APIGroupHandler{}, delegate: delegateHandler, } + establishingController := establish.NewEstablishingController(s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), crdClient.Apiextensions()) crdHandler := NewCustomResourceDefinitionHandler( versionDiscoveryHandler, groupDiscoveryHandler, - s.GenericAPIServer.RequestContextMapper(), s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), delegateHandler, c.ExtraConfig.CRDRESTOptionsGetter, c.GenericConfig.AdmissionControl, + establishingController, + c.ExtraConfig.MasterCount, ) s.GenericAPIServer.Handler.NonGoRestfulMux.Handle("/apis", crdHandler) s.GenericAPIServer.Handler.NonGoRestfulMux.HandlePrefix("/apis/", crdHandler) - // this only happens when KUBE_API_VERSIONS is set. We must return without adding controllers or poststarthooks which would affect healthz - if crdClient == nil { - return s, nil - } - - crdController := NewDiscoveryController(s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), versionDiscoveryHandler, groupDiscoveryHandler, c.GenericConfig.RequestContextMapper) + crdController := NewDiscoveryController(s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), versionDiscoveryHandler, groupDiscoveryHandler) namingController := status.NewNamingConditionController(s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), crdClient.Apiextensions()) finalizingController := finalizer.NewCRDFinalizer( s.Informers.Apiextensions().InternalVersion().CustomResourceDefinitions(), @@ -211,6 +195,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget) s.GenericAPIServer.AddPostStartHook("start-apiextensions-controllers", func(context genericapiserver.PostStartHookContext) error { go crdController.Run(context.StopCh) go namingController.Run(context.StopCh) + go establishingController.Run(context.StopCh) go finalizingController.Run(5, context.StopCh) return nil }) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/converter.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/converter.go new file mode 100644 index 000000000..69f5340a9 --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/converter.go @@ -0,0 +1,117 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package conversion + +import ( + "fmt" + + "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// NewCRDConverter returns a new CRD converter based on the conversion settings in crd object. +func NewCRDConverter(crd *apiextensions.CustomResourceDefinition) (safe, unsafe runtime.ObjectConvertor) { + validVersions := map[schema.GroupVersion]bool{} + for _, version := range crd.Spec.Versions { + validVersions[schema.GroupVersion{Group: crd.Spec.Group, Version: version.Name}] = true + } + + // The only converter right now is nopConverter. More converters will be returned based on the + // CRD object when they introduced. + unsafe = &crdConverter{ + clusterScoped: crd.Spec.Scope == apiextensions.ClusterScoped, + delegate: &nopConverter{ + validVersions: validVersions, + }, + } + return &safeConverterWrapper{unsafe}, unsafe +} + +var _ runtime.ObjectConvertor = &crdConverter{} + +// crdConverter extends the delegate with generic CRD conversion behaviour. The delegate will implement the +// user defined conversion strategy given in the CustomResourceDefinition. +type crdConverter struct { + delegate runtime.ObjectConvertor + clusterScoped bool +} + +func (c *crdConverter) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { + // We currently only support metadata.namespace and metadata.name. + switch { + case label == "metadata.name": + return label, value, nil + case !c.clusterScoped && label == "metadata.namespace": + return label, value, nil + default: + return "", "", fmt.Errorf("field label not supported: %s", label) + } +} + +func (c *crdConverter) Convert(in, out, context interface{}) error { + return c.delegate.Convert(in, out, context) +} + +// ConvertToVersion converts in object to the given gvk in place and returns the same `in` object. +func (c *crdConverter) ConvertToVersion(in runtime.Object, target runtime.GroupVersioner) (runtime.Object, error) { + // Run the converter on the list items instead of list itself + if list, ok := in.(*unstructured.UnstructuredList); ok { + for i := range list.Items { + obj, err := c.delegate.ConvertToVersion(&list.Items[i], target) + if err != nil { + return nil, err + } + + u, ok := obj.(*unstructured.Unstructured) + if !ok { + return nil, fmt.Errorf("output type %T in not valid for unstructured conversion", obj) + } + list.Items[i] = *u + } + return list, nil + } + + return c.delegate.ConvertToVersion(in, target) +} + +// safeConverterWrapper is a wrapper over an unsafe object converter that makes copy of the input and then delegate to the unsafe converter. +type safeConverterWrapper struct { + unsafe runtime.ObjectConvertor +} + +var _ runtime.ObjectConvertor = &nopConverter{} + +// ConvertFieldLabel delegate the call to the unsafe converter. +func (c *safeConverterWrapper) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { + return c.unsafe.ConvertFieldLabel(version, kind, label, value) +} + +// Convert makes a copy of in object and then delegate the call to the unsafe converter. +func (c *safeConverterWrapper) Convert(in, out, context interface{}) error { + inObject, ok := in.(runtime.Object) + if !ok { + return fmt.Errorf("input type %T in not valid for object conversion", in) + } + return c.unsafe.Convert(inObject.DeepCopyObject(), out, context) +} + +// ConvertToVersion makes a copy of in object and then delegate the call to the unsafe converter. +func (c *safeConverterWrapper) ConvertToVersion(in runtime.Object, target runtime.GroupVersioner) (runtime.Object, error) { + return c.unsafe.ConvertToVersion(in.DeepCopyObject(), target) +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/nop_converter.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/nop_converter.go new file mode 100644 index 000000000..716930bfb --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/nop_converter.go @@ -0,0 +1,79 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package conversion + +import ( + "errors" + "fmt" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// nopConverter is a converter that only sets the apiVersion fields, but does not real conversion. +type nopConverter struct { + validVersions map[schema.GroupVersion]bool +} + +var _ runtime.ObjectConvertor = &nopConverter{} + +func (nopConverter) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { + return "", "", errors.New("unstructured cannot convert field labels") +} + +func (c *nopConverter) Convert(in, out, context interface{}) error { + unstructIn, ok := in.(*unstructured.Unstructured) + if !ok { + return fmt.Errorf("input type %T in not valid for unstructured conversion", in) + } + + unstructOut, ok := out.(*unstructured.Unstructured) + if !ok { + return fmt.Errorf("output type %T in not valid for unstructured conversion", out) + } + + outGVK := unstructOut.GroupVersionKind() + if !c.validVersions[outGVK.GroupVersion()] { + return fmt.Errorf("request to convert CRD from an invalid group/version: %s", outGVK.String()) + } + inGVK := unstructIn.GroupVersionKind() + if !c.validVersions[inGVK.GroupVersion()] { + return fmt.Errorf("request to convert CRD to an invalid group/version: %s", inGVK.String()) + } + + unstructOut.SetUnstructuredContent(unstructIn.UnstructuredContent()) + _, err := c.ConvertToVersion(unstructOut, outGVK.GroupVersion()) + if err != nil { + return err + } + return nil +} + +func (c *nopConverter) ConvertToVersion(in runtime.Object, target runtime.GroupVersioner) (runtime.Object, error) { + kind := in.GetObjectKind().GroupVersionKind() + gvk, ok := target.KindForGroupVersionKinds([]schema.GroupVersionKind{kind}) + if !ok { + // TODO: should this be a typed error? + return nil, fmt.Errorf("%v is unstructured and is not suitable for converting to %q", kind, target) + } + if !c.validVersions[gvk.GroupVersion()] { + return nil, fmt.Errorf("request to convert CRD to an invalid group/version: %s", gvk.String()) + } + in.GetObjectKind().SetGroupVersionKind(gvk) + return in, nil +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery_controller.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery_controller.go index b180e105b..e3b3d0a44 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery_controller.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_discovery_controller.go @@ -18,6 +18,7 @@ package apiserver import ( "fmt" + "sort" "time" "github.com/golang/glog" @@ -28,8 +29,8 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/version" "k8s.io/apiserver/pkg/endpoints/discovery" - "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/workqueue" @@ -41,7 +42,6 @@ import ( type DiscoveryController struct { versionHandler *versionDiscoveryHandler groupHandler *groupDiscoveryHandler - contextMapper request.RequestContextMapper crdLister listers.CustomResourceDefinitionLister crdsSynced cache.InformerSynced @@ -52,13 +52,12 @@ type DiscoveryController struct { queue workqueue.RateLimitingInterface } -func NewDiscoveryController(crdInformer informers.CustomResourceDefinitionInformer, versionHandler *versionDiscoveryHandler, groupHandler *groupDiscoveryHandler, contextMapper request.RequestContextMapper) *DiscoveryController { +func NewDiscoveryController(crdInformer informers.CustomResourceDefinitionInformer, versionHandler *versionDiscoveryHandler, groupHandler *groupDiscoveryHandler) *DiscoveryController { c := &DiscoveryController{ versionHandler: versionHandler, groupHandler: groupHandler, crdLister: crdInformer.Lister(), crdsSynced: crdInformer.Informer().HasSynced, - contextMapper: contextMapper, queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "DiscoveryController"), } @@ -78,6 +77,7 @@ func (c *DiscoveryController) sync(version schema.GroupVersion) error { apiVersionsForDiscovery := []metav1.GroupVersionForDiscovery{} apiResourcesForDiscovery := []metav1.APIResource{} + versionsForDiscoveryMap := map[metav1.GroupVersion]bool{} crds, err := c.crdLister.List(labels.Everything()) if err != nil { @@ -93,13 +93,29 @@ func (c *DiscoveryController) sync(version schema.GroupVersion) error { if crd.Spec.Group != version.Group { continue } - foundGroup = true - apiVersionsForDiscovery = append(apiVersionsForDiscovery, metav1.GroupVersionForDiscovery{ - GroupVersion: crd.Spec.Group + "/" + crd.Spec.Version, - Version: crd.Spec.Version, - }) - if crd.Spec.Version != version.Version { + foundThisVersion := false + for _, v := range crd.Spec.Versions { + if !v.Served { + continue + } + // If there is any Served version, that means the group should show up in discovery + foundGroup = true + + gv := metav1.GroupVersion{Group: crd.Spec.Group, Version: v.Name} + if !versionsForDiscoveryMap[gv] { + versionsForDiscoveryMap[gv] = true + apiVersionsForDiscovery = append(apiVersionsForDiscovery, metav1.GroupVersionForDiscovery{ + GroupVersion: crd.Spec.Group + "/" + v.Name, + Version: v.Name, + }) + } + if v.Name == version.Version { + foundThisVersion = true + } + } + + if !foundThisVersion { continue } foundVersion = true @@ -147,13 +163,16 @@ func (c *DiscoveryController) sync(version schema.GroupVersion) error { return nil } + sortGroupDiscoveryByKubeAwareVersion(apiVersionsForDiscovery) + apiGroup := metav1.APIGroup{ Name: version.Group, Versions: apiVersionsForDiscovery, - // the preferred versions for a group is arbitrary since there cannot be duplicate resources + // the preferred versions for a group is the first item in + // apiVersionsForDiscovery after it put in the right ordered PreferredVersion: apiVersionsForDiscovery[0], } - c.groupHandler.setDiscovery(version.Group, discovery.NewAPIGroupHandler(Codecs, apiGroup, c.contextMapper)) + c.groupHandler.setDiscovery(version.Group, discovery.NewAPIGroupHandler(Codecs, apiGroup)) if !foundVersion { c.versionHandler.unsetDiscovery(version) @@ -161,11 +180,17 @@ func (c *DiscoveryController) sync(version schema.GroupVersion) error { } c.versionHandler.setDiscovery(version, discovery.NewAPIVersionHandler(Codecs, version, discovery.APIResourceListerFunc(func() []metav1.APIResource { return apiResourcesForDiscovery - }), c.contextMapper)) + }))) return nil } +func sortGroupDiscoveryByKubeAwareVersion(gd []metav1.GroupVersionForDiscovery) { + sort.Slice(gd, func(i, j int) bool { + return version.CompareKubeAwareVersionStrings(gd[i].Version, gd[j].Version) > 0 + }) +} + func (c *DiscoveryController) Run(stopCh <-chan struct{}) { defer utilruntime.HandleCrash() defer c.queue.ShutDown() @@ -210,7 +235,9 @@ func (c *DiscoveryController) processNextWorkItem() bool { } func (c *DiscoveryController) enqueue(obj *apiextensions.CustomResourceDefinition) { - c.queue.Add(schema.GroupVersion{Group: obj.Spec.Group, Version: obj.Spec.Version}) + for _, v := range obj.Spec.Versions { + c.queue.Add(schema.GroupVersion{Group: obj.Spec.Group, Version: v.Name}) + } } func (c *DiscoveryController) addCustomResourceDefinition(obj interface{}) { @@ -219,10 +246,14 @@ func (c *DiscoveryController) addCustomResourceDefinition(obj interface{}) { c.enqueue(castObj) } -func (c *DiscoveryController) updateCustomResourceDefinition(obj, _ interface{}) { - castObj := obj.(*apiextensions.CustomResourceDefinition) - glog.V(4).Infof("Updating customresourcedefinition %s", castObj.Name) - c.enqueue(castObj) +func (c *DiscoveryController) updateCustomResourceDefinition(oldObj, newObj interface{}) { + castNewObj := newObj.(*apiextensions.CustomResourceDefinition) + castOldObj := oldObj.(*apiextensions.CustomResourceDefinition) + glog.V(4).Infof("Updating customresourcedefinition %s", castOldObj.Name) + // Enqueue both old and new object to make sure we remove and add appropriate Versions. + // The working queue will resolve any duplicates and only changes will stay in the queue. + c.enqueue(castNewObj) + c.enqueue(castOldObj) } func (c *DiscoveryController) deleteCustomResourceDefinition(obj interface{}) { diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go index e427f4c11..7be3711dc 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go @@ -58,9 +58,11 @@ import ( "k8s.io/client-go/tools/cache" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + "k8s.io/apiextensions-apiserver/pkg/apiserver/conversion" apiservervalidation "k8s.io/apiextensions-apiserver/pkg/apiserver/validation" informers "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion" listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion" + "k8s.io/apiextensions-apiserver/pkg/controller/establish" "k8s.io/apiextensions-apiserver/pkg/controller/finalizer" apiextensionsfeatures "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apiextensions-apiserver/pkg/registry/customresource" @@ -80,13 +82,17 @@ type crdHandler struct { // which is suited for most read and rarely write cases customStorage atomic.Value - requestContextMapper apirequest.RequestContextMapper - crdLister listers.CustomResourceDefinitionLister delegate http.Handler restOptionsGetter generic.RESTOptionsGetter admission admission.Interface + + establishingController *establish.EstablishingController + + // MasterCount is used to implement sleep to improve + // CRD establishing process for HA clusters. + masterCount int } // crdInfo stores enough information to serve the storage for the custom resource @@ -96,11 +102,20 @@ type crdInfo struct { spec *apiextensions.CustomResourceDefinitionSpec acceptedNames *apiextensions.CustomResourceDefinitionNames - storage customresource.CustomResourceStorage + // Storage per version + storages map[string]customresource.CustomResourceStorage - requestScope handlers.RequestScope - scaleRequestScope handlers.RequestScope - statusRequestScope handlers.RequestScope + // Request scope per version + requestScopes map[string]handlers.RequestScope + + // Scale scope per version + scaleRequestScopes map[string]handlers.RequestScope + + // Status scope per version + statusRequestScopes map[string]handlers.RequestScope + + // storageVersion is the CRD version used when storing the object in etcd. + storageVersion string } // crdStorageMap goes from customresourcedefinition to its storage @@ -109,22 +124,23 @@ type crdStorageMap map[types.UID]*crdInfo func NewCustomResourceDefinitionHandler( versionDiscoveryHandler *versionDiscoveryHandler, groupDiscoveryHandler *groupDiscoveryHandler, - requestContextMapper apirequest.RequestContextMapper, crdInformer informers.CustomResourceDefinitionInformer, delegate http.Handler, restOptionsGetter generic.RESTOptionsGetter, - admission admission.Interface) *crdHandler { + admission admission.Interface, + establishingController *establish.EstablishingController, + masterCount int) *crdHandler { ret := &crdHandler{ versionDiscoveryHandler: versionDiscoveryHandler, groupDiscoveryHandler: groupDiscoveryHandler, customStorage: atomic.Value{}, - requestContextMapper: requestContextMapper, crdLister: crdInformer.Lister(), delegate: delegate, restOptionsGetter: restOptionsGetter, admission: admission, + establishingController: establishingController, + masterCount: masterCount, } - crdInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ UpdateFunc: ret.updateCustomResourceDefinition, DeleteFunc: func(obj interface{}) { @@ -138,11 +154,7 @@ func NewCustomResourceDefinitionHandler( } func (r *crdHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { - ctx, ok := r.requestContextMapper.Get(req) - if !ok { - responsewriters.InternalError(w, req, fmt.Errorf("no context found for request")) - return - } + ctx := req.Context() requestInfo, ok := apirequest.RequestInfoFrom(ctx) if !ok { responsewriters.InternalError(w, req, fmt.Errorf("no RequestInfo found in the context")) @@ -176,11 +188,16 @@ func (r *crdHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } - if crd.Spec.Version != requestInfo.APIVersion { + if !apiextensions.HasServedCRDVersion(crd, requestInfo.APIVersion) { r.delegate.ServeHTTP(w, req) return } - if !apiextensions.IsCRDConditionTrue(crd, apiextensions.Established) { + // There is a small chance that a CRD is being served because NamesAccepted condition is true, + // but it becomes "unserved" because another names update leads to a conflict + // and EstablishingController wasn't fast enough to put the CRD into the Established condition. + // We accept this as the problem is small and self-healing. + if !apiextensions.IsCRDConditionTrue(crd, apiextensions.NamesAccepted) && + !apiextensions.IsCRDConditionTrue(crd, apiextensions.Established) { r.delegate.ServeHTTP(w, req) return } @@ -222,8 +239,8 @@ func (r *crdHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { } func (r *crdHandler) serveResource(w http.ResponseWriter, req *http.Request, requestInfo *apirequest.RequestInfo, crdInfo *crdInfo, terminating bool, supportedTypes []string) http.HandlerFunc { - requestScope := crdInfo.requestScope - storage := crdInfo.storage.CustomResource + requestScope := crdInfo.requestScopes[requestInfo.APIVersion] + storage := crdInfo.storages[requestInfo.APIVersion].CustomResource minRequestTimeout := 1 * time.Minute switch requestInfo.Verb { @@ -240,11 +257,11 @@ func (r *crdHandler) serveResource(w http.ResponseWriter, req *http.Request, req http.Error(w, fmt.Sprintf("%v not allowed while CustomResourceDefinition is terminating", requestInfo.Verb), http.StatusMethodNotAllowed) return nil } - return handlers.CreateResource(storage, requestScope, discovery.NewUnstructuredObjectTyper(nil), r.admission) + return handlers.CreateResource(storage, requestScope, r.admission) case "update": - return handlers.UpdateResource(storage, requestScope, discovery.NewUnstructuredObjectTyper(nil), r.admission) + return handlers.UpdateResource(storage, requestScope, r.admission) case "patch": - return handlers.PatchResource(storage, requestScope, r.admission, unstructured.UnstructuredObjectConverter{}, supportedTypes) + return handlers.PatchResource(storage, requestScope, r.admission, supportedTypes) case "delete": allowsOptions := true return handlers.DeleteResource(storage, allowsOptions, requestScope, r.admission) @@ -258,16 +275,16 @@ func (r *crdHandler) serveResource(w http.ResponseWriter, req *http.Request, req } func (r *crdHandler) serveStatus(w http.ResponseWriter, req *http.Request, requestInfo *apirequest.RequestInfo, crdInfo *crdInfo, terminating bool, supportedTypes []string) http.HandlerFunc { - requestScope := crdInfo.statusRequestScope - storage := crdInfo.storage.Status + requestScope := crdInfo.statusRequestScopes[requestInfo.APIVersion] + storage := crdInfo.storages[requestInfo.APIVersion].Status switch requestInfo.Verb { case "get": return handlers.GetResource(storage, nil, requestScope) case "update": - return handlers.UpdateResource(storage, requestScope, discovery.NewUnstructuredObjectTyper(nil), r.admission) + return handlers.UpdateResource(storage, requestScope, r.admission) case "patch": - return handlers.PatchResource(storage, requestScope, r.admission, unstructured.UnstructuredObjectConverter{}, supportedTypes) + return handlers.PatchResource(storage, requestScope, r.admission, supportedTypes) default: http.Error(w, fmt.Sprintf("unhandled verb %q", requestInfo.Verb), http.StatusMethodNotAllowed) return nil @@ -275,16 +292,16 @@ func (r *crdHandler) serveStatus(w http.ResponseWriter, req *http.Request, reque } func (r *crdHandler) serveScale(w http.ResponseWriter, req *http.Request, requestInfo *apirequest.RequestInfo, crdInfo *crdInfo, terminating bool, supportedTypes []string) http.HandlerFunc { - requestScope := crdInfo.scaleRequestScope - storage := crdInfo.storage.Scale + requestScope := crdInfo.scaleRequestScopes[requestInfo.APIVersion] + storage := crdInfo.storages[requestInfo.APIVersion].Scale switch requestInfo.Verb { case "get": return handlers.GetResource(storage, nil, requestScope) case "update": - return handlers.UpdateResource(storage, requestScope, discovery.NewUnstructuredObjectTyper(nil), r.admission) + return handlers.UpdateResource(storage, requestScope, r.admission) case "patch": - return handlers.PatchResource(storage, requestScope, r.admission, unstructured.UnstructuredObjectConverter{}, supportedTypes) + return handlers.PatchResource(storage, requestScope, r.admission, supportedTypes) default: http.Error(w, fmt.Sprintf("unhandled verb %q", requestInfo.Verb), http.StatusMethodNotAllowed) return nil @@ -298,6 +315,19 @@ func (r *crdHandler) updateCustomResourceDefinition(oldObj, newObj interface{}) r.customStorageLock.Lock() defer r.customStorageLock.Unlock() + // Add CRD to the establishing controller queue. + // For HA clusters, we want to prevent race conditions when changing status to Established, + // so we want to be sure that CRD is Installing at least for 5 seconds before Establishing it. + // TODO: find a real HA safe checkpointing mechanism instead of an arbitrary wait. + if !apiextensions.IsCRDConditionTrue(newCRD, apiextensions.Established) && + apiextensions.IsCRDConditionTrue(newCRD, apiextensions.NamesAccepted) { + if r.masterCount > 1 { + r.establishingController.QueueCRD(newCRD.Name, 5*time.Second) + } else { + r.establishingController.QueueCRD(newCRD.Name, 0) + } + } + storageMap := r.customStorage.Load().(crdStorageMap) oldInfo, found := storageMap[newCRD.UID] if !found { @@ -314,8 +344,10 @@ func (r *crdHandler) updateCustomResourceDefinition(oldObj, newObj interface{}) // as it is used without locking elsewhere. storageMap2 := storageMap.clone() if oldInfo, ok := storageMap2[types.UID(oldCRD.UID)]; ok { - // destroy only the main storage. Those for the subresources share cacher and etcd clients. - oldInfo.storage.CustomResource.DestroyFunc() + for _, storage := range oldInfo.storages { + // destroy only the main storage. Those for the subresources share cacher and etcd clients. + storage.CustomResource.DestroyFunc() + } delete(storageMap2, types.UID(oldCRD.UID)) } @@ -346,9 +378,11 @@ func (r *crdHandler) removeDeadStorage() { } } if !found { - glog.V(4).Infof("Removing dead CRD storage for %v", s.requestScope.Resource) - // destroy only the main storage. Those for the subresources share cacher and etcd clients. - s.storage.CustomResource.DestroyFunc() + glog.V(4).Infof("Removing dead CRD storage for %s/%s", s.spec.Group, s.spec.Names.Kind) + for _, storage := range s.storages { + // destroy only the main storage. Those for the subresources share cacher and etcd clients. + storage.CustomResource.DestroyFunc() + } delete(storageMap2, uid) } } @@ -362,9 +396,11 @@ func (r *crdHandler) GetCustomResourceListerCollectionDeleter(crd *apiextensions if err != nil { return nil, err } - return info.storage.CustomResource, nil + return info.storages[info.storageVersion].CustomResource, nil } +var swaggerMetadataDescriptions = metav1.ObjectMeta{}.SwaggerDoc() + func (r *crdHandler) getOrCreateServingInfoFor(crd *apiextensions.CustomResourceDefinition) (*crdInfo, error) { storageMap := r.customStorage.Load().(crdStorageMap) if ret, ok := storageMap[crd.UID]; ok { @@ -379,153 +415,157 @@ func (r *crdHandler) getOrCreateServingInfoFor(crd *apiextensions.CustomResource return ret, nil } - // In addition to Unstructured objects (Custom Resources), we also may sometimes need to - // decode unversioned Options objects, so we delegate to parameterScheme for such types. - parameterScheme := runtime.NewScheme() - parameterScheme.AddUnversionedTypes(schema.GroupVersion{Group: crd.Spec.Group, Version: crd.Spec.Version}, - &metav1.ListOptions{}, - &metav1.ExportOptions{}, - &metav1.GetOptions{}, - &metav1.DeleteOptions{}, - ) - parameterCodec := runtime.NewParameterCodec(parameterScheme) - - kind := schema.GroupVersionKind{Group: crd.Spec.Group, Version: crd.Spec.Version, Kind: crd.Status.AcceptedNames.Kind} - typer := UnstructuredObjectTyper{ - Delegate: parameterScheme, - UnstructuredTyper: discovery.NewUnstructuredObjectTyper(nil), - } - creator := unstructuredCreator{} - - validator, _, err := apiservervalidation.NewSchemaValidator(crd.Spec.Validation) + storageVersion, err := apiextensions.GetCRDStorageVersion(crd) if err != nil { return nil, err } - var statusSpec *apiextensions.CustomResourceSubresourceStatus - var statusValidator *validate.SchemaValidator - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && crd.Spec.Subresources != nil && crd.Spec.Subresources.Status != nil { - statusSpec = crd.Spec.Subresources.Status + // Scope/Storages per version. + requestScopes := map[string]handlers.RequestScope{} + storages := map[string]customresource.CustomResourceStorage{} + statusScopes := map[string]handlers.RequestScope{} + scaleScopes := map[string]handlers.RequestScope{} - // for the status subresource, validate only against the status schema - if crd.Spec.Validation != nil && crd.Spec.Validation.OpenAPIV3Schema != nil && crd.Spec.Validation.OpenAPIV3Schema.Properties != nil { - if statusSchema, ok := crd.Spec.Validation.OpenAPIV3Schema.Properties["status"]; ok { - openapiSchema := &spec.Schema{} - if err := apiservervalidation.ConvertJSONSchemaProps(&statusSchema, openapiSchema); err != nil { - return nil, err + for _, v := range crd.Spec.Versions { + safeConverter, unsafeConverter := conversion.NewCRDConverter(crd) + // In addition to Unstructured objects (Custom Resources), we also may sometimes need to + // decode unversioned Options objects, so we delegate to parameterScheme for such types. + parameterScheme := runtime.NewScheme() + parameterScheme.AddUnversionedTypes(schema.GroupVersion{Group: crd.Spec.Group, Version: v.Name}, + &metav1.ListOptions{}, + &metav1.ExportOptions{}, + &metav1.GetOptions{}, + &metav1.DeleteOptions{}, + ) + parameterCodec := runtime.NewParameterCodec(parameterScheme) + + kind := schema.GroupVersionKind{Group: crd.Spec.Group, Version: v.Name, Kind: crd.Status.AcceptedNames.Kind} + typer := newUnstructuredObjectTyper(parameterScheme) + creator := unstructuredCreator{} + + validator, _, err := apiservervalidation.NewSchemaValidator(crd.Spec.Validation) + if err != nil { + return nil, err + } + + var statusSpec *apiextensions.CustomResourceSubresourceStatus + var statusValidator *validate.SchemaValidator + if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && crd.Spec.Subresources != nil && crd.Spec.Subresources.Status != nil { + statusSpec = crd.Spec.Subresources.Status + + // for the status subresource, validate only against the status schema + if crd.Spec.Validation != nil && crd.Spec.Validation.OpenAPIV3Schema != nil && crd.Spec.Validation.OpenAPIV3Schema.Properties != nil { + if statusSchema, ok := crd.Spec.Validation.OpenAPIV3Schema.Properties["status"]; ok { + openapiSchema := &spec.Schema{} + if err := apiservervalidation.ConvertJSONSchemaProps(&statusSchema, openapiSchema); err != nil { + return nil, err + } + statusValidator = validate.NewSchemaValidator(openapiSchema, nil, "", strfmt.Default) } - statusValidator = validate.NewSchemaValidator(openapiSchema, nil, "", strfmt.Default) } } - } - var scaleSpec *apiextensions.CustomResourceSubresourceScale - if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && crd.Spec.Subresources != nil && crd.Spec.Subresources.Scale != nil { - scaleSpec = crd.Spec.Subresources.Scale - } + var scaleSpec *apiextensions.CustomResourceSubresourceScale + if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && crd.Spec.Subresources != nil && crd.Spec.Subresources.Scale != nil { + scaleSpec = crd.Spec.Subresources.Scale + } - // TODO: identify how to pass printer specification from the CRD - table, err := tableconvertor.New(nil) - if err != nil { - glog.V(2).Infof("The CRD for %v has an invalid printer specification, falling back to default printing: %v", kind, err) - } + table, err := tableconvertor.New(crd.Spec.AdditionalPrinterColumns) + if err != nil { + glog.V(2).Infof("The CRD for %v has an invalid printer specification, falling back to default printing: %v", kind, err) + } - customResourceStorage := customresource.NewStorage( - schema.GroupResource{Group: crd.Spec.Group, Resource: crd.Status.AcceptedNames.Plural}, - schema.GroupVersionKind{Group: crd.Spec.Group, Version: crd.Spec.Version, Kind: crd.Status.AcceptedNames.ListKind}, - customresource.NewStrategy( - typer, - crd.Spec.Scope == apiextensions.NamespaceScoped, - kind, - validator, - statusValidator, - statusSpec, - scaleSpec, - ), - r.restOptionsGetter, - crd.Status.AcceptedNames.Categories, - table, - ) + storages[v.Name] = customresource.NewStorage( + schema.GroupResource{Group: crd.Spec.Group, Resource: crd.Status.AcceptedNames.Plural}, + schema.GroupVersionKind{Group: crd.Spec.Group, Version: v.Name, Kind: crd.Status.AcceptedNames.ListKind}, + customresource.NewStrategy( + typer, + crd.Spec.Scope == apiextensions.NamespaceScoped, + kind, + validator, + statusValidator, + statusSpec, + scaleSpec, + ), + crdConversionRESTOptionsGetter{ + RESTOptionsGetter: r.restOptionsGetter, + converter: safeConverter, + decoderVersion: schema.GroupVersion{Group: crd.Spec.Group, Version: v.Name}, + encoderVersion: schema.GroupVersion{Group: crd.Spec.Group, Version: storageVersion}, + }, + crd.Status.AcceptedNames.Categories, + table, + ) - selfLinkPrefix := "" - switch crd.Spec.Scope { - case apiextensions.ClusterScoped: - selfLinkPrefix = "/" + path.Join("apis", crd.Spec.Group, crd.Spec.Version) + "/" + crd.Status.AcceptedNames.Plural + "/" - case apiextensions.NamespaceScoped: - selfLinkPrefix = "/" + path.Join("apis", crd.Spec.Group, crd.Spec.Version, "namespaces") + "/" - } + selfLinkPrefix := "" + switch crd.Spec.Scope { + case apiextensions.ClusterScoped: + selfLinkPrefix = "/" + path.Join("apis", crd.Spec.Group, v.Name) + "/" + crd.Status.AcceptedNames.Plural + "/" + case apiextensions.NamespaceScoped: + selfLinkPrefix = "/" + path.Join("apis", crd.Spec.Group, v.Name, "namespaces") + "/" + } - clusterScoped := crd.Spec.Scope == apiextensions.ClusterScoped + clusterScoped := crd.Spec.Scope == apiextensions.ClusterScoped - var ctxFn handlers.ContextFunc - ctxFn = func(req *http.Request) apirequest.Context { - ret, _ := r.requestContextMapper.Get(req) - return ret - } + requestScopes[v.Name] = handlers.RequestScope{ + Namer: handlers.ContextBasedNaming{ + SelfLinker: meta.NewAccessor(), + ClusterScoped: clusterScoped, + SelfLinkPathPrefix: selfLinkPrefix, + }, + Serializer: unstructuredNegotiatedSerializer{typer: typer, creator: creator, converter: safeConverter}, + ParameterCodec: parameterCodec, - requestScope := handlers.RequestScope{ - Namer: handlers.ContextBasedNaming{ - GetContext: ctxFn, + Creater: creator, + Convertor: safeConverter, + Defaulter: unstructuredDefaulter{parameterScheme}, + Typer: typer, + UnsafeConvertor: unsafeConverter, + + Resource: schema.GroupVersionResource{Group: crd.Spec.Group, Version: v.Name, Resource: crd.Status.AcceptedNames.Plural}, + Kind: kind, + + MetaGroupVersion: metav1.SchemeGroupVersion, + + TableConvertor: storages[v.Name].CustomResource, + } + + // override scaleSpec subresource values + // shallow copy + scaleScope := requestScopes[v.Name] + scaleConverter := scale.NewScaleConverter() + scaleScope.Subresource = "scale" + scaleScope.Serializer = serializer.NewCodecFactory(scaleConverter.Scheme()) + scaleScope.Kind = autoscalingv1.SchemeGroupVersion.WithKind("Scale") + scaleScope.Namer = handlers.ContextBasedNaming{ SelfLinker: meta.NewAccessor(), ClusterScoped: clusterScoped, SelfLinkPathPrefix: selfLinkPrefix, - }, - ContextFunc: func(req *http.Request) apirequest.Context { - ret, _ := r.requestContextMapper.Get(req) - return ret - }, + SelfLinkPathSuffix: "/scale", + } + scaleScopes[v.Name] = scaleScope - Serializer: unstructuredNegotiatedSerializer{typer: typer, creator: creator}, - ParameterCodec: parameterCodec, - - Creater: creator, - Convertor: crdObjectConverter{ - UnstructuredObjectConverter: unstructured.UnstructuredObjectConverter{}, - clusterScoped: clusterScoped, - }, - Defaulter: unstructuredDefaulter{parameterScheme}, - Typer: typer, - UnsafeConvertor: unstructured.UnstructuredObjectConverter{}, - - Resource: schema.GroupVersionResource{Group: crd.Spec.Group, Version: crd.Spec.Version, Resource: crd.Status.AcceptedNames.Plural}, - Kind: kind, - - MetaGroupVersion: metav1.SchemeGroupVersion, - - TableConvertor: customResourceStorage.CustomResource, + // override status subresource values + // shallow copy + statusScope := requestScopes[v.Name] + statusScope.Subresource = "status" + statusScope.Namer = handlers.ContextBasedNaming{ + SelfLinker: meta.NewAccessor(), + ClusterScoped: clusterScoped, + SelfLinkPathPrefix: selfLinkPrefix, + SelfLinkPathSuffix: "/status", + } + statusScopes[v.Name] = statusScope } ret := &crdInfo{ - spec: &crd.Spec, - acceptedNames: &crd.Status.AcceptedNames, - - storage: customResourceStorage, - requestScope: requestScope, - scaleRequestScope: requestScope, // shallow copy - statusRequestScope: requestScope, // shallow copy - } - - // override scaleSpec subresource values - scaleConverter := scale.NewScaleConverter() - ret.scaleRequestScope.Subresource = "scale" - ret.scaleRequestScope.Serializer = serializer.NewCodecFactory(scaleConverter.Scheme()) - ret.scaleRequestScope.Kind = autoscalingv1.SchemeGroupVersion.WithKind("Scale") - ret.scaleRequestScope.Namer = handlers.ContextBasedNaming{ - GetContext: ctxFn, - SelfLinker: meta.NewAccessor(), - ClusterScoped: clusterScoped, - SelfLinkPathPrefix: selfLinkPrefix, - SelfLinkPathSuffix: "/scale", - } - - // override status subresource values - ret.statusRequestScope.Subresource = "status" - ret.statusRequestScope.Namer = handlers.ContextBasedNaming{ - GetContext: ctxFn, - SelfLinker: meta.NewAccessor(), - ClusterScoped: clusterScoped, - SelfLinkPathPrefix: selfLinkPrefix, - SelfLinkPathSuffix: "/status", + spec: &crd.Spec, + acceptedNames: &crd.Status.AcceptedNames, + storages: storages, + requestScopes: requestScopes, + scaleRequestScopes: scaleScopes, + statusRequestScopes: statusScopes, + storageVersion: storageVersion, } // Copy because we cannot write to storageMap without a race @@ -538,27 +578,10 @@ func (r *crdHandler) getOrCreateServingInfoFor(crd *apiextensions.CustomResource return ret, nil } -// crdObjectConverter is a converter that supports field selectors for CRDs. -type crdObjectConverter struct { - unstructured.UnstructuredObjectConverter - clusterScoped bool -} - -func (c crdObjectConverter) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { - // We currently only support metadata.namespace and metadata.name. - switch { - case label == "metadata.name": - return label, value, nil - case !c.clusterScoped && label == "metadata.namespace": - return label, value, nil - default: - return "", "", fmt.Errorf("field label not supported: %s", label) - } -} - type unstructuredNegotiatedSerializer struct { - typer runtime.ObjectTyper - creator runtime.ObjectCreater + typer runtime.ObjectTyper + creator runtime.ObjectCreater + converter runtime.ObjectConvertor } func (s unstructuredNegotiatedSerializer) SupportedMediaTypes() []runtime.SerializerInfo { @@ -583,11 +606,12 @@ func (s unstructuredNegotiatedSerializer) SupportedMediaTypes() []runtime.Serial } func (s unstructuredNegotiatedSerializer) EncoderForVersion(encoder runtime.Encoder, gv runtime.GroupVersioner) runtime.Encoder { - return versioning.NewDefaultingCodecForScheme(Scheme, encoder, nil, gv, nil) + return versioning.NewCodec(encoder, nil, s.converter, Scheme, Scheme, Scheme, gv, nil) } func (s unstructuredNegotiatedSerializer) DecoderToVersion(decoder runtime.Decoder, gv runtime.GroupVersioner) runtime.Decoder { - return versioning.NewDefaultingCodecForScheme(Scheme, nil, decoder, nil, gv) + d := schemaCoercingDecoder{delegate: decoder, validator: unstructuredSchemaCoercer{}} + return versioning.NewDefaultingCodecForScheme(Scheme, nil, d, nil, gv) } type UnstructuredObjectTyper struct { @@ -595,6 +619,13 @@ type UnstructuredObjectTyper struct { UnstructuredTyper runtime.ObjectTyper } +func newUnstructuredObjectTyper(Delegate runtime.ObjectTyper) UnstructuredObjectTyper { + return UnstructuredObjectTyper{ + Delegate: Delegate, + UnstructuredTyper: discovery.NewUnstructuredObjectTyper(), + } +} + func (t UnstructuredObjectTyper) ObjectKinds(obj runtime.Object) ([]schema.GroupVersionKind, bool, error) { // Delegate for things other than Unstructured. if _, ok := obj.(runtime.Unstructured); !ok { @@ -661,3 +692,192 @@ func (in crdStorageMap) clone() crdStorageMap { } return out } + +// crdConversionRESTOptionsGetter overrides the codec with one using the +// provided custom converter and custom encoder and decoder version. +type crdConversionRESTOptionsGetter struct { + generic.RESTOptionsGetter + converter runtime.ObjectConvertor + encoderVersion schema.GroupVersion + decoderVersion schema.GroupVersion +} + +func (t crdConversionRESTOptionsGetter) GetRESTOptions(resource schema.GroupResource) (generic.RESTOptions, error) { + ret, err := t.RESTOptionsGetter.GetRESTOptions(resource) + if err == nil { + d := schemaCoercingDecoder{delegate: ret.StorageConfig.Codec, validator: unstructuredSchemaCoercer{ + // drop invalid fields while decoding old CRs (before we had any ObjectMeta validation) + dropInvalidMetadata: true, + }} + c := schemaCoercingConverter{delegate: t.converter, validator: unstructuredSchemaCoercer{}} + ret.StorageConfig.Codec = versioning.NewCodec(ret.StorageConfig.Codec, d, c, &unstructuredCreator{}, discovery.NewUnstructuredObjectTyper(), &unstructuredDefaulter{delegate: Scheme}, t.encoderVersion, t.decoderVersion) + } + return ret, err +} + +// schemaCoercingDecoder calls the delegate decoder, and then applies the Unstructured schema validator +// to coerce the schema. +type schemaCoercingDecoder struct { + delegate runtime.Decoder + validator unstructuredSchemaCoercer +} + +var _ runtime.Decoder = schemaCoercingDecoder{} + +func (d schemaCoercingDecoder) Decode(data []byte, defaults *schema.GroupVersionKind, into runtime.Object) (runtime.Object, *schema.GroupVersionKind, error) { + obj, gvk, err := d.delegate.Decode(data, defaults, into) + if err != nil { + return nil, gvk, err + } + if u, ok := obj.(*unstructured.Unstructured); ok { + if err := d.validator.apply(u); err != nil { + return nil, gvk, err + } + } + + return obj, gvk, nil +} + +// schemaCoercingConverter calls the delegate converter and applies the Unstructured validator to +// coerce the schema. +type schemaCoercingConverter struct { + delegate runtime.ObjectConvertor + validator unstructuredSchemaCoercer +} + +var _ runtime.ObjectConvertor = schemaCoercingConverter{} + +func (v schemaCoercingConverter) Convert(in, out, context interface{}) error { + if err := v.delegate.Convert(in, out, context); err != nil { + return err + } + + if u, ok := out.(*unstructured.Unstructured); ok { + if err := v.validator.apply(u); err != nil { + return err + } + } + + return nil +} + +func (v schemaCoercingConverter) ConvertToVersion(in runtime.Object, gv runtime.GroupVersioner) (runtime.Object, error) { + out, err := v.delegate.ConvertToVersion(in, gv) + if err != nil { + return nil, err + } + + if u, ok := out.(*unstructured.Unstructured); ok { + if err := v.validator.apply(u); err != nil { + return nil, err + } + } + + return out, nil +} + +func (v schemaCoercingConverter) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { + return v.ConvertFieldLabel(version, kind, label, value) +} + +// unstructuredSchemaCoercer does the validation for Unstructured that json.Unmarshal +// does for native types. This includes: +// - validating and pruning ObjectMeta (here with optional error instead of pruning) +// - TODO: application of an OpenAPI validator (against the whole object or a top-level field of it). +// - TODO: optionally application of post-validation algorithms like defaulting and/or OpenAPI based pruning. +type unstructuredSchemaCoercer struct { + dropInvalidMetadata bool +} + +func (v *unstructuredSchemaCoercer) apply(u *unstructured.Unstructured) error { + // save implicit meta fields that don't have to be specified in the validation spec + kind, foundKind, err := unstructured.NestedString(u.UnstructuredContent(), "kind") + if err != nil { + return err + } + apiVersion, foundApiVersion, err := unstructured.NestedString(u.UnstructuredContent(), "apiVersion") + if err != nil { + return err + } + objectMeta, foundObjectMeta, err := getObjectMeta(u, v.dropInvalidMetadata) + if err != nil { + return err + } + + // restore meta fields, starting clean + if foundKind { + u.SetKind(kind) + } + if foundApiVersion { + u.SetAPIVersion(apiVersion) + } + if foundObjectMeta { + if err := setObjectMeta(u, objectMeta); err != nil { + return err + } + } + + return nil +} + +var encodingjson = json.CaseSensitiveJsonIterator() + +func getObjectMeta(u *unstructured.Unstructured, dropMalformedFields bool) (*metav1.ObjectMeta, bool, error) { + metadata, found := u.UnstructuredContent()["metadata"] + if !found { + return nil, false, nil + } + + // round-trip through JSON first, hoping that unmarshaling just works + objectMeta := &metav1.ObjectMeta{} + metadataBytes, err := encodingjson.Marshal(metadata) + if err != nil { + return nil, false, err + } + if err = encodingjson.Unmarshal(metadataBytes, objectMeta); err == nil { + // if successful, return + return objectMeta, true, nil + } + if !dropMalformedFields { + // if we're not trying to drop malformed fields, return the error + return nil, true, err + } + + metadataMap, ok := metadata.(map[string]interface{}) + if !ok { + return nil, false, fmt.Errorf("invalid metadata: expected object, got %T", metadata) + } + + // Go field by field accumulating into the metadata object. + // This takes advantage of the fact that you can repeatedly unmarshal individual fields into a single struct, + // each iteration preserving the old key-values. + accumulatedObjectMeta := &metav1.ObjectMeta{} + testObjectMeta := &metav1.ObjectMeta{} + for k, v := range metadataMap { + // serialize a single field + if singleFieldBytes, err := encodingjson.Marshal(map[string]interface{}{k: v}); err == nil { + // do a test unmarshal + if encodingjson.Unmarshal(singleFieldBytes, testObjectMeta) == nil { + // if that succeeds, unmarshal for real + encodingjson.Unmarshal(singleFieldBytes, accumulatedObjectMeta) + } + } + } + + return accumulatedObjectMeta, true, nil +} + +func setObjectMeta(u *unstructured.Unstructured, objectMeta *metav1.ObjectMeta) error { + if objectMeta == nil { + unstructured.RemoveNestedField(u.UnstructuredContent(), "metadata") + return nil + } + + metadata, err := runtime.DefaultUnstructuredConverter.ToUnstructured(objectMeta) + if err != nil { + return err + } + + u.UnstructuredContent()["metadata"] = metadata + return nil +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go index 81c3ac705..a6d6e23a1 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go @@ -17,9 +17,23 @@ limitations under the License. package apiserver import ( + "math/rand" + "reflect" "testing" + corev1 "k8s.io/api/core/v1" + "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + "k8s.io/apiextensions-apiserver/pkg/apiserver/conversion" + "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/api/testing/fuzzer" + metafuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/runtime/serializer/json" + "k8s.io/apimachinery/pkg/util/diff" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" ) func TestConvertFieldLabel(t *testing.T) { @@ -64,10 +78,14 @@ func TestConvertFieldLabel(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { - c := crdObjectConverter{ - UnstructuredObjectConverter: unstructured.UnstructuredObjectConverter{}, - clusterScoped: test.clusterScoped, + crd := apiextensions.CustomResourceDefinition{} + + if test.clusterScoped { + crd.Spec.Scope = apiextensions.ClusterScoped + } else { + crd.Spec.Scope = apiextensions.NamespaceScoped } + _, c := conversion.NewCRDConverter(&crd) label, value, err := c.ConvertFieldLabel("", "", test.label, "value") if e, a := test.expectError, err != nil; e != a { @@ -89,3 +107,202 @@ func TestConvertFieldLabel(t *testing.T) { }) } } + +func TestRoundtripObjectMeta(t *testing.T) { + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + codec := json.NewSerializer(json.DefaultMetaFactory, scheme, scheme, false) + seed := rand.Int63() + fuzzer := fuzzer.FuzzerFor(metafuzzer.Funcs, rand.NewSource(seed), codecs) + + N := 1000 + for i := 0; i < N; i++ { + u := &unstructured.Unstructured{Object: map[string]interface{}{}} + original := &metav1.ObjectMeta{} + fuzzer.Fuzz(original) + if err := setObjectMeta(u, original); err != nil { + t.Fatalf("unexpected error setting ObjectMeta: %v", err) + } + o, _, err := getObjectMeta(u, false) + if err != nil { + t.Fatalf("unexpected error getting the Objectmeta: %v", err) + } + + if !equality.Semantic.DeepEqual(original, o) { + t.Errorf("diff: %v\nCodec: %#v", diff.ObjectReflectDiff(original, o), codec) + } + } +} + +// TestMalformedObjectMetaFields sets a number of different random values and types for all +// metadata fields. If json.Unmarshal accepts them, compare that getObjectMeta +// gives the same result. Otherwise, drop malformed fields. +func TestMalformedObjectMetaFields(t *testing.T) { + fuzzer := fuzzer.FuzzerFor(metafuzzer.Funcs, rand.NewSource(rand.Int63()), serializer.NewCodecFactory(runtime.NewScheme())) + spuriousValues := func() []interface{} { + return []interface{}{ + // primitives + nil, + int64(1), + float64(1.5), + true, + "a", + // well-formed complex values + []interface{}{"a", "b"}, + map[string]interface{}{"a": "1", "b": "2"}, + []interface{}{int64(1), int64(2)}, + []interface{}{float64(1.5), float64(2.5)}, + // known things json decoding tolerates + map[string]interface{}{"a": "1", "b": nil}, + // malformed things + map[string]interface{}{"a": "1", "b": []interface{}{"nested"}}, + []interface{}{"a", int64(1), float64(1.5), true, []interface{}{"nested"}}, + } + } + N := 100 + for i := 0; i < N; i++ { + fuzzedObjectMeta := &metav1.ObjectMeta{} + fuzzer.Fuzz(fuzzedObjectMeta) + goodMetaMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(fuzzedObjectMeta.DeepCopy()) + if err != nil { + t.Fatal(err) + } + for _, pth := range jsonPaths(nil, goodMetaMap) { + for _, v := range spuriousValues() { + // skip values of same type, because they can only cause decoding errors further insides + orig, err := JsonPathValue(goodMetaMap, pth, 0) + if err != nil { + t.Fatalf("unexpected to not find something at %v: %v", pth, err) + } + if reflect.TypeOf(v) == reflect.TypeOf(orig) { + continue + } + + // make a spurious map + spuriousMetaMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(fuzzedObjectMeta.DeepCopy()) + if err != nil { + t.Fatal(err) + } + if err := SetJsonPath(spuriousMetaMap, pth, 0, v); err != nil { + t.Fatal(err) + } + + // See if it can unmarshal to object meta + spuriousJSON, err := encodingjson.Marshal(spuriousMetaMap) + if err != nil { + t.Fatalf("error on %v=%#v: %v", pth, v, err) + } + expectedObjectMeta := &metav1.ObjectMeta{} + if err := encodingjson.Unmarshal(spuriousJSON, expectedObjectMeta); err != nil { + // if standard json unmarshal would fail decoding this field, drop the field entirely + truncatedMetaMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(fuzzedObjectMeta.DeepCopy()) + if err != nil { + t.Fatal(err) + } + + // we expect this logic for the different fields: + switch { + default: + // delete complete top-level field by default + DeleteJsonPath(truncatedMetaMap, pth[:1], 0) + } + + truncatedJSON, err := encodingjson.Marshal(truncatedMetaMap) + if err != nil { + t.Fatalf("error on %v=%#v: %v", pth, v, err) + } + expectedObjectMeta = &metav1.ObjectMeta{} + if err := encodingjson.Unmarshal(truncatedJSON, expectedObjectMeta); err != nil { + t.Fatalf("error on %v=%#v: %v", pth, v, err) + } + } + + // make sure dropInvalidTypedFields+getObjectMeta matches what we expect + u := &unstructured.Unstructured{Object: map[string]interface{}{"metadata": spuriousMetaMap}} + actualObjectMeta, _, err := getObjectMeta(u, true) + if err != nil { + t.Errorf("got unexpected error after dropping invalid typed fields on %v=%#v: %v", pth, v, err) + continue + } + + if !equality.Semantic.DeepEqual(expectedObjectMeta, actualObjectMeta) { + t.Errorf("%v=%#v, diff: %v\n", pth, v, diff.ObjectReflectDiff(expectedObjectMeta, actualObjectMeta)) + t.Errorf("expectedObjectMeta %#v", expectedObjectMeta) + } + } + } + } +} + +func TestGetObjectMetaNils(t *testing.T) { + u := &unstructured.Unstructured{ + Object: map[string]interface{}{ + "kind": "Pod", + "apiVersion": "v1", + "metadata": map[string]interface{}{ + "generateName": nil, + "labels": map[string]interface{}{ + "foo": nil, + }, + }, + }, + } + + o, _, err := getObjectMeta(u, true) + if err != nil { + t.Fatal(err) + } + if o.GenerateName != "" { + t.Errorf("expected null json value to be read as \"\" string, but got: %q", o.GenerateName) + } + if got, expected := o.Labels, map[string]string{"foo": ""}; !reflect.DeepEqual(got, expected) { + t.Errorf("unexpected labels, expected=%#v, got=%#v", expected, got) + } + + // double check this what the kube JSON decode is doing + bs, _ := encodingjson.Marshal(u.UnstructuredContent()) + kubeObj, _, err := clientgoscheme.Codecs.UniversalDecoder(corev1.SchemeGroupVersion).Decode(bs, nil, nil) + if err != nil { + t.Fatal(err) + } + pod, ok := kubeObj.(*corev1.Pod) + if !ok { + t.Fatalf("expected v1 Pod, got: %T", pod) + } + if got, expected := o.GenerateName, pod.ObjectMeta.GenerateName; got != expected { + t.Errorf("expected generatedName to be %q, got %q", expected, got) + } + if got, expected := o.Labels, pod.ObjectMeta.Labels; !reflect.DeepEqual(got, expected) { + t.Errorf("expected labels to be %v, got %v", expected, got) + } +} + +func TestGetObjectMeta(t *testing.T) { + for i := 0; i < 100; i++ { + u := &unstructured.Unstructured{Object: map[string]interface{}{ + "metadata": map[string]interface{}{ + "name": "good", + "Name": "bad1", + "nAme": "bad2", + "naMe": "bad3", + "namE": "bad4", + + "namespace": "good", + "Namespace": "bad1", + "nAmespace": "bad2", + "naMespace": "bad3", + "namEspace": "bad4", + + "creationTimestamp": "a", + }, + }} + + meta, _, err := getObjectMeta(u, true) + if err != nil { + t.Fatal(err) + } + if meta.Name != "good" || meta.Namespace != "good" { + t.Fatalf("got %#v", meta) + } + } +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/jsonpath_test.go b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/jsonpath_test.go new file mode 100644 index 000000000..8d9bb24f8 --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/jsonpath_test.go @@ -0,0 +1,235 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package apiserver + +import ( + "bytes" + "fmt" + + "k8s.io/apimachinery/pkg/runtime" +) + +type ( + jsonPathNode struct { + index *int + field string + } + JsonPath []jsonPathNode +) + +func (p JsonPath) String() string { + var buf bytes.Buffer + for _, n := range p { + if n.index == nil { + buf.WriteString("." + n.field) + } else { + buf.WriteString(fmt.Sprintf("[%d]", *n.index)) + } + } + return buf.String() +} + +func jsonPaths(base JsonPath, j map[string]interface{}) []JsonPath { + res := make([]JsonPath, 0, len(j)) + for k, old := range j { + kPth := append(append([]jsonPathNode(nil), base...), jsonPathNode{field: k}) + res = append(res, kPth) + + switch old := old.(type) { + case map[string]interface{}: + res = append(res, jsonPaths(kPth, old)...) + case []interface{}: + res = append(res, jsonIterSlice(kPth, old)...) + } + } + return res +} + +func jsonIterSlice(base JsonPath, j []interface{}) []JsonPath { + res := make([]JsonPath, 0, len(j)) + for i, old := range j { + index := i + iPth := append(append([]jsonPathNode(nil), base...), jsonPathNode{index: &index}) + res = append(res, iPth) + + switch old := old.(type) { + case map[string]interface{}: + res = append(res, jsonPaths(iPth, old)...) + case []interface{}: + res = append(res, jsonIterSlice(iPth, old)...) + } + } + return res +} + +func JsonPathValue(j map[string]interface{}, pth JsonPath, base int) (interface{}, error) { + if len(pth) == base { + return nil, fmt.Errorf("empty json path is invalid for object") + } + if pth[base].index != nil { + return nil, fmt.Errorf("index json path is invalid for object") + } + field, ok := j[pth[base].field] + if !ok || len(pth) == base+1 { + if len(pth) > base+1 { + return nil, fmt.Errorf("invalid non-terminal json path %q for non-existing field", pth) + } + return j[pth[base].field], nil + } + switch field := field.(type) { + case map[string]interface{}: + return JsonPathValue(field, pth, base+1) + case []interface{}: + return jsonPathValueSlice(field, pth, base+1) + default: + return nil, fmt.Errorf("invalid non-terminal json path %q for field", pth[:base+1]) + } +} + +func jsonPathValueSlice(j []interface{}, pth JsonPath, base int) (interface{}, error) { + if len(pth) == base { + return nil, fmt.Errorf("empty json path %q is invalid for object", pth) + } + if pth[base].index == nil { + return nil, fmt.Errorf("field json path %q is invalid for object", pth[:base+1]) + } + if *pth[base].index >= len(j) { + return nil, fmt.Errorf("invalid index %q for array of size %d", pth[:base+1], len(j)) + } + if len(pth) == base+1 { + return j[*pth[base].index], nil + } + switch item := j[*pth[base].index].(type) { + case map[string]interface{}: + return JsonPathValue(item, pth, base+1) + case []interface{}: + return jsonPathValueSlice(item, pth, base+1) + default: + return nil, fmt.Errorf("invalid non-terminal json path %q for index", pth[:base+1]) + } +} + +func SetJsonPath(j map[string]interface{}, pth JsonPath, base int, value interface{}) error { + if len(pth) == base { + return fmt.Errorf("empty json path is invalid for object") + } + if pth[base].index != nil { + return fmt.Errorf("index json path is invalid for object") + } + field, ok := j[pth[base].field] + if !ok || len(pth) == base+1 { + if len(pth) > base+1 { + return fmt.Errorf("invalid non-terminal json path %q for non-existing field", pth) + } + j[pth[base].field] = runtime.DeepCopyJSONValue(value) + return nil + } + switch field := field.(type) { + case map[string]interface{}: + return SetJsonPath(field, pth, base+1, value) + case []interface{}: + return setJsonPathSlice(field, pth, base+1, value) + default: + return fmt.Errorf("invalid non-terminal json path %q for field", pth[:base+1]) + } +} + +func setJsonPathSlice(j []interface{}, pth JsonPath, base int, value interface{}) error { + if len(pth) == base { + return fmt.Errorf("empty json path %q is invalid for object", pth) + } + if pth[base].index == nil { + return fmt.Errorf("field json path %q is invalid for object", pth[:base+1]) + } + if *pth[base].index >= len(j) { + return fmt.Errorf("invalid index %q for array of size %d", pth[:base+1], len(j)) + } + if len(pth) == base+1 { + j[*pth[base].index] = runtime.DeepCopyJSONValue(value) + return nil + } + switch item := j[*pth[base].index].(type) { + case map[string]interface{}: + return SetJsonPath(item, pth, base+1, value) + case []interface{}: + return setJsonPathSlice(item, pth, base+1, value) + default: + return fmt.Errorf("invalid non-terminal json path %q for index", pth[:base+1]) + } +} + +func DeleteJsonPath(j map[string]interface{}, pth JsonPath, base int) error { + if len(pth) == base { + return fmt.Errorf("empty json path is invalid for object") + } + if pth[base].index != nil { + return fmt.Errorf("index json path is invalid for object") + } + field, ok := j[pth[base].field] + if !ok || len(pth) == base+1 { + if len(pth) > base+1 { + return fmt.Errorf("invalid non-terminal json path %q for non-existing field", pth) + } + delete(j, pth[base].field) + return nil + } + switch field := field.(type) { + case map[string]interface{}: + return DeleteJsonPath(field, pth, base+1) + case []interface{}: + if len(pth) == base+2 { + if pth[base+1].index == nil { + return fmt.Errorf("field json path %q is invalid for object", pth) + } + j[pth[base].field] = append(field[:*pth[base+1].index], field[*pth[base+1].index+1:]...) + return nil + } + return deleteJsonPathSlice(field, pth, base+1) + default: + return fmt.Errorf("invalid non-terminal json path %q for field", pth[:base+1]) + } +} + +func deleteJsonPathSlice(j []interface{}, pth JsonPath, base int) error { + if len(pth) == base { + return fmt.Errorf("empty json path %q is invalid for object", pth) + } + if pth[base].index == nil { + return fmt.Errorf("field json path %q is invalid for object", pth[:base+1]) + } + if *pth[base].index >= len(j) { + return fmt.Errorf("invalid index %q for array of size %d", pth[:base+1], len(j)) + } + if len(pth) == base+1 { + return fmt.Errorf("cannot delete item at index %q in-place", pth[:base]) + } + switch item := j[*pth[base].index].(type) { + case map[string]interface{}: + return DeleteJsonPath(item, pth, base+1) + case []interface{}: + if len(pth) == base+2 { + if pth[base+1].index == nil { + return fmt.Errorf("field json path %q is invalid for object", pth) + } + j[*pth[base].index] = append(item[:*pth[base+1].index], item[*pth[base+1].index+1:]) + return nil + } + return deleteJsonPathSlice(item, pth, base+1) + default: + return fmt.Errorf("invalid non-terminal json path %q for index", pth[:base+1]) + } +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD deleted file mode 100644 index 3042da88c..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/apiserver/validation", - deps = [ - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/github.com/go-openapi/strfmt:go_default_library", - "//vendor/github.com/go-openapi/validate:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD deleted file mode 100644 index c6312b730..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clientset.go", - "doc.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/clientset.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/clientset.go index 444418888..63fcb510a 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/clientset.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/clientset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,7 +19,6 @@ limitations under the License. package clientset import ( - glog "github.com/golang/glog" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" @@ -74,7 +73,6 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) if err != nil { - glog.Errorf("failed to create the DiscoveryClient: %v", err) return nil, err } return &cs, nil diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/doc.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/doc.go index 3421911a7..ee865e56d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/BUILD deleted file mode 100644 index 6bf35836d..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clientset_generated.go", - "doc.go", - "register.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/discovery/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/clientset_generated.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/clientset_generated.go index 9988cd0b4..e65fe63ea 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/clientset_generated.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/clientset_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -41,9 +41,10 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { } } - fakePtr := testing.Fake{} - fakePtr.AddReactor("*", "*", testing.ObjectReaction(o)) - fakePtr.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { + cs := &Clientset{} + cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake} + cs.AddReactor("*", "*", testing.ObjectReaction(o)) + cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { gvr := action.GetResource() ns := action.GetNamespace() watch, err := o.Watch(gvr, ns) @@ -53,7 +54,7 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { return true, watch, nil }) - return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}} + return cs } // Clientset implements clientset.Interface. Meant to be embedded into a diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/doc.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/doc.go index 0bc260bca..9b99e7167 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/register.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/register.go index 3113c1a6d..f37309186 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/register.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/register.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD deleted file mode 100644 index 9906c9c1a..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/doc.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/doc.go index 5c5c8debb..7dc375616 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/register.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/register.go index bc08c37e1..bd73f1179 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/register.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/register.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD deleted file mode 100644 index 054ceeca8..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "apiextensions_client.go", - "customresourcedefinition.go", - "doc.go", - "generated_expansion.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/apiextensions_client.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/apiextensions_client.go index 7da7276b7..a1fd337f9 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/apiextensions_client.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/apiextensions_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/customresourcedefinition.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/customresourcedefinition.go index 3a2513caf..f25a6ce34 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/customresourcedefinition.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/customresourcedefinition.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/doc.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/BUILD deleted file mode 100644 index a1d6e27ad..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_apiextensions_client.go", - "fake_customresourcedefinition.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/doc.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_apiextensions_client.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_apiextensions_client.go index 39327a9c3..288683ef9 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_apiextensions_client.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_apiextensions_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_customresourcedefinition.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_customresourcedefinition.go index 10fd3cc15..11aefe869 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_customresourcedefinition.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/fake_customresourcedefinition.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeCustomResourceDefinitions) List(opts v1.ListOptions) (result *v1bet if label == nil { label = labels.Everything() } - list := &v1beta1.CustomResourceDefinitionList{} + list := &v1beta1.CustomResourceDefinitionList{ListMeta: obj.(*v1beta1.CustomResourceDefinitionList).ListMeta} for _, item := range obj.(*v1beta1.CustomResourceDefinitionList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/generated_expansion.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/generated_expansion.go index 07a7c1dce..2a989d4be 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/BUILD deleted file mode 100644 index a31718d05..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clientset.go", - "doc.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/clientset.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/clientset.go index 9519b78f1..152a9fea0 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/clientset.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/clientset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,7 +19,6 @@ limitations under the License. package internalclientset import ( - glog "github.com/golang/glog" apiextensionsinternalversion "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" @@ -66,7 +65,6 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) if err != nil { - glog.Errorf("failed to create the DiscoveryClient: %v", err) return nil, err } return &cs, nil diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/doc.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/doc.go index 22ccee919..01b3d5e0f 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/BUILD deleted file mode 100644 index 3beb9047a..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clientset_generated.go", - "doc.go", - "register.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/discovery/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/clientset_generated.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/clientset_generated.go index 3c0f41dba..72ab169e9 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/clientset_generated.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/clientset_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -41,9 +41,10 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { } } - fakePtr := testing.Fake{} - fakePtr.AddReactor("*", "*", testing.ObjectReaction(o)) - fakePtr.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { + cs := &Clientset{} + cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake} + cs.AddReactor("*", "*", testing.ObjectReaction(o)) + cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { gvr := action.GetResource() ns := action.GetNamespace() watch, err := o.Watch(gvr, ns) @@ -53,7 +54,7 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { return true, watch, nil }) - return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}} + return cs } // Clientset implements clientset.Interface. Meant to be embedded into a diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/doc.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/doc.go index 0bc260bca..9b99e7167 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/register.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/register.go index 5c17a1003..89093fd9f 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/register.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/register.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/BUILD deleted file mode 100644 index ae5835d47..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/doc.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/doc.go index 5c5c8debb..7dc375616 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/register.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/register.go index f9de21961..01df98a6b 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/register.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme/register.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,11 +19,7 @@ limitations under the License. package scheme import ( - os "os" - apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install" - announced "k8s.io/apimachinery/pkg/apimachinery/announced" - registered "k8s.io/apimachinery/pkg/apimachinery/registered" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" @@ -34,15 +30,12 @@ var Scheme = runtime.NewScheme() var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) -var Registry = registered.NewOrDie(os.Getenv("KUBE_API_VERSIONS")) -var GroupFactoryRegistry = make(announced.APIGroupFactoryRegistry) - func init() { v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) - Install(GroupFactoryRegistry, Registry, Scheme) + Install(Scheme) } // Install registers the API group and adds types to a scheme -func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { - apiextensions.Install(groupFactoryRegistry, registry, scheme) +func Install(scheme *runtime.Scheme) { + apiextensions.Install(scheme) } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/BUILD deleted file mode 100644 index d92943a88..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "apiextensions_client.go", - "customresourcedefinition.go", - "doc.go", - "generated_expansion.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/apiextensions_client.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/apiextensions_client.go index 9e08a905a..31b34404c 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/apiextensions_client.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/apiextensions_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -66,17 +66,12 @@ func New(c rest.Interface) *ApiextensionsClient { } func setConfigDefaults(config *rest.Config) error { - g, err := scheme.Registry.Group("apiextensions.k8s.io") - if err != nil { - return err - } - config.APIPath = "/apis" if config.UserAgent == "" { config.UserAgent = rest.DefaultKubernetesUserAgent() } - if config.GroupVersion == nil || config.GroupVersion.Group != g.GroupVersion.Group { - gv := g.GroupVersion + if config.GroupVersion == nil || config.GroupVersion.Group != scheme.Scheme.PrioritizedVersionsForGroup("apiextensions.k8s.io")[0].Group { + gv := scheme.Scheme.PrioritizedVersionsForGroup("apiextensions.k8s.io")[0] config.GroupVersion = &gv } config.NegotiatedSerializer = scheme.Codecs diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/customresourcedefinition.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/customresourcedefinition.go index 322454cdf..f3ddc8044 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/customresourcedefinition.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/customresourcedefinition.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/doc.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/doc.go index b057e5201..86602442b 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/BUILD deleted file mode 100644 index 932e84be2..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_apiextensions_client.go", - "fake_customresourcedefinition.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/doc.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/doc.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/fake_apiextensions_client.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/fake_apiextensions_client.go index 32bb913c0..1a601e5b0 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/fake_apiextensions_client.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/fake_apiextensions_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/fake_customresourcedefinition.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/fake_customresourcedefinition.go index c5cd1da48..74016362d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/fake_customresourcedefinition.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/fake_customresourcedefinition.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeCustomResourceDefinitions) List(opts v1.ListOptions) (result *apiex if label == nil { label = labels.Everything() } - list := &apiextensions.CustomResourceDefinitionList{} + list := &apiextensions.CustomResourceDefinitionList{ListMeta: obj.(*apiextensions.CustomResourceDefinitionList).ListMeta} for _, item := range obj.(*apiextensions.CustomResourceDefinitionList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/generated_expansion.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/generated_expansion.go index 74c295f6c..a88821021 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/generated_expansion.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD deleted file mode 100644 index 57f38ce25..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "factory.go", - "generic.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD deleted file mode 100644 index a0b8cee3d..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/interface.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/interface.go index e88c53087..7b48c57ca 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/interface.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD deleted file mode 100644 index bd2d06784..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "customresourcedefinition.go", - "interface.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/customresourcedefinition.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/customresourcedefinition.go index 9d9b12787..589b4b20c 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/customresourcedefinition.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/customresourcedefinition.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/interface.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/interface.go index 331dad83e..f78edbb59 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/interface.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/factory.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/factory.go index 6e7141621..94d039c72 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/factory.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/factory.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -32,12 +32,16 @@ import ( cache "k8s.io/client-go/tools/cache" ) +// SharedInformerOption defines the functional option type for SharedInformerFactory. +type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory + type sharedInformerFactory struct { client clientset.Interface namespace string tweakListOptions internalinterfaces.TweakListOptionsFunc lock sync.Mutex defaultResync time.Duration + customResync map[reflect.Type]time.Duration informers map[reflect.Type]cache.SharedIndexInformer // startedInformers is used for tracking which informers have been started. @@ -45,23 +49,62 @@ type sharedInformerFactory struct { startedInformers map[reflect.Type]bool } -// NewSharedInformerFactory constructs a new instance of sharedInformerFactory +// WithCustomResyncConfig sets a custom resync period for the specified informer types. +func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + for k, v := range resyncConfig { + factory.customResync[reflect.TypeOf(k)] = v + } + return factory + } +} + +// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory. +func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.tweakListOptions = tweakListOptions + return factory + } +} + +// WithNamespace limits the SharedInformerFactory to the specified namespace. +func WithNamespace(namespace string) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.namespace = namespace + return factory + } +} + +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. func NewSharedInformerFactory(client clientset.Interface, defaultResync time.Duration) SharedInformerFactory { - return NewFilteredSharedInformerFactory(client, defaultResync, v1.NamespaceAll, nil) + return NewSharedInformerFactoryWithOptions(client, defaultResync) } // NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory. // Listers obtained via this SharedInformerFactory will be subject to the same filters // as specified here. +// Deprecated: Please use NewSharedInformerFactoryWithOptions instead func NewFilteredSharedInformerFactory(client clientset.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory { - return &sharedInformerFactory{ + return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions)) +} + +// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options. +func NewSharedInformerFactoryWithOptions(client clientset.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory { + factory := &sharedInformerFactory{ client: client, - namespace: namespace, - tweakListOptions: tweakListOptions, + namespace: v1.NamespaceAll, defaultResync: defaultResync, informers: make(map[reflect.Type]cache.SharedIndexInformer), startedInformers: make(map[reflect.Type]bool), + customResync: make(map[reflect.Type]time.Duration), } + + // Apply all options + for _, opt := range options { + factory = opt(factory) + } + + return factory } // Start initializes all requested informers. @@ -110,7 +153,13 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal if exists { return informer } - informer = newFunc(f.client, f.defaultResync) + + resyncPeriod, exists := f.customResync[informerType] + if !exists { + resyncPeriod = f.defaultResync + } + + informer = newFunc(f.client, resyncPeriod) f.informers[informerType] = informer return informer diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/generic.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/generic.go index a742bbd25..da8a2ab0c 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/generic.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/generic.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD deleted file mode 100644 index 56bb1f8d8..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["factory_interfaces.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go index 2048b744f..3b17f5a1a 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/factory_interfaces.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/BUILD deleted file mode 100644 index ec24afd53..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "factory.go", - "generic.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions:all-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/BUILD deleted file mode 100644 index b1e3dfa02..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/interface.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/interface.go index f096df135..8236e2acc 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/interface.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/BUILD deleted file mode 100644 index 143223332..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "customresourcedefinition.go", - "interface.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/customresourcedefinition.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/customresourcedefinition.go index 08587b732..2c54f3ce5 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/customresourcedefinition.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/customresourcedefinition.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/interface.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/interface.go index 15c7e9f14..d9444144b 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/interface.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/factory.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/factory.go index b1d07527d..84b04523d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/factory.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/factory.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -32,12 +32,16 @@ import ( cache "k8s.io/client-go/tools/cache" ) +// SharedInformerOption defines the functional option type for SharedInformerFactory. +type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory + type sharedInformerFactory struct { client internalclientset.Interface namespace string tweakListOptions internalinterfaces.TweakListOptionsFunc lock sync.Mutex defaultResync time.Duration + customResync map[reflect.Type]time.Duration informers map[reflect.Type]cache.SharedIndexInformer // startedInformers is used for tracking which informers have been started. @@ -45,23 +49,62 @@ type sharedInformerFactory struct { startedInformers map[reflect.Type]bool } -// NewSharedInformerFactory constructs a new instance of sharedInformerFactory +// WithCustomResyncConfig sets a custom resync period for the specified informer types. +func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + for k, v := range resyncConfig { + factory.customResync[reflect.TypeOf(k)] = v + } + return factory + } +} + +// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory. +func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.tweakListOptions = tweakListOptions + return factory + } +} + +// WithNamespace limits the SharedInformerFactory to the specified namespace. +func WithNamespace(namespace string) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.namespace = namespace + return factory + } +} + +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. func NewSharedInformerFactory(client internalclientset.Interface, defaultResync time.Duration) SharedInformerFactory { - return NewFilteredSharedInformerFactory(client, defaultResync, v1.NamespaceAll, nil) + return NewSharedInformerFactoryWithOptions(client, defaultResync) } // NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory. // Listers obtained via this SharedInformerFactory will be subject to the same filters // as specified here. +// Deprecated: Please use NewSharedInformerFactoryWithOptions instead func NewFilteredSharedInformerFactory(client internalclientset.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory { - return &sharedInformerFactory{ + return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions)) +} + +// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options. +func NewSharedInformerFactoryWithOptions(client internalclientset.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory { + factory := &sharedInformerFactory{ client: client, - namespace: namespace, - tweakListOptions: tweakListOptions, + namespace: v1.NamespaceAll, defaultResync: defaultResync, informers: make(map[reflect.Type]cache.SharedIndexInformer), startedInformers: make(map[reflect.Type]bool), + customResync: make(map[reflect.Type]time.Duration), } + + // Apply all options + for _, opt := range options { + factory = opt(factory) + } + + return factory } // Start initializes all requested informers. @@ -110,7 +153,13 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal if exists { return informer } - informer = newFunc(f.client, f.defaultResync) + + resyncPeriod, exists := f.customResync[informerType] + if !exists { + resyncPeriod = f.defaultResync + } + + informer = newFunc(f.client, resyncPeriod) f.informers[informerType] = informer return informer diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/generic.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/generic.go index 77a9e1b0b..c12c44074 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/generic.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/generic.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD deleted file mode 100644 index 398d1f2f8..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["factory_interfaces.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/factory_interfaces.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/factory_interfaces.go index d41da2418..5854db0ca 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/factory_interfaces.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/factory_interfaces.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/BUILD deleted file mode 100644 index 54732b7f9..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "customresourcedefinition.go", - "expansion_generated.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/customresourcedefinition.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/customresourcedefinition.go index c736b3db8..f64f01d9d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/customresourcedefinition.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/customresourcedefinition.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/expansion_generated.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/expansion_generated.go index 05a413aee..5e3ae381d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/expansion_generated.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD deleted file mode 100644 index f57e6d77f..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "customresourcedefinition.go", - "expansion_generated.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/customresourcedefinition.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/customresourcedefinition.go index 468f5a664..87633217b 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/customresourcedefinition.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/customresourcedefinition.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/expansion_generated.go b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/expansion_generated.go index 65b786659..429782deb 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD deleted file mode 100644 index a5cd39b43..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["start.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/cmd/server", - deps = [ - "//vendor/github.com/spf13/cobra:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server/options:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go b/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go index df3cf3e60..c36071d8d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/start.go @@ -51,7 +51,7 @@ func NewCustomResourceDefinitionsServerOptions(out, errOut io.Writer) *CustomRes StdErr: errOut, } - // the shared informer is not needed for kube-aggregator. Disable the kubeconfig flag and the client creation. + // the shared informer is not needed for apiextentions apiserver. Disable the kubeconfig flag and the client creation. o.RecommendedOptions.CoreAPI = nil return o @@ -86,7 +86,7 @@ func NewCommandStartCustomResourceDefinitionsServer(out, errOut io.Writer, stopC func (o CustomResourceDefinitionsServerOptions) Validate(args []string) error { errors := []error{} errors = append(errors, o.RecommendedOptions.Validate()...) - errors = append(errors, o.APIEnablement.Validate(apiserver.Registry)...) + errors = append(errors, o.APIEnablement.Validate(apiserver.Scheme)...) return utilerrors.NewAggregate(errors) } @@ -104,7 +104,7 @@ func (o CustomResourceDefinitionsServerOptions) Config() (*apiserver.Config, err if err := o.RecommendedOptions.ApplyTo(serverConfig, apiserver.Scheme); err != nil { return nil, err } - if err := o.APIEnablement.ApplyTo(&serverConfig.Config, apiserver.DefaultAPIResourceConfigSource(), apiserver.Registry); err != nil { + if err := o.APIEnablement.ApplyTo(&serverConfig.Config, apiserver.DefaultAPIResourceConfigSource(), apiserver.Scheme); err != nil { return nil, err } @@ -137,7 +137,7 @@ func (o CustomResourceDefinitionsServerOptions) RunCustomResourceDefinitionsServ return err } - server, err := config.Complete().New(genericapiserver.EmptyDelegate) + server, err := config.Complete().New(genericapiserver.NewEmptyDelegate()) if err != nil { return err } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish/establishing_controller.go b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish/establishing_controller.go new file mode 100644 index 000000000..5c2ebbcaa --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/establish/establishing_controller.go @@ -0,0 +1,142 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package establish + +import ( + "fmt" + "time" + + "github.com/golang/glog" + apierrors "k8s.io/apimachinery/pkg/api/errors" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/tools/cache" + "k8s.io/client-go/util/workqueue" + + "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" + client "k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion" + informers "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion" + listers "k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion" +) + +// EstablishingController controls how and when CRD is established. +type EstablishingController struct { + crdClient client.CustomResourceDefinitionsGetter + crdLister listers.CustomResourceDefinitionLister + crdSynced cache.InformerSynced + + // To allow injection for testing. + syncFn func(key string) error + + queue workqueue.RateLimitingInterface +} + +// NewEstablishingController creates new EstablishingController. +func NewEstablishingController(crdInformer informers.CustomResourceDefinitionInformer, + crdClient client.CustomResourceDefinitionsGetter) *EstablishingController { + ec := &EstablishingController{ + crdClient: crdClient, + crdLister: crdInformer.Lister(), + crdSynced: crdInformer.Informer().HasSynced, + queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "crdEstablishing"), + } + + ec.syncFn = ec.sync + + return ec +} + +// QueueCRD adds CRD into the establishing queue. +func (ec *EstablishingController) QueueCRD(key string, timeout time.Duration) { + ec.queue.AddAfter(key, timeout) +} + +// Run starts the EstablishingController. +func (ec *EstablishingController) Run(stopCh <-chan struct{}) { + defer utilruntime.HandleCrash() + defer ec.queue.ShutDown() + + glog.Infof("Starting EstablishingController") + defer glog.Infof("Shutting down EstablishingController") + + if !cache.WaitForCacheSync(stopCh, ec.crdSynced) { + return + } + + // only start one worker thread since its a slow moving API + go wait.Until(ec.runWorker, time.Second, stopCh) + + <-stopCh +} + +func (ec *EstablishingController) runWorker() { + for ec.processNextWorkItem() { + } +} + +// processNextWorkItem deals with one key off the queue. +// It returns false when it's time to quit. +func (ec *EstablishingController) processNextWorkItem() bool { + key, quit := ec.queue.Get() + if quit { + return false + } + defer ec.queue.Done(key) + + err := ec.syncFn(key.(string)) + if err == nil { + return true + } + + utilruntime.HandleError(fmt.Errorf("%v failed with: %v", key, err)) + ec.queue.AddRateLimited(key) + + return true +} + +// sync is used to turn CRDs into the Established state. +func (ec *EstablishingController) sync(key string) error { + cachedCRD, err := ec.crdLister.Get(key) + if apierrors.IsNotFound(err) { + return nil + } + if err != nil { + return err + } + + if !apiextensions.IsCRDConditionTrue(cachedCRD, apiextensions.NamesAccepted) || + apiextensions.IsCRDConditionTrue(cachedCRD, apiextensions.Established) { + return nil + } + + crd := cachedCRD.DeepCopy() + establishedCondition := apiextensions.CustomResourceDefinitionCondition{ + Type: apiextensions.Established, + Status: apiextensions.ConditionTrue, + Reason: "InitialNamesAccepted", + Message: "the initial names have been accepted", + } + apiextensions.SetCRDCondition(crd, establishedCondition) + + // Update server with new CRD condition. + _, err = ec.crdClient.CustomResourceDefinitions().UpdateStatus(crd) + if err != nil { + return err + } + + return nil +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD deleted file mode 100644 index 452dfefdf..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["crd_finalizer.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/controller/finalizer", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/util/workqueue:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD deleted file mode 100644 index c408cf487..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["naming_controller_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["naming_controller.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/controller/status", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/util/workqueue:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go index 16016e493..f00def4b1 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller.go @@ -24,6 +24,7 @@ import ( "github.com/golang/glog" + "k8s.io/apimachinery/pkg/api/equality" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" utilerrors "k8s.io/apimachinery/pkg/util/errors" @@ -191,7 +192,10 @@ func (c *NamingConditionController) calculateNamesAndConditions(in *apiextension namesAcceptedCondition.Message = "no conflicts found" } - // set EstablishedCondition to true if all names are accepted. Never set it back to false. + // set EstablishedCondition initially to false, then set it to true in establishing controller. + // The Establishing Controller will see the NamesAccepted condition when it arrives through the shared informer. + // At that time the API endpoint handler will serve the endpoint, avoiding a race + // which we had if we set Established to true here. establishedCondition := apiextensions.CustomResourceDefinitionCondition{ Type: apiextensions.Established, Status: apiextensions.ConditionFalse, @@ -204,8 +208,8 @@ func (c *NamingConditionController) calculateNamesAndConditions(in *apiextension if establishedCondition.Status != apiextensions.ConditionTrue && namesAcceptedCondition.Status == apiextensions.ConditionTrue { establishedCondition = apiextensions.CustomResourceDefinitionCondition{ Type: apiextensions.Established, - Status: apiextensions.ConditionTrue, - Reason: "InitialNamesAccepted", + Status: apiextensions.ConditionFalse, + Reason: "Installing", Message: "the initial names have been accepted", } } @@ -238,12 +242,16 @@ func (c *NamingConditionController) sync(key string) error { return err } + // Skip checking names if Spec and Status names are same. + if equality.Semantic.DeepEqual(inCustomResourceDefinition.Spec.Names, inCustomResourceDefinition.Status.AcceptedNames) { + return nil + } + acceptedNames, namingCondition, establishedCondition := c.calculateNamesAndConditions(inCustomResourceDefinition) // nothing to do if accepted names and NamesAccepted condition didn't change if reflect.DeepEqual(inCustomResourceDefinition.Status.AcceptedNames, acceptedNames) && - apiextensions.IsCRDConditionEquivalent(&namingCondition, apiextensions.FindCRDCondition(inCustomResourceDefinition, apiextensions.NamesAccepted)) && - apiextensions.IsCRDConditionEquivalent(&establishedCondition, apiextensions.FindCRDCondition(inCustomResourceDefinition, apiextensions.Established)) { + apiextensions.IsCRDConditionEquivalent(&namingCondition, apiextensions.FindCRDCondition(inCustomResourceDefinition, apiextensions.NamesAccepted)) { return nil } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller_test.go b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller_test.go index 615c5dd85..717e52884 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/naming_controller_test.go @@ -95,19 +95,17 @@ var acceptedCondition = apiextensions.CustomResourceDefinitionCondition{ Message: "no conflicts found", } -func nameConflictCondition(reason, message string) apiextensions.CustomResourceDefinitionCondition { - return apiextensions.CustomResourceDefinitionCondition{ - Type: apiextensions.NamesAccepted, - Status: apiextensions.ConditionFalse, - Reason: reason, - Message: message, - } +var notAcceptedCondition = apiextensions.CustomResourceDefinitionCondition{ + Type: apiextensions.NamesAccepted, + Status: apiextensions.ConditionFalse, + Reason: "NotAccepted", + Message: "not all names are accepted", } -var establishedCondition = apiextensions.CustomResourceDefinitionCondition{ +var installingCondition = apiextensions.CustomResourceDefinitionCondition{ Type: apiextensions.Established, - Status: apiextensions.ConditionTrue, - Reason: "InitialNamesAccepted", + Status: apiextensions.ConditionFalse, + Reason: "Installing", Message: "the initial names have been accepted", } @@ -118,6 +116,15 @@ var notEstablishedCondition = apiextensions.CustomResourceDefinitionCondition{ Message: "not all names are accepted", } +func nameConflictCondition(reason, message string) apiextensions.CustomResourceDefinitionCondition { + return apiextensions.CustomResourceDefinitionCondition{ + Type: apiextensions.NamesAccepted, + Status: apiextensions.ConditionFalse, + Reason: reason, + Message: message, + } +} + func TestSync(t *testing.T) { tests := []struct { name string @@ -136,7 +143,7 @@ func TestSync(t *testing.T) { Plural: "alfa", }, expectedNameConflictCondition: acceptedCondition, - expectedEstablishedCondition: establishedCondition, + expectedEstablishedCondition: installingCondition, }, { name: "different groups", @@ -146,7 +153,7 @@ func TestSync(t *testing.T) { }, expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"), expectedNameConflictCondition: acceptedCondition, - expectedEstablishedCondition: establishedCondition, + expectedEstablishedCondition: installingCondition, }, { name: "conflict plural to singular", @@ -206,7 +213,7 @@ func TestSync(t *testing.T) { }, expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"), expectedNameConflictCondition: acceptedCondition, - expectedEstablishedCondition: establishedCondition, + expectedEstablishedCondition: installingCondition, }, { name: "merge on conflicts", @@ -248,7 +255,7 @@ func TestSync(t *testing.T) { }, expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"), expectedNameConflictCondition: acceptedCondition, - expectedEstablishedCondition: establishedCondition, + expectedEstablishedCondition: installingCondition, }, { name: "no conflicts on self, remove shortname", @@ -264,44 +271,44 @@ func TestSync(t *testing.T) { }, expectedNames: names("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1"), expectedNameConflictCondition: acceptedCondition, - expectedEstablishedCondition: establishedCondition, + expectedEstablishedCondition: installingCondition, }, { - name: "established before with true condition", - in: newCRD("alfa.bravo.com").Condition(establishedCondition).NewOrDie(), + name: "installing before with true condition", + in: newCRD("alfa.bravo.com").Condition(acceptedCondition).NewOrDie(), existing: []*apiextensions.CustomResourceDefinition{}, expectedNames: apiextensions.CustomResourceDefinitionNames{ Plural: "alfa", }, expectedNameConflictCondition: acceptedCondition, - expectedEstablishedCondition: establishedCondition, + expectedEstablishedCondition: installingCondition, }, { - name: "not established before with false condition", - in: newCRD("alfa.bravo.com").Condition(notEstablishedCondition).NewOrDie(), + name: "not installing before with false condition", + in: newCRD("alfa.bravo.com").Condition(notAcceptedCondition).NewOrDie(), existing: []*apiextensions.CustomResourceDefinition{}, expectedNames: apiextensions.CustomResourceDefinitionNames{ Plural: "alfa", }, expectedNameConflictCondition: acceptedCondition, - expectedEstablishedCondition: establishedCondition, + expectedEstablishedCondition: installingCondition, }, { - name: "conflicting, established before with true condition", + name: "conflicting, installing before with true condition", in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"). - Condition(establishedCondition). + Condition(acceptedCondition). NewOrDie(), existing: []*apiextensions.CustomResourceDefinition{ newCRD("india.bravo.com").StatusNames("india", "alfa", "", "").NewOrDie(), }, expectedNames: names("", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"), expectedNameConflictCondition: nameConflictCondition("PluralConflict", `"alfa" is already in use`), - expectedEstablishedCondition: establishedCondition, + expectedEstablishedCondition: notEstablishedCondition, }, { - name: "conflicting, not established before with false condition", + name: "conflicting, not installing before with false condition", in: newCRD("alfa.bravo.com").SpecNames("alfa", "delta-singular", "echo-kind", "foxtrot-listkind", "golf-shortname-1", "hotel-shortname-2"). - Condition(notEstablishedCondition). + Condition(notAcceptedCondition). NewOrDie(), existing: []*apiextensions.CustomResourceDefinition{ newCRD("india.bravo.com").StatusNames("india", "alfa", "", "").NewOrDie(), @@ -322,7 +329,7 @@ func TestSync(t *testing.T) { crdLister: listers.NewCustomResourceDefinitionLister(crdIndexer), crdMutationCache: cache.NewIntegerResourceVersionMutationCache(crdIndexer, crdIndexer, 60*time.Second, false), } - actualNames, actualNameConflictCondition, actualEstablishedCondition := c.calculateNamesAndConditions(tc.in) + actualNames, actualNameConflictCondition, establishedCondition := c.calculateNamesAndConditions(tc.in) if e, a := tc.expectedNames, actualNames; !reflect.DeepEqual(e, a) { t.Errorf("%v expected %v, got %#v", tc.name, e, a) @@ -330,7 +337,7 @@ func TestSync(t *testing.T) { if e, a := tc.expectedNameConflictCondition, actualNameConflictCondition; !apiextensions.IsCRDConditionEquivalent(&e, &a) { t.Errorf("%v expected %v, got %v", tc.name, e, a) } - if e, a := tc.expectedEstablishedCondition, actualEstablishedCondition; !apiextensions.IsCRDConditionEquivalent(&e, &a) { + if e, a := tc.expectedEstablishedCondition, establishedCondition; !apiextensions.IsCRDConditionEquivalent(&e, &a) { t.Errorf("%v expected %v, got %v", tc.name, e, a) } } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/features/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/features/BUILD deleted file mode 100644 index c6438cb40..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/features/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["kube_features.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/features", - deps = ["//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/features/OWNERS b/vendor/k8s.io/apiextensions-apiserver/pkg/features/OWNERS new file mode 100644 index 000000000..fe7b0144e --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/features/OWNERS @@ -0,0 +1,2 @@ +approvers: +- feature-approvers diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go b/vendor/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go index b80e80ac3..24e72f91e 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/features/kube_features.go @@ -36,6 +36,7 @@ const ( // owner: @sttts, @nikhita // alpha: v1.10 + // beta: v1.11 // // CustomResourceSubresources defines the subresources for CustomResources CustomResourceSubresources utilfeature.Feature = "CustomResourceSubresources" @@ -50,5 +51,5 @@ func init() { // available throughout Kubernetes binaries. var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureSpec{ CustomResourceValidation: {Default: true, PreRelease: utilfeature.Beta}, - CustomResourceSubresources: {Default: false, PreRelease: utilfeature.Alpha}, + CustomResourceSubresources: {Default: true, PreRelease: utilfeature.Beta}, } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD deleted file mode 100644 index 73ac1009e..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD +++ /dev/null @@ -1,87 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "etcd.go", - "registry.go", - "status_strategy.go", - "strategy.go", - "validator.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/registry/customresource", - deps = [ - "//vendor/github.com/go-openapi/validate:go_default_library", - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor:all-srcs", - ], - tags = ["automanaged"], -) - -go_test( - name = "go_default_xtest", - srcs = ["etcd_test.go"], - deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic/testing:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/etcd/testing:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - ], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go index bf54fe33b..d9e8fd97c 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd.go @@ -17,16 +17,17 @@ limitations under the License. package customresource import ( + "context" "fmt" "strings" autoscalingv1 "k8s.io/api/autoscaling/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" + metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/generic" genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/registry/rest" @@ -106,6 +107,59 @@ func newREST(resource schema.GroupResource, listKind schema.GroupVersionKind, st // Implement CategoriesProvider var _ rest.CategoriesProvider = &REST{} +// List returns a list of items matching labels and field according to the store's PredicateFunc. +func (e *REST) List(ctx context.Context, options *metainternalversion.ListOptions) (runtime.Object, error) { + l, err := e.Store.List(ctx, options) + if err != nil { + return nil, err + } + + // Shallow copy ObjectMeta in returned list for each item. Native types have `Items []Item` fields and therefore + // implicitly shallow copy ObjectMeta. The generic store sets the self-link for each item. So this is necessary + // to avoid mutation of the objects from the cache. + if ul, ok := l.(*unstructured.UnstructuredList); ok { + for i := range ul.Items { + shallowCopyObjectMeta(&ul.Items[i]) + } + } + + return l, nil +} + +func (r *REST) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { + o, err := r.Store.Get(ctx, name, options) + if err != nil { + return nil, err + } + if u, ok := o.(*unstructured.Unstructured); ok { + shallowCopyObjectMeta(u) + } + return o, nil +} + +func shallowCopyObjectMeta(u runtime.Unstructured) { + obj := shallowMapDeepCopy(u.UnstructuredContent()) + if metadata, ok := obj["metadata"]; ok { + if metadata, ok := metadata.(map[string]interface{}); ok { + obj["metadata"] = shallowMapDeepCopy(metadata) + u.SetUnstructuredContent(obj) + } + } +} + +func shallowMapDeepCopy(in map[string]interface{}) map[string]interface{} { + if in == nil { + return nil + } + + out := make(map[string]interface{}, len(in)) + for k, v := range in { + out[k] = v + } + + return out +} + // Categories implements the CategoriesProvider interface. Returns a list of categories a resource is part of. func (r *REST) Categories() []string { return r.categories @@ -116,17 +170,19 @@ type StatusREST struct { store *genericregistry.Store } +var _ = rest.Patcher(&StatusREST{}) + func (r *StatusREST) New() runtime.Object { return &unstructured.Unstructured{} } // Get retrieves the object from the storage. It is required to support Patch. -func (r *StatusREST) Get(ctx genericapirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { +func (r *StatusREST) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { return r.store.Get(ctx, name, options) } // Update alters the status subset of an object. -func (r *StatusREST) Update(ctx genericapirequest.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc) (runtime.Object, bool, error) { +func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc) (runtime.Object, bool, error) { return r.store.Update(ctx, name, objInfo, createValidation, updateValidation) } @@ -150,7 +206,7 @@ func (r *ScaleREST) New() runtime.Object { return &autoscalingv1.Scale{} } -func (r *ScaleREST) Get(ctx genericapirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { +func (r *ScaleREST) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { cr, err := r.registry.GetCustomResource(ctx, name, options) if err != nil { return nil, err @@ -166,7 +222,7 @@ func (r *ScaleREST) Get(ctx genericapirequest.Context, name string, options *met return scaleObject, err } -func (r *ScaleREST) Update(ctx genericapirequest.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc) (runtime.Object, bool, error) { +func (r *ScaleREST) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc) (runtime.Object, bool, error) { cr, err := r.registry.GetCustomResource(ctx, name, &metav1.GetOptions{}) if err != nil { return nil, false, err diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd_test.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd_test.go index 8bee3396c..15a242e44 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd_test.go @@ -21,12 +21,15 @@ import ( "reflect" "strings" "testing" + "time" autoscalingv1 "k8s.io/api/autoscaling/v1" apiequality "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/errors" + metainternal "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/diff" @@ -58,7 +61,7 @@ func newStorage(t *testing.T) (customresource.CustomResourceStorage, *etcdtestin typer := apiserver.UnstructuredObjectTyper{ Delegate: parameterScheme, - UnstructuredTyper: discovery.NewUnstructuredObjectTyper(nil), + UnstructuredTyper: discovery.NewUnstructuredObjectTyper(), } kind := schema.GroupVersionKind{Group: "mygroup.example.com", Version: "v1beta1", Kind: "Noxu"} @@ -72,8 +75,19 @@ func newStorage(t *testing.T) (customresource.CustomResourceStorage, *etcdtestin status := &apiextensions.CustomResourceSubresourceStatus{} - // TODO: identify how to pass printer specification from the CRD - table, _ := tableconvertor.New(nil) + headers := []apiextensions.CustomResourceColumnDefinition{ + {Name: "Age", Type: "date", JSONPath: ".metadata.creationTimestamp"}, + {Name: "Replicas", Type: "integer", JSONPath: ".spec.replicas"}, + {Name: "Missing", Type: "string", JSONPath: ".spec.missing"}, + {Name: "Invalid", Type: "integer", JSONPath: ".spec.string"}, + {Name: "String", Type: "string", JSONPath: ".spec.string"}, + {Name: "StringFloat64", Type: "string", JSONPath: ".spec.float64"}, + {Name: "StringInt64", Type: "string", JSONPath: ".spec.replicas"}, + {Name: "StringBool", Type: "string", JSONPath: ".spec.bool"}, + {Name: "Float64", Type: "number", JSONPath: ".spec.float64"}, + {Name: "Bool", Type: "boolean", JSONPath: ".spec.bool"}, + } + table, _ := tableconvertor.New(headers) storage := customresource.NewStorage( schema.GroupResource{Group: "mygroup.example.com", Resource: "noxus"}, @@ -112,11 +126,18 @@ func validNewCustomResource() *unstructured.Unstructured { "apiVersion": "mygroup.example.com/v1beta1", "kind": "Noxu", "metadata": map[string]interface{}{ - "namespace": "default", - "name": "foo", + "namespace": "default", + "name": "foo", + "creationTimestamp": time.Now().Add(-time.Hour*12 - 30*time.Minute).UTC().Format(time.RFC3339), }, "spec": map[string]interface{}{ - "replicas": int64(7), + "replicas": int64(7), + "string": "string", + "float64": float64(3.1415926), + "bool": true, + "stringList": []interface{}{"foo", "bar"}, + "mixedList": []interface{}{"foo", int64(42)}, + "nonPrimitiveList": []interface{}{"foo", []interface{}{int64(1), int64(2)}}, }, }, } @@ -160,6 +181,58 @@ func TestDelete(t *testing.T) { test.TestDelete(validNewCustomResource()) } +func TestGenerationNumber(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.CustomResource.Store.DestroyFunc() + modifiedRno := *validNewCustomResource() + modifiedRno.SetGeneration(10) + ctx := genericapirequest.NewDefaultContext() + cr, err := createCustomResource(storage.CustomResource, modifiedRno, t) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + etcdCR, err := storage.CustomResource.Get(ctx, cr.GetName(), &metav1.GetOptions{}) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + storedCR, _ := etcdCR.(*unstructured.Unstructured) + + // Generation initialization + if storedCR.GetGeneration() != 1 { + t.Fatalf("Unexpected generation number %v", storedCR.GetGeneration()) + } + + // Updates to spec should increment the generation number + setSpecReplicas(storedCR, getSpecReplicas(storedCR)+1) + if _, _, err := storage.CustomResource.Update(ctx, storedCR.GetName(), rest.DefaultUpdatedObjectInfo(storedCR), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc); err != nil { + t.Errorf("unexpected error: %v", err) + } + etcdCR, err = storage.CustomResource.Get(ctx, cr.GetName(), &metav1.GetOptions{}) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + storedCR, _ = etcdCR.(*unstructured.Unstructured) + if storedCR.GetGeneration() != 2 { + t.Fatalf("Unexpected generation, spec: %v", storedCR.GetGeneration()) + } + + // Updates to status should not increment the generation number + setStatusReplicas(storedCR, getStatusReplicas(storedCR)+1) + if _, _, err := storage.CustomResource.Update(ctx, storedCR.GetName(), rest.DefaultUpdatedObjectInfo(storedCR), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc); err != nil { + t.Errorf("unexpected error: %v", err) + } + etcdCR, err = storage.CustomResource.Get(ctx, cr.GetName(), &metav1.GetOptions{}) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + storedCR, _ = etcdCR.(*unstructured.Unstructured) + if storedCR.GetGeneration() != 2 { + t.Fatalf("Unexpected generation, spec: %v", storedCR.GetGeneration()) + } + +} + func TestCategories(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) @@ -173,6 +246,77 @@ func TestCategories(t *testing.T) { } } +func TestColumns(t *testing.T) { + storage, server := newStorage(t) + defer server.Terminate(t) + defer storage.CustomResource.Store.DestroyFunc() + + ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), metav1.NamespaceDefault) + key := "/noxus/" + metav1.NamespaceDefault + "/foo" + validCustomResource := validNewCustomResource() + if err := storage.CustomResource.Storage.Create(ctx, key, validCustomResource, nil, 0); err != nil { + t.Fatalf("unexpected error: %v", err) + } + + gottenList, err := storage.CustomResource.List(ctx, &metainternal.ListOptions{}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + tbl, err := storage.CustomResource.ConvertToTable(ctx, gottenList, &metav1beta1.TableOptions{}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + expectedColumns := []struct { + Name, Type string + }{ + {"Name", "string"}, + {"Age", "date"}, + {"Replicas", "integer"}, + {"Missing", "string"}, + {"Invalid", "integer"}, + {"String", "string"}, + {"StringFloat64", "string"}, + {"StringInt64", "string"}, + {"StringBool", "string"}, + {"Float64", "number"}, + {"Bool", "boolean"}, + } + if len(tbl.ColumnDefinitions) != len(expectedColumns) { + t.Fatalf("got %d columns, expected %d. Got: %+v", len(tbl.ColumnDefinitions), len(expectedColumns), tbl.ColumnDefinitions) + } + for i, d := range tbl.ColumnDefinitions { + if d.Name != expectedColumns[i].Name { + t.Errorf("got column %d name %q, expected %q", i, d.Name, expectedColumns[i].Name) + } + if d.Type != expectedColumns[i].Type { + t.Errorf("got column %d type %q, expected %q", i, d.Type, expectedColumns[i].Type) + } + } + + expectedRows := [][]interface{}{ + { + "foo", + "12h", + int64(7), + nil, + nil, + "string", + "3.1415926", + "7", + "true", + float64(3.1415926), + true, + }, + } + for i, r := range tbl.Rows { + if !reflect.DeepEqual(r.Cells, expectedRows[i]) { + t.Errorf("got row %d with cells %#v, expected %#v", i, r.Cells, expectedRows[i]) + } + } +} + func TestStatusUpdate(t *testing.T) { storage, server := newStorage(t) defer server.Terminate(t) @@ -398,3 +542,34 @@ func (c unstructuredJsonCodec) Encode(obj runtime.Object, w io.Writer) error { w.Write(bs) return nil } + +func setSpecReplicas(u *unstructured.Unstructured, replicas int64) { + setNestedField(u, replicas, "spec", "replicas") +} + +func getSpecReplicas(u *unstructured.Unstructured) int64 { + val, found, err := unstructured.NestedInt64(u.Object, "spec", "replicas") + if !found || err != nil { + return 0 + } + return val +} + +func setStatusReplicas(u *unstructured.Unstructured, replicas int64) { + setNestedField(u, replicas, "status", "replicas") +} + +func getStatusReplicas(u *unstructured.Unstructured) int64 { + val, found, err := unstructured.NestedInt64(u.Object, "status", "replicas") + if !found || err != nil { + return 0 + } + return val +} + +func setNestedField(u *unstructured.Unstructured, value interface{}, fields ...string) { + if u.Object == nil { + u.Object = make(map[string]interface{}) + } + unstructured.SetNestedField(u.Object, value, fields...) +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/registry.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/registry.go index a0fd086d0..e3d468036 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/registry.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/registry.go @@ -17,6 +17,7 @@ limitations under the License. package customresource import ( + "context" "fmt" "strings" @@ -26,18 +27,17 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/watch" - genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/rest" ) // Registry is an interface for things that know how to store CustomResources. type Registry interface { - ListCustomResources(ctx genericapirequest.Context, options *metainternalversion.ListOptions) (*unstructured.UnstructuredList, error) - WatchCustomResources(ctx genericapirequest.Context, options *metainternalversion.ListOptions) (watch.Interface, error) - GetCustomResource(ctx genericapirequest.Context, customResourceID string, options *metav1.GetOptions) (*unstructured.Unstructured, error) - CreateCustomResource(ctx genericapirequest.Context, customResource *unstructured.Unstructured, createValidation rest.ValidateObjectFunc) (*unstructured.Unstructured, error) - UpdateCustomResource(ctx genericapirequest.Context, customResource *unstructured.Unstructured, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc) (*unstructured.Unstructured, error) - DeleteCustomResource(ctx genericapirequest.Context, customResourceID string) error + ListCustomResources(ctx context.Context, options *metainternalversion.ListOptions) (*unstructured.UnstructuredList, error) + WatchCustomResources(ctx context.Context, options *metainternalversion.ListOptions) (watch.Interface, error) + GetCustomResource(ctx context.Context, customResourceID string, options *metav1.GetOptions) (*unstructured.Unstructured, error) + CreateCustomResource(ctx context.Context, customResource *unstructured.Unstructured, createValidation rest.ValidateObjectFunc) (*unstructured.Unstructured, error) + UpdateCustomResource(ctx context.Context, customResource *unstructured.Unstructured, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc) (*unstructured.Unstructured, error) + DeleteCustomResource(ctx context.Context, customResourceID string) error } // storage puts strong typing around storage calls @@ -51,7 +51,7 @@ func NewRegistry(s rest.StandardStorage) Registry { return &storage{s} } -func (s *storage) ListCustomResources(ctx genericapirequest.Context, options *metainternalversion.ListOptions) (*unstructured.UnstructuredList, error) { +func (s *storage) ListCustomResources(ctx context.Context, options *metainternalversion.ListOptions) (*unstructured.UnstructuredList, error) { if options != nil && options.FieldSelector != nil && !options.FieldSelector.Empty() { return nil, fmt.Errorf("field selector not supported yet") } @@ -62,11 +62,11 @@ func (s *storage) ListCustomResources(ctx genericapirequest.Context, options *me return obj.(*unstructured.UnstructuredList), err } -func (s *storage) WatchCustomResources(ctx genericapirequest.Context, options *metainternalversion.ListOptions) (watch.Interface, error) { +func (s *storage) WatchCustomResources(ctx context.Context, options *metainternalversion.ListOptions) (watch.Interface, error) { return s.Watch(ctx, options) } -func (s *storage) GetCustomResource(ctx genericapirequest.Context, customResourceID string, options *metav1.GetOptions) (*unstructured.Unstructured, error) { +func (s *storage) GetCustomResource(ctx context.Context, customResourceID string, options *metav1.GetOptions) (*unstructured.Unstructured, error) { obj, err := s.Get(ctx, customResourceID, options) customResource, ok := obj.(*unstructured.Unstructured) if !ok { @@ -82,7 +82,7 @@ func (s *storage) GetCustomResource(ctx genericapirequest.Context, customResourc return customResource, nil } -func (s *storage) CreateCustomResource(ctx genericapirequest.Context, customResource *unstructured.Unstructured, createValidation rest.ValidateObjectFunc) (*unstructured.Unstructured, error) { +func (s *storage) CreateCustomResource(ctx context.Context, customResource *unstructured.Unstructured, createValidation rest.ValidateObjectFunc) (*unstructured.Unstructured, error) { obj, err := s.Create(ctx, customResource, rest.ValidateAllObjectFunc, false) if err != nil { return nil, err @@ -90,7 +90,7 @@ func (s *storage) CreateCustomResource(ctx genericapirequest.Context, customReso return obj.(*unstructured.Unstructured), nil } -func (s *storage) UpdateCustomResource(ctx genericapirequest.Context, customResource *unstructured.Unstructured, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc) (*unstructured.Unstructured, error) { +func (s *storage) UpdateCustomResource(ctx context.Context, customResource *unstructured.Unstructured, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc) (*unstructured.Unstructured, error) { obj, _, err := s.Update(ctx, customResource.GetName(), rest.DefaultUpdatedObjectInfo(customResource), createValidation, updateValidation) if err != nil { return nil, err @@ -98,7 +98,7 @@ func (s *storage) UpdateCustomResource(ctx genericapirequest.Context, customReso return obj.(*unstructured.Unstructured), nil } -func (s *storage) DeleteCustomResource(ctx genericapirequest.Context, customResourceID string) error { +func (s *storage) DeleteCustomResource(ctx context.Context, customResourceID string) error { _, _, err := s.Delete(ctx, customResourceID, nil) return err } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy.go index dab6bf47a..1710eb2e1 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy.go @@ -17,10 +17,11 @@ limitations under the License. package customresource import ( + "context" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" - genericapirequest "k8s.io/apiserver/pkg/endpoints/request" ) type statusStrategy struct { @@ -31,32 +32,28 @@ func NewStatusStrategy(strategy customResourceStrategy) statusStrategy { return statusStrategy{strategy} } -func (a statusStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) { +func (a statusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { + // update is only allowed to set status newCustomResourceObject := obj.(*unstructured.Unstructured) - oldCustomResourceObject := old.(*unstructured.Unstructured) - newCustomResource := newCustomResourceObject.UnstructuredContent() - oldCustomResource := oldCustomResourceObject.UnstructuredContent() + status, ok := newCustomResource["status"] - // update is not allowed to set spec and metadata - _, ok1 := newCustomResource["spec"] - _, ok2 := oldCustomResource["spec"] - switch { - case ok2: - newCustomResource["spec"] = oldCustomResource["spec"] - case ok1: - delete(newCustomResource, "spec") + // copy old object into new object + oldCustomResourceObject := old.(*unstructured.Unstructured) + // overridding the resourceVersion in metadata is safe here, we have already checked that + // new object and old object have the same resourceVersion. + *newCustomResourceObject = *oldCustomResourceObject.DeepCopy() + + // set status + newCustomResource = newCustomResourceObject.UnstructuredContent() + if ok { + newCustomResource["status"] = status + } else { + delete(newCustomResource, "status") } - - newCustomResourceObject.SetAnnotations(oldCustomResourceObject.GetAnnotations()) - newCustomResourceObject.SetFinalizers(oldCustomResourceObject.GetFinalizers()) - newCustomResourceObject.SetGeneration(oldCustomResourceObject.GetGeneration()) - newCustomResourceObject.SetLabels(oldCustomResourceObject.GetLabels()) - newCustomResourceObject.SetOwnerReferences(oldCustomResourceObject.GetOwnerReferences()) - newCustomResourceObject.SetSelfLink(oldCustomResourceObject.GetSelfLink()) } // ValidateUpdate is the default update validation for an end user updating status. -func (a statusStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { +func (a statusStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { return a.customResourceStrategy.validator.ValidateStatusUpdate(ctx, obj, old, a.scale) } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy_test.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy_test.go new file mode 100644 index 000000000..8a651d12b --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy_test.go @@ -0,0 +1,138 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package customresource + +import ( + "context" + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +func TestPrepareForUpdate(t *testing.T) { + strategy := statusStrategy{} + tcs := []struct { + old *unstructured.Unstructured + obj *unstructured.Unstructured + expected *unstructured.Unstructured + }{ + { + // changes to spec are ignored + old: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "old", + }, + }, + obj: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "new", + }, + }, + expected: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "old", + }, + }, + }, + { + // changes to other places are also ignored + old: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "old", + }, + }, + obj: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "new": "new", + }, + }, + expected: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "old", + }, + }, + }, + { + // delete status + old: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "old", + "status": "old", + }, + }, + obj: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "old", + }, + }, + expected: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "old", + }, + }, + }, + { + // update status + old: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "old", + "status": "old", + }, + }, + obj: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "status": "new", + }, + }, + expected: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "old", + "status": "new", + }, + }, + }, + { + // update status and other parts + old: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "old", + "status": "old", + }, + }, + obj: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "new", + "new": "new", + "status": "new", + }, + }, + expected: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "spec": "old", + "status": "new", + }, + }, + }, + } + for index, tc := range tcs { + strategy.PrepareForUpdate(context.TODO(), tc.obj, tc.old) + if !reflect.DeepEqual(tc.obj, tc.expected) { + t.Errorf("test %d failed: expected: %v, got %v", index, tc.expected, tc.obj) + } + } +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go index 092bfc89c..4895e287a 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/strategy.go @@ -17,6 +17,8 @@ limitations under the License. package customresource import ( + "context" + "github.com/go-openapi/validate" apiequality "k8s.io/apimachinery/pkg/api/equality" @@ -28,7 +30,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation/field" - genericapirequest "k8s.io/apiserver/pkg/endpoints/request" apiserverstorage "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" utilfeature "k8s.io/apiserver/pkg/util/feature" @@ -69,7 +70,7 @@ func (a customResourceStrategy) NamespaceScoped() bool { } // PrepareForCreate clears the status of a CustomResource before creation. -func (a customResourceStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) { +func (a customResourceStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { if utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) && a.status != nil { customResourceObject := obj.(*unstructured.Unstructured) customResource := customResourceObject.UnstructuredContent() @@ -85,7 +86,7 @@ func (a customResourceStrategy) PrepareForCreate(ctx genericapirequest.Context, } // PrepareForUpdate clears fields that are not allowed to be set by end users on update. -func (a customResourceStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) { +func (a customResourceStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { if !utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) || a.status == nil { return } @@ -126,7 +127,7 @@ func (a customResourceStrategy) PrepareForUpdate(ctx genericapirequest.Context, } // Validate validates a new CustomResource. -func (a customResourceStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList { +func (a customResourceStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { return a.validator.Validate(ctx, obj, a.scale) } @@ -146,7 +147,7 @@ func (customResourceStrategy) AllowUnconditionalUpdate() bool { } // ValidateUpdate is the default update validation for an end user updating status. -func (a customResourceStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { +func (a customResourceStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { return a.validator.ValidateUpdate(ctx, obj, old, a.scale) } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/BUILD deleted file mode 100644 index e6150d203..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["tableconvertor.go"], - importpath = "k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/go-openapi/spec:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta/table:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/client-go/util/jsonpath:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/tableconvertor.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/tableconvertor.go index 4eb62da6b..e1bed809d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/tableconvertor.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/tableconvertor.go @@ -18,74 +18,64 @@ package tableconvertor import ( "bytes" + "context" + "encoding/json" "fmt" - "strings" - - "github.com/go-openapi/spec" + "reflect" + "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" "k8s.io/apimachinery/pkg/api/meta" metatable "k8s.io/apimachinery/pkg/api/meta/table" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" "k8s.io/apimachinery/pkg/runtime" - genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/client-go/util/jsonpath" ) -const printColumnsKey = "x-kubernetes-print-columns" - var swaggerMetadataDescriptions = metav1.ObjectMeta{}.SwaggerDoc() -// New creates a new table convertor for the provided OpenAPI schema. If the printer definition cannot be parsed, +// New creates a new table convertor for the provided CRD column definition. If the printer definition cannot be parsed, // error will be returned along with a default table convertor. -func New(extensions spec.Extensions) (rest.TableConvertor, error) { +func New(crdColumns []apiextensions.CustomResourceColumnDefinition) (rest.TableConvertor, error) { headers := []metav1beta1.TableColumnDefinition{ {Name: "Name", Type: "string", Format: "name", Description: swaggerMetadataDescriptions["name"]}, - {Name: "Created At", Type: "date", Description: swaggerMetadataDescriptions["creationTimestamp"]}, } c := &convertor{ headers: headers, } - format, ok := extensions.GetString(printColumnsKey) - if !ok { - return c, nil - } - // "x-kubernetes-print-columns": "custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion" - parts := strings.SplitN(format, "=", 2) - if len(parts) != 2 || parts[0] != "custom-columns" { - return c, fmt.Errorf("unrecognized column definition in 'x-kubernetes-print-columns', only support 'custom-columns=NAME=JSONPATH[,NAME=JSONPATH]'") - } - columnSpecs := strings.Split(parts[1], ",") - var columns []*jsonpath.JSONPath - for _, spec := range columnSpecs { - parts := strings.SplitN(spec, ":", 2) - if len(parts) != 2 || len(parts[0]) == 0 || len(parts[1]) == 0 { - return c, fmt.Errorf("unrecognized column definition in 'x-kubernetes-print-columns', must specify NAME=JSONPATH: %s", spec) - } - path := jsonpath.New(parts[0]) - if err := path.Parse(parts[1]); err != nil { - return c, fmt.Errorf("unrecognized column definition in 'x-kubernetes-print-columns': %v", spec) + + for _, col := range crdColumns { + path := jsonpath.New(col.Name) + if err := path.Parse(fmt.Sprintf("{%s}", col.JSONPath)); err != nil { + return c, fmt.Errorf("unrecognized column definition %q", col.JSONPath) } path.AllowMissingKeys(true) - columns = append(columns, path) - headers = append(headers, metav1beta1.TableColumnDefinition{ - Name: parts[0], - Type: "string", - Description: fmt.Sprintf("Custom resource definition column from OpenAPI (in JSONPath format): %s", parts[1]), + + desc := fmt.Sprintf("Custom resource definition column (in JSONPath format): %s", col.JSONPath) + if len(col.Description) > 0 { + desc = col.Description + } + + c.additionalColumns = append(c.additionalColumns, path) + c.headers = append(c.headers, metav1beta1.TableColumnDefinition{ + Name: col.Name, + Type: col.Type, + Format: col.Format, + Description: desc, + Priority: col.Priority, }) } - c.columns = columns - c.headers = headers + return c, nil } type convertor struct { - headers []metav1beta1.TableColumnDefinition - columns []*jsonpath.JSONPath + headers []metav1beta1.TableColumnDefinition + additionalColumns []*jsonpath.JSONPath } -func (c *convertor) ConvertToTable(ctx genericapirequest.Context, obj runtime.Object, tableOptions runtime.Object) (*metav1beta1.Table, error) { +func (c *convertor) ConvertToTable(ctx context.Context, obj runtime.Object, tableOptions runtime.Object) (*metav1beta1.Table, error) { table := &metav1beta1.Table{ ColumnDefinitions: c.headers, } @@ -103,18 +93,80 @@ func (c *convertor) ConvertToTable(ctx genericapirequest.Context, obj runtime.Ob var err error buf := &bytes.Buffer{} table.Rows, err = metatable.MetaToTableRow(obj, func(obj runtime.Object, m metav1.Object, name, age string) ([]interface{}, error) { - cells := make([]interface{}, 2, 2+len(c.columns)) + cells := make([]interface{}, 1, 1+len(c.additionalColumns)) cells[0] = name - cells[1] = age - for _, column := range c.columns { - if err := column.Execute(buf, obj); err != nil { + customHeaders := c.headers[1:] + for i, column := range c.additionalColumns { + results, err := column.FindResults(obj.(runtime.Unstructured).UnstructuredContent()) + if err != nil || len(results) == 0 || len(results[0]) == 0 { cells = append(cells, nil) continue } - cells = append(cells, buf.String()) - buf.Reset() + + // as we only support simple JSON path, we can assume to have only one result (or none, filtered out above) + value := results[0][0].Interface() + if customHeaders[i].Type == "string" { + if err := column.PrintResults(buf, []reflect.Value{reflect.ValueOf(value)}); err == nil { + cells = append(cells, buf.String()) + buf.Reset() + } else { + cells = append(cells, nil) + } + } else { + cells = append(cells, cellForJSONValue(customHeaders[i].Type, value)) + } } return cells, nil }) return table, err } + +func cellForJSONValue(headerType string, value interface{}) interface{} { + if value == nil { + return nil + } + + switch headerType { + case "integer": + switch typed := value.(type) { + case int64: + return typed + case float64: + return int64(typed) + case json.Number: + if i64, err := typed.Int64(); err == nil { + return i64 + } + } + case "number": + switch typed := value.(type) { + case int64: + return float64(typed) + case float64: + return typed + case json.Number: + if f, err := typed.Float64(); err == nil { + return f + } + } + case "boolean": + if b, ok := value.(bool); ok { + return b + } + case "string": + if s, ok := value.(string); ok { + return s + } + case "date": + if typed, ok := value.(string); ok { + var timestamp metav1.Time + err := timestamp.UnmarshalQueryParameter(typed) + if err != nil { + return "" + } + return metatable.ConvertToHumanReadableDateType(timestamp) + } + } + + return nil +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/tableconvertor_test.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/tableconvertor_test.go new file mode 100644 index 000000000..179aabb8a --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/tableconvertor_test.go @@ -0,0 +1,68 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package tableconvertor + +import ( + "fmt" + "reflect" + "testing" + "time" +) + +func Test_cellForJSONValue(t *testing.T) { + tests := []struct { + headerType string + value interface{} + want interface{} + }{ + {"integer", int64(42), int64(42)}, + {"integer", float64(3.14), int64(3)}, + {"integer", true, nil}, + {"integer", "foo", nil}, + + {"number", int64(42), float64(42)}, + {"number", float64(3.14), float64(3.14)}, + {"number", true, nil}, + {"number", "foo", nil}, + + {"boolean", int64(42), nil}, + {"boolean", float64(3.14), nil}, + {"boolean", true, true}, + {"boolean", "foo", nil}, + + {"string", int64(42), nil}, + {"string", float64(3.14), nil}, + {"string", true, nil}, + {"string", "foo", "foo"}, + + {"date", int64(42), nil}, + {"date", float64(3.14), nil}, + {"date", true, nil}, + {"date", time.Now().Add(-time.Hour*12 - 30*time.Minute).UTC().Format(time.RFC3339), "12h"}, + {"date", time.Now().Add(+time.Hour*12 + 30*time.Minute).UTC().Format(time.RFC3339), ""}, + {"date", "", ""}, + + {"unknown", "foo", nil}, + } + for _, tt := range tests { + t.Run(fmt.Sprintf("%#v of type %s", tt.value, tt.headerType), func(t *testing.T) { + if got := cellForJSONValue(tt.headerType, tt.value); !reflect.DeepEqual(got, tt.want) { + t.Errorf("cellForJSONValue() = %#v, want %#v", got, tt.want) + } + }) + } +} diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/validator.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/validator.go index ef5023dc6..5206a17eb 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/validator.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/validator.go @@ -17,6 +17,7 @@ limitations under the License. package customresource import ( + "context" "fmt" "math" "strings" @@ -29,7 +30,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation/field" - genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" apiservervalidation "k8s.io/apiextensions-apiserver/pkg/apiserver/validation" @@ -42,74 +42,37 @@ type customResourceValidator struct { statusSchemaValidator *validate.SchemaValidator } -func (a customResourceValidator) Validate(ctx genericapirequest.Context, obj runtime.Object, scale *apiextensions.CustomResourceSubresourceScale) field.ErrorList { +func (a customResourceValidator) Validate(ctx context.Context, obj runtime.Object, scale *apiextensions.CustomResourceSubresourceScale) field.ErrorList { + u, ok := obj.(*unstructured.Unstructured) + if !ok { + return field.ErrorList{field.Invalid(field.NewPath(""), u, fmt.Sprintf("has type %T. Must be a pointer to an Unstructured type", u))} + } accessor, err := meta.Accessor(obj) if err != nil { return field.ErrorList{field.Invalid(field.NewPath("metadata"), nil, err.Error())} } - typeAccessor, err := meta.TypeAccessor(obj) - if err != nil { - return field.ErrorList{field.Invalid(field.NewPath("kind"), nil, err.Error())} - } - if typeAccessor.GetKind() != a.kind.Kind { - return field.ErrorList{field.Invalid(field.NewPath("kind"), typeAccessor.GetKind(), fmt.Sprintf("must be %v", a.kind.Kind))} - } - if typeAccessor.GetAPIVersion() != a.kind.Group+"/"+a.kind.Version { - return field.ErrorList{field.Invalid(field.NewPath("apiVersion"), typeAccessor.GetAPIVersion(), fmt.Sprintf("must be %v", a.kind.Group+"/"+a.kind.Version))} + + if errs := a.ValidateTypeMeta(ctx, u); len(errs) > 0 { + return errs } - customResourceObject, ok := obj.(*unstructured.Unstructured) - // this will never happen. - if !ok { - return field.ErrorList{field.Invalid(field.NewPath(""), customResourceObject, fmt.Sprintf("has type %T. Must be a pointer to an Unstructured type", customResourceObject))} + var allErrs field.ErrorList + + allErrs = append(allErrs, validation.ValidateObjectMetaAccessor(accessor, a.namespaceScoped, validation.NameIsDNSSubdomain, field.NewPath("metadata"))...) + if err = apiservervalidation.ValidateCustomResource(u.UnstructuredContent(), a.schemaValidator); err != nil { + allErrs = append(allErrs, field.Invalid(field.NewPath(""), u.UnstructuredContent(), err.Error())) } - customResource := customResourceObject.UnstructuredContent() + allErrs = append(allErrs, a.ValidateScaleSpec(ctx, u, scale)...) + allErrs = append(allErrs, a.ValidateScaleStatus(ctx, u, scale)...) - if err = apiservervalidation.ValidateCustomResource(customResource, a.schemaValidator); err != nil { - return field.ErrorList{field.Invalid(field.NewPath(""), customResource, err.Error())} - } - - if scale != nil { - // validate specReplicas - specReplicasPath := strings.TrimPrefix(scale.SpecReplicasPath, ".") // ignore leading period - specReplicas, _, err := unstructured.NestedInt64(customResource, strings.Split(specReplicasPath, ".")...) - if err != nil { - return field.ErrorList{field.Invalid(field.NewPath(scale.SpecReplicasPath), specReplicas, err.Error())} - } - if specReplicas < 0 { - return field.ErrorList{field.Invalid(field.NewPath(scale.SpecReplicasPath), specReplicas, "should be a non-negative integer")} - } - if specReplicas > math.MaxInt32 { - return field.ErrorList{field.Invalid(field.NewPath(scale.SpecReplicasPath), specReplicas, fmt.Sprintf("should be less than or equal to %v", math.MaxInt32))} - } - - // validate statusReplicas - statusReplicasPath := strings.TrimPrefix(scale.StatusReplicasPath, ".") // ignore leading period - statusReplicas, _, err := unstructured.NestedInt64(customResource, strings.Split(statusReplicasPath, ".")...) - if err != nil { - return field.ErrorList{field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, err.Error())} - } - if statusReplicas < 0 { - return field.ErrorList{field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, "should be a non-negative integer")} - } - if statusReplicas > math.MaxInt32 { - return field.ErrorList{field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, fmt.Sprintf("should be less than or equal to %v", math.MaxInt32))} - } - - // validate labelSelector - if scale.LabelSelectorPath != nil { - labelSelectorPath := strings.TrimPrefix(*scale.LabelSelectorPath, ".") // ignore leading period - labelSelector, _, err := unstructured.NestedString(customResource, strings.Split(labelSelectorPath, ".")...) - if err != nil { - return field.ErrorList{field.Invalid(field.NewPath(*scale.LabelSelectorPath), labelSelector, err.Error())} - } - } - } - - return validation.ValidateObjectMetaAccessor(accessor, a.namespaceScoped, validation.NameIsDNSSubdomain, field.NewPath("metadata")) + return allErrs } -func (a customResourceValidator) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object, scale *apiextensions.CustomResourceSubresourceScale) field.ErrorList { +func (a customResourceValidator) ValidateUpdate(ctx context.Context, obj, old runtime.Object, scale *apiextensions.CustomResourceSubresourceScale) field.ErrorList { + u, ok := obj.(*unstructured.Unstructured) + if !ok { + return field.ErrorList{field.Invalid(field.NewPath(""), u, fmt.Sprintf("has type %T. Must be a pointer to an Unstructured type", u))} + } objAccessor, err := meta.Accessor(obj) if err != nil { return field.ErrorList{field.Invalid(field.NewPath("metadata"), nil, err.Error())} @@ -118,69 +81,28 @@ func (a customResourceValidator) ValidateUpdate(ctx genericapirequest.Context, o if err != nil { return field.ErrorList{field.Invalid(field.NewPath("metadata"), nil, err.Error())} } - typeAccessor, err := meta.TypeAccessor(obj) - if err != nil { - return field.ErrorList{field.Invalid(field.NewPath("kind"), nil, err.Error())} - } - if typeAccessor.GetKind() != a.kind.Kind { - return field.ErrorList{field.Invalid(field.NewPath("kind"), typeAccessor.GetKind(), fmt.Sprintf("must be %v", a.kind.Kind))} - } - if typeAccessor.GetAPIVersion() != a.kind.Group+"/"+a.kind.Version { - return field.ErrorList{field.Invalid(field.NewPath("apiVersion"), typeAccessor.GetAPIVersion(), fmt.Sprintf("must be %v", a.kind.Group+"/"+a.kind.Version))} + + if errs := a.ValidateTypeMeta(ctx, u); len(errs) > 0 { + return errs } - customResourceObject, ok := obj.(*unstructured.Unstructured) - // this will never happen. - if !ok { - return field.ErrorList{field.Invalid(field.NewPath(""), customResourceObject, fmt.Sprintf("has type %T. Must be a pointer to an Unstructured type", customResourceObject))} + var allErrs field.ErrorList + + allErrs = append(allErrs, validation.ValidateObjectMetaAccessorUpdate(objAccessor, oldAccessor, field.NewPath("metadata"))...) + if err = apiservervalidation.ValidateCustomResource(u.UnstructuredContent(), a.schemaValidator); err != nil { + allErrs = append(allErrs, field.Invalid(field.NewPath(""), u.UnstructuredContent(), err.Error())) } - customResource := customResourceObject.UnstructuredContent() + allErrs = append(allErrs, a.ValidateScaleSpec(ctx, u, scale)...) + allErrs = append(allErrs, a.ValidateScaleStatus(ctx, u, scale)...) - if err = apiservervalidation.ValidateCustomResource(customResource, a.schemaValidator); err != nil { - return field.ErrorList{field.Invalid(field.NewPath(""), customResource, err.Error())} - } - - if scale != nil { - // validate specReplicas - specReplicasPath := strings.TrimPrefix(scale.SpecReplicasPath, ".") // ignore leading period - specReplicas, _, err := unstructured.NestedInt64(customResource, strings.Split(specReplicasPath, ".")...) - if err != nil { - return field.ErrorList{field.Invalid(field.NewPath(scale.SpecReplicasPath), specReplicas, err.Error())} - } - if specReplicas < 0 { - return field.ErrorList{field.Invalid(field.NewPath(scale.SpecReplicasPath), specReplicas, "should be a non-negative integer")} - } - if specReplicas > math.MaxInt32 { - return field.ErrorList{field.Invalid(field.NewPath(scale.SpecReplicasPath), specReplicas, fmt.Sprintf("should be less than or equal to %v", math.MaxInt32))} - } - - // validate statusReplicas - statusReplicasPath := strings.TrimPrefix(scale.StatusReplicasPath, ".") // ignore leading period - statusReplicas, _, err := unstructured.NestedInt64(customResource, strings.Split(statusReplicasPath, ".")...) - if err != nil { - return field.ErrorList{field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, err.Error())} - } - if statusReplicas < 0 { - return field.ErrorList{field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, "should be a non-negative integer")} - } - if statusReplicas > math.MaxInt32 { - return field.ErrorList{field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, fmt.Sprintf("should be less than or equal to %v", math.MaxInt32))} - } - - // validate labelSelector - if scale.LabelSelectorPath != nil { - labelSelectorPath := strings.TrimPrefix(*scale.LabelSelectorPath, ".") // ignore leading period - labelSelector, _, err := unstructured.NestedString(customResource, strings.Split(labelSelectorPath, ".")...) - if err != nil { - return field.ErrorList{field.Invalid(field.NewPath(*scale.LabelSelectorPath), labelSelector, err.Error())} - } - } - } - - return validation.ValidateObjectMetaAccessorUpdate(objAccessor, oldAccessor, field.NewPath("metadata")) + return allErrs } -func (a customResourceValidator) ValidateStatusUpdate(ctx genericapirequest.Context, obj, old runtime.Object, scale *apiextensions.CustomResourceSubresourceScale) field.ErrorList { +func (a customResourceValidator) ValidateStatusUpdate(ctx context.Context, obj, old runtime.Object, scale *apiextensions.CustomResourceSubresourceScale) field.ErrorList { + u, ok := obj.(*unstructured.Unstructured) + if !ok { + return field.ErrorList{field.Invalid(field.NewPath(""), u, fmt.Sprintf("has type %T. Must be a pointer to an Unstructured type", u))} + } objAccessor, err := meta.Accessor(obj) if err != nil { return field.ErrorList{field.Invalid(field.NewPath("metadata"), nil, err.Error())} @@ -189,53 +111,85 @@ func (a customResourceValidator) ValidateStatusUpdate(ctx genericapirequest.Cont if err != nil { return field.ErrorList{field.Invalid(field.NewPath("metadata"), nil, err.Error())} } + + if errs := a.ValidateTypeMeta(ctx, u); len(errs) > 0 { + return errs + } + + var allErrs field.ErrorList + + allErrs = append(allErrs, validation.ValidateObjectMetaAccessorUpdate(objAccessor, oldAccessor, field.NewPath("metadata"))...) + if err = apiservervalidation.ValidateCustomResource(u.UnstructuredContent(), a.schemaValidator); err != nil { + allErrs = append(allErrs, field.Invalid(field.NewPath(""), u.UnstructuredContent(), err.Error())) + } + allErrs = append(allErrs, a.ValidateScaleStatus(ctx, u, scale)...) + + return allErrs +} + +func (a customResourceValidator) ValidateTypeMeta(ctx context.Context, obj *unstructured.Unstructured) field.ErrorList { typeAccessor, err := meta.TypeAccessor(obj) if err != nil { return field.ErrorList{field.Invalid(field.NewPath("kind"), nil, err.Error())} } + + var allErrs field.ErrorList if typeAccessor.GetKind() != a.kind.Kind { - return field.ErrorList{field.Invalid(field.NewPath("kind"), typeAccessor.GetKind(), fmt.Sprintf("must be %v", a.kind.Kind))} + allErrs = append(allErrs, field.Invalid(field.NewPath("kind"), typeAccessor.GetKind(), fmt.Sprintf("must be %v", a.kind.Kind))) } if typeAccessor.GetAPIVersion() != a.kind.Group+"/"+a.kind.Version { - return field.ErrorList{field.Invalid(field.NewPath("apiVersion"), typeAccessor.GetAPIVersion(), fmt.Sprintf("must be %v", a.kind.Group+"/"+a.kind.Version))} + allErrs = append(allErrs, field.Invalid(field.NewPath("apiVersion"), typeAccessor.GetAPIVersion(), fmt.Sprintf("must be %v", a.kind.Group+"/"+a.kind.Version))) } - - customResourceObject, ok := obj.(*unstructured.Unstructured) - // this will never happen. - if !ok { - return field.ErrorList{field.Invalid(field.NewPath(""), customResourceObject, fmt.Sprintf("has type %T. Must be a pointer to an Unstructured type", customResourceObject))} - } - customResource := customResourceObject.UnstructuredContent() - - // validate only the status - customResourceStatus := customResource["status"] - if err = apiservervalidation.ValidateCustomResource(customResourceStatus, a.statusSchemaValidator); err != nil { - return field.ErrorList{field.Invalid(field.NewPath("status"), customResourceStatus, err.Error())} - } - - if scale != nil { - // validate statusReplicas - statusReplicasPath := strings.TrimPrefix(scale.StatusReplicasPath, ".") // ignore leading period - statusReplicas, _, err := unstructured.NestedInt64(customResource, strings.Split(statusReplicasPath, ".")...) - if err != nil { - return field.ErrorList{field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, err.Error())} - } - if statusReplicas < 0 { - return field.ErrorList{field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, "should be a non-negative integer")} - } - if statusReplicas > math.MaxInt32 { - return field.ErrorList{field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, fmt.Sprintf("should be less than or equal to %v", math.MaxInt32))} - } - - // validate labelSelector - if scale.LabelSelectorPath != nil { - labelSelectorPath := strings.TrimPrefix(*scale.LabelSelectorPath, ".") // ignore leading period - labelSelector, _, err := unstructured.NestedString(customResource, strings.Split(labelSelectorPath, ".")...) - if err != nil { - return field.ErrorList{field.Invalid(field.NewPath(*scale.LabelSelectorPath), labelSelector, err.Error())} - } - } - } - - return validation.ValidateObjectMetaAccessorUpdate(objAccessor, oldAccessor, field.NewPath("metadata")) + return allErrs +} + +func (a customResourceValidator) ValidateScaleSpec(ctx context.Context, obj *unstructured.Unstructured, scale *apiextensions.CustomResourceSubresourceScale) field.ErrorList { + if scale == nil { + return nil + } + + var allErrs field.ErrorList + + // validate specReplicas + specReplicasPath := strings.TrimPrefix(scale.SpecReplicasPath, ".") // ignore leading period + specReplicas, _, err := unstructured.NestedInt64(obj.UnstructuredContent(), strings.Split(specReplicasPath, ".")...) + if err != nil { + allErrs = append(allErrs, field.Invalid(field.NewPath(scale.SpecReplicasPath), specReplicas, err.Error())) + } else if specReplicas < 0 { + allErrs = append(allErrs, field.Invalid(field.NewPath(scale.SpecReplicasPath), specReplicas, "should be a non-negative integer")) + } else if specReplicas > math.MaxInt32 { + allErrs = append(allErrs, field.Invalid(field.NewPath(scale.SpecReplicasPath), specReplicas, fmt.Sprintf("should be less than or equal to %v", math.MaxInt32))) + } + + return allErrs +} + +func (a customResourceValidator) ValidateScaleStatus(ctx context.Context, obj *unstructured.Unstructured, scale *apiextensions.CustomResourceSubresourceScale) field.ErrorList { + if scale == nil { + return nil + } + + var allErrs field.ErrorList + + // validate statusReplicas + statusReplicasPath := strings.TrimPrefix(scale.StatusReplicasPath, ".") // ignore leading period + statusReplicas, _, err := unstructured.NestedInt64(obj.UnstructuredContent(), strings.Split(statusReplicasPath, ".")...) + if err != nil { + allErrs = append(allErrs, field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, err.Error())) + } else if statusReplicas < 0 { + allErrs = append(allErrs, field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, "should be a non-negative integer")) + } else if statusReplicas > math.MaxInt32 { + allErrs = append(allErrs, field.Invalid(field.NewPath(scale.StatusReplicasPath), statusReplicas, fmt.Sprintf("should be less than or equal to %v", math.MaxInt32))) + } + + // validate labelSelector + if scale.LabelSelectorPath != nil { + labelSelectorPath := strings.TrimPrefix(*scale.LabelSelectorPath, ".") // ignore leading period + labelSelector, _, err := unstructured.NestedString(obj.UnstructuredContent(), strings.Split(labelSelectorPath, ".")...) + if err != nil { + allErrs = append(allErrs, field.Invalid(field.NewPath(*scale.LabelSelectorPath), labelSelector, err.Error())) + } + } + + return allErrs } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD deleted file mode 100644 index 2a77d83b3..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "etcd.go", - "strategy.go", - ], - importpath = "k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition", - deps = [ - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - "//vendor/k8s.io/apiserver/pkg/endpoints/request:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/generic/registry:go_default_library", - "//vendor/k8s.io/apiserver/pkg/registry/rest:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/errors:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go index c501c6a08..8d272ad77 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/etcd.go @@ -17,13 +17,13 @@ limitations under the License. package customresourcedefinition import ( + "context" "fmt" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/generic" genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" "k8s.io/apiserver/pkg/registry/rest" @@ -66,7 +66,7 @@ func (r *REST) ShortNames() []string { } // Delete adds the CRD finalizer to the list -func (r *REST) Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error) { +func (r *REST) Delete(ctx context.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error) { obj, err := r.Get(ctx, name, &metav1.GetOptions{}) if err != nil { return nil, false, err @@ -160,13 +160,18 @@ type StatusREST struct { store *genericregistry.Store } -var _ = rest.Updater(&StatusREST{}) +var _ = rest.Patcher(&StatusREST{}) func (r *StatusREST) New() runtime.Object { return &apiextensions.CustomResourceDefinition{} } +// Get retrieves the object from the storage. It is required to support Patch. +func (r *StatusREST) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { + return r.store.Get(ctx, name, options) +} + // Update alters the status subset of an object. -func (r *StatusREST) Update(ctx genericapirequest.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc) (runtime.Object, bool, error) { +func (r *StatusREST) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc) (runtime.Object, bool, error) { return r.store.Update(ctx, name, objInfo, createValidation, updateValidation) } diff --git a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go index 7e44fa4c2..a0bebb7a7 100644 --- a/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go +++ b/vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/strategy.go @@ -17,6 +17,7 @@ limitations under the License. package customresourcedefinition import ( + "context" "fmt" apiequality "k8s.io/apimachinery/pkg/api/equality" @@ -24,7 +25,6 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" - genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" @@ -50,7 +50,7 @@ func (strategy) NamespaceScoped() bool { } // PrepareForCreate clears the status of a CustomResourceDefinition before creation. -func (strategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) { +func (strategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { crd := obj.(*apiextensions.CustomResourceDefinition) crd.Status = apiextensions.CustomResourceDefinitionStatus{} crd.Generation = 1 @@ -62,10 +62,19 @@ func (strategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Obje if !utilfeature.DefaultFeatureGate.Enabled(apiextensionsfeatures.CustomResourceSubresources) { crd.Spec.Subresources = nil } + + for _, v := range crd.Spec.Versions { + if v.Storage { + if !apiextensions.IsStoredVersion(crd, v.Name) { + crd.Status.StoredVersions = append(crd.Status.StoredVersions, v.Name) + } + break + } + } } // PrepareForUpdate clears fields that are not allowed to be set by end users on update. -func (strategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) { +func (strategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newCRD := obj.(*apiextensions.CustomResourceDefinition) oldCRD := old.(*apiextensions.CustomResourceDefinition) newCRD.Status = oldCRD.Status @@ -90,10 +99,19 @@ func (strategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime newCRD.Spec.Subresources = nil oldCRD.Spec.Subresources = nil } + + for _, v := range newCRD.Spec.Versions { + if v.Storage { + if !apiextensions.IsStoredVersion(newCRD, v.Name) { + newCRD.Status.StoredVersions = append(newCRD.Status.StoredVersions, v.Name) + } + break + } + } } // Validate validates a new CustomResourceDefinition. -func (strategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList { +func (strategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList { return validation.ValidateCustomResourceDefinition(obj.(*apiextensions.CustomResourceDefinition)) } @@ -113,7 +131,7 @@ func (strategy) Canonicalize(obj runtime.Object) { } // ValidateUpdate is the default update validation for an end user updating status. -func (strategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { +func (strategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { return validation.ValidateCustomResourceDefinitionUpdate(obj.(*apiextensions.CustomResourceDefinition), old.(*apiextensions.CustomResourceDefinition)) } @@ -130,7 +148,7 @@ func (statusStrategy) NamespaceScoped() bool { return false } -func (statusStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) { +func (statusStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { newObj := obj.(*apiextensions.CustomResourceDefinition) oldObj := old.(*apiextensions.CustomResourceDefinition) newObj.Spec = oldObj.Spec @@ -155,7 +173,7 @@ func (statusStrategy) AllowUnconditionalUpdate() bool { func (statusStrategy) Canonicalize(obj runtime.Object) { } -func (statusStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList { +func (statusStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList { return validation.ValidateUpdateCustomResourceDefinitionStatus(obj.(*apiextensions.CustomResourceDefinition), old.(*apiextensions.CustomResourceDefinition)) } diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/BUILD b/vendor/k8s.io/apiextensions-apiserver/test/integration/BUILD deleted file mode 100644 index b9617e41a..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/BUILD +++ /dev/null @@ -1,58 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "basic_test.go", - "finalization_test.go", - "registration_test.go", - "subresources_test.go", - "validation_test.go", - "yaml_test.go", - ], - tags = ["integration"], - deps = [ - "//vendor/github.com/coreos/etcd/clientv3:go_default_library", - "//vendor/github.com/ghodss/yaml:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/features:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/test/integration/testserver:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", - "//vendor/k8s.io/apiserver/pkg/util/feature/testing:go_default_library", - "//vendor/k8s.io/client-go/dynamic:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apiextensions-apiserver/test/integration/testserver:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/basic_test.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/basic_test.go index e373a178a..a53c4ca94 100644 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/basic_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/basic_test.go @@ -17,6 +17,7 @@ limitations under the License. package integration import ( + "fmt" "reflect" "sort" "testing" @@ -43,177 +44,217 @@ func TestServerUp(t *testing.T) { } func TestNamespaceScopedCRUD(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - testSimpleCRUD(t, ns, noxuDefinition, noxuVersionClient) - testFieldSelector(t, ns, noxuDefinition, noxuVersionClient) + + testSimpleCRUD(t, ns, noxuDefinition, dynamicClient) + testFieldSelector(t, ns, noxuDefinition, dynamicClient) } func TestClusterScopedCRUD(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "" - testSimpleCRUD(t, ns, noxuDefinition, noxuVersionClient) - testFieldSelector(t, ns, noxuDefinition, noxuVersionClient) + testSimpleCRUD(t, ns, noxuDefinition, dynamicClient) + testFieldSelector(t, ns, noxuDefinition, dynamicClient) } -func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition, noxuVersionClient dynamic.Interface) { - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) +func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition, dynamicClient dynamic.Interface) { + noxuResourceClients := map[string]dynamic.ResourceInterface{} + noxuWatchs := map[string]watch.Interface{} + disabledVersions := map[string]bool{} + for _, v := range noxuDefinition.Spec.Versions { + disabledVersions[v.Name] = !v.Served + } + for _, v := range noxuDefinition.Spec.Versions { + noxuResourceClients[v.Name] = newNamespacedCustomResourceVersionedClient(ns, dynamicClient, noxuDefinition, v.Name) + + noxuWatch, err := noxuResourceClients[v.Name].Watch(metav1.ListOptions{}) + if disabledVersions[v.Name] { + if err == nil { + t.Errorf("expected the watch creation fail for disabled version %s", v.Name) + } + } else { + if err != nil { + t.Fatal(err) + } + noxuWatchs[v.Name] = noxuWatch + } + } + defer func() { + for _, w := range noxuWatchs { + w.Stop() + } + }() + + for version, noxuResourceClient := range noxuResourceClients { + createdNoxuInstance, err := instantiateVersionedCustomResource(t, testserver.NewVersionedNoxuInstance(ns, "foo", version), noxuResourceClient, noxuDefinition, version) + if disabledVersions[version] { + if err == nil { + t.Errorf("expected the CR creation fail for disabled version %s", version) + } + continue + } + if err != nil { + t.Fatalf("unable to create noxu Instance:%v", err) + } + if e, a := noxuDefinition.Spec.Group+"/"+version, createdNoxuInstance.GetAPIVersion(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + for watchVersion, noxuWatch := range noxuWatchs { + select { + case watchEvent := <-noxuWatch.ResultChan(): + if e, a := watch.Added, watchEvent.Type; e != a { + t.Errorf("expected %v, got %v", e, a) + break + } + createdObjectMeta, err := meta.Accessor(watchEvent.Object) + if err != nil { + t.Fatal(err) + } + // it should have a UUID + if len(createdObjectMeta.GetUID()) == 0 { + t.Errorf("missing uuid: %#v", watchEvent.Object) + } + if e, a := ns, createdObjectMeta.GetNamespace(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + createdTypeMeta, err := meta.TypeAccessor(watchEvent.Object) + if err != nil { + t.Fatal(err) + } + if e, a := noxuDefinition.Spec.Group+"/"+watchVersion, createdTypeMeta.GetAPIVersion(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := noxuDefinition.Spec.Names.Kind, createdTypeMeta.GetKind(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + case <-time.After(5 * time.Second): + t.Errorf("missing watch event") + } + } + + // Check get for all versions + for version2, noxuResourceClient2 := range noxuResourceClients { + // Get test + gottenNoxuInstance, err := noxuResourceClient2.Get("foo", metav1.GetOptions{}) + + if disabledVersions[version2] { + if err == nil { + t.Errorf("expected the get operation fail for disabled version %s", version2) + } + } else { + if err != nil { + t.Fatal(err) + } + + if e, a := version2, gottenNoxuInstance.GroupVersionKind().Version; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } + } + + // List test + listWithItem, err := noxuResourceClient2.List(metav1.ListOptions{}) + if disabledVersions[version2] { + if err == nil { + t.Errorf("expected the list operation fail for disabled version %s", version2) + } + } else { + if err != nil { + t.Fatal(err) + } + if e, a := 1, len(listWithItem.Items); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := version2, listWithItem.GroupVersionKind().Version; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := version2, listWithItem.Items[0].GroupVersionKind().Version; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } + } + } + + // Delete test + if err := noxuResourceClient.Delete("foo", metav1.NewDeleteOptions(0)); err != nil { + t.Fatal(err) + } + + listWithoutItem, err := noxuResourceClient.List(metav1.ListOptions{}) + if err != nil { + t.Fatal(err) + } + if e, a := 0, len(listWithoutItem.Items); e != a { + t.Errorf("expected %v, got %v", e, a) + } + + for _, noxuWatch := range noxuWatchs { + select { + case watchEvent := <-noxuWatch.ResultChan(): + if e, a := watch.Deleted, watchEvent.Type; e != a { + t.Errorf("expected %v, got %v", e, a) + break + } + deletedObjectMeta, err := meta.Accessor(watchEvent.Object) + if err != nil { + t.Fatal(err) + } + // it should have a UUID + createdObjectMeta, err := meta.Accessor(createdNoxuInstance) + if err != nil { + t.Fatal(err) + } + if e, a := createdObjectMeta.GetUID(), deletedObjectMeta.GetUID(); e != a { + t.Errorf("expected equal UID for (expected) %v, and (actual) %v", createdNoxuInstance, watchEvent.Object) + } + + case <-time.After(5 * time.Second): + t.Errorf("missing watch event") + } + } + + // Delete test + if err := noxuResourceClient.DeleteCollection(metav1.NewDeleteOptions(0), metav1.ListOptions{}); err != nil { + t.Fatal(err) + } + } +} + +func testFieldSelector(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition, dynamicClient dynamic.Interface) { + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) initialList, err := noxuResourceClient.List(metav1.ListOptions{}) if err != nil { t.Fatal(err) } - if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a { + if e, a := 0, len(initialList.Items); e != a { t.Errorf("expected %v, got %v", e, a) } initialListTypeMeta, err := meta.TypeAccessor(initialList) if err != nil { t.Fatal(err) } - if e, a := noxuDefinition.Spec.Group+"/"+noxuDefinition.Spec.Version, initialListTypeMeta.GetAPIVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := noxuDefinition.Spec.Names.ListKind, initialListTypeMeta.GetKind(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - initialListListMeta, err := meta.ListAccessor(initialList) - if err != nil { - t.Fatal(err) - } - noxuWatch, err := noxuResourceClient.Watch(metav1.ListOptions{ResourceVersion: initialListListMeta.GetResourceVersion()}) - if err != nil { - t.Fatal(err) - } - defer noxuWatch.Stop() - - createdNoxuInstance, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, "foo"), noxuResourceClient, noxuDefinition) - if err != nil { - t.Fatalf("unable to create noxu Instance:%v", err) - } - - select { - case watchEvent := <-noxuWatch.ResultChan(): - if e, a := watch.Added, watchEvent.Type; e != a { - t.Errorf("expected %v, got %v", e, a) - break - } - createdObjectMeta, err := meta.Accessor(watchEvent.Object) - if err != nil { - t.Fatal(err) - } - // it should have a UUID - if len(createdObjectMeta.GetUID()) == 0 { - t.Errorf("missing uuid: %#v", watchEvent.Object) - } - if e, a := ns, createdObjectMeta.GetNamespace(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - createdTypeMeta, err := meta.TypeAccessor(watchEvent.Object) - if err != nil { - t.Fatal(err) - } - if e, a := noxuDefinition.Spec.Group+"/"+noxuDefinition.Spec.Version, createdTypeMeta.GetAPIVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := noxuDefinition.Spec.Names.Kind, createdTypeMeta.GetKind(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - case <-time.After(5 * time.Second): - t.Errorf("missing watch event") - } - - gottenNoxuInstance, err := noxuResourceClient.Get("foo", metav1.GetOptions{}) - if err != nil { - t.Fatal(err) - } - if e, a := createdNoxuInstance, gottenNoxuInstance; !reflect.DeepEqual(e, a) { - t.Errorf("expected %v, got %v", e, a) - } - - listWithItem, err := noxuResourceClient.List(metav1.ListOptions{}) - if err != nil { - t.Fatal(err) - } - if e, a := 1, len(listWithItem.(*unstructured.UnstructuredList).Items); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := *createdNoxuInstance, listWithItem.(*unstructured.UnstructuredList).Items[0]; !reflect.DeepEqual(e, a) { - t.Errorf("expected %v, got %v", e, a) - } - - if err := noxuResourceClient.Delete("foo", nil); err != nil { - t.Fatal(err) - } - - listWithoutItem, err := noxuResourceClient.List(metav1.ListOptions{}) - if err != nil { - t.Fatal(err) - } - if e, a := 0, len(listWithoutItem.(*unstructured.UnstructuredList).Items); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - select { - case watchEvent := <-noxuWatch.ResultChan(): - if e, a := watch.Deleted, watchEvent.Type; e != a { - t.Errorf("expected %v, got %v", e, a) - break - } - deletedObjectMeta, err := meta.Accessor(watchEvent.Object) - if err != nil { - t.Fatal(err) - } - // it should have a UUID - createdObjectMeta, err := meta.Accessor(createdNoxuInstance) - if err != nil { - t.Fatal(err) - } - if e, a := createdObjectMeta.GetUID(), deletedObjectMeta.GetUID(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - case <-time.After(5 * time.Second): - t.Errorf("missing watch event") - } -} - -func testFieldSelector(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition, noxuVersionClient dynamic.Interface) { - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) - initialList, err := noxuResourceClient.List(metav1.ListOptions{}) - if err != nil { - t.Fatal(err) - } - if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a { - t.Errorf("expected %v, got %v", e, a) - } - initialListTypeMeta, err := meta.TypeAccessor(initialList) - if err != nil { - t.Fatal(err) - } - if e, a := noxuDefinition.Spec.Group+"/"+noxuDefinition.Spec.Version, initialListTypeMeta.GetAPIVersion(); e != a { + if e, a := noxuDefinition.Spec.Group+"/"+noxuDefinition.Spec.Versions[0].Name, initialListTypeMeta.GetAPIVersion(); e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := noxuDefinition.Spec.Names.ListKind, initialListTypeMeta.GetKind(); e != a { @@ -268,7 +309,7 @@ func testFieldSelector(t *testing.T, ns string, noxuDefinition *apiextensionsv1b if err != nil { t.Fatal(err) } - if e, a := noxuDefinition.Spec.Group+"/"+noxuDefinition.Spec.Version, createdTypeMeta.GetAPIVersion(); e != a { + if e, a := noxuDefinition.Spec.Group+"/"+noxuDefinition.Spec.Versions[0].Name, createdTypeMeta.GetAPIVersion(); e != a { t.Errorf("expected %v, got %v", e, a) } if e, a := noxuDefinition.Spec.Names.Kind, createdTypeMeta.GetKind(); e != a { @@ -291,10 +332,10 @@ func testFieldSelector(t *testing.T, ns string, noxuDefinition *apiextensionsv1b if err != nil { t.Fatal(err) } - if e, a := 1, len(listWithItem.(*unstructured.UnstructuredList).Items); e != a { + if e, a := 1, len(listWithItem.Items); e != a { t.Errorf("expected %v, got %v", e, a) } - if e, a := *createdNoxuInstanceFoo, listWithItem.(*unstructured.UnstructuredList).Items[0]; !reflect.DeepEqual(e, a) { + if e, a := *createdNoxuInstanceFoo, listWithItem.Items[0]; !reflect.DeepEqual(e, a) { t.Errorf("expected %v, got %v", e, a) } @@ -309,7 +350,7 @@ func testFieldSelector(t *testing.T, ns string, noxuDefinition *apiextensionsv1b if err != nil { t.Fatal(err) } - if e, a := 0, len(listWithoutItem.(*unstructured.UnstructuredList).Items); e != a { + if e, a := 0, len(listWithoutItem.Items); e != a { t.Errorf("expected %v, got %v", e, a) } @@ -347,7 +388,7 @@ func TestDiscovery(t *testing.T) { group := "mygroup.example.com" version := "v1beta1" - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } @@ -355,7 +396,7 @@ func TestDiscovery(t *testing.T) { scope := apiextensionsv1beta1.NamespaceScoped noxuDefinition := testserver.NewNoxuCustomResourceDefinition(scope) - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } @@ -395,25 +436,25 @@ func TestDiscovery(t *testing.T) { } func TestNoNamespaceReject(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) initialList, err := noxuResourceClient.List(metav1.ListOptions{}) if err != nil { t.Fatal(err) } - if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a { + if e, a := 0, len(initialList.Items); e != a { t.Errorf("expected %v, got %v", e, a) } initialListTypeMeta, err := meta.TypeAccessor(initialList) @@ -434,27 +475,27 @@ func TestNoNamespaceReject(t *testing.T) { } func TestSameNameDiffNamespace(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns1 := "namespace-1" - testSimpleCRUD(t, ns1, noxuDefinition, noxuVersionClient) + testSimpleCRUD(t, ns1, noxuDefinition, dynamicClient) ns2 := "namespace-2" - testSimpleCRUD(t, ns2, noxuDefinition, noxuVersionClient) + testSimpleCRUD(t, ns2, noxuDefinition, dynamicClient) } func TestSelfLink(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } @@ -462,16 +503,13 @@ func TestSelfLink(t *testing.T) { // namespace scoped noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuNamespacedResourceClient := noxuVersionClient.Resource(&metav1.APIResource{ - Name: noxuDefinition.Spec.Names.Plural, - Namespaced: noxuDefinition.Spec.Scope == apiextensionsv1beta1.NamespaceScoped, - }, ns) + noxuNamespacedResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) noxuInstanceToCreate := testserver.NewNoxuInstance(ns, "foo") createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate) @@ -485,15 +523,12 @@ func TestSelfLink(t *testing.T) { // cluster scoped curletDefinition := testserver.NewCurletCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped) - curletVersionClient, err := testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, clientPool) + curletDefinition, err = testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } - curletResourceClient := curletVersionClient.Resource(&metav1.APIResource{ - Name: curletDefinition.Spec.Names.Plural, - Namespaced: curletDefinition.Spec.Scope == apiextensionsv1beta1.NamespaceScoped, - }, ns) + curletResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, curletDefinition) curletInstanceToCreate := testserver.NewCurletInstance(ns, "foo") createdCurletInstance, err := curletResourceClient.Create(curletInstanceToCreate) @@ -507,23 +542,20 @@ func TestSelfLink(t *testing.T) { } func TestPreserveInt(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuNamespacedResourceClient := noxuVersionClient.Resource(&metav1.APIResource{ - Name: noxuDefinition.Spec.Names.Plural, - Namespaced: true, - }, ns) + noxuNamespacedResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) noxuInstanceToCreate := testserver.NewNoxuInstance(ns, "foo") createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate) @@ -552,23 +584,20 @@ func TestPreserveInt(t *testing.T) { } func TestPatch(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuNamespacedResourceClient := noxuVersionClient.Resource(&metav1.APIResource{ - Name: noxuDefinition.Spec.Names.Plural, - Namespaced: true, - }, ns) + noxuNamespacedResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) noxuInstanceToCreate := testserver.NewNoxuInstance(ns, "foo") createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate) @@ -582,17 +611,6 @@ func TestPatch(t *testing.T) { t.Fatalf("unexpected error: %v", err) } - // this call waits for the resourceVersion to be reached in the cache before returning. - // We need to do this because the patch gets its initial object from the storage, and the cache serves that. - // If it is out of date, then our initial patch is applied to an old resource version, which conflicts - // and then the updated object shows a conflicting diff, which permanently fails the patch. - // This gives expected stability in the patch without retrying on an known number of conflicts below in the test. - // See https://issue.k8s.io/42644 - _, err = noxuNamespacedResourceClient.Get("foo", metav1.GetOptions{ResourceVersion: createdNoxuInstance.GetResourceVersion()}) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - // a patch with no change createdNoxuInstance, err = noxuNamespacedResourceClient.Patch("foo", types.MergePatchType, patch) if err != nil { @@ -626,25 +644,25 @@ func TestPatch(t *testing.T) { } func TestCrossNamespaceListWatch(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) initialList, err := noxuResourceClient.List(metav1.ListOptions{}) if err != nil { t.Fatal(err) } - if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a { + if e, a := 0, len(initialList.Items); e != a { t.Errorf("expected %v, got %v", e, a) } @@ -661,13 +679,13 @@ func TestCrossNamespaceListWatch(t *testing.T) { instances := make(map[string]*unstructured.Unstructured) ns1 := "namespace-1" - noxuNamespacedResourceClient1 := NewNamespacedCustomResourceClient(ns1, noxuVersionClient, noxuDefinition) + noxuNamespacedResourceClient1 := newNamespacedCustomResourceClient(ns1, dynamicClient, noxuDefinition) instances[ns1] = createInstanceWithNamespaceHelper(t, ns1, "foo1", noxuNamespacedResourceClient1, noxuDefinition) noxuNamespacesWatch1, err := noxuNamespacedResourceClient1.Watch(metav1.ListOptions{ResourceVersion: initialListListMeta.GetResourceVersion()}) defer noxuNamespacesWatch1.Stop() ns2 := "namespace-2" - noxuNamespacedResourceClient2 := NewNamespacedCustomResourceClient(ns2, noxuVersionClient, noxuDefinition) + noxuNamespacedResourceClient2 := newNamespacedCustomResourceClient(ns2, dynamicClient, noxuDefinition) instances[ns2] = createInstanceWithNamespaceHelper(t, ns2, "foo2", noxuNamespacedResourceClient2, noxuDefinition) noxuNamespacesWatch2, err := noxuNamespacedResourceClient2.Watch(metav1.ListOptions{ResourceVersion: initialListListMeta.GetResourceVersion()}) defer noxuNamespacesWatch2.Stop() @@ -677,11 +695,11 @@ func TestCrossNamespaceListWatch(t *testing.T) { t.Fatal(err) } - if e, a := 2, len(createdList.(*unstructured.UnstructuredList).Items); e != a { + if e, a := 2, len(createdList.Items); e != a { t.Errorf("expected %v, got %v", e, a) } - for _, a := range createdList.(*unstructured.UnstructuredList).Items { + for _, a := range createdList.Items { if e := instances[a.GetNamespace()]; !reflect.DeepEqual(e, &a) { t.Errorf("expected %v, got %v", e, a) } @@ -762,27 +780,27 @@ func checkNamespacesWatchHelper(t *testing.T, ns string, namespacedwatch watch.I } func TestNameConflict(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } noxu2Definition := testserver.NewNoxu2CustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - _, err = apiExtensionClient.Apiextensions().CustomResourceDefinitions().Create(noxu2Definition) + _, err = apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Create(noxu2Definition) if err != nil { t.Fatal(err) } // A NameConflict occurs err = wait.Poll(500*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) { - crd, err := testserver.GetCustomResourceDefinition(noxu2Definition, apiExtensionClient) + crd, err := apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get(noxu2Definition.Name, metav1.GetOptions{}) if err != nil { return false, err } @@ -805,7 +823,7 @@ func TestNameConflict(t *testing.T) { // Names are now accepted err = wait.Poll(500*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) { - crd, err := testserver.GetCustomResourceDefinition(noxu2Definition, apiExtensionClient) + crd, err := apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get(noxu2Definition.Name, metav1.GetOptions{}) if err != nil { return false, err } @@ -821,3 +839,38 @@ func TestNameConflict(t *testing.T) { t.Fatal(err) } } + +func TestStatusGetAndPatch(t *testing.T) { + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() + if err != nil { + t.Fatal(err) + } + defer close(stopCh) + + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) + if err != nil { + t.Fatal(err) + } + + // make sure we don't get 405 Method Not Allowed from Getting CRD/status subresource + result := &apiextensionsv1beta1.CustomResourceDefinition{} + err = apiExtensionClient.ApiextensionsV1beta1().RESTClient().Get(). + Resource("customresourcedefinitions"). + Name(noxuDefinition.Name). + SubResource("status"). + Do(). + Into(result) + if err != nil { + t.Fatal(err) + } + + // make sure we don't get 405 Method Not Allowed from Patching CRD/status subresource + _, err = apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions(). + Patch(noxuDefinition.Name, types.StrategicMergePatchType, + []byte(fmt.Sprintf(`{"labels":{"test-label":"dummy"}}`)), + "status") + if err != nil { + t.Fatal(err) + } +} diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go index 57b04884b..4dcf8d727 100644 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go @@ -18,27 +18,30 @@ package integration import ( "testing" + "time" "github.com/stretchr/testify/require" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + "k8s.io/apiextensions-apiserver/test/integration/testserver" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/wait" ) func TestFinalization(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() require.NoError(t, err) defer close(stopCh) noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) require.NoError(t, err) ns := "not-the-default" name := "foo123" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) instance := testserver.NewNoxuInstance(ns, name) instance.SetFinalizers([]string{"noxu.example.com/finalizer"}) @@ -89,3 +92,74 @@ func TestFinalization(t *testing.T) { require.Error(t, err) require.True(t, errors.IsNotFound(err), "%#v", err) } + +func TestFinalizationAndDeletion(t *testing.T) { + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() + require.NoError(t, err) + defer close(stopCh) + + // Create a CRD. + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) + require.NoError(t, err) + + // Create a CR with a finalizer. + ns := "not-the-default" + name := "foo123" + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) + + instance := testserver.NewNoxuInstance(ns, name) + instance.SetFinalizers([]string{"noxu.example.com/finalizer"}) + createdNoxuInstance, err := instantiateCustomResource(t, instance, noxuResourceClient, noxuDefinition) + require.NoError(t, err) + + // Delete a CR. Because there's a finalizer, it will not get deleted now. + uid := createdNoxuInstance.GetUID() + err = noxuResourceClient.Delete(name, &metav1.DeleteOptions{ + Preconditions: &metav1.Preconditions{ + UID: &uid, + }, + }) + require.NoError(t, err) + + // Check is the CR scheduled for deletion. + gottenNoxuInstance, err := noxuResourceClient.Get(name, metav1.GetOptions{}) + require.NoError(t, err) + require.NotNil(t, gottenNoxuInstance.GetDeletionTimestamp()) + + // Delete the CRD. + testserver.DeleteCustomResourceDefinition(noxuDefinition, apiExtensionClient) + + // Check is CR still there after the CRD deletion. + gottenNoxuInstance, err = noxuResourceClient.Get(name, metav1.GetOptions{}) + require.NoError(t, err) + + // Update the CR to remove the finalizer. + for { + gottenNoxuInstance.SetFinalizers(nil) + _, err = noxuResourceClient.Update(gottenNoxuInstance) + if err == nil { + break + } + if !errors.IsConflict(err) { + require.NoError(t, err) // Fail on unexpected error + } + gottenNoxuInstance, err = noxuResourceClient.Get(name, metav1.GetOptions{}) + require.NoError(t, err) + } + + // Verify the CR is gone. + // It should return the NonFound error. + _, err = noxuResourceClient.Get(name, metav1.GetOptions{}) + if !errors.IsNotFound(err) { + t.Fatalf("unable to delete cr: %v", err) + } + + err = wait.Poll(500*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) { + _, err = apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get(noxuDefinition.Name, metav1.GetOptions{}) + return errors.IsNotFound(err), err + }) + if !errors.IsNotFound(err) { + t.Fatalf("unable to delete crd: %v", err) + } +} diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/helpers.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/helpers.go new file mode 100644 index 000000000..5aa231d45 --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/helpers.go @@ -0,0 +1,94 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package integration + +import ( + "fmt" + "testing" + + apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/dynamic" +) + +func instantiateCustomResource(t *testing.T, instanceToCreate *unstructured.Unstructured, client dynamic.ResourceInterface, definition *apiextensionsv1beta1.CustomResourceDefinition) (*unstructured.Unstructured, error) { + return instantiateVersionedCustomResource(t, instanceToCreate, client, definition, definition.Spec.Versions[0].Name) +} + +func instantiateVersionedCustomResource(t *testing.T, instanceToCreate *unstructured.Unstructured, client dynamic.ResourceInterface, definition *apiextensionsv1beta1.CustomResourceDefinition, version string) (*unstructured.Unstructured, error) { + createdInstance, err := client.Create(instanceToCreate) + if err != nil { + t.Logf("%#v", createdInstance) + return nil, err + } + createdObjectMeta, err := meta.Accessor(createdInstance) + if err != nil { + t.Fatal(err) + } + // it should have a UUID + if len(createdObjectMeta.GetUID()) == 0 { + t.Errorf("missing uuid: %#v", createdInstance) + } + createdTypeMeta, err := meta.TypeAccessor(createdInstance) + if err != nil { + t.Fatal(err) + } + if e, a := definition.Spec.Group+"/"+version, createdTypeMeta.GetAPIVersion(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + if e, a := definition.Spec.Names.Kind, createdTypeMeta.GetKind(); e != a { + t.Errorf("expected %v, got %v", e, a) + } + return createdInstance, nil +} + +func newNamespacedCustomResourceVersionedClient(ns string, client dynamic.Interface, crd *apiextensionsv1beta1.CustomResourceDefinition, version string) dynamic.ResourceInterface { + gvr := schema.GroupVersionResource{Group: crd.Spec.Group, Version: version, Resource: crd.Spec.Names.Plural} + + if crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped { + return client.Resource(gvr).Namespace(ns) + } + return client.Resource(gvr) +} + +func newNamespacedCustomResourceClient(ns string, client dynamic.Interface, crd *apiextensionsv1beta1.CustomResourceDefinition) dynamic.ResourceInterface { + return newNamespacedCustomResourceVersionedClient(ns, client, crd, crd.Spec.Versions[0].Name) +} + +// updateCustomResourceDefinitionWithRetry updates a CRD, retrying up to 5 times on version conflict errors. +func updateCustomResourceDefinitionWithRetry(client clientset.Interface, name string, update func(*apiextensionsv1beta1.CustomResourceDefinition)) (*apiextensionsv1beta1.CustomResourceDefinition, error) { + for i := 0; i < 5; i++ { + crd, err := client.ApiextensionsV1beta1().CustomResourceDefinitions().Get(name, metav1.GetOptions{}) + if err != nil { + return nil, fmt.Errorf("failed to get CustomResourceDefinition %q: %v", name, err) + } + update(crd) + crd, err = client.ApiextensionsV1beta1().CustomResourceDefinitions().Update(crd) + if err == nil { + return crd, nil + } + if !errors.IsConflict(err) { + return nil, fmt.Errorf("failed to update CustomResourceDefinition %q: %v", name, err) + } + } + return nil, fmt.Errorf("too many retries after conflicts updating CustomResourceDefinition %q", name) +} diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/objectmeta_test.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/objectmeta_test.go new file mode 100644 index 000000000..50f656bf1 --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/objectmeta_test.go @@ -0,0 +1,166 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package integration + +import ( + "path" + "reflect" + "strings" + "testing" + + "github.com/coreos/etcd/clientv3" + "github.com/coreos/etcd/pkg/transport" + apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" + "k8s.io/apiextensions-apiserver/test/integration/testserver" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/json" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/client-go/dynamic" +) + +func TestPostInvalidObjectMeta(t *testing.T) { + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() + if err != nil { + t.Fatal(err) + } + defer close(stopCh) + + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) + if err != nil { + t.Fatal(err) + } + + noxuResourceClient := newNamespacedCustomResourceClient("default", dynamicClient, noxuDefinition) + + obj := testserver.NewNoxuInstance("default", "foo") + unstructured.SetNestedField(obj.UnstructuredContent(), int64(42), "metadata", "unknown") + unstructured.SetNestedField(obj.UnstructuredContent(), map[string]interface{}{"foo": int64(42), "bar": "abc"}, "metadata", "labels") + _, err = instantiateCustomResource(t, obj, noxuResourceClient, noxuDefinition) + if err == nil { + t.Fatalf("unexpected non-error, expected invalid labels to be rejected: %v", err) + } + if status, ok := err.(errors.APIStatus); !ok { + t.Fatalf("expected APIStatus error, but got: %#v", err) + } else if !errors.IsBadRequest(err) { + t.Fatalf("expected BadRequst error, but got: %v", errors.ReasonForError(err)) + } else if !strings.Contains(status.Status().Message, "cannot be handled") { + t.Fatalf("expected 'cannot be handled' error message, got: %v", status.Status().Message) + } + + unstructured.SetNestedField(obj.UnstructuredContent(), map[string]interface{}{"bar": "abc"}, "metadata", "labels") + obj, err = instantiateCustomResource(t, obj, noxuResourceClient, noxuDefinition) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if unknown, found, err := unstructured.NestedInt64(obj.UnstructuredContent(), "metadata", "unknown"); err != nil { + t.Errorf("unexpected error getting metadata.unknown: %v", err) + } else if found { + t.Errorf("unexpected metadata.unknown=%#v: expected this to be pruned", unknown) + } +} + +func TestInvalidObjectMetaInStorage(t *testing.T) { + serverConfig, err := testserver.DefaultServerConfig() + if err != nil { + t.Fatal(err) + } + + stopCh, config, err := testserver.StartServer(serverConfig) + defer close(stopCh) + if err != nil { + t.Fatal(err) + } + + apiExtensionClient, err := clientset.NewForConfig(config) + if err != nil { + t.Fatal(err) + } + + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + t.Fatal(err) + } + + noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) + if err != nil { + t.Fatal(err) + } + + restOptions, err := serverConfig.GenericConfig.RESTOptionsGetter.GetRESTOptions(schema.GroupResource{Group: noxuDefinition.Spec.Group, Resource: noxuDefinition.Spec.Names.Plural}) + if err != nil { + t.Fatal(err) + } + tlsInfo := transport.TLSInfo{ + CertFile: restOptions.StorageConfig.CertFile, + KeyFile: restOptions.StorageConfig.KeyFile, + CAFile: restOptions.StorageConfig.CAFile, + } + tlsConfig, err := tlsInfo.ClientConfig() + if err != nil { + t.Fatal(err) + } + etcdConfig := clientv3.Config{ + Endpoints: restOptions.StorageConfig.ServerList, + TLS: tlsConfig, + } + etcdclient, err := clientv3.New(etcdConfig) + if err != nil { + t.Fatal(err) + } + + t.Logf("Creating object with invalid labels manually in etcd") + + original := testserver.NewNoxuInstance("default", "foo") + unstructured.SetNestedField(original.UnstructuredContent(), int64(42), "metadata", "unknown") + unstructured.SetNestedField(original.UnstructuredContent(), map[string]interface{}{"foo": int64(42), "bar": "abc"}, "metadata", "labels") + + ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), metav1.NamespaceDefault) + key := path.Join("/", restOptions.StorageConfig.Prefix, noxuDefinition.Spec.Group, "noxus/default/foo") + val, _ := json.Marshal(original.UnstructuredContent()) + if _, err := etcdclient.Put(ctx, key, string(val)); err != nil { + t.Fatalf("unexpected error: %v", err) + } + + t.Logf("Checking that ObjectMeta is pruned from unknown fields") + + noxuResourceClient := newNamespacedCustomResourceClient("default", dynamicClient, noxuDefinition) + obj, err := noxuResourceClient.Get("foo", metav1.GetOptions{}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if unknown, found, err := unstructured.NestedFieldNoCopy(obj.UnstructuredContent(), "metadata", "unknown"); err != nil { + t.Errorf("unexpected error: %v", err) + } else if found { + t.Errorf("unexpected to find metadata.unknown=%#v", unknown) + } + + t.Logf("Checking that ObjectMeta is pruned from invalid typed fields") + + if labels, found, err := unstructured.NestedStringMap(obj.UnstructuredContent(), "metadata", "labels"); err != nil { + t.Errorf("unexpected error: %v", err) + } else if found && !reflect.DeepEqual(labels, map[string]string{"bar": "abc"}) { + t.Errorf("unexpected to find metadata.lables=%#v", labels) + } +} diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/registration_test.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/registration_test.go index 7cdd2bc7c..9cb33ac70 100644 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/registration_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/registration_test.go @@ -40,56 +40,8 @@ import ( "k8s.io/client-go/dynamic" ) -func instantiateCustomResource(t *testing.T, instanceToCreate *unstructured.Unstructured, client dynamic.ResourceInterface, definition *apiextensionsv1beta1.CustomResourceDefinition) (*unstructured.Unstructured, error) { - createdInstance, err := client.Create(instanceToCreate) - if err != nil { - t.Logf("%#v", createdInstance) - return nil, err - } - createdObjectMeta, err := meta.Accessor(createdInstance) - if err != nil { - t.Fatal(err) - } - // it should have a UUID - if len(createdObjectMeta.GetUID()) == 0 { - t.Errorf("missing uuid: %#v", createdInstance) - } - createdTypeMeta, err := meta.TypeAccessor(createdInstance) - if err != nil { - t.Fatal(err) - } - if e, a := definition.Spec.Group+"/"+definition.Spec.Version, createdTypeMeta.GetAPIVersion(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - if e, a := definition.Spec.Names.Kind, createdTypeMeta.GetKind(); e != a { - t.Errorf("expected %v, got %v", e, a) - } - return createdInstance, nil -} - -func NewNamespacedCustomResourceClient(ns string, client dynamic.Interface, definition *apiextensionsv1beta1.CustomResourceDefinition) dynamic.ResourceInterface { - return client.Resource(&metav1.APIResource{ - Name: definition.Spec.Names.Plural, - Namespaced: definition.Spec.Scope == apiextensionsv1beta1.NamespaceScoped, - }, ns) -} - -func NewNamespacedCustomResourceStatusClient(ns string, client dynamic.Interface, definition *apiextensionsv1beta1.CustomResourceDefinition) dynamic.ResourceInterface { - return client.Resource(&metav1.APIResource{ - Name: definition.Spec.Names.Plural + "/status", - Namespaced: definition.Spec.Scope == apiextensionsv1beta1.NamespaceScoped, - }, ns) -} - -func NewNamespacedCustomResourceScaleClient(ns string, client dynamic.Interface, definition *apiextensionsv1beta1.CustomResourceDefinition) dynamic.ResourceInterface { - return client.Resource(&metav1.APIResource{ - Name: definition.Spec.Names.Plural + "/scale", - Namespaced: definition.Spec.Scope == apiextensionsv1beta1.NamespaceScoped, - }, ns) -} - func TestMultipleResourceInstances(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } @@ -97,11 +49,11 @@ func TestMultipleResourceInstances(t *testing.T) { ns := "not-the-default" noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } - noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuNamespacedResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) noxuList, err := noxuNamespacedResourceClient.List(metav1.ListOptions{}) if err != nil { t.Fatal(err) @@ -168,10 +120,10 @@ func TestMultipleResourceInstances(t *testing.T) { if err != nil { t.Fatal(err) } - if e, a := len(instances), len(listWithItem.(*unstructured.UnstructuredList).Items); e != a { + if e, a := len(instances), len(listWithItem.Items); e != a { t.Errorf("expected %v, got %v", e, a) } - for _, a := range listWithItem.(*unstructured.UnstructuredList).Items { + for _, a := range listWithItem.Items { if e := instances[a.GetName()].Instance; !reflect.DeepEqual(e, &a) { t.Errorf("expected %v, got %v", e, a) } @@ -185,7 +137,7 @@ func TestMultipleResourceInstances(t *testing.T) { if err != nil { t.Fatal(err) } - if e, a := 0, len(listWithoutItem.(*unstructured.UnstructuredList).Items); e != a { + if e, a := 0, len(listWithoutItem.Items); e != a { t.Errorf("expected %v, got %v", e, a) } @@ -213,7 +165,7 @@ func TestMultipleResourceInstances(t *testing.T) { } func TestMultipleRegistration(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } @@ -222,11 +174,11 @@ func TestMultipleRegistration(t *testing.T) { ns := "not-the-default" sameInstanceName := "foo" noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } - noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuNamespacedResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) createdNoxuInstance, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, sameInstanceName), noxuNamespacedResourceClient, noxuDefinition) if err != nil { t.Fatalf("unable to create noxu Instance:%v", err) @@ -241,11 +193,11 @@ func TestMultipleRegistration(t *testing.T) { } curletDefinition := testserver.NewCurletCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - curletVersionClient, err := testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, clientPool) + curletDefinition, err = testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } - curletNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, curletVersionClient, curletDefinition) + curletNamespacedResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, curletDefinition) createdCurletInstance, err := instantiateCustomResource(t, testserver.NewCurletInstance(ns, sameInstanceName), curletNamespacedResourceClient, curletDefinition) if err != nil { t.Fatalf("unable to create noxu Instance:%v", err) @@ -269,7 +221,7 @@ func TestMultipleRegistration(t *testing.T) { } func TestDeRegistrationAndReRegistration(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } @@ -278,18 +230,18 @@ func TestDeRegistrationAndReRegistration(t *testing.T) { ns := "not-the-default" sameInstanceName := "foo" func() { - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } - noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuNamespacedResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) if _, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, sameInstanceName), noxuNamespacedResourceClient, noxuDefinition); err != nil { t.Fatal(err) } if err := testserver.DeleteCustomResourceDefinition(noxuDefinition, apiExtensionClient); err != nil { t.Fatal(err) } - if _, err := testserver.GetCustomResourceDefinition(noxuDefinition, apiExtensionClient); err == nil || !errors.IsNotFound(err) { + if _, err := apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get(noxuDefinition.Name, metav1.GetOptions{}); err == nil || !errors.IsNotFound(err) { t.Fatalf("expected a NotFound error, got:%v", err) } if _, err = noxuNamespacedResourceClient.List(metav1.ListOptions{}); err == nil || !errors.IsNotFound(err) { @@ -301,14 +253,14 @@ func TestDeRegistrationAndReRegistration(t *testing.T) { }() func() { - if _, err := testserver.GetCustomResourceDefinition(noxuDefinition, apiExtensionClient); err == nil || !errors.IsNotFound(err) { + if _, err := apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get(noxuDefinition.Name, metav1.GetOptions{}); err == nil || !errors.IsNotFound(err) { t.Fatalf("expected a NotFound error, got:%v", err) } - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } - noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuNamespacedResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) initialList, err := noxuNamespacedResourceClient.List(metav1.ListOptions{}) if err != nil { t.Fatal(err) @@ -316,7 +268,7 @@ func TestDeRegistrationAndReRegistration(t *testing.T) { if _, err = noxuNamespacedResourceClient.Get(sameInstanceName, metav1.GetOptions{}); err == nil || !errors.IsNotFound(err) { t.Fatalf("expected a NotFound error, got:%v", err) } - if e, a := 0, len(initialList.(*unstructured.UnstructuredList).Items); e != a { + if e, a := 0, len(initialList.Items); e != a { t.Fatalf("expected %v, got %v", e, a) } createdNoxuInstance, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns, sameInstanceName), noxuNamespacedResourceClient, noxuDefinition) @@ -334,10 +286,10 @@ func TestDeRegistrationAndReRegistration(t *testing.T) { if err != nil { t.Fatal(err) } - if e, a := 1, len(listWithItem.(*unstructured.UnstructuredList).Items); e != a { + if e, a := 1, len(listWithItem.Items); e != a { t.Fatalf("expected %v, got %v", e, a) } - if e, a := *createdNoxuInstance, listWithItem.(*unstructured.UnstructuredList).Items[0]; !reflect.DeepEqual(e, a) { + if e, a := *createdNoxuInstance, listWithItem.Items[0]; !reflect.DeepEqual(e, a) { t.Fatalf("expected %v, got %v", e, a) } @@ -351,7 +303,7 @@ func TestDeRegistrationAndReRegistration(t *testing.T) { if err != nil { t.Fatal(err) } - if e, a := 0, len(listWithoutItem.(*unstructured.UnstructuredList).Items); e != a { + if e, a := 0, len(listWithoutItem.Items); e != a { t.Fatalf("expected %v, got %v", e, a) } }() @@ -372,28 +324,31 @@ func TestEtcdStorage(t *testing.T) { if err != nil { t.Fatal(err) } - clientPool := dynamic.NewDynamicClientPool(clientConfig) + dynamicClient, err := dynamic.NewForConfig(clientConfig) + if err != nil { + t.Fatal(err) + } etcdPrefix := getPrefixFromConfig(t, config) ns1 := "another-default-is-possible" curletDefinition := testserver.NewCurletCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped) - curletVersionClient, err := testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, clientPool) + curletDefinition, err = testserver.CreateNewCustomResourceDefinition(curletDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } - curletNamespacedResourceClient := NewNamespacedCustomResourceClient(ns1, curletVersionClient, curletDefinition) + curletNamespacedResourceClient := newNamespacedCustomResourceClient(ns1, dynamicClient, curletDefinition) if _, err := instantiateCustomResource(t, testserver.NewCurletInstance(ns1, "bar"), curletNamespacedResourceClient, curletDefinition); err != nil { t.Fatalf("unable to create curlet cluster scoped Instance:%v", err) } ns2 := "the-cruel-default" noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } - noxuNamespacedResourceClient := NewNamespacedCustomResourceClient(ns2, noxuVersionClient, noxuDefinition) + noxuNamespacedResourceClient := newNamespacedCustomResourceClient(ns2, dynamicClient, noxuDefinition) if _, err := instantiateCustomResource(t, testserver.NewNoxuInstance(ns2, "foo"), noxuNamespacedResourceClient, noxuDefinition); err != nil { t.Fatalf("unable to create noxu namespace scoped Instance:%v", err) } diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/subresources_test.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/subresources_test.go index 7f04c8215..bce63a4a5 100644 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/subresources_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/subresources_test.go @@ -22,7 +22,6 @@ import ( "sort" "strings" "testing" - "time" autoscaling "k8s.io/api/autoscaling/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -30,14 +29,10 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" - utilfeature "k8s.io/apiserver/pkg/util/feature" - utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing" "k8s.io/client-go/dynamic" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" - "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apiextensions-apiserver/test/integration/testserver" ) @@ -90,24 +85,20 @@ func NewNoxuSubresourceInstance(namespace, name string) *unstructured.Unstructur } func TestStatusSubresource(t *testing.T) { - // enable alpha feature CustomResourceSubresources - defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)() - - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) - noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) _, err = instantiateCustomResource(t, NewNoxuSubresourceInstance(ns, "foo"), noxuResourceClient, noxuDefinition) if err != nil { t.Fatalf("unable to create noxu instance: %v", err) @@ -137,7 +128,7 @@ func TestStatusSubresource(t *testing.T) { // UpdateStatus should not update spec. // Check that .spec.num = 10 and .status.num = 20 - updatedStatusInstance, err := noxuStatusResourceClient.Update(gottenNoxuInstance) + updatedStatusInstance, err := noxuResourceClient.UpdateStatus(gottenNoxuInstance) if err != nil { t.Fatalf("unable to update status: %v", err) } @@ -200,9 +191,6 @@ func TestStatusSubresource(t *testing.T) { } func TestScaleSubresource(t *testing.T) { - // enable alpha feature CustomResourceSubresources - defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)() - groupResource := schema.GroupResource{ Group: "mygroup.example.com", Resource: "noxus", @@ -218,26 +206,28 @@ func TestScaleSubresource(t *testing.T) { if err != nil { t.Fatal(err) } - clientPool := dynamic.NewDynamicClientPool(config) + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + t.Fatal(err) + } noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.NamespaceScoped) // set invalid json path for specReplicasPath noxuDefinition.Spec.Subresources.Scale.SpecReplicasPath = "foo,bar" - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err == nil { t.Fatalf("unexpected non-error: specReplicasPath should be a valid json path under .spec") } noxuDefinition.Spec.Subresources.Scale.SpecReplicasPath = ".spec.replicas" - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) - noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) _, err = instantiateCustomResource(t, NewNoxuSubresourceInstance(ns, "foo"), noxuResourceClient, noxuDefinition) if err != nil { t.Fatalf("unable to create noxu instance: %v", err) @@ -257,7 +247,7 @@ func TestScaleSubresource(t *testing.T) { if err != nil { t.Fatalf("unexpected error: %v", err) } - _, err = noxuStatusResourceClient.Update(gottenNoxuInstance) + _, err = noxuResourceClient.UpdateStatus(gottenNoxuInstance) if err != nil { t.Fatalf("unable to update status: %v", err) } @@ -332,9 +322,6 @@ func TestScaleSubresource(t *testing.T) { } func TestValidationSchema(t *testing.T) { - // enable alpha feature CustomResourceSubresources - defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)() - stopCh, config, err := testserver.StartDefaultServer() if err != nil { t.Fatal(err) @@ -345,13 +332,19 @@ func TestValidationSchema(t *testing.T) { if err != nil { t.Fatal(err) } - clientPool := dynamic.NewDynamicClientPool(config) + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + t.Fatal(err) + } // fields other than properties in root schema are not allowed noxuDefinition := newNoxuValidationCRD(apiextensionsv1beta1.NamespaceScoped) - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition.Spec.Subresources = &apiextensionsv1beta1.CustomResourceSubresources{ + Status: &apiextensionsv1beta1.CustomResourceSubresourceStatus{}, + } + _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err == nil { - t.Fatalf("unexpected non-error: if subresources for custom resources are enabled, only properties can be used at the root of the schema") + t.Fatalf(`unexpected non-error, expected: must only have "properties" or "required" at the root if the status subresource is enabled`) } // make sure we are not restricting fields to properties even in subschemas @@ -366,18 +359,17 @@ func TestValidationSchema(t *testing.T) { }, }, }, + Required: []string{"spec"}, + Description: "This is a description at the root of the schema", } - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatalf("unable to created crd %v: %v", noxuDefinition.Name, err) } } func TestValidateOnlyStatus(t *testing.T) { - // enable alpha feature CustomResourceSubresources - defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)() - - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } @@ -386,9 +378,8 @@ func TestValidateOnlyStatus(t *testing.T) { // UpdateStatus should validate only status // 1. create a crd with max value of .spec.num = 10 and .status.num = 10 // 2. create a cr with .spec.num = 10 and .status.num = 10 (valid) - // 3. update the crd so that max value of .spec.num = 5 and .status.num = 10 - // 4. update the status of the cr with .status.num = 5 (spec is invalid) - // validation passes becauses spec is not validated + // 3. update the spec of the cr with .spec.num = 15 (spec is invalid), expect no error + // 4. update the spec of the cr with .spec.num = 15 (spec is invalid), expect error // max value of spec.num = 10 and status.num = 10 schema := &apiextensionsv1beta1.JSONSchemaProps{ @@ -417,13 +408,12 @@ func TestValidateOnlyStatus(t *testing.T) { OpenAPIV3Schema: schema, } - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) - noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) // set .spec.num = 10 and .status.num = 10 noxuInstance := NewNoxuSubresourceInstance(ns, "foo") @@ -437,65 +427,35 @@ func TestValidateOnlyStatus(t *testing.T) { t.Fatalf("unable to create noxu instance: %v", err) } - gottenCRD, err := apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get("noxus.mygroup.example.com", metav1.GetOptions{}) + // update the spec with .spec.num = 15, expecting no error + err = unstructured.SetNestedField(createdNoxuInstance.Object, int64(15), "spec", "num") if err != nil { - t.Fatal(err) + t.Fatalf("unexpected error setting .spec.num: %v", err) } - - // update the crd so that max value of spec.num = 5 and status.num = 10 - gottenCRD.Spec.Validation.OpenAPIV3Schema = &apiextensionsv1beta1.JSONSchemaProps{ - Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{ - "spec": { - Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{ - "num": { - Type: "integer", - Maximum: float64Ptr(5), - }, - }, - }, - "status": { - Properties: map[string]apiextensionsv1beta1.JSONSchemaProps{ - "num": { - Type: "integer", - Maximum: float64Ptr(10), - }, - }, - }, - }, - } - - if _, err = apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Update(gottenCRD); err != nil { - t.Fatal(err) - } - - // update the status with .status.num = 5 - err = unstructured.SetNestedField(createdNoxuInstance.Object, int64(5), "status", "num") + createdNoxuInstance, err = noxuResourceClient.UpdateStatus(createdNoxuInstance) if err != nil { - t.Fatalf("unexpected error: %v", err) + t.Errorf("unexpected error: %v", err) } - // cr is updated even though spec is invalid - err = wait.Poll(500*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) { - _, err := noxuStatusResourceClient.Update(createdNoxuInstance) - if statusError, isStatus := err.(*apierrors.StatusError); isStatus { - if strings.Contains(statusError.Error(), "is invalid") { - return false, nil - } - } - if err != nil { - return false, err - } - return true, nil - }) + // update with .status.num = 15, expecting an error + err = unstructured.SetNestedField(createdNoxuInstance.Object, int64(15), "status", "num") if err != nil { - t.Fatal(err) + t.Fatalf("unexpected error setting .status.num: %v", err) + } + createdNoxuInstance, err = noxuResourceClient.UpdateStatus(createdNoxuInstance) + if err == nil { + t.Fatal("expected error, but got none") + } + statusError, isStatus := err.(*apierrors.StatusError) + if !isStatus || statusError == nil { + t.Fatalf("expected status error, got %T: %v", err, err) + } + if !strings.Contains(statusError.Error(), "Invalid value") { + t.Fatalf("expected 'Invalid value' in error, got: %v", err) } } func TestSubresourcesDiscovery(t *testing.T) { - // enable alpha feature CustomResourceSubresources - defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)() - stopCh, config, err := testserver.StartDefaultServer() if err != nil { t.Fatal(err) @@ -506,10 +466,13 @@ func TestSubresourcesDiscovery(t *testing.T) { if err != nil { t.Fatal(err) } - clientPool := dynamic.NewDynamicClientPool(config) + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + t.Fatal(err) + } noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.NamespaceScoped) - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } @@ -577,24 +540,20 @@ func TestSubresourcesDiscovery(t *testing.T) { } func TestGeneration(t *testing.T) { - // enable alpha feature CustomResourceSubresources - defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)() - - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) - noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) _, err = instantiateCustomResource(t, NewNoxuSubresourceInstance(ns, "foo"), noxuResourceClient, noxuDefinition) if err != nil { t.Fatalf("unable to create noxu instance: %v", err) @@ -616,7 +575,7 @@ func TestGeneration(t *testing.T) { } // UpdateStatus does not increment generation - updatedStatusInstance, err := noxuStatusResourceClient.Update(gottenNoxuInstance) + updatedStatusInstance, err := noxuResourceClient.UpdateStatus(gottenNoxuInstance) if err != nil { t.Fatalf("unable to update status: %v", err) } @@ -646,9 +605,6 @@ func TestGeneration(t *testing.T) { } func TestSubresourcePatch(t *testing.T) { - // enable alpha feature CustomResourceSubresources - defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)() - groupResource := schema.GroupResource{ Group: "mygroup.example.com", Resource: "noxus", @@ -664,18 +620,19 @@ func TestSubresourcePatch(t *testing.T) { if err != nil { t.Fatal(err) } - clientPool := dynamic.NewDynamicClientPool(config) + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + t.Fatal(err) + } noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) - noxuStatusResourceClient := NewNamespacedCustomResourceStatusClient(ns, noxuVersionClient, noxuDefinition) - noxuScaleResourceClient := NewNamespacedCustomResourceScaleClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) _, err = instantiateCustomResource(t, NewNoxuSubresourceInstance(ns, "foo"), noxuResourceClient, noxuDefinition) if err != nil { t.Fatalf("unable to create noxu instance: %v", err) @@ -687,7 +644,7 @@ func TestSubresourcePatch(t *testing.T) { } patch := []byte(`{"spec": {"num":999}, "status": {"num":999}}`) - patchedNoxuInstance, err := noxuStatusResourceClient.Patch("foo", types.MergePatchType, patch) + patchedNoxuInstance, err := noxuResourceClient.Patch("foo", types.MergePatchType, patch, "status") if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -722,19 +679,19 @@ func TestSubresourcePatch(t *testing.T) { } // no-op patch - _, err = noxuStatusResourceClient.Patch("foo", types.MergePatchType, patch) + _, err = noxuResourceClient.Patch("foo", types.MergePatchType, patch, "status") if err != nil { t.Fatalf("unexpected error: %v", err) } // empty patch - _, err = noxuStatusResourceClient.Patch("foo", types.MergePatchType, []byte(`{}`)) + _, err = noxuResourceClient.Patch("foo", types.MergePatchType, []byte(`{}`), "status") if err != nil { t.Fatalf("unexpected error: %v", err) } patch = []byte(`{"spec": {"replicas":7}, "status": {"replicas":7}}`) - patchedNoxuInstance, err = noxuScaleResourceClient.Patch("foo", types.MergePatchType, patch) + patchedNoxuInstance, err = noxuResourceClient.Patch("foo", types.MergePatchType, patch, "scale") if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -763,24 +720,24 @@ func TestSubresourcePatch(t *testing.T) { } // no-op patch - _, err = noxuScaleResourceClient.Patch("foo", types.MergePatchType, patch) + _, err = noxuResourceClient.Patch("foo", types.MergePatchType, patch, "scale") if err != nil { t.Fatalf("unexpected error: %v", err) } // empty patch - _, err = noxuScaleResourceClient.Patch("foo", types.MergePatchType, []byte(`{}`)) + _, err = noxuResourceClient.Patch("foo", types.MergePatchType, []byte(`{}`), "scale") if err != nil { t.Fatalf("unexpected error: %v", err) } // make sure strategic merge patch is not supported for both status and scale - _, err = noxuStatusResourceClient.Patch("foo", types.StrategicMergePatchType, patch) + _, err = noxuResourceClient.Patch("foo", types.StrategicMergePatchType, patch, "status") if err == nil { t.Fatalf("unexpected non-error: strategic merge patch is not supported for custom resources") } - _, err = noxuScaleResourceClient.Patch("foo", types.StrategicMergePatchType, patch) + _, err = noxuResourceClient.Patch("foo", types.StrategicMergePatchType, patch, "scale") if err == nil { t.Fatalf("unexpected non-error: strategic merge patch is not supported for custom resources") } diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/table_test.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/table_test.go new file mode 100644 index 000000000..0c3ac609a --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/table_test.go @@ -0,0 +1,185 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package integration + +import ( + "fmt" + "testing" + + "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/rest" + + apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + "k8s.io/apiextensions-apiserver/test/integration/testserver" +) + +func newTableCRD() *apiextensionsv1beta1.CustomResourceDefinition { + return &apiextensionsv1beta1.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "tables.mygroup.example.com"}, + Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ + Group: "mygroup.example.com", + Version: "v1beta1", + Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ + Plural: "tables", + Singular: "table", + Kind: "Table", + ListKind: "TablemList", + }, + Scope: apiextensionsv1beta1.ClusterScoped, + AdditionalPrinterColumns: []apiextensionsv1beta1.CustomResourceColumnDefinition{ + {Name: "Age", Type: "date", JSONPath: ".metadata.creationTimestamp"}, + {Name: "Alpha", Type: "string", JSONPath: ".spec.alpha"}, + {Name: "Beta", Type: "integer", Description: "the beta field", Format: "int64", Priority: 42, JSONPath: ".spec.beta"}, + {Name: "Gamma", Type: "integer", Description: "a column with wrongly typed values", JSONPath: ".spec.gamma"}, + }, + }, + } +} + +func newTableInstance(name string) *unstructured.Unstructured { + return &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": "mygroup.example.com/v1beta1", + "kind": "Table", + "metadata": map[string]interface{}{ + "name": name, + }, + "spec": map[string]interface{}{ + "alpha": "foo_123", + "beta": 10, + "gamma": "bar", + "delta": "hello", + }, + }, + } +} + +func TestTableGet(t *testing.T) { + stopCh, config, err := testserver.StartDefaultServer() + if err != nil { + t.Fatal(err) + } + defer close(stopCh) + + apiExtensionClient, err := clientset.NewForConfig(config) + if err != nil { + t.Fatal(err) + } + + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + t.Fatal(err) + } + + crd := newTableCRD() + crd, err = testserver.CreateNewCustomResourceDefinition(crd, apiExtensionClient, dynamicClient) + if err != nil { + t.Fatal(err) + } + + crd, err = apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get(crd.Name, metav1.GetOptions{}) + if err != nil { + t.Fatal(err) + } + t.Logf("table crd created: %#v", crd) + + crClient := newNamespacedCustomResourceClient("", dynamicClient, crd) + foo, err := crClient.Create(newTableInstance("foo")) + if err != nil { + t.Fatalf("unable to create noxu instance: %v", err) + } + t.Logf("foo created: %#v", foo.UnstructuredContent()) + + gv := schema.GroupVersion{Group: crd.Spec.Group, Version: crd.Spec.Version} + gvk := gv.WithKind(crd.Spec.Names.Kind) + + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + parameterCodec := runtime.NewParameterCodec(scheme) + metav1.AddToGroupVersion(scheme, gv) + scheme.AddKnownTypes(gv, &metav1beta1.Table{}, &metav1beta1.TableOptions{}) + scheme.AddKnownTypes(metav1beta1.SchemeGroupVersion, &metav1beta1.Table{}, &metav1beta1.TableOptions{}) + + crConfig := *config + crConfig.GroupVersion = &gv + crConfig.APIPath = "/apis" + crConfig.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: codecs} + crRestClient, err := rest.RESTClientFor(&crConfig) + if err != nil { + t.Fatal(err) + } + + ret, err := crRestClient.Get(). + Resource(crd.Spec.Names.Plural). + SetHeader("Accept", fmt.Sprintf("application/json;as=Table;v=%s;g=%s, application/json", metav1beta1.SchemeGroupVersion.Version, metav1beta1.GroupName)). + VersionedParams(&metav1beta1.TableOptions{}, parameterCodec). + Do(). + Get() + if err != nil { + t.Fatalf("failed to list %v resources: %v", gvk, err) + } + + tbl, ok := ret.(*metav1beta1.Table) + if !ok { + t.Fatalf("expected metav1beta1.Table, got %T", ret) + } + t.Logf("%v table list: %#v", gvk, tbl) + + if got, expected := len(tbl.ColumnDefinitions), 5; got != expected { + t.Errorf("expected %d headers, got %d", expected, got) + } else { + alpha := metav1beta1.TableColumnDefinition{Name: "Alpha", Type: "string", Format: "", Description: "Custom resource definition column (in JSONPath format): .spec.alpha", Priority: 0} + if got, expected := tbl.ColumnDefinitions[2], alpha; got != expected { + t.Errorf("expected column definition %#v, got %#v", expected, got) + } + + beta := metav1beta1.TableColumnDefinition{Name: "Beta", Type: "integer", Format: "int64", Description: "the beta field", Priority: 42} + if got, expected := tbl.ColumnDefinitions[3], beta; got != expected { + t.Errorf("expected column definition %#v, got %#v", expected, got) + } + + gamma := metav1beta1.TableColumnDefinition{Name: "Gamma", Type: "integer", Description: "a column with wrongly typed values"} + if got, expected := tbl.ColumnDefinitions[4], gamma; got != expected { + t.Errorf("expected column definition %#v, got %#v", expected, got) + } + } + if got, expected := len(tbl.Rows), 1; got != expected { + t.Errorf("expected %d rows, got %d", expected, got) + } else if got, expected := len(tbl.Rows[0].Cells), 5; got != expected { + t.Errorf("expected %d cells, got %d", expected, got) + } else { + if got, expected := tbl.Rows[0].Cells[0], "foo"; got != expected { + t.Errorf("expected cell[0] to equal %q, got %q", expected, got) + } + if got, expected := tbl.Rows[0].Cells[2], "foo_123"; got != expected { + t.Errorf("expected cell[2] to equal %q, got %q", expected, got) + } + if got, expected := tbl.Rows[0].Cells[3], int64(10); got != expected { + t.Errorf("expected cell[3] to equal %#v, got %#v", expected, got) + } + if got, expected := tbl.Rows[0].Cells[4], interface{}(nil); got != expected { + t.Errorf("expected cell[3] to equal %#v although the type does not match the column, got %#v", expected, got) + } + } +} diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/BUILD b/vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/BUILD deleted file mode 100644 index 8c12d58d3..000000000 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "resources.go", - "start.go", - ], - importpath = "k8s.io/apiextensions-apiserver/test/integration/testserver", - deps = [ - "//vendor/github.com/pborman/uuid:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/apiserver:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset:go_default_library", - "//vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server:go_default_library", - "//vendor/k8s.io/apiserver/pkg/server/options:go_default_library", - "//vendor/k8s.io/apiserver/pkg/storage/names:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/dynamic:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/scale:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/resources.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/resources.go index bf54e1490..f341b002f 100644 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/resources.go +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/resources.go @@ -23,7 +23,6 @@ import ( apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" @@ -33,6 +32,7 @@ import ( "k8s.io/client-go/discovery" "k8s.io/client-go/dynamic" "k8s.io/client-go/rest" + "k8s.io/client-go/restmapper" "k8s.io/client-go/scale" ) @@ -79,10 +79,10 @@ func NewNoxuCustomResourceDefinition(scope apiextensionsv1beta1.ResourceScope) * } } -func NewNoxuInstance(namespace, name string) *unstructured.Unstructured { +func NewVersionedNoxuInstance(namespace, name, version string) *unstructured.Unstructured { return &unstructured.Unstructured{ Object: map[string]interface{}{ - "apiVersion": "mygroup.example.com/v1beta1", + "apiVersion": "mygroup.example.com/" + version, "kind": "WishIHadChosenNoxu", "metadata": map[string]interface{}{ "namespace": namespace, @@ -99,6 +99,46 @@ func NewNoxuInstance(namespace, name string) *unstructured.Unstructured { } } +func NewNoxuInstance(namespace, name string) *unstructured.Unstructured { + return NewVersionedNoxuInstance(namespace, name, "v1beta1") +} + +func NewMultipleVersionNoxuCRD(scope apiextensionsv1beta1.ResourceScope) *apiextensionsv1beta1.CustomResourceDefinition { + return &apiextensionsv1beta1.CustomResourceDefinition{ + ObjectMeta: metav1.ObjectMeta{Name: "noxus.mygroup.example.com"}, + Spec: apiextensionsv1beta1.CustomResourceDefinitionSpec{ + Group: "mygroup.example.com", + Version: "v1beta1", + Names: apiextensionsv1beta1.CustomResourceDefinitionNames{ + Plural: "noxus", + Singular: "nonenglishnoxu", + Kind: "WishIHadChosenNoxu", + ShortNames: []string{"foo", "bar", "abc", "def"}, + ListKind: "NoxuItemList", + Categories: []string{"all"}, + }, + Scope: scope, + Versions: []apiextensionsv1beta1.CustomResourceDefinitionVersion{ + { + Name: "v1beta1", + Served: true, + Storage: false, + }, + { + Name: "v1beta2", + Served: true, + Storage: true, + }, + { + Name: "v0", + Served: false, + Storage: false, + }, + }, + }, + } +} + func NewNoxu2CustomResourceDefinition(scope apiextensionsv1beta1.ResourceScope) *apiextensionsv1beta1.CustomResourceDefinition { return &apiextensionsv1beta1.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{Name: "noxus2.mygroup.example.com"}, @@ -150,38 +190,60 @@ func NewCurletInstance(namespace, name string) *unstructured.Unstructured { } } +func servedVersions(crd *apiextensionsv1beta1.CustomResourceDefinition) []string { + if len(crd.Spec.Versions) == 0 { + return []string{crd.Spec.Version} + } + var versions []string + for _, v := range crd.Spec.Versions { + if v.Served { + versions = append(versions, v.Name) + } + } + return versions +} + +func existsInDiscovery(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, version string) (bool, error) { + groupResource, err := apiExtensionsClient.Discovery().ServerResourcesForGroupVersion(crd.Spec.Group + "/" + version) + if err != nil { + if errors.IsNotFound(err) { + return false, nil + } + return false, err + } + for _, g := range groupResource.APIResources { + if g.Name == crd.Spec.Names.Plural { + return true, nil + } + } + return false, nil +} + // CreateNewCustomResourceDefinitionWatchUnsafe creates the CRD and makes sure // the apiextension apiserver has installed the CRD. But it's not safe to watch // the created CR. Please call CreateNewCustomResourceDefinition if you need to // watch the CR. -func CreateNewCustomResourceDefinitionWatchUnsafe(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, clientPool dynamic.ClientPool) (dynamic.Interface, error) { - _, err := apiExtensionsClient.Apiextensions().CustomResourceDefinitions().Create(crd) +func CreateNewCustomResourceDefinitionWatchUnsafe(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface) (*apiextensionsv1beta1.CustomResourceDefinition, error) { + crd, err := apiExtensionsClient.ApiextensionsV1beta1().CustomResourceDefinitions().Create(crd) if err != nil { return nil, err } - // wait until the resource appears in discovery - err = wait.PollImmediate(500*time.Millisecond, 30*time.Second, func() (bool, error) { - resourceList, err := apiExtensionsClient.Discovery().ServerResourcesForGroupVersion(crd.Spec.Group + "/" + crd.Spec.Version) + // wait until all resources appears in discovery + for _, version := range servedVersions(crd) { + err := wait.PollImmediate(500*time.Millisecond, 30*time.Second, func() (bool, error) { + return existsInDiscovery(crd, apiExtensionsClient, version) + }) if err != nil { - return false, nil + return nil, err } - for _, resource := range resourceList.APIResources { - if resource.Name == crd.Spec.Names.Plural { - return true, nil - } - } - return false, nil - }) - if err != nil { - return nil, err } - return clientPool.ClientForGroupVersionResource(schema.GroupVersionResource{Group: crd.Spec.Group, Version: crd.Spec.Version, Resource: crd.Spec.Names.Plural}) + return crd, err } -func CreateNewCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, clientPool dynamic.ClientPool) (dynamic.Interface, error) { - dynamicClient, err := CreateNewCustomResourceDefinitionWatchUnsafe(crd, apiExtensionsClient, clientPool) +func CreateNewCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface, dynamicClientSet dynamic.Interface) (*apiextensionsv1beta1.CustomResourceDefinition, error) { + crd, err := CreateNewCustomResourceDefinitionWatchUnsafe(crd, apiExtensionsClient) if err != nil { return nil, err } @@ -196,43 +258,35 @@ func CreateNewCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceD // For this test, we'll actually cycle, "list/watch/create/delete" until we get an RV from list that observes the create and not an error. // This way all the tests that are checking for watches don't have to worry about RV too old problems because crazy things *could* happen // before like the created RV could be too old to watch. - var primingErr error - wait.PollImmediate(500*time.Millisecond, 30*time.Second, func() (bool, error) { - primingErr = checkForWatchCachePrimed(crd, dynamicClient) - if primingErr == nil { - return true, nil + for _, version := range servedVersions(crd) { + err := wait.PollImmediate(500*time.Millisecond, 30*time.Second, func() (bool, error) { + return isWatchCachePrimed(crd, dynamicClientSet, version) + }) + if err != nil { + return nil, err } - return false, nil - }) - if primingErr != nil { - return nil, primingErr } - - return dynamicClient, nil + return crd, nil } -func checkForWatchCachePrimed(crd *apiextensionsv1beta1.CustomResourceDefinition, dynamicClient dynamic.Interface) error { +// isWatchCachePrimed returns true if the watch is primed for an specified version of CRD watch +func isWatchCachePrimed(crd *apiextensionsv1beta1.CustomResourceDefinition, dynamicClientSet dynamic.Interface, version string) (bool, error) { ns := "" if crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped { ns = "aval" } - resourceClient := dynamicClient.Resource(&metav1.APIResource{ - Name: crd.Spec.Names.Plural, - Namespaced: crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped, - }, ns) - initialList, err := resourceClient.List(metav1.ListOptions{}) - if err != nil { - return err - } - initialListListMeta, err := meta.ListAccessor(initialList) - if err != nil { - return err - } + gvr := schema.GroupVersionResource{Group: crd.Spec.Group, Version: version, Resource: crd.Spec.Names.Plural} + var resourceClient dynamic.ResourceInterface + if crd.Spec.Scope != apiextensionsv1beta1.ClusterScoped { + resourceClient = dynamicClientSet.Resource(gvr).Namespace(ns) + } else { + resourceClient = dynamicClientSet.Resource(gvr) + } instanceName := "setup-instance" instance := &unstructured.Unstructured{ Object: map[string]interface{}{ - "apiVersion": crd.Spec.Group + "/" + crd.Spec.Version, + "apiVersion": crd.Spec.Group + "/" + version, "kind": crd.Spec.Names.Kind, "metadata": map[string]interface{}{ "namespace": ns, @@ -243,31 +297,35 @@ func checkForWatchCachePrimed(crd *apiextensionsv1beta1.CustomResourceDefinition "gamma": "bar", "delta": "hello", "epsilon": "foobar", + "spec": map[string]interface{}{}, }, } - if _, err := resourceClient.Create(instance); err != nil { - return err - } - // we created something, clean it up - defer func() { - resourceClient.Delete(instanceName, nil) - }() - - noxuWatch, err := resourceClient.Watch(metav1.ListOptions{ResourceVersion: initialListListMeta.GetResourceVersion()}) + createdInstance, err := resourceClient.Create(instance) if err != nil { - return err + return false, err + } + err = resourceClient.Delete(createdInstance.GetName(), nil) + if err != nil { + return false, err + } + + noxuWatch, err := resourceClient.Watch(metav1.ListOptions{ResourceVersion: createdInstance.GetResourceVersion()}) + if err != nil { + return false, err } defer noxuWatch.Stop() select { case watchEvent := <-noxuWatch.ResultChan(): - if watch.Added == watchEvent.Type { - return nil + if watch.Error == watchEvent.Type { + return false, nil } - return fmt.Errorf("expected add, but got %#v", watchEvent) - + if watch.Deleted != watchEvent.Type { + return false, fmt.Errorf("expected DELETE, but got %#v", watchEvent) + } + return true, nil case <-time.After(5 * time.Second): - return fmt.Errorf("gave up waiting for watch event") + return false, fmt.Errorf("gave up waiting for watch event") } } @@ -275,27 +333,16 @@ func DeleteCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceDefi if err := apiExtensionsClient.Apiextensions().CustomResourceDefinitions().Delete(crd.Name, nil); err != nil { return err } - err := wait.PollImmediate(500*time.Millisecond, 30*time.Second, func() (bool, error) { - groupResource, err := apiExtensionsClient.Discovery().ServerResourcesForGroupVersion(crd.Spec.Group + "/" + crd.Spec.Version) + for _, version := range servedVersions(crd) { + err := wait.PollImmediate(500*time.Millisecond, 30*time.Second, func() (bool, error) { + exists, err := existsInDiscovery(crd, apiExtensionsClient, version) + return !exists, err + }) if err != nil { - if errors.IsNotFound(err) { - return true, nil - - } - return false, err + return err } - for _, g := range groupResource.APIResources { - if g.Name == crd.Spec.Names.Plural { - return false, nil - } - } - return true, nil - }) - return err -} - -func GetCustomResourceDefinition(crd *apiextensionsv1beta1.CustomResourceDefinition, apiExtensionsClient clientset.Interface) (*apiextensionsv1beta1.CustomResourceDefinition, error) { - return apiExtensionsClient.Apiextensions().CustomResourceDefinitions().Get(crd.Name, metav1.GetOptions{}) + } + return nil } func CreateNewScaleClient(crd *apiextensionsv1beta1.CustomResourceDefinition, config *rest.Config) (scale.ScalesGetter, error) { @@ -308,7 +355,7 @@ func CreateNewScaleClient(crd *apiextensionsv1beta1.CustomResourceDefinition, co return nil, err } - resources := []*discovery.APIGroupResources{ + resources := []*restmapper.APIGroupResources{ { Group: metav1.APIGroup{ Name: crd.Spec.Group, @@ -323,7 +370,7 @@ func CreateNewScaleClient(crd *apiextensionsv1beta1.CustomResourceDefinition, co }, } - restMapper := discovery.NewRESTMapper(resources, nil) + restMapper := restmapper.NewDiscoveryRESTMapper(resources) resolver := scale.NewDiscoveryScaleKindResolver(discoveryClient) return scale.NewForConfig(config, restMapper, dynamic.LegacyAPIPathResolverFunc, resolver) diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/start.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/start.go index c0a60bfc7..22b9fa286 100644 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/start.go +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/start.go @@ -64,7 +64,7 @@ func DefaultServerConfig() (*extensionsapiserver.Config, error) { if err := options.RecommendedOptions.ApplyTo(genericConfig, nil); err != nil { return nil, err } - if err := options.APIEnablement.ApplyTo(&genericConfig.Config, extensionsapiserver.DefaultAPIResourceConfigSource(), extensionsapiserver.Registry); err != nil { + if err := options.APIEnablement.ApplyTo(&genericConfig.Config, extensionsapiserver.DefaultAPIResourceConfigSource(), extensionsapiserver.Scheme); err != nil { return nil, err } @@ -90,7 +90,7 @@ func DefaultServerConfig() (*extensionsapiserver.Config, error) { func StartServer(config *extensionsapiserver.Config) (chan struct{}, *rest.Config, error) { stopCh := make(chan struct{}) - server, err := config.Complete().New(genericapiserver.EmptyDelegate) + server, err := config.Complete().New(genericapiserver.NewEmptyDelegate()) if err != nil { return nil, nil, err } @@ -139,7 +139,7 @@ func StartDefaultServer() (chan struct{}, *rest.Config, error) { return StartServer(config) } -func StartDefaultServerWithClients() (chan struct{}, clientset.Interface, dynamic.ClientPool, error) { +func StartDefaultServerWithClients() (chan struct{}, clientset.Interface, dynamic.Interface, error) { stopCh, config, err := StartDefaultServer() if err != nil { return nil, nil, nil, err @@ -151,5 +151,11 @@ func StartDefaultServerWithClients() (chan struct{}, clientset.Interface, dynami return nil, nil, nil, err } - return stopCh, apiExtensionsClient, dynamic.NewDynamicClientPool(config), nil + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + close(stopCh) + return nil, nil, nil, err + } + + return stopCh, apiExtensionsClient, dynamicClient, nil } diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/validation_test.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/validation_test.go index 3ef47b658..cb761330d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/validation_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/validation_test.go @@ -31,20 +31,20 @@ import ( ) func TestForProperValidationErrors(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) tests := []struct { name string @@ -54,8 +54,7 @@ func TestForProperValidationErrors(t *testing.T) { { name: "bad version", instanceFn: func() *unstructured.Unstructured { - instance := testserver.NewNoxuInstance(ns, "foo") - instance.Object["apiVersion"] = "mygroup.example.com/v2" + instance := testserver.NewVersionedNoxuInstance(ns, "foo", "v2") return instance }, expectedError: "the API version in the data (mygroup.example.com/v2) does not match the expected API version (mygroup.example.com/v1beta1)", @@ -169,20 +168,20 @@ func newNoxuValidationInstance(namespace, name string) *unstructured.Unstructure } func TestCustomResourceValidation(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := newNoxuValidationCRD(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) _, err = instantiateCustomResource(t, newNoxuValidationInstance(ns, "foo"), noxuResourceClient, noxuDefinition) if err != nil { t.Fatalf("unable to create noxu instance: %v", err) @@ -190,20 +189,20 @@ func TestCustomResourceValidation(t *testing.T) { } func TestCustomResourceUpdateValidation(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := newNoxuValidationCRD(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) _, err = instantiateCustomResource(t, newNoxuValidationInstance(ns, "foo"), noxuResourceClient, noxuDefinition) if err != nil { t.Fatalf("unable to create noxu instance: %v", err) @@ -233,20 +232,20 @@ func TestCustomResourceUpdateValidation(t *testing.T) { } func TestCustomResourceValidationErrors(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } defer close(stopCh) noxuDefinition := newNoxuValidationCRD(apiextensionsv1beta1.NamespaceScoped) - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) tests := []struct { name string @@ -324,7 +323,7 @@ func TestCustomResourceValidationErrors(t *testing.T) { } func TestCRValidationOnCRDUpdate(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } @@ -335,12 +334,12 @@ func TestCRValidationOnCRDUpdate(t *testing.T) { // set stricter schema noxuDefinition.Spec.Validation.OpenAPIV3Schema.Required = []string{"alpha", "beta", "epsilon"} - noxuVersionClient, err := testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } ns := "not-the-default" - noxuResourceClient := NewNamespacedCustomResourceClient(ns, noxuVersionClient, noxuDefinition) + noxuResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) // CR is rejected _, err = instantiateCustomResource(t, newNoxuValidationInstance(ns, "foo"), noxuResourceClient, noxuDefinition) @@ -348,14 +347,11 @@ func TestCRValidationOnCRDUpdate(t *testing.T) { t.Fatalf("unexpected non-error: CR should be rejected") } - gottenCRD, err := apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get("noxus.mygroup.example.com", metav1.GetOptions{}) - if err != nil { - t.Fatal(err) - } - // update the CRD to a less stricter schema - gottenCRD.Spec.Validation.OpenAPIV3Schema.Required = []string{"alpha", "beta"} - if _, err = apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Update(gottenCRD); err != nil { + _, err = updateCustomResourceDefinitionWithRetry(apiExtensionClient, "noxus.mygroup.example.com", func(crd *apiextensionsv1beta1.CustomResourceDefinition) { + crd.Spec.Validation.OpenAPIV3Schema.Required = []string{"alpha", "beta"} + }) + if err != nil { t.Fatal(err) } @@ -378,7 +374,7 @@ func TestCRValidationOnCRDUpdate(t *testing.T) { } func TestForbiddenFieldsInSchema(t *testing.T) { - stopCh, apiExtensionClient, clientPool, err := testserver.StartDefaultServerWithClients() + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() if err != nil { t.Fatal(err) } @@ -387,7 +383,7 @@ func TestForbiddenFieldsInSchema(t *testing.T) { noxuDefinition := newNoxuValidationCRD(apiextensionsv1beta1.NamespaceScoped) noxuDefinition.Spec.Validation.OpenAPIV3Schema.AdditionalProperties.Allows = false - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err == nil { t.Fatalf("unexpected non-error: additionalProperties cannot be set to false") } @@ -398,7 +394,7 @@ func TestForbiddenFieldsInSchema(t *testing.T) { } noxuDefinition.Spec.Validation.OpenAPIV3Schema.AdditionalProperties.Allows = true - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err == nil { t.Fatalf("unexpected non-error: uniqueItems cannot be set to true") } @@ -409,14 +405,14 @@ func TestForbiddenFieldsInSchema(t *testing.T) { UniqueItems: false, } - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err == nil { t.Fatal("unexpected non-error: $ref cannot be non-empty string") } noxuDefinition.Spec.Validation.OpenAPIV3Schema.Ref = nil - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/versioning_test.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/versioning_test.go new file mode 100644 index 000000000..55d0c17af --- /dev/null +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/versioning_test.go @@ -0,0 +1,138 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package integration + +import ( + "reflect" + "testing" + + apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + "k8s.io/apiextensions-apiserver/test/integration/testserver" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func TestVersionedNamspacedScopedCRD(t *testing.T) { + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() + if err != nil { + t.Fatal(err) + } + defer close(stopCh) + + noxuDefinition := testserver.NewMultipleVersionNoxuCRD(apiextensionsv1beta1.NamespaceScoped) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) + if err != nil { + t.Fatal(err) + } + + ns := "not-the-default" + testSimpleCRUD(t, ns, noxuDefinition, dynamicClient) +} + +func TestVersionedClusterScopedCRD(t *testing.T) { + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() + if err != nil { + t.Fatal(err) + } + defer close(stopCh) + + noxuDefinition := testserver.NewMultipleVersionNoxuCRD(apiextensionsv1beta1.ClusterScoped) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) + if err != nil { + t.Fatal(err) + } + + ns := "" + testSimpleCRUD(t, ns, noxuDefinition, dynamicClient) +} + +func TestStoragedVersionInNamespacedCRDStatus(t *testing.T) { + noxuDefinition := testserver.NewMultipleVersionNoxuCRD(apiextensionsv1beta1.NamespaceScoped) + ns := "not-the-default" + testStoragedVersionInCRDStatus(t, ns, noxuDefinition) +} + +func TestStoragedVersionInClusterScopedCRDStatus(t *testing.T) { + noxuDefinition := testserver.NewMultipleVersionNoxuCRD(apiextensionsv1beta1.ClusterScoped) + ns := "" + testStoragedVersionInCRDStatus(t, ns, noxuDefinition) +} + +func testStoragedVersionInCRDStatus(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta1.CustomResourceDefinition) { + versionsV1Beta1Storage := []apiextensionsv1beta1.CustomResourceDefinitionVersion{ + { + Name: "v1beta1", + Served: true, + Storage: true, + }, + { + Name: "v1beta2", + Served: true, + Storage: false, + }, + } + versionsV1Beta2Storage := []apiextensionsv1beta1.CustomResourceDefinitionVersion{ + { + Name: "v1beta1", + Served: true, + Storage: false, + }, + { + Name: "v1beta2", + Served: true, + Storage: true, + }, + } + stopCh, apiExtensionClient, dynamicClient, err := testserver.StartDefaultServerWithClients() + if err != nil { + t.Fatal(err) + } + defer close(stopCh) + + noxuDefinition.Spec.Versions = versionsV1Beta1Storage + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) + if err != nil { + t.Fatal(err) + } + + // The storage version list should be initilized to storage version + crd, err := apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get(noxuDefinition.Name, metav1.GetOptions{}) + if err != nil { + t.Fatal(err) + } + if e, a := []string{"v1beta1"}, crd.Status.StoredVersions; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } + + // Changing CRD storage version should be reflected immediately + crd.Spec.Versions = versionsV1Beta2Storage + _, err = apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Update(crd) + if err != nil { + t.Fatal(err) + } + crd, err = apiExtensionClient.ApiextensionsV1beta1().CustomResourceDefinitions().Get(noxuDefinition.Name, metav1.GetOptions{}) + if err != nil { + t.Fatal(err) + } + if e, a := []string{"v1beta1", "v1beta2"}, crd.Status.StoredVersions; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } + + err = testserver.DeleteCustomResourceDefinition(crd, apiExtensionClient) + if err != nil { + t.Fatal(err) + } +} diff --git a/vendor/k8s.io/apiextensions-apiserver/test/integration/yaml_test.go b/vendor/k8s.io/apiextensions-apiserver/test/integration/yaml_test.go index 9f23427f0..2dc279559 100644 --- a/vendor/k8s.io/apiextensions-apiserver/test/integration/yaml_test.go +++ b/vendor/k8s.io/apiextensions-apiserver/test/integration/yaml_test.go @@ -27,13 +27,10 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/types" - utilfeature "k8s.io/apiserver/pkg/util/feature" - utilfeaturetesting "k8s.io/apiserver/pkg/util/feature/testing" "k8s.io/client-go/dynamic" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" - "k8s.io/apiextensions-apiserver/pkg/features" "k8s.io/apiextensions-apiserver/test/integration/testserver" ) @@ -48,10 +45,13 @@ func TestYAML(t *testing.T) { if err != nil { t.Fatal(err) } - clientPool := dynamic.NewDynamicClientPool(config) + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + t.Fatal(err) + } noxuDefinition := testserver.NewNoxuCustomResourceDefinition(apiextensionsv1beta1.ClusterScoped) - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } @@ -354,9 +354,6 @@ values: } func TestYAMLSubresource(t *testing.T) { - // enable alpha feature CustomResourceSubresources - defer utilfeaturetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.CustomResourceSubresources, true)() - stopCh, config, err := testserver.StartDefaultServer() if err != nil { t.Fatal(err) @@ -367,10 +364,13 @@ func TestYAMLSubresource(t *testing.T) { if err != nil { t.Fatal(err) } - clientPool := dynamic.NewDynamicClientPool(config) + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + t.Fatal(err) + } noxuDefinition := NewNoxuSubresourcesCRD(apiextensionsv1beta1.ClusterScoped) - _, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, clientPool) + noxuDefinition, err = testserver.CreateNewCustomResourceDefinition(noxuDefinition, apiExtensionClient, dynamicClient) if err != nil { t.Fatal(err) } diff --git a/vendor/k8s.io/apimachinery/Godeps/Godeps.json b/vendor/k8s.io/apimachinery/Godeps/Godeps.json index 9c5e1932f..8782f3610 100644 --- a/vendor/k8s.io/apimachinery/Godeps/Godeps.json +++ b/vendor/k8s.io/apimachinery/Godeps/Godeps.json @@ -1,178 +1,186 @@ { - "ImportPath": "k8s.io/apimachinery", - "GoVersion": "go1.9", - "GodepVersion": "v79", - "Packages": [ - "./..." - ], - "Deps": [ - { - "ImportPath": "github.com/davecgh/go-spew/spew", - "Rev": "782f4967f2dc4564575ca782fe2d04090b5faca8" - }, - { - "ImportPath": "github.com/docker/spdystream", - "Rev": "449fdfce4d962303d702fec724ef0ad181c92528" - }, - { - "ImportPath": "github.com/docker/spdystream/spdy", - "Rev": "449fdfce4d962303d702fec724ef0ad181c92528" - }, - { - "ImportPath": "github.com/elazarl/goproxy", - "Rev": "c4fc26588b6ef8af07a191fcb6476387bdd46711" - }, - { - "ImportPath": "github.com/evanphx/json-patch", - "Rev": "944e07253867aacae43c04b2e6a239005443f33a" - }, - { - "ImportPath": "github.com/ghodss/yaml", - "Rev": "73d445a93680fa1a78ae23a5839bad48f32ba1ee" - }, - { - "ImportPath": "github.com/gogo/protobuf/proto", - "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" - }, - { - "ImportPath": "github.com/gogo/protobuf/sortkeys", - "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" - }, - { - "ImportPath": "github.com/golang/glog", - "Rev": "44145f04b68cf362d9c4df2182967c2275eaefed" - }, - { - "ImportPath": "github.com/golang/groupcache/lru", - "Rev": "02826c3e79038b59d737d3b1c0a1d937f71a4433" - }, - { - "ImportPath": "github.com/golang/protobuf/proto", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" - }, - { - "ImportPath": "github.com/golang/protobuf/ptypes", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" - }, - { - "ImportPath": "github.com/golang/protobuf/ptypes/any", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" - }, - { - "ImportPath": "github.com/golang/protobuf/ptypes/duration", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" - }, - { - "ImportPath": "github.com/golang/protobuf/ptypes/timestamp", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" - }, - { - "ImportPath": "github.com/google/gofuzz", - "Rev": "44d81051d367757e1c7c6a5a86423ece9afcf63c" - }, - { - "ImportPath": "github.com/googleapis/gnostic/OpenAPIv2", - "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" - }, - { - "ImportPath": "github.com/googleapis/gnostic/compiler", - "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" - }, - { - "ImportPath": "github.com/googleapis/gnostic/extensions", - "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" - }, - { - "ImportPath": "github.com/hashicorp/golang-lru", - "Rev": "a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4" - }, - { - "ImportPath": "github.com/hashicorp/golang-lru/simplelru", - "Rev": "a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4" - }, - { - "ImportPath": "github.com/json-iterator/go", - "Rev": "13f86432b882000a51c6e610c620974462691a97" - }, - { - "ImportPath": "github.com/mxk/go-flowrate/flowrate", - "Rev": "cca7078d478f8520f85629ad7c68962d31ed7682" - }, - { - "ImportPath": "github.com/pborman/uuid", - "Rev": "ca53cad383cad2479bbba7f7a1a05797ec1386e4" - }, - { - "ImportPath": "github.com/pmezard/go-difflib/difflib", - "Rev": "d8ed2627bdf02c080bf22230dbb337003b7aba2d" - }, - { - "ImportPath": "github.com/spf13/pflag", - "Rev": "4c012f6dcd9546820e378d0bdda4d8fc772cdfea" - }, - { - "ImportPath": "github.com/stretchr/testify/assert", - "Rev": "f6abca593680b2315d2075e0f5e2a9751e3f431a" - }, - { - "ImportPath": "github.com/stretchr/testify/require", - "Rev": "f6abca593680b2315d2075e0f5e2a9751e3f431a" - }, - { - "ImportPath": "golang.org/x/net/html", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/html/atom", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/http2", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/http2/hpack", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/idna", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/lex/httplex", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/net/websocket", - "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" - }, - { - "ImportPath": "golang.org/x/text/secure/bidirule", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/transform", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/unicode/bidi", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "golang.org/x/text/unicode/norm", - "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" - }, - { - "ImportPath": "gopkg.in/inf.v0", - "Rev": "3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4" - }, - { - "ImportPath": "gopkg.in/yaml.v2", - "Rev": "670d4cfef0544295bc27a114dbac37980d83185a" - }, - { - "ImportPath": "k8s.io/kube-openapi/pkg/util/proto", - "Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" - } - ] + "ImportPath": "k8s.io/apimachinery", + "GoVersion": "go1.9", + "GodepVersion": "v80", + "Packages": [ + "./..." + ], + "Deps": [ + { + "ImportPath": "github.com/davecgh/go-spew/spew", + "Rev": "782f4967f2dc4564575ca782fe2d04090b5faca8" + }, + { + "ImportPath": "github.com/docker/spdystream", + "Rev": "449fdfce4d962303d702fec724ef0ad181c92528" + }, + { + "ImportPath": "github.com/docker/spdystream/spdy", + "Rev": "449fdfce4d962303d702fec724ef0ad181c92528" + }, + { + "ImportPath": "github.com/elazarl/goproxy", + "Rev": "c4fc26588b6ef8af07a191fcb6476387bdd46711" + }, + { + "ImportPath": "github.com/evanphx/json-patch", + "Rev": "94e38aa1586e8a6c8a75770bddf5ff84c48a106b" + }, + { + "ImportPath": "github.com/ghodss/yaml", + "Rev": "73d445a93680fa1a78ae23a5839bad48f32ba1ee" + }, + { + "ImportPath": "github.com/gogo/protobuf/proto", + "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" + }, + { + "ImportPath": "github.com/gogo/protobuf/sortkeys", + "Rev": "c0656edd0d9eab7c66d1eb0c568f9039345796f7" + }, + { + "ImportPath": "github.com/golang/glog", + "Rev": "44145f04b68cf362d9c4df2182967c2275eaefed" + }, + { + "ImportPath": "github.com/golang/groupcache/lru", + "Rev": "02826c3e79038b59d737d3b1c0a1d937f71a4433" + }, + { + "ImportPath": "github.com/golang/protobuf/proto", + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" + }, + { + "ImportPath": "github.com/golang/protobuf/ptypes", + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" + }, + { + "ImportPath": "github.com/golang/protobuf/ptypes/any", + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" + }, + { + "ImportPath": "github.com/golang/protobuf/ptypes/duration", + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" + }, + { + "ImportPath": "github.com/golang/protobuf/ptypes/timestamp", + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" + }, + { + "ImportPath": "github.com/google/gofuzz", + "Rev": "44d81051d367757e1c7c6a5a86423ece9afcf63c" + }, + { + "ImportPath": "github.com/googleapis/gnostic/OpenAPIv2", + "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" + }, + { + "ImportPath": "github.com/googleapis/gnostic/compiler", + "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" + }, + { + "ImportPath": "github.com/googleapis/gnostic/extensions", + "Rev": "0c5108395e2debce0d731cf0287ddf7242066aba" + }, + { + "ImportPath": "github.com/hashicorp/golang-lru", + "Rev": "a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4" + }, + { + "ImportPath": "github.com/hashicorp/golang-lru/simplelru", + "Rev": "a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4" + }, + { + "ImportPath": "github.com/json-iterator/go", + "Rev": "f2b4162afba35581b6d4a50d3b8f34e33c144682" + }, + { + "ImportPath": "github.com/modern-go/concurrent", + "Rev": "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" + }, + { + "ImportPath": "github.com/modern-go/reflect2", + "Rev": "05fbef0ca5da472bbf96c9322b84a53edc03c9fd" + }, + { + "ImportPath": "github.com/mxk/go-flowrate/flowrate", + "Rev": "cca7078d478f8520f85629ad7c68962d31ed7682" + }, + { + "ImportPath": "github.com/pborman/uuid", + "Rev": "ca53cad383cad2479bbba7f7a1a05797ec1386e4" + }, + { + "ImportPath": "github.com/pmezard/go-difflib/difflib", + "Rev": "d8ed2627bdf02c080bf22230dbb337003b7aba2d" + }, + { + "ImportPath": "github.com/spf13/pflag", + "Rev": "583c0c0531f06d5278b7d917446061adc344b5cd" + }, + { + "ImportPath": "github.com/stretchr/testify/assert", + "Rev": "c679ae2cc0cb27ec3293fea7e254e47386f05d69" + }, + { + "ImportPath": "github.com/stretchr/testify/require", + "Rev": "c679ae2cc0cb27ec3293fea7e254e47386f05d69" + }, + { + "ImportPath": "golang.org/x/net/html", + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" + }, + { + "ImportPath": "golang.org/x/net/html/atom", + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" + }, + { + "ImportPath": "golang.org/x/net/http2", + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" + }, + { + "ImportPath": "golang.org/x/net/http2/hpack", + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" + }, + { + "ImportPath": "golang.org/x/net/idna", + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" + }, + { + "ImportPath": "golang.org/x/net/lex/httplex", + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" + }, + { + "ImportPath": "golang.org/x/net/websocket", + "Rev": "1c05540f6879653db88113bc4a2b70aec4bd491f" + }, + { + "ImportPath": "golang.org/x/text/secure/bidirule", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/transform", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/unicode/bidi", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "golang.org/x/text/unicode/norm", + "Rev": "b19bf474d317b857955b12035d2c5acb57ce8b01" + }, + { + "ImportPath": "gopkg.in/inf.v0", + "Rev": "3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4" + }, + { + "ImportPath": "gopkg.in/yaml.v2", + "Rev": "670d4cfef0544295bc27a114dbac37980d83185a" + }, + { + "ImportPath": "k8s.io/kube-openapi/pkg/util/proto", + "Rev": "91cfa479c814065e420cee7ed227db0f63a5854e" + } + ] } diff --git a/vendor/k8s.io/apimachinery/SECURITY_CONTACTS b/vendor/k8s.io/apimachinery/SECURITY_CONTACTS new file mode 100644 index 000000000..0648a8ebf --- /dev/null +++ b/vendor/k8s.io/apimachinery/SECURITY_CONTACTS @@ -0,0 +1,17 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +cjcullen +jessfraz +liggitt +philips +tallclair diff --git a/vendor/k8s.io/apimachinery/pkg/api/equality/BUILD b/vendor/k8s.io/apimachinery/pkg/api/equality/BUILD deleted file mode 100644 index 75051f35b..000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/equality/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["semantic.go"], - importpath = "k8s.io/apimachinery/pkg/api/equality", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/errors/BUILD b/vendor/k8s.io/apimachinery/pkg/api/errors/BUILD deleted file mode 100644 index 785e9d8a6..000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/errors/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["errors_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "errors.go", - ], - importpath = "k8s.io/apimachinery/pkg/api/errors", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD b/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD deleted file mode 100644 index a02a1fb5b..000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD +++ /dev/null @@ -1,72 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "meta_test.go", - "multirestmapper_test.go", - "priority_test.go", - "restmapper_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "errors.go", - "firsthit_restmapper.go", - "help.go", - "interfaces.go", - "lazy.go", - "meta.go", - "multirestmapper.go", - "priority.go", - "restmapper.go", - "unstructured.go", - ], - importpath = "k8s.io/apimachinery/pkg/api/meta", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/api/meta/table:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/interfaces.go b/vendor/k8s.io/apimachinery/pkg/api/meta/interfaces.go index 5dc9d89e6..42eac3af0 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/interfaces.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/interfaces.go @@ -23,12 +23,6 @@ import ( "k8s.io/apimachinery/pkg/types" ) -// VersionInterfaces contains the interfaces one should use for dealing with types of a particular version. -type VersionInterfaces struct { - runtime.ObjectConvertor - MetadataAccessor -} - type ListMetaAccessor interface { GetListMeta() List } @@ -92,28 +86,19 @@ const ( type RESTScope interface { // Name of the scope Name() RESTScopeName - // ParamName is the optional name of the parameter that should be inserted in the resource url - // If empty, no param will be inserted - ParamName() string - // ArgumentName is the optional name that should be used for the variable holding the value. - ArgumentName() string - // ParamDescription is the optional description to use to document the parameter in api documentation - ParamDescription() string } // RESTMapping contains the information needed to deal with objects of a specific // resource and kind in a RESTful manner. type RESTMapping struct { - // Resource is a string representing the name of this resource as a REST client would see it - Resource string + // Resource is the GroupVersionResource (location) for this endpoint + Resource schema.GroupVersionResource + // GroupVersionKind is the GroupVersionKind (data format) to submit to this endpoint GroupVersionKind schema.GroupVersionKind // Scope contains the information needed to deal with REST Resources that are in a resource hierarchy Scope RESTScope - - runtime.ObjectConvertor - MetadataAccessor } // RESTMapper allows clients to map resources to kind, and map kind and version diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/lazy.go b/vendor/k8s.io/apimachinery/pkg/api/meta/lazy.go index 7f92f39a4..431a0a635 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/lazy.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/lazy.go @@ -19,27 +19,25 @@ package meta import ( "sync" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) // lazyObject defers loading the mapper and typer until necessary. type lazyObject struct { - loader func() (RESTMapper, runtime.ObjectTyper, error) + loader func() (RESTMapper, error) lock sync.Mutex loaded bool err error mapper RESTMapper - typer runtime.ObjectTyper } // NewLazyObjectLoader handles unrecoverable errors when creating a RESTMapper / ObjectTyper by // returning those initialization errors when the interface methods are invoked. This defers the // initialization and any server calls until a client actually needs to perform the action. -func NewLazyObjectLoader(fn func() (RESTMapper, runtime.ObjectTyper, error)) (RESTMapper, runtime.ObjectTyper) { +func NewLazyRESTMapperLoader(fn func() (RESTMapper, error)) RESTMapper { obj := &lazyObject{loader: fn} - return obj, obj + return obj } // init lazily loads the mapper and typer, returning an error if initialization has failed. @@ -49,13 +47,12 @@ func (o *lazyObject) init() error { if o.loaded { return o.err } - o.mapper, o.typer, o.err = o.loader() + o.mapper, o.err = o.loader() o.loaded = true return o.err } var _ RESTMapper = &lazyObject{} -var _ runtime.ObjectTyper = &lazyObject{} func (o *lazyObject) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) { if err := o.init(); err != nil { @@ -105,17 +102,3 @@ func (o *lazyObject) ResourceSingularizer(resource string) (singular string, err } return o.mapper.ResourceSingularizer(resource) } - -func (o *lazyObject) ObjectKinds(obj runtime.Object) ([]schema.GroupVersionKind, bool, error) { - if err := o.init(); err != nil { - return nil, false, err - } - return o.typer.ObjectKinds(obj) -} - -func (o *lazyObject) Recognizes(gvk schema.GroupVersionKind) bool { - if err := o.init(); err != nil { - return false - } - return o.typer.Recognizes(gvk) -} diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go b/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go index b9670071c..1c2a83cfa 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go @@ -38,7 +38,6 @@ var errNotCommon = fmt.Errorf("object does not implement the common interface fo // CommonAccessor returns a Common interface for the provided object or an error if the object does // not provide List. -// TODO: return bool instead of error func CommonAccessor(obj interface{}) (metav1.Common, error) { switch t := obj.(type) { case List: @@ -71,7 +70,6 @@ func CommonAccessor(obj interface{}) (metav1.Common, error) { // not provide List. // IMPORTANT: Objects are NOT a superset of lists. Do not use this check to determine whether an // object *is* a List. -// TODO: return bool instead of error func ListAccessor(obj interface{}) (List, error) { switch t := obj.(type) { case List: @@ -101,7 +99,6 @@ var errNotObject = fmt.Errorf("object does not implement the Object interfaces") // obj must be a pointer to an API type. An error is returned if the minimum // required fields are missing. Fields that are not required return the default // value and are a no-op if set. -// TODO: return bool instead of error func Accessor(obj interface{}) (metav1.Object, error) { switch t := obj.(type) { case metav1.Object: diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/priority.go b/vendor/k8s.io/apimachinery/pkg/api/meta/priority.go index df28e64ff..fa11c580f 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/priority.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/priority.go @@ -54,12 +54,12 @@ func (m PriorityRESTMapper) String() string { // ResourceFor finds all resources, then passes them through the ResourcePriority patterns to find a single matching hit. func (m PriorityRESTMapper) ResourceFor(partiallySpecifiedResource schema.GroupVersionResource) (schema.GroupVersionResource, error) { - originalGVRs, err := m.Delegate.ResourcesFor(partiallySpecifiedResource) - if err != nil { - return schema.GroupVersionResource{}, err + originalGVRs, originalErr := m.Delegate.ResourcesFor(partiallySpecifiedResource) + if originalErr != nil && len(originalGVRs) == 0 { + return schema.GroupVersionResource{}, originalErr } if len(originalGVRs) == 1 { - return originalGVRs[0], nil + return originalGVRs[0], originalErr } remainingGVRs := append([]schema.GroupVersionResource{}, originalGVRs...) @@ -77,7 +77,7 @@ func (m PriorityRESTMapper) ResourceFor(partiallySpecifiedResource schema.GroupV continue case 1: // one match, return - return matchedGVRs[0], nil + return matchedGVRs[0], originalErr default: // more than one match, use the matched hits as the list moving to the next pattern. // this way you can have a series of selection criteria @@ -90,12 +90,12 @@ func (m PriorityRESTMapper) ResourceFor(partiallySpecifiedResource schema.GroupV // KindFor finds all kinds, then passes them through the KindPriority patterns to find a single matching hit. func (m PriorityRESTMapper) KindFor(partiallySpecifiedResource schema.GroupVersionResource) (schema.GroupVersionKind, error) { - originalGVKs, err := m.Delegate.KindsFor(partiallySpecifiedResource) - if err != nil { - return schema.GroupVersionKind{}, err + originalGVKs, originalErr := m.Delegate.KindsFor(partiallySpecifiedResource) + if originalErr != nil && len(originalGVKs) == 0 { + return schema.GroupVersionKind{}, originalErr } if len(originalGVKs) == 1 { - return originalGVKs[0], nil + return originalGVKs[0], originalErr } remainingGVKs := append([]schema.GroupVersionKind{}, originalGVKs...) @@ -113,7 +113,7 @@ func (m PriorityRESTMapper) KindFor(partiallySpecifiedResource schema.GroupVersi continue case 1: // one match, return - return matchedGVKs[0], nil + return matchedGVKs[0], originalErr default: // more than one match, use the matched hits as the list moving to the next pattern. // this way you can have a series of selection criteria @@ -153,9 +153,9 @@ func kindMatches(pattern schema.GroupVersionKind, kind schema.GroupVersionKind) } func (m PriorityRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) (mapping *RESTMapping, err error) { - mappings, err := m.Delegate.RESTMappings(gk, versions...) - if err != nil { - return nil, err + mappings, originalErr := m.Delegate.RESTMappings(gk, versions...) + if originalErr != nil && len(mappings) == 0 { + return nil, originalErr } // any versions the user provides take priority @@ -187,7 +187,7 @@ func (m PriorityRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) continue case 1: // one match, return - return matching[0], nil + return matching[0], originalErr default: // more than one match, use the matched hits as the list moving to the next pattern. // this way you can have a series of selection criteria @@ -195,7 +195,7 @@ func (m PriorityRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) } } if len(remaining) == 1 { - return remaining[0], nil + return remaining[0], originalErr } var kinds []schema.GroupVersionKind diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/priority_test.go b/vendor/k8s.io/apimachinery/pkg/api/meta/priority_test.go index 098d53bd5..fff1afd17 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/priority_test.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/priority_test.go @@ -34,6 +34,30 @@ func TestPriorityRESTMapperResourceForErrorHandling(t *testing.T) { result schema.GroupVersionResource err string }{ + { + name: "error", + delegate: fixedRESTMapper{err: errors.New("delegateError")}, + err: "delegateError", + }, + { + name: "single hit + error", + delegate: fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{{Resource: "single-hit"}}, err: errors.New("delegateError")}, + result: schema.GroupVersionResource{Resource: "single-hit"}, + err: "delegateError", + }, + { + name: "group selection + error", + delegate: fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{ + {Group: "one", Version: "a", Resource: "first"}, + {Group: "two", Version: "b", Resource: "second"}, + }, err: errors.New("delegateError")}, + resourcePatterns: []schema.GroupVersionResource{ + {Group: "one", Version: AnyVersion, Resource: AnyResource}, + }, + result: schema.GroupVersionResource{Group: "one", Version: "a", Resource: "first"}, + err: "delegateError", + }, + { name: "single hit", delegate: fixedRESTMapper{resourcesFor: []schema.GroupVersionResource{{Resource: "single-hit"}}}, @@ -106,6 +130,10 @@ func TestPriorityRESTMapperResourceForErrorHandling(t *testing.T) { if len(tc.err) == 0 && actualErr == nil { continue } + if len(tc.err) == 0 && actualErr != nil { + t.Errorf("%s: unexpected err: %v", tc.name, actualErr) + continue + } if len(tc.err) > 0 && actualErr == nil { t.Errorf("%s: missing expected err: %v", tc.name, tc.err) continue @@ -125,6 +153,30 @@ func TestPriorityRESTMapperKindForErrorHandling(t *testing.T) { result schema.GroupVersionKind err string }{ + { + name: "error", + delegate: fixedRESTMapper{err: errors.New("delegateErr")}, + err: "delegateErr", + }, + { + name: "single hit + error", + delegate: fixedRESTMapper{kindsFor: []schema.GroupVersionKind{{Kind: "single-hit"}}, err: errors.New("delegateErr")}, + result: schema.GroupVersionKind{Kind: "single-hit"}, + err: "delegateErr", + }, + { + name: "group selection + error", + delegate: fixedRESTMapper{kindsFor: []schema.GroupVersionKind{ + {Group: "one", Version: "a", Kind: "first"}, + {Group: "two", Version: "b", Kind: "second"}, + }, err: errors.New("delegateErr")}, + kindPatterns: []schema.GroupVersionKind{ + {Group: "one", Version: AnyVersion, Kind: AnyKind}, + }, + result: schema.GroupVersionKind{Group: "one", Version: "a", Kind: "first"}, + err: "delegateErr", + }, + { name: "single hit", delegate: fixedRESTMapper{kindsFor: []schema.GroupVersionKind{{Kind: "single-hit"}}}, @@ -197,6 +249,10 @@ func TestPriorityRESTMapperKindForErrorHandling(t *testing.T) { if len(tc.err) == 0 && actualErr == nil { continue } + if len(tc.err) == 0 && actualErr != nil { + t.Errorf("%s: unexpected err: %v", tc.name, actualErr) + continue + } if len(tc.err) > 0 && actualErr == nil { t.Errorf("%s: missing expected err: %v", tc.name, tc.err) continue @@ -248,6 +304,13 @@ func TestPriorityRESTMapperRESTMapping(t *testing.T) { input: schema.GroupKind{Kind: "Foo"}, err: errors.New("fail on this"), }, + { + name: "result + error", + mapper: PriorityRESTMapper{Delegate: fixedRESTMapper{mappings: []*RESTMapping{mapping1}, err: errors.New("fail on this")}}, + input: schema.GroupKind{Kind: "Foo"}, + result: mapping1, + err: errors.New("fail on this"), + }, { name: "return error for ambiguous", mapper: PriorityRESTMapper{ diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper.go b/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper.go index ff945acd1..41b60d731 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper.go @@ -28,30 +28,15 @@ import ( // Implements RESTScope interface type restScope struct { - name RESTScopeName - paramName string - argumentName string - paramDescription string + name RESTScopeName } func (r *restScope) Name() RESTScopeName { return r.name } -func (r *restScope) ParamName() string { - return r.paramName -} -func (r *restScope) ArgumentName() string { - return r.argumentName -} -func (r *restScope) ParamDescription() string { - return r.paramDescription -} var RESTScopeNamespace = &restScope{ - name: RESTScopeNameNamespace, - paramName: "namespaces", - argumentName: "namespace", - paramDescription: "object name and auth scope, such as for teams and projects", + name: RESTScopeNameNamespace, } var RESTScopeRoot = &restScope{ @@ -77,8 +62,6 @@ type DefaultRESTMapper struct { kindToScope map[schema.GroupVersionKind]RESTScope singularToPlural map[schema.GroupVersionResource]schema.GroupVersionResource pluralToSingular map[schema.GroupVersionResource]schema.GroupVersionResource - - interfacesFunc VersionInterfacesFunc } func (m *DefaultRESTMapper) String() string { @@ -87,16 +70,12 @@ func (m *DefaultRESTMapper) String() string { var _ RESTMapper = &DefaultRESTMapper{} -// VersionInterfacesFunc returns the appropriate typer, and metadata accessor for a -// given api version, or an error if no such api version exists. -type VersionInterfacesFunc func(version schema.GroupVersion) (*VersionInterfaces, error) - // NewDefaultRESTMapper initializes a mapping between Kind and APIVersion // to a resource name and back based on the objects in a runtime.Scheme // and the Kubernetes API conventions. Takes a group name, a priority list of the versions // to search when an object has no default version (set empty to return an error), // and a function that retrieves the correct metadata for a given version. -func NewDefaultRESTMapper(defaultGroupVersions []schema.GroupVersion, f VersionInterfacesFunc) *DefaultRESTMapper { +func NewDefaultRESTMapper(defaultGroupVersions []schema.GroupVersion) *DefaultRESTMapper { resourceToKind := make(map[schema.GroupVersionResource]schema.GroupVersionKind) kindToPluralResource := make(map[schema.GroupVersionKind]schema.GroupVersionResource) kindToScope := make(map[schema.GroupVersionKind]RESTScope) @@ -111,7 +90,6 @@ func NewDefaultRESTMapper(defaultGroupVersions []schema.GroupVersion, f VersionI defaultGroupVersions: defaultGroupVersions, singularToPlural: singularToPlural, pluralToSingular: pluralToSingular, - interfacesFunc: f, } } @@ -526,18 +504,10 @@ func (m *DefaultRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string return nil, fmt.Errorf("the provided version %q and kind %q cannot be mapped to a supported scope", gvk.GroupVersion(), gvk.Kind) } - interfaces, err := m.interfacesFunc(gvk.GroupVersion()) - if err != nil { - return nil, fmt.Errorf("the provided version %q has no relevant versions: %v", gvk.GroupVersion().String(), err) - } - mappings = append(mappings, &RESTMapping{ - Resource: res.Resource, + Resource: res, GroupVersionKind: gvk, Scope: scope, - - ObjectConvertor: interfaces.ObjectConvertor, - MetadataAccessor: interfaces.MetadataAccessor, }) } diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper_test.go b/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper_test.go index 1b1c70d65..853404ad6 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper_test.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper_test.go @@ -17,42 +17,13 @@ limitations under the License. package meta import ( - "errors" "reflect" "strings" "testing" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) -type fakeConvertor struct{} - -func (fakeConvertor) Convert(in, out, context interface{}) error { - return nil -} - -func (fakeConvertor) ConvertToVersion(in runtime.Object, _ runtime.GroupVersioner) (runtime.Object, error) { - return in, nil -} - -func (fakeConvertor) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { - return label, value, nil -} - -var validAccessor = resourceAccessor{} -var validConvertor = fakeConvertor{} - -func fakeInterfaces(version schema.GroupVersion) (*VersionInterfaces, error) { - return &VersionInterfaces{ObjectConvertor: validConvertor, MetadataAccessor: validAccessor}, nil -} - -var unmatchedErr = errors.New("no version") - -func unmatchedVersionInterfaces(version schema.GroupVersion) (*VersionInterfaces, error) { - return nil, unmatchedErr -} - func TestRESTMapperVersionAndKindForResource(t *testing.T) { testGroup := "test.group" testVersion := "test" @@ -71,7 +42,7 @@ func TestRESTMapperVersionAndKindForResource(t *testing.T) { {Resource: schema.GroupVersionResource{Resource: "internalobjects"}, ExpectedGVK: testGroupVersion.WithKind("InternalObject")}, } for i, testCase := range testCases { - mapper := NewDefaultRESTMapper([]schema.GroupVersion{testGroupVersion}, fakeInterfaces) + mapper := NewDefaultRESTMapper([]schema.GroupVersion{testGroupVersion}) if len(testCase.ExpectedGVK.Kind) != 0 { mapper.Add(testCase.ExpectedGVK, RESTScopeNamespace) } @@ -104,7 +75,7 @@ func TestRESTMapperGroupForResource(t *testing.T) { {Resource: schema.GroupVersionResource{Resource: "myobje"}, Err: true, GroupVersionKind: schema.GroupVersionKind{Group: "testapi", Version: "test", Kind: "MyObject"}}, } for i, testCase := range testCases { - mapper := NewDefaultRESTMapper([]schema.GroupVersion{testCase.GroupVersionKind.GroupVersion()}, fakeInterfaces) + mapper := NewDefaultRESTMapper([]schema.GroupVersion{testCase.GroupVersionKind.GroupVersion()}) mapper.Add(testCase.GroupVersionKind, RESTScopeNamespace) actualGVK, err := mapper.KindFor(testCase.Resource) @@ -249,7 +220,7 @@ func TestRESTMapperKindsFor(t *testing.T) { } for _, testCase := range testCases { tcName := testCase.Name - mapper := NewDefaultRESTMapper(testCase.PreferredOrder, fakeInterfaces) + mapper := NewDefaultRESTMapper(testCase.PreferredOrder) for _, kind := range testCase.KindsToRegister { mapper.Add(kind, RESTScopeNamespace) } @@ -426,7 +397,7 @@ func TestRESTMapperResourcesFor(t *testing.T) { tcName := testCase.Name for _, partialResource := range []schema.GroupVersionResource{testCase.PluralPartialResourceToRequest, testCase.SingularPartialResourceToRequest} { - mapper := NewDefaultRESTMapper(testCase.PreferredOrder, fakeInterfaces) + mapper := NewDefaultRESTMapper(testCase.PreferredOrder) for _, kind := range testCase.KindsToRegister { mapper.Add(kind, RESTScopeNamespace) } @@ -511,7 +482,7 @@ func TestRESTMapperResourceSingularizer(t *testing.T) { {Kind: "lowercases", Plural: "lowercaseses", Singular: "lowercases"}, } for i, testCase := range testCases { - mapper := NewDefaultRESTMapper([]schema.GroupVersion{testGroupVersion}, fakeInterfaces) + mapper := NewDefaultRESTMapper([]schema.GroupVersion{testGroupVersion}) // create singular/plural mapping mapper.Add(testGroupVersion.WithKind(testCase.Kind), RESTScopeNamespace) @@ -535,7 +506,7 @@ func TestRESTMapperRESTMapping(t *testing.T) { APIGroupVersions []schema.GroupVersion DefaultVersions []schema.GroupVersion - Resource string + Resource schema.GroupVersionResource ExpectedGroupVersion *schema.GroupVersion Err bool }{ @@ -544,19 +515,19 @@ func TestRESTMapperRESTMapping(t *testing.T) { {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "Unknown", Err: true}, - {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, - {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")}, + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")}, - {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")}, - {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{}, Resource: "internalobjects", ExpectedGroupVersion: &schema.GroupVersion{Group: testGroup, Version: "test"}}, + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{}, Resource: internalGroupVersion.WithResource("internalobjects"), ExpectedGroupVersion: &schema.GroupVersion{Group: testGroup, Version: "test"}}, - {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: "internalobjects"}, + {DefaultVersions: []schema.GroupVersion{testGroupVersion}, Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "test"}}, Resource: testGroupVersion.WithResource("internalobjects")}, // TODO: add test for a resource that exists in one version but not another } for i, testCase := range testCases { - mapper := NewDefaultRESTMapper(testCase.DefaultVersions, fakeInterfaces) + mapper := NewDefaultRESTMapper(testCase.DefaultVersions) mapper.Add(internalGroupVersion.WithKind("InternalObject"), RESTScopeNamespace) preferredVersions := []string{} @@ -577,10 +548,6 @@ func TestRESTMapperRESTMapping(t *testing.T) { t.Errorf("%d: unexpected resource: %#v", i, mapping) } - if mapping.MetadataAccessor == nil || mapping.ObjectConvertor == nil { - t.Errorf("%d: missing codec and accessor: %#v", i, mapping) - } - groupVersion := testCase.ExpectedGroupVersion if groupVersion == nil { groupVersion = &testCase.APIGroupVersions[0] @@ -599,7 +566,7 @@ func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) { internalObjectGK := schema.GroupKind{Group: "tgroup", Kind: "InternalObject"} otherObjectGK := schema.GroupKind{Group: "tgroup", Kind: "OtherObject"} - mapper := NewDefaultRESTMapper([]schema.GroupVersion{expectedGroupVersion1, expectedGroupVersion2}, fakeInterfaces) + mapper := NewDefaultRESTMapper([]schema.GroupVersion{expectedGroupVersion1, expectedGroupVersion2}) mapper.Add(expectedGroupVersion1.WithKind("InternalObject"), RESTScopeNamespace) mapper.Add(expectedGroupVersion2.WithKind("OtherObject"), RESTScopeNamespace) @@ -608,7 +575,7 @@ func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) { if err != nil { t.Fatalf("unexpected error: %v", err) } - if mapping.Resource != "otherobjects" || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 { + if mapping.Resource != expectedGroupVersion2.WithResource("otherobjects") || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 { t.Errorf("unexpected mapping: %#v", mapping) } @@ -616,7 +583,7 @@ func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) { if err != nil { t.Fatalf("unexpected error: %v", err) } - if mapping.Resource != "internalobjects" || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion1 { + if mapping.Resource != expectedGroupVersion1.WithResource("internalobjects") || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion1 { t.Errorf("unexpected mapping: %#v", mapping) } @@ -646,7 +613,7 @@ func TestRESTMapperRESTMappingSelectsVersion(t *testing.T) { if err != nil { t.Fatalf("unexpected error: %v", err) } - if mapping.Resource != "otherobjects" || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 { + if mapping.Resource != expectedGroupVersion2.WithResource("otherobjects") || mapping.GroupVersionKind.GroupVersion() != expectedGroupVersion2 { t.Errorf("unexpected mapping: %#v", mapping) } } @@ -678,7 +645,7 @@ func TestRESTMapperRESTMappings(t *testing.T) { Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "v2"}}, AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")}, - ExpectedRESTMappings: []*RESTMapping{{Resource: "internalobjects", GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}}, + ExpectedRESTMappings: []*RESTMapping{{Resource: schema.GroupVersionResource{Group: testGroup, Version: "v2", Resource: "internalobjects"}, GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}}, }, // ask for specific versions - only one available - check ExpectedRESTMappings @@ -687,20 +654,29 @@ func TestRESTMapperRESTMappings(t *testing.T) { Kind: "InternalObject", APIGroupVersions: []schema.GroupVersion{{Group: testGroup, Version: "v3"}, {Group: testGroup, Version: "v2"}}, AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")}, - ExpectedRESTMappings: []*RESTMapping{{Resource: "internalobjects", GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}}, + ExpectedRESTMappings: []*RESTMapping{{Resource: schema.GroupVersionResource{Group: testGroup, Version: "v2", Resource: "internalobjects"}, GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}}, }, // do not ask for specific version - search through default versions - check ExpectedRESTMappings { - DefaultVersions: []schema.GroupVersion{testGroupVersion, {Group: testGroup, Version: "v2"}}, - Kind: "InternalObject", - AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v1"}.WithKind("InternalObject"), schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")}, - ExpectedRESTMappings: []*RESTMapping{{Resource: "internalobjects", GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v1", Kind: "InternalObject"}}, {Resource: "internalobjects", GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}}}, + DefaultVersions: []schema.GroupVersion{testGroupVersion, {Group: testGroup, Version: "v2"}}, + Kind: "InternalObject", + AddGroupVersionKind: []schema.GroupVersionKind{schema.GroupVersion{Group: testGroup, Version: "v1"}.WithKind("InternalObject"), schema.GroupVersion{Group: testGroup, Version: "v2"}.WithKind("InternalObject")}, + ExpectedRESTMappings: []*RESTMapping{ + { + Resource: schema.GroupVersionResource{Group: testGroup, Version: "v1", Resource: "internalobjects"}, + GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v1", Kind: "InternalObject"}, + }, + { + Resource: schema.GroupVersionResource{Group: testGroup, Version: "v2", Resource: "internalobjects"}, + GroupVersionKind: schema.GroupVersionKind{Group: testGroup, Version: "v2", Kind: "InternalObject"}, + }, + }, }, } for i, testCase := range testCases { - mapper := NewDefaultRESTMapper(testCase.DefaultVersions, fakeInterfaces) + mapper := NewDefaultRESTMapper(testCase.DefaultVersions) for _, gvk := range testCase.AddGroupVersionKind { mapper.Add(gvk, RESTScopeNamespace) } @@ -727,9 +703,6 @@ func TestRESTMapperRESTMappings(t *testing.T) { if mapping.Resource != exp.Resource { t.Errorf("%d - %d: unexpected resource: %#v", i, j, mapping) } - if mapping.MetadataAccessor == nil || mapping.ObjectConvertor == nil { - t.Errorf("%d - %d: missing codec and accessor: %#v", i, j, mapping) - } if mapping.GroupVersionKind != exp.GroupVersionKind { t.Errorf("%d - %d: unexpected GroupVersionKind: %#v", i, j, mapping) } @@ -742,9 +715,9 @@ func TestRESTMapperReportsErrorOnBadVersion(t *testing.T) { expectedGroupVersion2 := schema.GroupVersion{Group: "tgroup", Version: "test2"} internalObjectGK := schema.GroupKind{Group: "tgroup", Kind: "InternalObject"} - mapper := NewDefaultRESTMapper([]schema.GroupVersion{expectedGroupVersion1, expectedGroupVersion2}, unmatchedVersionInterfaces) + mapper := NewDefaultRESTMapper([]schema.GroupVersion{expectedGroupVersion1, expectedGroupVersion2}) mapper.Add(expectedGroupVersion1.WithKind("InternalObject"), RESTScopeNamespace) - _, err := mapper.RESTMapping(internalObjectGK, expectedGroupVersion1.Version) + _, err := mapper.RESTMapping(internalObjectGK, "test3") if err == nil { t.Errorf("unexpected non-error") } diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/table/BUILD b/vendor/k8s.io/apimachinery/pkg/api/meta/table/BUILD deleted file mode 100644 index e3ffd2493..000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/table/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["table.go"], - importpath = "k8s.io/apimachinery/pkg/api/meta/table", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/duration:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/table/table.go b/vendor/k8s.io/apimachinery/pkg/api/meta/table/table.go index a0097a4e2..2144a77cb 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/table/table.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/table/table.go @@ -53,7 +53,7 @@ func MetaToTableRow(obj runtime.Object, rowFn func(obj runtime.Object, m metav1. row := metav1beta1.TableRow{ Object: runtime.RawExtension{Object: obj}, } - row.Cells, err = rowFn(obj, m, m.GetName(), translateTimestamp(m.GetCreationTimestamp())) + row.Cells, err = rowFn(obj, m, m.GetName(), ConvertToHumanReadableDateType(m.GetCreationTimestamp())) if err != nil { return nil, err } @@ -61,9 +61,9 @@ func MetaToTableRow(obj runtime.Object, rowFn func(obj runtime.Object, m metav1. return rows, nil } -// translateTimestamp returns the elapsed time since timestamp in +// ConvertToHumanReadableDateType returns the elapsed time since timestamp in // human-readable approximation. -func translateTimestamp(timestamp metav1.Time) string { +func ConvertToHumanReadableDateType(timestamp metav1.Time) string { if timestamp.IsZero() { return "" } diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/testrestmapper/test_restmapper.go b/vendor/k8s.io/apimachinery/pkg/api/meta/testrestmapper/test_restmapper.go new file mode 100644 index 000000000..a08b42b82 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/testrestmapper/test_restmapper.go @@ -0,0 +1,171 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package testrestmapper + +import ( + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/sets" +) + +// TestOnlyStaticRESTMapper returns a union RESTMapper of all known types with priorities chosen in the following order: +// 1. legacy kube group preferred version, extensions preferred version, metrics perferred version, legacy +// kube any version, extensions any version, metrics any version, all other groups alphabetical preferred version, +// all other groups alphabetical. +// TODO callers of this method should be updated to build their own specific restmapper based on their scheme for their tests +// TODO the things being tested are related to whether various cases are handled, not tied to the particular types being checked. +func TestOnlyStaticRESTMapper(scheme *runtime.Scheme, versionPatterns ...schema.GroupVersion) meta.RESTMapper { + unionMapper := meta.MultiRESTMapper{} + unionedGroups := sets.NewString() + for _, enabledVersion := range scheme.PrioritizedVersionsAllGroups() { + if !unionedGroups.Has(enabledVersion.Group) { + unionedGroups.Insert(enabledVersion.Group) + unionMapper = append(unionMapper, newRESTMapper(enabledVersion.Group, scheme)) + } + } + + if len(versionPatterns) != 0 { + resourcePriority := []schema.GroupVersionResource{} + kindPriority := []schema.GroupVersionKind{} + for _, versionPriority := range versionPatterns { + resourcePriority = append(resourcePriority, versionPriority.WithResource(meta.AnyResource)) + kindPriority = append(kindPriority, versionPriority.WithKind(meta.AnyKind)) + } + + return meta.PriorityRESTMapper{Delegate: unionMapper, ResourcePriority: resourcePriority, KindPriority: kindPriority} + } + + prioritizedGroups := []string{"", "extensions", "metrics"} + resourcePriority, kindPriority := prioritiesForGroups(scheme, prioritizedGroups...) + + prioritizedGroupsSet := sets.NewString(prioritizedGroups...) + remainingGroups := sets.String{} + for _, enabledVersion := range scheme.PrioritizedVersionsAllGroups() { + if !prioritizedGroupsSet.Has(enabledVersion.Group) { + remainingGroups.Insert(enabledVersion.Group) + } + } + + remainingResourcePriority, remainingKindPriority := prioritiesForGroups(scheme, remainingGroups.List()...) + resourcePriority = append(resourcePriority, remainingResourcePriority...) + kindPriority = append(kindPriority, remainingKindPriority...) + + return meta.PriorityRESTMapper{Delegate: unionMapper, ResourcePriority: resourcePriority, KindPriority: kindPriority} +} + +// prioritiesForGroups returns the resource and kind priorities for a PriorityRESTMapper, preferring the preferred version of each group first, +// then any non-preferred version of the group second. +func prioritiesForGroups(scheme *runtime.Scheme, groups ...string) ([]schema.GroupVersionResource, []schema.GroupVersionKind) { + resourcePriority := []schema.GroupVersionResource{} + kindPriority := []schema.GroupVersionKind{} + + for _, group := range groups { + availableVersions := scheme.PrioritizedVersionsForGroup(group) + if len(availableVersions) > 0 { + resourcePriority = append(resourcePriority, availableVersions[0].WithResource(meta.AnyResource)) + kindPriority = append(kindPriority, availableVersions[0].WithKind(meta.AnyKind)) + } + } + for _, group := range groups { + resourcePriority = append(resourcePriority, schema.GroupVersionResource{Group: group, Version: meta.AnyVersion, Resource: meta.AnyResource}) + kindPriority = append(kindPriority, schema.GroupVersionKind{Group: group, Version: meta.AnyVersion, Kind: meta.AnyKind}) + } + + return resourcePriority, kindPriority +} + +func newRESTMapper(group string, scheme *runtime.Scheme) meta.RESTMapper { + mapper := meta.NewDefaultRESTMapper(scheme.PrioritizedVersionsForGroup(group)) + for _, gv := range scheme.PrioritizedVersionsForGroup(group) { + for kind := range scheme.KnownTypes(gv) { + if ignoredKinds.Has(kind) { + continue + } + scope := meta.RESTScopeNamespace + if rootScopedKinds[gv.WithKind(kind).GroupKind()] { + scope = meta.RESTScopeRoot + } + mapper.Add(gv.WithKind(kind), scope) + } + } + + return mapper +} + +// hardcoded is good enough for the test we're running +var rootScopedKinds = map[schema.GroupKind]bool{ + {Group: "admission.k8s.io", Kind: "AdmissionReview"}: true, + + {Group: "admissionregistration.k8s.io", Kind: "InitializerConfiguration"}: true, + {Group: "admissionregistration.k8s.io", Kind: "ValidatingWebhookConfiguration"}: true, + {Group: "admissionregistration.k8s.io", Kind: "MutatingWebhookConfiguration"}: true, + + {Group: "authentication.k8s.io", Kind: "TokenReview"}: true, + + {Group: "authorization.k8s.io", Kind: "SubjectAccessReview"}: true, + {Group: "authorization.k8s.io", Kind: "SelfSubjectAccessReview"}: true, + {Group: "authorization.k8s.io", Kind: "SelfSubjectRulesReview"}: true, + + {Group: "certificates.k8s.io", Kind: "CertificateSigningRequest"}: true, + + {Group: "", Kind: "Node"}: true, + {Group: "", Kind: "Namespace"}: true, + {Group: "", Kind: "PersistentVolume"}: true, + {Group: "", Kind: "ComponentStatus"}: true, + + {Group: "extensions", Kind: "PodSecurityPolicy"}: true, + + {Group: "policy", Kind: "PodSecurityPolicy"}: true, + + {Group: "extensions", Kind: "PodSecurityPolicy"}: true, + + {Group: "rbac.authorization.k8s.io", Kind: "ClusterRole"}: true, + {Group: "rbac.authorization.k8s.io", Kind: "ClusterRoleBinding"}: true, + + {Group: "scheduling.k8s.io", Kind: "PriorityClass"}: true, + + {Group: "storage.k8s.io", Kind: "StorageClass"}: true, + {Group: "storage.k8s.io", Kind: "VolumeAttachment"}: true, + + {Group: "apiextensions.k8s.io", Kind: "CustomResourceDefinition"}: true, + + {Group: "apiserver.k8s.io", Kind: "AdmissionConfiguration"}: true, + + {Group: "audit.k8s.io", Kind: "Event"}: true, + {Group: "audit.k8s.io", Kind: "Policy"}: true, + + {Group: "apiregistration.k8s.io", Kind: "APIService"}: true, + + {Group: "metrics.k8s.io", Kind: "NodeMetrics"}: true, + + {Group: "wardle.k8s.io", Kind: "Fischer"}: true, +} + +// hardcoded is good enough for the test we're running +var ignoredKinds = sets.NewString( + "ListOptions", + "DeleteOptions", + "Status", + "PodLogOptions", + "PodExecOptions", + "PodAttachOptions", + "PodPortForwardOptions", + "PodProxyOptions", + "NodeProxyOptions", + "ServiceProxyOptions", +) diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/unstructured.go b/vendor/k8s.io/apimachinery/pkg/api/meta/unstructured.go deleted file mode 100644 index 4e13efea3..000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/unstructured.go +++ /dev/null @@ -1,47 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package meta - -import ( - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// InterfacesForUnstructuredConversion returns VersionInterfaces suitable for -// dealing with unstructured.Unstructured objects and supports conversion -// from typed objects (provided by parent) to untyped objects. -func InterfacesForUnstructuredConversion(parent VersionInterfacesFunc) VersionInterfacesFunc { - return func(version schema.GroupVersion) (*VersionInterfaces, error) { - if i, err := parent(version); err == nil { - return &VersionInterfaces{ - ObjectConvertor: i.ObjectConvertor, - MetadataAccessor: NewAccessor(), - }, nil - } - return InterfacesForUnstructured(version) - } -} - -// InterfacesForUnstructured returns VersionInterfaces suitable for -// dealing with unstructured.Unstructured objects. It will return errors for -// other conversions. -func InterfacesForUnstructured(schema.GroupVersion) (*VersionInterfaces, error) { - return &VersionInterfaces{ - ObjectConvertor: &unstructured.UnstructuredObjectConverter{}, - MetadataAccessor: NewAccessor(), - }, nil -} diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/BUILD b/vendor/k8s.io/apimachinery/pkg/api/resource/BUILD deleted file mode 100644 index 57f85fb24..000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/BUILD +++ /dev/null @@ -1,69 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "amount_test.go", - "math_test.go", - "quantity_proto_test.go", - "quantity_test.go", - "scale_int_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/gopkg.in/inf.v0:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "amount.go", - "generated.pb.go", - "math.go", - "quantity.go", - "quantity_proto.go", - "scale_int.go", - "suffix.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apimachinery/pkg/api/resource", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/gopkg.in/inf.v0:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = ["quantity_example_test.go"], - deps = ["//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.pb.go index 6de71e508..083c82256 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto index 40185777e..31a46a6d3 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go index 6a8bb9972..c3cd13960 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go @@ -25,8 +25,6 @@ import ( "strconv" "strings" - flag "github.com/spf13/pflag" - inf "gopkg.in/inf.v0" ) @@ -747,43 +745,3 @@ func (q *Quantity) Copy() *Quantity { Format: q.Format, } } - -// qFlag is a helper type for the Flag function -type qFlag struct { - dest *Quantity -} - -// Sets the value of the internal Quantity. (used by flag & pflag) -func (qf qFlag) Set(val string) error { - q, err := ParseQuantity(val) - if err != nil { - return err - } - // This copy is OK because q will not be referenced again. - *qf.dest = q - return nil -} - -// Converts the value of the internal Quantity to a string. (used by flag & pflag) -func (qf qFlag) String() string { - return qf.dest.String() -} - -// States the type of flag this is (Quantity). (used by pflag) -func (qf qFlag) Type() string { - return "quantity" -} - -// QuantityFlag is a helper that makes a quantity flag (using standard flag package). -// Will panic if defaultValue is not a valid quantity. -func QuantityFlag(flagName, defaultValue, description string) *Quantity { - q := MustParse(defaultValue) - flag.Var(NewQuantityFlagValue(&q), flagName, description) - return &q -} - -// NewQuantityFlagValue returns an object that can be used to back a flag, -// pointing at the given Quantity variable. -func NewQuantityFlagValue(q *Quantity) flag.Value { - return qFlag{q} -} diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_test.go b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_test.go index 74f091a38..915b2444e 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_test.go +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/quantity_test.go @@ -24,7 +24,6 @@ import ( "unicode" fuzz "github.com/google/gofuzz" - "github.com/spf13/pflag" inf "gopkg.in/inf.v0" ) @@ -1059,21 +1058,6 @@ func TestCopy(t *testing.T) { } } -func TestQFlagSet(t *testing.T) { - qf := qFlag{&Quantity{}} - qf.Set("1Ki") - if e, a := "1Ki", qf.String(); e != a { - t.Errorf("Unexpected result %v != %v", e, a) - } -} - -func TestQFlagIsPFlag(t *testing.T) { - var pfv pflag.Value = qFlag{} - if e, a := "quantity", pfv.Type(); e != a { - t.Errorf("Unexpected result %v != %v", e, a) - } -} - func TestSub(t *testing.T) { tests := []struct { a Quantity diff --git a/vendor/k8s.io/apimachinery/pkg/api/resource/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/api/resource/zz_generated.deepcopy.go index fc36d9811..ab4740790 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/resource/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/api/resource/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/api/testing/BUILD b/vendor/k8s.io/apimachinery/pkg/api/testing/BUILD deleted file mode 100644 index f4d21861a..000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/testing/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["codec.go"], - importpath = "k8s.io/apimachinery/pkg/api/testing", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/api/testing/fuzzer:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/api/testing/roundtrip:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer/BUILD b/vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer/BUILD deleted file mode 100644 index ee7b37e1e..000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["valuefuzz_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "fuzzer.go", - "valuefuzz.go", - ], - importpath = "k8s.io/apimachinery/pkg/api/testing/fuzzer", - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip/BUILD b/vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip/BUILD deleted file mode 100644 index af01af51b..000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["roundtrip.go"], - importpath = "k8s.io/apimachinery/pkg/api/testing/roundtrip", - deps = [ - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/golang/protobuf/proto:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip/roundtrip.go b/vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip/roundtrip.go index 0c032b815..f8b12aa85 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip/roundtrip.go +++ b/vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip/roundtrip.go @@ -33,8 +33,6 @@ import ( apimeta "k8s.io/apimachinery/pkg/api/meta" apitesting "k8s.io/apimachinery/pkg/api/testing" "k8s.io/apimachinery/pkg/api/testing/fuzzer" - "k8s.io/apimachinery/pkg/apimachinery/announced" - "k8s.io/apimachinery/pkg/apimachinery/registered" metafuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -45,15 +43,13 @@ import ( "k8s.io/apimachinery/pkg/util/sets" ) -type InstallFunc func(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) +type InstallFunc func(scheme *runtime.Scheme) // RoundTripTestForAPIGroup is convenient to call from your install package to make sure that a "bare" install of your group provides // enough information to round trip func RoundTripTestForAPIGroup(t *testing.T, installFn InstallFunc, fuzzingFuncs fuzzer.FuzzerFuncs) { - groupFactoryRegistry := make(announced.APIGroupFactoryRegistry) - registry := registered.NewOrDie("") scheme := runtime.NewScheme() - installFn(groupFactoryRegistry, registry, scheme) + installFn(scheme) RoundTripTestForScheme(t, scheme, fuzzingFuncs) } @@ -72,10 +68,8 @@ func RoundTripTestForScheme(t *testing.T, scheme *runtime.Scheme, fuzzingFuncs f // RoundTripProtobufTestForAPIGroup is convenient to call from your install package to make sure that a "bare" install of your group provides // enough information to round trip func RoundTripProtobufTestForAPIGroup(t *testing.T, installFn InstallFunc, fuzzingFuncs fuzzer.FuzzerFuncs) { - groupFactoryRegistry := make(announced.APIGroupFactoryRegistry) - registry := registered.NewOrDie("") scheme := runtime.NewScheme() - installFn(groupFactoryRegistry, registry, scheme) + installFn(scheme) RoundTripProtobufTestForScheme(t, scheme, fuzzingFuncs) } @@ -138,6 +132,24 @@ func roundTripTypes(t *testing.T, scheme *runtime.Scheme, codecFactory runtimese } } +// RoundTripExternalTypes applies the round-trip test to all external round-trippable Kinds +// in the scheme. It will skip all the GroupVersionKinds in the nonRoundTripExternalTypes list . +func RoundTripExternalTypes(t *testing.T, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, nonRoundTrippableTypes map[schema.GroupVersionKind]bool) { + kinds := scheme.AllKnownTypes() + for gvk := range kinds { + if gvk.Version == runtime.APIVersionInternal || globalNonRoundTrippableTypes.Has(gvk.Kind) { + continue + } + + // FIXME: this is explicitly testing w/o protobuf which was failing if enabled + // the reason for that is that protobuf is not setting Kind and APIVersion fields + // during obj2 decode, the same then applies to DecodeInto obj3. My guess is we + // should be setting these two fields accordingly when protobuf is passed as codec + // to roundTrip method. + roundTripSpecificKind(t, gvk, scheme, codecFactory, fuzzer, nonRoundTrippableTypes, true) + } +} + func RoundTripSpecificKindWithoutProtobuf(t *testing.T, gvk schema.GroupVersionKind, scheme *runtime.Scheme, codecFactory runtimeserializer.CodecFactory, fuzzer *fuzz.Fuzzer, nonRoundTrippableTypes map[schema.GroupVersionKind]bool) { roundTripSpecificKind(t, gvk, scheme, codecFactory, fuzzer, nonRoundTrippableTypes, true) } diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/BUILD b/vendor/k8s.io/apimachinery/pkg/api/validation/BUILD deleted file mode 100644 index 2c6a0aa3d..000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/validation/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["objectmeta_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generic.go", - "objectmeta.go", - ], - importpath = "k8s.io/apimachinery/pkg/api/validation", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/api/validation/path:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go index 3c32a937a..44b9b1600 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go +++ b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go @@ -30,10 +30,6 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" ) -// TODO: delete this global variable when we enable the validation of common -// fields by default. -var RepairMalformedUpdates bool = true - const FieldImmutableErrorMsg string = `field is immutable` const totalAnnotationSizeLimitB int = 256 * (1 << 10) // 256 kB @@ -254,39 +250,6 @@ func ValidateObjectMetaUpdate(newMeta, oldMeta *metav1.ObjectMeta, fldPath *fiel func ValidateObjectMetaAccessorUpdate(newMeta, oldMeta metav1.Object, fldPath *field.Path) field.ErrorList { var allErrs field.ErrorList - if !RepairMalformedUpdates && newMeta.GetUID() != oldMeta.GetUID() { - allErrs = append(allErrs, field.Invalid(fldPath.Child("uid"), newMeta.GetUID(), "field is immutable")) - } - // in the event it is left empty, set it, to allow clients more flexibility - // TODO: remove the following code that repairs the update request when we retire the clients that modify the immutable fields. - // Please do not copy this pattern elsewhere; validation functions should not be modifying the objects they are passed! - if RepairMalformedUpdates { - if len(newMeta.GetUID()) == 0 { - newMeta.SetUID(oldMeta.GetUID()) - } - // ignore changes to timestamp - if oldCreationTime := oldMeta.GetCreationTimestamp(); oldCreationTime.IsZero() { - oldMeta.SetCreationTimestamp(newMeta.GetCreationTimestamp()) - } else { - newMeta.SetCreationTimestamp(oldMeta.GetCreationTimestamp()) - } - // an object can never remove a deletion timestamp or clear/change grace period seconds - if !oldMeta.GetDeletionTimestamp().IsZero() { - newMeta.SetDeletionTimestamp(oldMeta.GetDeletionTimestamp()) - } - if oldMeta.GetDeletionGracePeriodSeconds() != nil && newMeta.GetDeletionGracePeriodSeconds() == nil { - newMeta.SetDeletionGracePeriodSeconds(oldMeta.GetDeletionGracePeriodSeconds()) - } - } - - // TODO: needs to check if newMeta==nil && oldMeta !=nil after the repair logic is removed. - if newMeta.GetDeletionGracePeriodSeconds() != nil && (oldMeta.GetDeletionGracePeriodSeconds() == nil || *newMeta.GetDeletionGracePeriodSeconds() != *oldMeta.GetDeletionGracePeriodSeconds()) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("deletionGracePeriodSeconds"), newMeta.GetDeletionGracePeriodSeconds(), "field is immutable; may only be changed via deletion")) - } - if newMeta.GetDeletionTimestamp() != nil && (oldMeta.GetDeletionTimestamp() == nil || !newMeta.GetDeletionTimestamp().Equal(oldMeta.GetDeletionTimestamp())) { - allErrs = append(allErrs, field.Invalid(fldPath.Child("deletionTimestamp"), newMeta.GetDeletionTimestamp(), "field is immutable; may only be changed via deletion")) - } - // Finalizers cannot be added if the object is already being deleted. if oldMeta.GetDeletionTimestamp() != nil { allErrs = append(allErrs, ValidateNoNewFinalizers(newMeta.GetFinalizers(), oldMeta.GetFinalizers(), fldPath.Child("finalizers"))...) @@ -308,6 +271,8 @@ func ValidateObjectMetaAccessorUpdate(newMeta, oldMeta metav1.Object, fldPath *f allErrs = append(allErrs, ValidateImmutableField(newMeta.GetNamespace(), oldMeta.GetNamespace(), fldPath.Child("namespace"))...) allErrs = append(allErrs, ValidateImmutableField(newMeta.GetUID(), oldMeta.GetUID(), fldPath.Child("uid"))...) allErrs = append(allErrs, ValidateImmutableField(newMeta.GetCreationTimestamp(), oldMeta.GetCreationTimestamp(), fldPath.Child("creationTimestamp"))...) + allErrs = append(allErrs, ValidateImmutableField(newMeta.GetDeletionTimestamp(), oldMeta.GetDeletionTimestamp(), fldPath.Child("deletionTimestamp"))...) + allErrs = append(allErrs, ValidateImmutableField(newMeta.GetDeletionGracePeriodSeconds(), oldMeta.GetDeletionGracePeriodSeconds(), fldPath.Child("deletionGracePeriodSeconds"))...) allErrs = append(allErrs, ValidateImmutableField(newMeta.GetClusterName(), oldMeta.GetClusterName(), fldPath.Child("clusterName"))...) allErrs = append(allErrs, v1validation.ValidateLabels(newMeta.GetLabels(), fldPath.Child("labels"))...) diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go index 9ec73b040..ebd6c7e7c 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go +++ b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go @@ -219,21 +219,21 @@ func TestValidateObjectMetaUpdateIgnoresCreationTimestamp(t *testing.T) { &metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, &metav1.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: metav1.NewTime(time.Unix(10, 0))}, field.NewPath("field"), - ); len(errs) != 0 { + ); len(errs) != 1 { t.Fatalf("unexpected errors: %v", errs) } if errs := ValidateObjectMetaUpdate( &metav1.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: metav1.NewTime(time.Unix(10, 0))}, &metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, field.NewPath("field"), - ); len(errs) != 0 { + ); len(errs) != 1 { t.Fatalf("unexpected errors: %v", errs) } if errs := ValidateObjectMetaUpdate( &metav1.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: metav1.NewTime(time.Unix(10, 0))}, &metav1.ObjectMeta{Name: "test", ResourceVersion: "1", CreationTimestamp: metav1.NewTime(time.Unix(11, 0))}, field.NewPath("field"), - ); len(errs) != 0 { + ); len(errs) != 1 { t.Fatalf("unexpected errors: %v", errs) } } @@ -328,38 +328,38 @@ func TestValidateObjectMetaUpdatePreventsDeletionFieldMutation(t *testing.T) { Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, - ExpectedErrs: []string{"field.deletionTimestamp: Invalid value: 1970-01-01 00:16:40 +0000 UTC: field is immutable; may only be changed via deletion"}, + ExpectedErrs: []string{"field.deletionTimestamp: Invalid value: 1970-01-01 00:16:40 +0000 UTC: field is immutable"}, }, "invalid clear deletionTimestamp": { Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, - ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, - ExpectedErrs: []string{}, // no errors, validation copies the old value + ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + ExpectedErrs: []string{"field.deletionTimestamp: Invalid value: \"null\": field is immutable"}, }, "invalid change deletionTimestamp": { Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &later}, - ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &now}, - ExpectedErrs: []string{}, // no errors, validation copies the old value + ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionTimestamp: &later}, + ExpectedErrs: []string{"field.deletionTimestamp: Invalid value: 1970-01-01 00:33:20 +0000 UTC: field is immutable"}, }, "invalid set deletionGracePeriodSeconds": { Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, - ExpectedErrs: []string{"field.deletionGracePeriodSeconds: Invalid value: 30: field is immutable; may only be changed via deletion"}, + ExpectedErrs: []string{"field.deletionGracePeriodSeconds: Invalid value: 30: field is immutable"}, }, "invalid clear deletionGracePeriodSeconds": { Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, - ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, - ExpectedErrs: []string{}, // no errors, validation copies the old value + ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1"}, + ExpectedErrs: []string{"field.deletionGracePeriodSeconds: Invalid value: \"null\": field is immutable"}, }, "invalid change deletionGracePeriodSeconds": { Old: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodShort}, New: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodLong}, ExpectedNew: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", DeletionGracePeriodSeconds: &gracePeriodLong}, - ExpectedErrs: []string{"field.deletionGracePeriodSeconds: Invalid value: 40: field is immutable; may only be changed via deletion"}, + ExpectedErrs: []string{"field.deletionGracePeriodSeconds: Invalid value: 40: field is immutable"}, }, } diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD b/vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD deleted file mode 100644 index ddc17e79e..000000000 --- a/vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["name_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["name.go"], - importpath = "k8s.io/apimachinery/pkg/api/validation/path", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apimachinery/BUILD b/vendor/k8s.io/apimachinery/pkg/apimachinery/BUILD deleted file mode 100644 index b1071fb46..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apimachinery/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["types_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "types.go", - ], - importpath = "k8s.io/apimachinery/pkg/apimachinery", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apimachinery/announced:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apimachinery/registered:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/BUILD b/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/BUILD deleted file mode 100644 index ea31914f7..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["announced_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "announced.go", - "group_factory.go", - ], - importpath = "k8s.io/apimachinery/pkg/apimachinery/announced", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/announced.go b/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/announced.go deleted file mode 100644 index 4e38cc8c5..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/announced.go +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package announced contains tools for announcing API group factories. This is -// distinct from registration (in the 'registered' package) in that it's safe -// to announce every possible group linked in, but only groups requested at -// runtime should be registered. This package contains both a registry, and -// factory code (which was formerly copy-pasta in every install package). -package announced - -import ( - "fmt" - - "k8s.io/apimachinery/pkg/apimachinery/registered" - "k8s.io/apimachinery/pkg/runtime" -) - -// APIGroupFactoryRegistry allows for groups and versions to announce themselves, -// which simply makes them available and doesn't take other actions. Later, -// users of the registry can select which groups and versions they'd actually -// like to register with an APIRegistrationManager. -// -// (Right now APIRegistrationManager has separate 'registration' and 'enabled' -// concepts-- APIGroupFactory is going to take over the former function; -// they will overlap until the refactoring is finished.) -// -// The key is the group name. After initialization, this should be treated as -// read-only. It is implemented as a map from group name to group factory, and -// it is safe to use this knowledge to manually pick out groups to register -// (e.g., for testing). -type APIGroupFactoryRegistry map[string]*GroupMetaFactory - -func (gar APIGroupFactoryRegistry) group(groupName string) *GroupMetaFactory { - gmf, ok := gar[groupName] - if !ok { - gmf = &GroupMetaFactory{VersionArgs: map[string]*GroupVersionFactoryArgs{}} - gar[groupName] = gmf - } - return gmf -} - -// AnnounceGroupVersion adds the particular arguments for this group version to the group factory. -func (gar APIGroupFactoryRegistry) AnnounceGroupVersion(gvf *GroupVersionFactoryArgs) error { - gmf := gar.group(gvf.GroupName) - if _, ok := gmf.VersionArgs[gvf.VersionName]; ok { - return fmt.Errorf("version %q in group %q has already been announced", gvf.VersionName, gvf.GroupName) - } - gmf.VersionArgs[gvf.VersionName] = gvf - return nil -} - -// AnnounceGroup adds the group-wide arguments to the group factory. -func (gar APIGroupFactoryRegistry) AnnounceGroup(args *GroupMetaFactoryArgs) error { - gmf := gar.group(args.GroupName) - if gmf.GroupArgs != nil { - return fmt.Errorf("group %q has already been announced", args.GroupName) - } - gmf.GroupArgs = args - return nil -} - -// RegisterAndEnableAll throws every factory at the specified API registration -// manager, and lets it decide which to register. (If you want to do this a la -// cart, you may look through gar itself-- it's just a map.) -func (gar APIGroupFactoryRegistry) RegisterAndEnableAll(m *registered.APIRegistrationManager, scheme *runtime.Scheme) error { - for groupName, gmf := range gar { - if err := gmf.Register(m); err != nil { - return fmt.Errorf("error registering %v: %v", groupName, err) - } - if err := gmf.Enable(m, scheme); err != nil { - return fmt.Errorf("error enabling %v: %v", groupName, err) - } - } - return nil -} - -// AnnouncePreconstructedFactory announces a factory which you've manually assembled. -// You may call this instead of calling AnnounceGroup and AnnounceGroupVersion. -func (gar APIGroupFactoryRegistry) AnnouncePreconstructedFactory(gmf *GroupMetaFactory) error { - name := gmf.GroupArgs.GroupName - if _, exists := gar[name]; exists { - return fmt.Errorf("the group %q has already been announced.", name) - } - gar[name] = gmf - return nil -} diff --git a/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/announced_test.go b/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/announced_test.go deleted file mode 100644 index 95882e5df..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/announced_test.go +++ /dev/null @@ -1,64 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package announced - -import ( - "reflect" - "testing" - - "k8s.io/apimachinery/pkg/util/sets" -) - -func TestFactoryRegistry(t *testing.T) { - regA := make(APIGroupFactoryRegistry) - regB := make(APIGroupFactoryRegistry) - - if err := regA.AnnounceGroup(&GroupMetaFactoryArgs{ - GroupName: "foo", - VersionPreferenceOrder: []string{"v2", "v1"}, - RootScopedKinds: sets.NewString("namespaces"), - }); err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if err := regA.AnnounceGroupVersion(&GroupVersionFactoryArgs{ - GroupName: "foo", - VersionName: "v1", - }); err != nil { - t.Fatalf("Unexpected error: %v", err) - } - if err := regA.AnnounceGroupVersion(&GroupVersionFactoryArgs{ - GroupName: "foo", - VersionName: "v2", - }); err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - if err := regB.AnnouncePreconstructedFactory(NewGroupMetaFactory( - &GroupMetaFactoryArgs{ - GroupName: "foo", - VersionPreferenceOrder: []string{"v2", "v1"}, - RootScopedKinds: sets.NewString("namespaces"), - }, - VersionToSchemeFunc{"v1": nil, "v2": nil}, - )); err != nil { - t.Fatalf("Unexpected error: %v", err) - } - - if !reflect.DeepEqual(regA, regB) { - t.Errorf("Expected both ways of registering to be equivalent, but they were not.\n\n%#v\n\n%#v\n", regA, regB) - } -} diff --git a/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/group_factory.go b/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/group_factory.go deleted file mode 100644 index 154ed08f5..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apimachinery/announced/group_factory.go +++ /dev/null @@ -1,255 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package announced - -import ( - "fmt" - - "github.com/golang/glog" - - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/apimachinery" - "k8s.io/apimachinery/pkg/apimachinery/registered" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/sets" -) - -type SchemeFunc func(*runtime.Scheme) error -type VersionToSchemeFunc map[string]SchemeFunc - -// GroupVersionFactoryArgs contains all the per-version parts of a GroupMetaFactory. -type GroupVersionFactoryArgs struct { - GroupName string - VersionName string - - AddToScheme SchemeFunc -} - -// GroupMetaFactoryArgs contains the group-level args of a GroupMetaFactory. -type GroupMetaFactoryArgs struct { - // GroupName is the name of the API-Group - // - // example: 'servicecatalog.k8s.io' - GroupName string - VersionPreferenceOrder []string - // RootScopedKinds are resources that are not namespaced. - RootScopedKinds sets.String // nil is allowed - IgnoredKinds sets.String // nil is allowed - - // May be nil if there are no internal objects. - AddInternalObjectsToScheme SchemeFunc -} - -// NewGroupMetaFactory builds the args for you. This is for if you're -// constructing a factory all at once and not using the registry. -func NewGroupMetaFactory(groupArgs *GroupMetaFactoryArgs, versions VersionToSchemeFunc) *GroupMetaFactory { - gmf := &GroupMetaFactory{ - GroupArgs: groupArgs, - VersionArgs: map[string]*GroupVersionFactoryArgs{}, - } - for v, f := range versions { - gmf.VersionArgs[v] = &GroupVersionFactoryArgs{ - GroupName: groupArgs.GroupName, - VersionName: v, - AddToScheme: f, - } - } - return gmf -} - -// Announce adds this Group factory to the global factory registry. It should -// only be called if you constructed the GroupMetaFactory yourself via -// NewGroupMetaFactory. -// Note that this will panic on an error, since it's expected that you'll be -// calling this at initialization time and any error is a result of a -// programmer importing the wrong set of packages. If this assumption doesn't -// work for you, just call DefaultGroupFactoryRegistry.AnnouncePreconstructedFactory -// yourself. -func (gmf *GroupMetaFactory) Announce(groupFactoryRegistry APIGroupFactoryRegistry) *GroupMetaFactory { - if err := groupFactoryRegistry.AnnouncePreconstructedFactory(gmf); err != nil { - panic(err) - } - return gmf -} - -// GroupMetaFactory has the logic for actually assembling and registering a group. -// -// There are two ways of obtaining one of these. -// 1. You can announce your group and versions separately, and then let the -// GroupFactoryRegistry assemble this object for you. (This allows group and -// versions to be imported separately, without referencing each other, to -// keep import trees small.) -// 2. You can call NewGroupMetaFactory(), which is mostly a drop-in replacement -// for the old, bad way of doing things. You can then call .Announce() to -// announce your constructed factory to any code that would like to do -// things the new, better way. -// -// Note that GroupMetaFactory actually does construct GroupMeta objects, but -// currently it does so in a way that's very entangled with an -// APIRegistrationManager. It's a TODO item to cleanly separate that interface. -type GroupMetaFactory struct { - GroupArgs *GroupMetaFactoryArgs - // map of version name to version factory - VersionArgs map[string]*GroupVersionFactoryArgs - - // assembled by Register() - prioritizedVersionList []schema.GroupVersion -} - -// Register constructs the finalized prioritized version list and sanity checks -// the announced group & versions. Then it calls register. -func (gmf *GroupMetaFactory) Register(m *registered.APIRegistrationManager) error { - if gmf.GroupArgs == nil { - return fmt.Errorf("partially announced groups are not allowed, only got versions: %#v", gmf.VersionArgs) - } - if len(gmf.VersionArgs) == 0 { - return fmt.Errorf("group %v announced but no versions announced", gmf.GroupArgs.GroupName) - } - - pvSet := sets.NewString(gmf.GroupArgs.VersionPreferenceOrder...) - if pvSet.Len() != len(gmf.GroupArgs.VersionPreferenceOrder) { - return fmt.Errorf("preference order for group %v has duplicates: %v", gmf.GroupArgs.GroupName, gmf.GroupArgs.VersionPreferenceOrder) - } - prioritizedVersions := []schema.GroupVersion{} - for _, v := range gmf.GroupArgs.VersionPreferenceOrder { - prioritizedVersions = append( - prioritizedVersions, - schema.GroupVersion{ - Group: gmf.GroupArgs.GroupName, - Version: v, - }, - ) - } - - // Go through versions that weren't explicitly prioritized. - unprioritizedVersions := []schema.GroupVersion{} - for _, v := range gmf.VersionArgs { - if v.GroupName != gmf.GroupArgs.GroupName { - return fmt.Errorf("found %v/%v in group %v?", v.GroupName, v.VersionName, gmf.GroupArgs.GroupName) - } - if pvSet.Has(v.VersionName) { - pvSet.Delete(v.VersionName) - continue - } - unprioritizedVersions = append(unprioritizedVersions, schema.GroupVersion{Group: v.GroupName, Version: v.VersionName}) - } - if len(unprioritizedVersions) > 1 { - glog.Warningf("group %v has multiple unprioritized versions: %#v. They will have an arbitrary preference order!", gmf.GroupArgs.GroupName, unprioritizedVersions) - } - if pvSet.Len() != 0 { - return fmt.Errorf("group %v has versions in the priority list that were never announced: %s", gmf.GroupArgs.GroupName, pvSet) - } - prioritizedVersions = append(prioritizedVersions, unprioritizedVersions...) - m.RegisterVersions(prioritizedVersions) - gmf.prioritizedVersionList = prioritizedVersions - return nil -} - -func (gmf *GroupMetaFactory) newRESTMapper(scheme *runtime.Scheme, externalVersions []schema.GroupVersion, groupMeta *apimachinery.GroupMeta) meta.RESTMapper { - // the list of kinds that are scoped at the root of the api hierarchy - // if a kind is not enumerated here, it is assumed to have a namespace scope - rootScoped := sets.NewString() - if gmf.GroupArgs.RootScopedKinds != nil { - rootScoped = gmf.GroupArgs.RootScopedKinds - } - ignoredKinds := sets.NewString() - if gmf.GroupArgs.IgnoredKinds != nil { - ignoredKinds = gmf.GroupArgs.IgnoredKinds - } - - mapper := meta.NewDefaultRESTMapper(externalVersions, groupMeta.InterfacesFor) - for _, gv := range externalVersions { - for kind := range scheme.KnownTypes(gv) { - if ignoredKinds.Has(kind) { - continue - } - scope := meta.RESTScopeNamespace - if rootScoped.Has(kind) { - scope = meta.RESTScopeRoot - } - mapper.Add(gv.WithKind(kind), scope) - } - } - - return mapper -} - -// Enable enables group versions that are allowed, adds methods to the scheme, etc. -func (gmf *GroupMetaFactory) Enable(m *registered.APIRegistrationManager, scheme *runtime.Scheme) error { - externalVersions := []schema.GroupVersion{} - for _, v := range gmf.prioritizedVersionList { - if !m.IsAllowedVersion(v) { - continue - } - externalVersions = append(externalVersions, v) - if err := m.EnableVersions(v); err != nil { - return err - } - gmf.VersionArgs[v.Version].AddToScheme(scheme) - } - if len(externalVersions) == 0 { - glog.V(4).Infof("No version is registered for group %v", gmf.GroupArgs.GroupName) - return nil - } - - if gmf.GroupArgs.AddInternalObjectsToScheme != nil { - gmf.GroupArgs.AddInternalObjectsToScheme(scheme) - } - - preferredExternalVersion := externalVersions[0] - accessor := meta.NewAccessor() - - groupMeta := &apimachinery.GroupMeta{ - GroupVersion: preferredExternalVersion, - GroupVersions: externalVersions, - SelfLinker: runtime.SelfLinker(accessor), - } - for _, v := range externalVersions { - gvf := gmf.VersionArgs[v.Version] - if err := groupMeta.AddVersionInterfaces( - schema.GroupVersion{Group: gvf.GroupName, Version: gvf.VersionName}, - &meta.VersionInterfaces{ - ObjectConvertor: scheme, - MetadataAccessor: accessor, - }, - ); err != nil { - return err - } - } - groupMeta.InterfacesFor = groupMeta.DefaultInterfacesFor - groupMeta.RESTMapper = gmf.newRESTMapper(scheme, externalVersions, groupMeta) - - if err := m.RegisterGroup(*groupMeta); err != nil { - return err - } - return nil -} - -// RegisterAndEnable is provided only to allow this code to get added in multiple steps. -// It's really bad that this is called in init() methods, but supporting this -// temporarily lets us do the change incrementally. -func (gmf *GroupMetaFactory) RegisterAndEnable(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) error { - if err := gmf.Register(registry); err != nil { - return err - } - if err := gmf.Enable(registry, scheme); err != nil { - return err - } - - return nil -} diff --git a/vendor/k8s.io/apimachinery/pkg/apimachinery/registered/BUILD b/vendor/k8s.io/apimachinery/pkg/apimachinery/registered/BUILD deleted file mode 100644 index ba02a0938..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apimachinery/registered/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["registered_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apimachinery:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["registered.go"], - importpath = "k8s.io/apimachinery/pkg/apimachinery/registered", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apimachinery/registered/registered.go b/vendor/k8s.io/apimachinery/pkg/apimachinery/registered/registered.go deleted file mode 100644 index 0da94f50f..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apimachinery/registered/registered.go +++ /dev/null @@ -1,336 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package to keep track of API Versions that can be registered and are enabled in a Scheme. -package registered - -import ( - "fmt" - "sort" - "strings" - - "github.com/golang/glog" - - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/apimachinery" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/sets" -) - -// APIRegistrationManager provides the concept of what API groups are enabled. -// -// TODO: currently, it also provides a "registered" concept. But it's wrong to -// have both concepts in the same object. Therefore the "announced" package is -// going to take over the registered concept. After all the install packages -// are switched to using the announce package instead of this package, then we -// can combine the registered/enabled concepts in this object. Simplifying this -// isn't easy right now because there are so many callers of this package. -type APIRegistrationManager struct { - // registeredGroupVersions stores all API group versions for which RegisterGroup is called. - registeredVersions map[schema.GroupVersion]struct{} - - // enabledVersions represents all enabled API versions. It should be a - // subset of registeredVersions. Please call EnableVersions() to add - // enabled versions. - enabledVersions map[schema.GroupVersion]struct{} - - // map of group meta for all groups. - groupMetaMap map[string]*apimachinery.GroupMeta - - // envRequestedVersions represents the versions requested via the - // KUBE_API_VERSIONS environment variable. The install package of each group - // checks this list before add their versions to the latest package and - // Scheme. This list is small and order matters, so represent as a slice - envRequestedVersions []schema.GroupVersion -} - -// NewAPIRegistrationManager constructs a new manager. The argument ought to be -// the value of the KUBE_API_VERSIONS env var, or a value of this which you -// wish to test. -func NewAPIRegistrationManager(kubeAPIVersions string) (*APIRegistrationManager, error) { - m := &APIRegistrationManager{ - registeredVersions: map[schema.GroupVersion]struct{}{}, - enabledVersions: map[schema.GroupVersion]struct{}{}, - groupMetaMap: map[string]*apimachinery.GroupMeta{}, - envRequestedVersions: []schema.GroupVersion{}, - } - - if len(kubeAPIVersions) != 0 { - for _, version := range strings.Split(kubeAPIVersions, ",") { - gv, err := schema.ParseGroupVersion(version) - if err != nil { - return nil, fmt.Errorf("invalid api version: %s in KUBE_API_VERSIONS: %s.", - version, kubeAPIVersions) - } - m.envRequestedVersions = append(m.envRequestedVersions, gv) - } - } - return m, nil -} - -func NewOrDie(kubeAPIVersions string) *APIRegistrationManager { - m, err := NewAPIRegistrationManager(kubeAPIVersions) - if err != nil { - glog.Fatalf("Could not construct version manager: %v (KUBE_API_VERSIONS=%q)", err, kubeAPIVersions) - } - return m -} - -// RegisterVersions adds the given group versions to the list of registered group versions. -func (m *APIRegistrationManager) RegisterVersions(availableVersions []schema.GroupVersion) { - for _, v := range availableVersions { - m.registeredVersions[v] = struct{}{} - } -} - -// RegisterGroup adds the given group to the list of registered groups. -func (m *APIRegistrationManager) RegisterGroup(groupMeta apimachinery.GroupMeta) error { - groupName := groupMeta.GroupVersion.Group - if _, found := m.groupMetaMap[groupName]; found { - return fmt.Errorf("group %q is already registered in groupsMap: %v", groupName, m.groupMetaMap) - } - m.groupMetaMap[groupName] = &groupMeta - return nil -} - -// EnableVersions adds the versions for the given group to the list of enabled versions. -// Note that the caller should call RegisterGroup before calling this method. -// The caller of this function is responsible to add the versions to scheme and RESTMapper. -func (m *APIRegistrationManager) EnableVersions(versions ...schema.GroupVersion) error { - var unregisteredVersions []schema.GroupVersion - for _, v := range versions { - if _, found := m.registeredVersions[v]; !found { - unregisteredVersions = append(unregisteredVersions, v) - } - m.enabledVersions[v] = struct{}{} - } - if len(unregisteredVersions) != 0 { - return fmt.Errorf("Please register versions before enabling them: %v", unregisteredVersions) - } - return nil -} - -// IsAllowedVersion returns if the version is allowed by the KUBE_API_VERSIONS -// environment variable. If the environment variable is empty, then it always -// returns true. -func (m *APIRegistrationManager) IsAllowedVersion(v schema.GroupVersion) bool { - if len(m.envRequestedVersions) == 0 { - return true - } - for _, envGV := range m.envRequestedVersions { - if v == envGV { - return true - } - } - return false -} - -// IsEnabledVersion returns if a version is enabled. -func (m *APIRegistrationManager) IsEnabledVersion(v schema.GroupVersion) bool { - _, found := m.enabledVersions[v] - return found -} - -// EnabledVersions returns all enabled versions. Groups are randomly ordered, but versions within groups -// are priority order from best to worst -func (m *APIRegistrationManager) EnabledVersions() []schema.GroupVersion { - ret := []schema.GroupVersion{} - for _, groupMeta := range m.groupMetaMap { - for _, version := range groupMeta.GroupVersions { - if m.IsEnabledVersion(version) { - ret = append(ret, version) - } - } - } - return ret -} - -// EnabledVersionsForGroup returns all enabled versions for a group in order of best to worst -func (m *APIRegistrationManager) EnabledVersionsForGroup(group string) []schema.GroupVersion { - groupMeta, ok := m.groupMetaMap[group] - if !ok { - return []schema.GroupVersion{} - } - - ret := []schema.GroupVersion{} - for _, version := range groupMeta.GroupVersions { - if m.IsEnabledVersion(version) { - ret = append(ret, version) - } - } - return ret -} - -// Group returns the metadata of a group if the group is registered, otherwise -// an error is returned. -func (m *APIRegistrationManager) Group(group string) (*apimachinery.GroupMeta, error) { - groupMeta, found := m.groupMetaMap[group] - if !found { - return nil, fmt.Errorf("group %v has not been registered", group) - } - groupMetaCopy := *groupMeta - return &groupMetaCopy, nil -} - -// IsRegistered takes a string and determines if it's one of the registered groups -func (m *APIRegistrationManager) IsRegistered(group string) bool { - _, found := m.groupMetaMap[group] - return found -} - -// IsRegisteredVersion returns if a version is registered. -func (m *APIRegistrationManager) IsRegisteredVersion(v schema.GroupVersion) bool { - _, found := m.registeredVersions[v] - return found -} - -// RegisteredGroupVersions returns all registered group versions. -func (m *APIRegistrationManager) RegisteredGroupVersions() []schema.GroupVersion { - ret := []schema.GroupVersion{} - for groupVersion := range m.registeredVersions { - ret = append(ret, groupVersion) - } - return ret -} - -// InterfacesFor is a union meta.VersionInterfacesFunc func for all registered types -func (m *APIRegistrationManager) InterfacesFor(version schema.GroupVersion) (*meta.VersionInterfaces, error) { - groupMeta, err := m.Group(version.Group) - if err != nil { - return nil, err - } - return groupMeta.InterfacesFor(version) -} - -// TODO: This is an expedient function, because we don't check if a Group is -// supported throughout the code base. We will abandon this function and -// checking the error returned by the Group() function. -func (m *APIRegistrationManager) GroupOrDie(group string) *apimachinery.GroupMeta { - groupMeta, found := m.groupMetaMap[group] - if !found { - if group == "" { - panic("The legacy v1 API is not registered.") - } else { - panic(fmt.Sprintf("Group %s is not registered.", group)) - } - } - groupMetaCopy := *groupMeta - return &groupMetaCopy -} - -// RESTMapper returns a union RESTMapper of all known types with priorities chosen in the following order: -// 1. if KUBE_API_VERSIONS is specified, then KUBE_API_VERSIONS in order, OR -// 1. legacy kube group preferred version, extensions preferred version, metrics perferred version, legacy -// kube any version, extensions any version, metrics any version, all other groups alphabetical preferred version, -// all other groups alphabetical. -func (m *APIRegistrationManager) RESTMapper(versionPatterns ...schema.GroupVersion) meta.RESTMapper { - unionMapper := meta.MultiRESTMapper{} - unionedGroups := sets.NewString() - for enabledVersion := range m.enabledVersions { - if !unionedGroups.Has(enabledVersion.Group) { - unionedGroups.Insert(enabledVersion.Group) - groupMeta := m.groupMetaMap[enabledVersion.Group] - unionMapper = append(unionMapper, groupMeta.RESTMapper) - } - } - - if len(versionPatterns) != 0 { - resourcePriority := []schema.GroupVersionResource{} - kindPriority := []schema.GroupVersionKind{} - for _, versionPriority := range versionPatterns { - resourcePriority = append(resourcePriority, versionPriority.WithResource(meta.AnyResource)) - kindPriority = append(kindPriority, versionPriority.WithKind(meta.AnyKind)) - } - - return meta.PriorityRESTMapper{Delegate: unionMapper, ResourcePriority: resourcePriority, KindPriority: kindPriority} - } - - if len(m.envRequestedVersions) != 0 { - resourcePriority := []schema.GroupVersionResource{} - kindPriority := []schema.GroupVersionKind{} - - for _, versionPriority := range m.envRequestedVersions { - resourcePriority = append(resourcePriority, versionPriority.WithResource(meta.AnyResource)) - kindPriority = append(kindPriority, versionPriority.WithKind(meta.AnyKind)) - } - - return meta.PriorityRESTMapper{Delegate: unionMapper, ResourcePriority: resourcePriority, KindPriority: kindPriority} - } - - prioritizedGroups := []string{"", "extensions", "metrics"} - resourcePriority, kindPriority := m.prioritiesForGroups(prioritizedGroups...) - - prioritizedGroupsSet := sets.NewString(prioritizedGroups...) - remainingGroups := sets.String{} - for enabledVersion := range m.enabledVersions { - if !prioritizedGroupsSet.Has(enabledVersion.Group) { - remainingGroups.Insert(enabledVersion.Group) - } - } - - remainingResourcePriority, remainingKindPriority := m.prioritiesForGroups(remainingGroups.List()...) - resourcePriority = append(resourcePriority, remainingResourcePriority...) - kindPriority = append(kindPriority, remainingKindPriority...) - - return meta.PriorityRESTMapper{Delegate: unionMapper, ResourcePriority: resourcePriority, KindPriority: kindPriority} -} - -// prioritiesForGroups returns the resource and kind priorities for a PriorityRESTMapper, preferring the preferred version of each group first, -// then any non-preferred version of the group second. -func (m *APIRegistrationManager) prioritiesForGroups(groups ...string) ([]schema.GroupVersionResource, []schema.GroupVersionKind) { - resourcePriority := []schema.GroupVersionResource{} - kindPriority := []schema.GroupVersionKind{} - - for _, group := range groups { - availableVersions := m.EnabledVersionsForGroup(group) - if len(availableVersions) > 0 { - resourcePriority = append(resourcePriority, availableVersions[0].WithResource(meta.AnyResource)) - kindPriority = append(kindPriority, availableVersions[0].WithKind(meta.AnyKind)) - } - } - for _, group := range groups { - resourcePriority = append(resourcePriority, schema.GroupVersionResource{Group: group, Version: meta.AnyVersion, Resource: meta.AnyResource}) - kindPriority = append(kindPriority, schema.GroupVersionKind{Group: group, Version: meta.AnyVersion, Kind: meta.AnyKind}) - } - - return resourcePriority, kindPriority -} - -// AllPreferredGroupVersions returns the preferred versions of all registered -// groups in the form of "group1/version1,group2/version2,..." -func (m *APIRegistrationManager) AllPreferredGroupVersions() string { - if len(m.groupMetaMap) == 0 { - return "" - } - var defaults []string - for _, groupMeta := range m.groupMetaMap { - defaults = append(defaults, groupMeta.GroupVersion.String()) - } - sort.Strings(defaults) - return strings.Join(defaults, ",") -} - -// ValidateEnvRequestedVersions returns a list of versions that are requested in -// the KUBE_API_VERSIONS environment variable, but not enabled. -func (m *APIRegistrationManager) ValidateEnvRequestedVersions() []schema.GroupVersion { - var missingVersions []schema.GroupVersion - for _, v := range m.envRequestedVersions { - if _, found := m.enabledVersions[v]; !found { - missingVersions = append(missingVersions, v) - } - } - return missingVersions -} diff --git a/vendor/k8s.io/apimachinery/pkg/apimachinery/registered/registered_test.go b/vendor/k8s.io/apimachinery/pkg/apimachinery/registered/registered_test.go deleted file mode 100644 index 58fc0173e..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apimachinery/registered/registered_test.go +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package registered - -import ( - "testing" - - "k8s.io/apimachinery/pkg/apimachinery" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -func TestAllPreferredGroupVersions(t *testing.T) { - testCases := []struct { - groupMetas []apimachinery.GroupMeta - expect string - }{ - { - groupMetas: []apimachinery.GroupMeta{ - { - GroupVersion: schema.GroupVersion{Group: "group1", Version: "v1"}, - }, - { - GroupVersion: schema.GroupVersion{Group: "group2", Version: "v2"}, - }, - { - GroupVersion: schema.GroupVersion{Group: "", Version: "v1"}, - }, - }, - expect: "group1/v1,group2/v2,v1", - }, - { - groupMetas: []apimachinery.GroupMeta{ - { - GroupVersion: schema.GroupVersion{Group: "", Version: "v1"}, - }, - }, - expect: "v1", - }, - { - groupMetas: []apimachinery.GroupMeta{}, - expect: "", - }, - } - for _, testCase := range testCases { - m, err := NewAPIRegistrationManager("") - if err != nil { - t.Fatalf("Unexpected failure to make a manager: %v", err) - } - for _, groupMeta := range testCase.groupMetas { - m.RegisterGroup(groupMeta) - } - output := m.AllPreferredGroupVersions() - if testCase.expect != output { - t.Errorf("Error. expect: %s, got: %s", testCase.expect, output) - } - } -} diff --git a/vendor/k8s.io/apimachinery/pkg/apimachinery/types.go b/vendor/k8s.io/apimachinery/pkg/apimachinery/types.go deleted file mode 100644 index baca784fa..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apimachinery/types.go +++ /dev/null @@ -1,87 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package apimachinery - -import ( - "fmt" - - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// GroupMeta stores the metadata of a group. -type GroupMeta struct { - // GroupVersion represents the preferred version of the group. - GroupVersion schema.GroupVersion - - // GroupVersions is Group + all versions in that group. - GroupVersions []schema.GroupVersion - - // SelfLinker can set or get the SelfLink field of all API types. - // TODO: when versioning changes, make this part of each API definition. - // TODO(lavalamp): Combine SelfLinker & ResourceVersioner interfaces, force all uses - // to go through the InterfacesFor method below. - SelfLinker runtime.SelfLinker - - // RESTMapper provides the default mapping between REST paths and the objects declared in a Scheme and all known - // versions. - RESTMapper meta.RESTMapper - - // InterfacesFor returns the default Codec and ResourceVersioner for a given version - // string, or an error if the version is not known. - // TODO: make this stop being a func pointer and always use the default - // function provided below once every place that populates this field has been changed. - InterfacesFor func(version schema.GroupVersion) (*meta.VersionInterfaces, error) - - // InterfacesByVersion stores the per-version interfaces. - InterfacesByVersion map[schema.GroupVersion]*meta.VersionInterfaces -} - -// DefaultInterfacesFor returns the default Codec and ResourceVersioner for a given version -// string, or an error if the version is not known. -// TODO: Remove the "Default" prefix. -func (gm *GroupMeta) DefaultInterfacesFor(version schema.GroupVersion) (*meta.VersionInterfaces, error) { - if v, ok := gm.InterfacesByVersion[version]; ok { - return v, nil - } - return nil, fmt.Errorf("unsupported storage version: %s (valid: %v)", version, gm.GroupVersions) -} - -// AddVersionInterfaces adds the given version to the group. Only call during -// init, after that GroupMeta objects should be immutable. Not thread safe. -// (If you use this, be sure to set .InterfacesFor = .DefaultInterfacesFor) -// TODO: remove the "Interfaces" suffix and make this also maintain the -// .GroupVersions member. -func (gm *GroupMeta) AddVersionInterfaces(version schema.GroupVersion, interfaces *meta.VersionInterfaces) error { - if e, a := gm.GroupVersion.Group, version.Group; a != e { - return fmt.Errorf("got a version in group %v, but am in group %v", a, e) - } - if gm.InterfacesByVersion == nil { - gm.InterfacesByVersion = make(map[schema.GroupVersion]*meta.VersionInterfaces) - } - gm.InterfacesByVersion[version] = interfaces - - // TODO: refactor to make the below error not possible, this function - // should *set* GroupVersions rather than depend on it. - for _, v := range gm.GroupVersions { - if v == version { - return nil - } - } - return fmt.Errorf("added a version interface without the corresponding version %v being in the list %#v", version, gm.GroupVersions) -} diff --git a/vendor/k8s.io/apimachinery/pkg/apimachinery/types_test.go b/vendor/k8s.io/apimachinery/pkg/apimachinery/types_test.go deleted file mode 100644 index ca858788e..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apimachinery/types_test.go +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package apimachinery - -import ( - "testing" - - "k8s.io/apimachinery/pkg/runtime/schema" -) - -func TestAdd(t *testing.T) { - gm := GroupMeta{ - GroupVersion: schema.GroupVersion{ - Group: "test", - Version: "v1", - }, - GroupVersions: []schema.GroupVersion{{Group: "test", Version: "v1"}}, - } - - gm.AddVersionInterfaces(schema.GroupVersion{Group: "test", Version: "v1"}, nil) - if e, a := 1, len(gm.InterfacesByVersion); e != a { - t.Errorf("expected %v, got %v", e, a) - } - - // GroupVersions is unchanged - if e, a := 1, len(gm.GroupVersions); e != a { - t.Errorf("expected %v, got %v", e, a) - } -} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/BUILD deleted file mode 100644 index fa0dd46d3..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["fuzzer.go"], - importpath = "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/fuzzer.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/fuzzer.go index 54fab9c02..3a28f7431 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/fuzzer.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/fuzzer.go @@ -181,16 +181,45 @@ func v1FuzzerFuncs(codecs runtimeserializer.CodecFactory) []interface{} { j.Kind = "" }, func(j *metav1.ObjectMeta, c fuzz.Continue) { - j.Name = c.RandString() + c.FuzzNoCustom(j) + j.ResourceVersion = strconv.FormatUint(c.RandUint64(), 10) - j.SelfLink = c.RandString() j.UID = types.UID(c.RandString()) - j.GenerateName = c.RandString() var sec, nsec int64 c.Fuzz(&sec) c.Fuzz(&nsec) j.CreationTimestamp = metav1.Unix(sec, nsec).Rfc3339Copy() + + if j.DeletionTimestamp != nil { + c.Fuzz(&sec) + c.Fuzz(&nsec) + t := metav1.Unix(sec, nsec).Rfc3339Copy() + j.DeletionTimestamp = &t + } + + if len(j.Labels) == 0 { + j.Labels = nil + } else { + delete(j.Labels, "") + } + if len(j.Annotations) == 0 { + j.Annotations = nil + } else { + delete(j.Annotations, "") + } + if len(j.OwnerReferences) == 0 { + j.OwnerReferences = nil + } + if len(j.Finalizers) == 0 { + j.Finalizers = nil + } + }, + func(j *metav1.Initializers, c fuzz.Continue) { + c.FuzzNoCustom(j) + if len(j.Pending) == 0 { + j.Pending = nil + } }, func(j *metav1.ListMeta, c fuzz.Continue) { j.ResourceVersion = strconv.FormatUint(c.RandUint64(), 10) @@ -268,7 +297,7 @@ func v1alpha1FuzzerFuncs(codecs runtimeserializer.CodecFactory) []interface{} { case 0: r.Cells[i] = c.RandString() case 1: - r.Cells[i] = c.Uint64() + r.Cells[i] = c.Int63() case 2: r.Cells[i] = c.RandBool() case 3: @@ -280,7 +309,7 @@ func v1alpha1FuzzerFuncs(codecs runtimeserializer.CodecFactory) []interface{} { case 4: x := make([]interface{}, c.Intn(10)) for i := range x { - x[i] = c.Uint64() + x[i] = c.Int63() } r.Cells[i] = x default: diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD deleted file mode 100644 index edb9a6ac6..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "register_test.go", - "roundtrip_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apimachinery/pkg/apis/meta/internalversion", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.conversion.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.conversion.go index c3fd40a90..a63b3fc2c 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.conversion.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.conversion.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.deepcopy.go index e4e5b017b..77bd9a6b4 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD deleted file mode 100644 index 186db1871..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD +++ /dev/null @@ -1,101 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "controller_ref_test.go", - "duration_test.go", - "group_version_test.go", - "helpers_test.go", - "labels_test.go", - "micro_time_test.go", - "time_test.go", - "types_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/ghodss/yaml:go_default_library", - "//vendor/github.com/json-iterator/go:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "controller_ref.go", - "conversion.go", - "doc.go", - "duration.go", - "generated.pb.go", - "group_version.go", - "helpers.go", - "labels.go", - "meta.go", - "micro_time.go", - "micro_time_proto.go", - "register.go", - "time.go", - "time_proto.go", - "types.go", - "types_swagger_doc_generated.go", - "watch.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/apimachinery/pkg/apis/meta/v1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/selection:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:all-srcs", - ], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_xtest", - srcs = ["conversion_test.go"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go index cd651bcd5..c36fc6556 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go @@ -75,6 +75,8 @@ func AddConversionFuncs(scheme *runtime.Scheme) error { Convert_unversioned_LabelSelector_to_map, Convert_Slice_string_To_Slice_int32, + + Convert_Slice_string_To_v1_DeletionPropagation, ) } @@ -304,3 +306,13 @@ func Convert_Slice_string_To_Slice_int32(in *[]string, out *[]int32, s conversio } return nil } + +// Convert_Slice_string_To_v1_DeletionPropagation allows converting a URL query parameter propagationPolicy +func Convert_Slice_string_To_v1_DeletionPropagation(input *[]string, out *DeletionPropagation, s conversion.Scope) error { + if len(*input) > 0 { + *out = DeletionPropagation((*input)[0]) + } else { + *out = "" + } + return nil +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go index bc591584e..4ff57fd8d 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion_test.go @@ -47,3 +47,38 @@ func TestMapToLabelSelectorRoundTrip(t *testing.T) { } } } + +func TestConvertSliceStringToDeletionPropagation(t *testing.T) { + tcs := []struct { + Input []string + Output v1.DeletionPropagation + }{ + { + Input: nil, + Output: "", + }, + { + Input: []string{}, + Output: "", + }, + { + Input: []string{"foo"}, + Output: "foo", + }, + { + Input: []string{"bar", "foo"}, + Output: "bar", + }, + } + + for _, tc := range tcs { + var dp v1.DeletionPropagation + if err := v1.Convert_Slice_string_To_v1_DeletionPropagation(&tc.Input, &dp, nil); err != nil { + t.Errorf("Convert_Slice_string_To_v1_DeletionPropagation(%#v): %v", tc.Input, err) + continue + } + if !apiequality.Semantic.DeepEqual(dp, tc.Output) { + t.Errorf("slice string to DeletionPropagation conversion failed: got %v; want %v", dp, tc.Output) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/duration.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/duration.go index fea458dfb..2eaabf079 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/duration.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/duration.go @@ -31,7 +31,10 @@ type Duration struct { // UnmarshalJSON implements the json.Unmarshaller interface. func (d *Duration) UnmarshalJSON(b []byte) error { var str string - json.Unmarshal(b, &str) + err := json.Unmarshal(b, &str) + if err != nil { + return err + } pd, err := time.ParseDuration(str) if err != nil { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go index 1fa478f5a..febace500 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto index bd5abcb79..4baf44f3d 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -49,6 +49,7 @@ message APIGroup { // The server returns only those CIDRs that it thinks that the client can match. // For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. // Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP. + // +optional repeated ServerAddressByClientCIDR serverAddressByClientCIDRs = 4; } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version_test.go index 1f7f07e81..ab62ff424 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version_test.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version_test.go @@ -21,7 +21,7 @@ import ( "reflect" "testing" - jsoniter "github.com/json-iterator/go" + k8s_json "k8s.io/apimachinery/pkg/runtime/serializer/json" ) type GroupVersionHolder struct { @@ -47,7 +47,8 @@ func TestGroupVersionUnmarshalJSON(t *testing.T) { t.Errorf("JSON codec failed to unmarshal input '%s': expected %+v, got %+v", c.input, c.expect, result.GV) } // test the json-iterator codec - if err := jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(c.input, &result); err != nil { + iter := k8s_json.CaseSensitiveJsonIterator() + if err := iter.Unmarshal(c.input, &result); err != nil { t.Errorf("json-iterator codec failed to unmarshal input '%v': %v", c.input, err) } if !reflect.DeepEqual(result.GV, c.expect) { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go index 7e5bc2d4e..6f6c5111b 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go @@ -104,7 +104,10 @@ func (t *MicroTime) UnmarshalJSON(b []byte) error { } var str string - json.Unmarshal(b, &str) + err := json.Unmarshal(b, &str) + if err != nil { + return err + } pt, err := time.Parse(RFC3339Micro, str) if err != nil { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time.go index 5041954f7..efff656e1 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time.go @@ -106,7 +106,10 @@ func (t *Time) UnmarshalJSON(b []byte) error { } var str string - json.Unmarshal(b, &str) + err := json.Unmarshal(b, &str) + if err != nil { + return err + } pt, err := time.Parse(time.RFC3339, str) if err != nil { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go index 917efb37f..e93df1846 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go @@ -799,7 +799,8 @@ type APIGroup struct { // The server returns only those CIDRs that it thinks that the client can match. // For example: the master will return an internal IP CIDR only, if the client reaches the server using an internal IP. // Server looks at X-Forwarded-For header or X-Real-Ip header or request.RemoteAddr (in that order) to get the client IP. - ServerAddressByClientCIDRs []ServerAddressByClientCIDR `json:"serverAddressByClientCIDRs" protobuf:"bytes,4,rep,name=serverAddressByClientCIDRs"` + // +optional + ServerAddressByClientCIDRs []ServerAddressByClientCIDR `json:"serverAddressByClientCIDRs,omitempty" protobuf:"bytes,4,rep,name=serverAddressByClientCIDRs"` } // ServerAddressByClientCIDR helps the client to determine the server address that they should use, depending on the clientCIDR that they match. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go index caf929ee0..f91d8a81f 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_APIGroup = map[string]string{ "": "APIGroup contains the name, the supported versions, and the preferred version of a group.", "name": "name is the name of the group.", diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_test.go index 116f7505a..ed5f20c40 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_test.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_test.go @@ -21,7 +21,7 @@ import ( "reflect" "testing" - jsoniter "github.com/json-iterator/go" + k8s_json "k8s.io/apimachinery/pkg/runtime/serializer/json" ) func TestVerbsUgorjiMarshalJSON(t *testing.T) { @@ -45,7 +45,7 @@ func TestVerbsUgorjiMarshalJSON(t *testing.T) { } } -func TestVerbsUgorjiUnmarshalJSON(t *testing.T) { +func TestVerbsUJsonIterUnmarshalJSON(t *testing.T) { cases := []struct { input string result APIResource @@ -56,9 +56,10 @@ func TestVerbsUgorjiUnmarshalJSON(t *testing.T) { {`{"verbs":["delete"]}`, APIResource{Verbs: Verbs([]string{"delete"})}}, } + iter := k8s_json.CaseSensitiveJsonIterator() for i, c := range cases { var result APIResource - if err := jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal([]byte(c.input), &result); err != nil { + if err := iter.Unmarshal([]byte(c.input), &result); err != nil { t.Errorf("[%d] Failed to unmarshal input '%v': %v", i, c.input, err) } if !reflect.DeepEqual(result, c.result) { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD deleted file mode 100644 index 22c1acee0..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "helpers_test.go", - "unstructured_list_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "helpers.go", - "unstructured.go", - "unstructured_list.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go index 08705ac84..fc138e75a 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go @@ -18,7 +18,6 @@ package unstructured import ( gojson "encoding/json" - "errors" "fmt" "io" "strings" @@ -34,14 +33,17 @@ import ( // Returns false if the value is missing. // No error is returned for a nil field. func NestedFieldCopy(obj map[string]interface{}, fields ...string) (interface{}, bool, error) { - val, found, err := nestedFieldNoCopy(obj, fields...) + val, found, err := NestedFieldNoCopy(obj, fields...) if !found || err != nil { return nil, found, err } return runtime.DeepCopyJSONValue(val), true, nil } -func nestedFieldNoCopy(obj map[string]interface{}, fields ...string) (interface{}, bool, error) { +// NestedFieldNoCopy returns a reference to a nested field. +// Returns false if value is not found and an error if unable +// to traverse obj. +func NestedFieldNoCopy(obj map[string]interface{}, fields ...string) (interface{}, bool, error) { var val interface{} = obj for i, field := range fields { @@ -60,7 +62,7 @@ func nestedFieldNoCopy(obj map[string]interface{}, fields ...string) (interface{ // NestedString returns the string value of a nested field. // Returns false if value is not found and an error if not a string. func NestedString(obj map[string]interface{}, fields ...string) (string, bool, error) { - val, found, err := nestedFieldNoCopy(obj, fields...) + val, found, err := NestedFieldNoCopy(obj, fields...) if !found || err != nil { return "", found, err } @@ -74,7 +76,7 @@ func NestedString(obj map[string]interface{}, fields ...string) (string, bool, e // NestedBool returns the bool value of a nested field. // Returns false if value is not found and an error if not a bool. func NestedBool(obj map[string]interface{}, fields ...string) (bool, bool, error) { - val, found, err := nestedFieldNoCopy(obj, fields...) + val, found, err := NestedFieldNoCopy(obj, fields...) if !found || err != nil { return false, found, err } @@ -88,7 +90,7 @@ func NestedBool(obj map[string]interface{}, fields ...string) (bool, bool, error // NestedFloat64 returns the float64 value of a nested field. // Returns false if value is not found and an error if not a float64. func NestedFloat64(obj map[string]interface{}, fields ...string) (float64, bool, error) { - val, found, err := nestedFieldNoCopy(obj, fields...) + val, found, err := NestedFieldNoCopy(obj, fields...) if !found || err != nil { return 0, found, err } @@ -102,7 +104,7 @@ func NestedFloat64(obj map[string]interface{}, fields ...string) (float64, bool, // NestedInt64 returns the int64 value of a nested field. // Returns false if value is not found and an error if not an int64. func NestedInt64(obj map[string]interface{}, fields ...string) (int64, bool, error) { - val, found, err := nestedFieldNoCopy(obj, fields...) + val, found, err := NestedFieldNoCopy(obj, fields...) if !found || err != nil { return 0, found, err } @@ -116,7 +118,7 @@ func NestedInt64(obj map[string]interface{}, fields ...string) (int64, bool, err // NestedStringSlice returns a copy of []string value of a nested field. // Returns false if value is not found and an error if not a []interface{} or contains non-string items in the slice. func NestedStringSlice(obj map[string]interface{}, fields ...string) ([]string, bool, error) { - val, found, err := nestedFieldNoCopy(obj, fields...) + val, found, err := NestedFieldNoCopy(obj, fields...) if !found || err != nil { return nil, found, err } @@ -138,7 +140,7 @@ func NestedStringSlice(obj map[string]interface{}, fields ...string) ([]string, // NestedSlice returns a deep copy of []interface{} value of a nested field. // Returns false if value is not found and an error if not a []interface{}. func NestedSlice(obj map[string]interface{}, fields ...string) ([]interface{}, bool, error) { - val, found, err := nestedFieldNoCopy(obj, fields...) + val, found, err := NestedFieldNoCopy(obj, fields...) if !found || err != nil { return nil, found, err } @@ -180,7 +182,7 @@ func NestedMap(obj map[string]interface{}, fields ...string) (map[string]interfa // nestedMapNoCopy returns a map[string]interface{} value of a nested field. // Returns false if value is not found and an error if not a map[string]interface{}. func nestedMapNoCopy(obj map[string]interface{}, fields ...string) (map[string]interface{}, bool, error) { - val, found, err := nestedFieldNoCopy(obj, fields...) + val, found, err := NestedFieldNoCopy(obj, fields...) if !found || err != nil { return nil, found, err } @@ -433,43 +435,17 @@ func (s unstructuredJSONScheme) decodeToList(data []byte, list *UnstructuredList return nil } -// UnstructuredObjectConverter is an ObjectConverter for use with -// Unstructured objects. Since it has no schema or type information, -// it will only succeed for no-op conversions. This is provided as a -// sane implementation for APIs that require an object converter. -type UnstructuredObjectConverter struct{} - -func (UnstructuredObjectConverter) Convert(in, out, context interface{}) error { - unstructIn, ok := in.(*Unstructured) - if !ok { - return fmt.Errorf("input type %T in not valid for unstructured conversion", in) - } - - unstructOut, ok := out.(*Unstructured) - if !ok { - return fmt.Errorf("output type %T in not valid for unstructured conversion", out) - } - - // maybe deep copy the map? It is documented in the - // ObjectConverter interface that this function is not - // guaranteed to not mutate the input. Or maybe set the input - // object to nil. - unstructOut.Object = unstructIn.Object - return nil +type JSONFallbackEncoder struct { + runtime.Encoder } -func (UnstructuredObjectConverter) ConvertToVersion(in runtime.Object, target runtime.GroupVersioner) (runtime.Object, error) { - if kind := in.GetObjectKind().GroupVersionKind(); !kind.Empty() { - gvk, ok := target.KindForGroupVersionKinds([]schema.GroupVersionKind{kind}) - if !ok { - // TODO: should this be a typed error? - return nil, fmt.Errorf("%v is unstructured and is not suitable for converting to %q", kind, target) +func (c JSONFallbackEncoder) Encode(obj runtime.Object, w io.Writer) error { + err := c.Encoder.Encode(obj, w) + if runtime.IsNotRegisteredError(err) { + switch obj.(type) { + case *Unstructured, *UnstructuredList: + return UnstructuredJSONScheme.Encode(obj, w) } - in.GetObjectKind().SetGroupVersionKind(gvk) } - return in, nil -} - -func (UnstructuredObjectConverter) ConvertFieldLabel(version, kind, label, value string) (string, string, error) { - return "", "", errors.New("unstructured cannot convert field labels") + return err } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go index 9e774d1c1..d97996211 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers_test.go @@ -58,3 +58,79 @@ func TestRemoveNestedField(t *testing.T) { RemoveNestedField(obj, "x") // Remove of a non-existent field assert.Empty(t, obj) } + +func TestNestedFieldNoCopy(t *testing.T) { + target := map[string]interface{}{"foo": "bar"} + + obj := map[string]interface{}{ + "a": map[string]interface{}{ + "b": target, + "c": nil, + "d": []interface{}{"foo"}, + }, + } + + // case 1: field exists and is non-nil + res, exists, err := NestedFieldNoCopy(obj, "a", "b") + assert.True(t, exists) + assert.Nil(t, err) + assert.Equal(t, target, res) + target["foo"] = "baz" + assert.Equal(t, target["foo"], res.(map[string]interface{})["foo"], "result should be a reference to the expected item") + + // case 2: field exists and is nil + res, exists, err = NestedFieldNoCopy(obj, "a", "c") + assert.True(t, exists) + assert.Nil(t, err) + assert.Nil(t, res) + + // case 3: error traversing obj + res, exists, err = NestedFieldNoCopy(obj, "a", "d", "foo") + assert.False(t, exists) + assert.NotNil(t, err) + assert.Nil(t, res) + + // case 4: field does not exist + res, exists, err = NestedFieldNoCopy(obj, "a", "e") + assert.False(t, exists) + assert.Nil(t, err) + assert.Nil(t, res) +} + +func TestNestedFieldCopy(t *testing.T) { + target := map[string]interface{}{"foo": "bar"} + + obj := map[string]interface{}{ + "a": map[string]interface{}{ + "b": target, + "c": nil, + "d": []interface{}{"foo"}, + }, + } + + // case 1: field exists and is non-nil + res, exists, err := NestedFieldCopy(obj, "a", "b") + assert.True(t, exists) + assert.Nil(t, err) + assert.Equal(t, target, res) + target["foo"] = "baz" + assert.NotEqual(t, target["foo"], res.(map[string]interface{})["foo"], "result should be a copy of the expected item") + + // case 2: field exists and is nil + res, exists, err = NestedFieldCopy(obj, "a", "c") + assert.True(t, exists) + assert.Nil(t, err) + assert.Nil(t, res) + + // case 3: error traversing obj + res, exists, err = NestedFieldCopy(obj, "a", "d", "foo") + assert.False(t, exists) + assert.NotNil(t, err) + assert.Nil(t, res) + + // case 4: field does not exist + res, exists, err = NestedFieldCopy(obj, "a", "e") + assert.False(t, exists) + assert.Nil(t, err) + assert.Nil(t, res) +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go index 2a1333049..548a01e59 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go @@ -58,6 +58,26 @@ func (obj *Unstructured) IsList() bool { _, ok = field.([]interface{}) return ok } +func (obj *Unstructured) ToList() (*UnstructuredList, error) { + if !obj.IsList() { + // return an empty list back + return &UnstructuredList{Object: obj.Object}, nil + } + + ret := &UnstructuredList{} + ret.Object = obj.Object + + err := obj.EachListItem(func(item runtime.Object) error { + castItem := item.(*Unstructured) + ret.Items = append(ret.Items, *castItem) + return nil + }) + if err != nil { + return nil, err + } + + return ret, nil +} func (obj *Unstructured) EachListItem(fn func(runtime.Object) error) error { field, ok := obj.Object["items"] @@ -82,7 +102,7 @@ func (obj *Unstructured) EachListItem(fn func(runtime.Object) error) error { func (obj *Unstructured) UnstructuredContent() map[string]interface{} { if obj.Object == nil { - obj.Object = make(map[string]interface{}) + return make(map[string]interface{}) } return obj.Object } @@ -138,7 +158,7 @@ func (u *Unstructured) setNestedMap(value map[string]string, fields ...string) { } func (u *Unstructured) GetOwnerReferences() []metav1.OwnerReference { - field, found, err := nestedFieldNoCopy(u.Object, "metadata", "ownerReferences") + field, found, err := NestedFieldNoCopy(u.Object, "metadata", "ownerReferences") if !found || err != nil { return nil } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go index 57d78a09d..bf3fd023f 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go @@ -53,19 +53,18 @@ func (u *UnstructuredList) EachListItem(fn func(runtime.Object) error) error { } // UnstructuredContent returns a map contain an overlay of the Items field onto -// the Object field. Items always overwrites overlay. Changing "items" in the -// returned object will affect items in the underlying Items field, but changing -// the "items" slice itself will have no effect. -// TODO: expose SetUnstructuredContent on runtime.Unstructured that allows -// items to be changed. +// the Object field. Items always overwrites overlay. func (u *UnstructuredList) UnstructuredContent() map[string]interface{} { - out := u.Object - if out == nil { - out = make(map[string]interface{}) + out := make(map[string]interface{}, len(u.Object)+1) + + // shallow copy every property + for k, v := range u.Object { + out[k] = v } + items := make([]interface{}, len(u.Items)) for i, item := range u.Items { - items[i] = item.Object + items[i] = item.UnstructuredContent() } out["items"] = items return out diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_test.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_test.go new file mode 100644 index 000000000..cbcbbcef3 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_test.go @@ -0,0 +1,32 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package unstructured + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNilUnstructuredContent(t *testing.T) { + var u Unstructured + uCopy := u.DeepCopy() + content := u.UnstructuredContent() + expContent := make(map[string]interface{}) + assert.EqualValues(t, expContent, content) + assert.Equal(t, uCopy, &u) +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme/scheme.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme/scheme.go new file mode 100644 index 000000000..ab2574e82 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme/scheme.go @@ -0,0 +1,129 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package unstructuredscheme + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/runtime/serializer/json" + "k8s.io/apimachinery/pkg/runtime/serializer/versioning" +) + +var ( + scheme = runtime.NewScheme() + codecs = serializer.NewCodecFactory(scheme) +) + +// NewUnstructuredNegotiatedSerializer returns a simple, negotiated serializer +func NewUnstructuredNegotiatedSerializer() runtime.NegotiatedSerializer { + return unstructuredNegotiatedSerializer{ + scheme: scheme, + typer: NewUnstructuredObjectTyper(), + creator: NewUnstructuredCreator(), + } +} + +type unstructuredNegotiatedSerializer struct { + scheme *runtime.Scheme + typer runtime.ObjectTyper + creator runtime.ObjectCreater +} + +func (s unstructuredNegotiatedSerializer) SupportedMediaTypes() []runtime.SerializerInfo { + return []runtime.SerializerInfo{ + { + MediaType: "application/json", + EncodesAsText: true, + Serializer: json.NewSerializer(json.DefaultMetaFactory, s.creator, s.typer, false), + PrettySerializer: json.NewSerializer(json.DefaultMetaFactory, s.creator, s.typer, true), + StreamSerializer: &runtime.StreamSerializerInfo{ + EncodesAsText: true, + Serializer: json.NewSerializer(json.DefaultMetaFactory, s.creator, s.typer, false), + Framer: json.Framer, + }, + }, + { + MediaType: "application/yaml", + EncodesAsText: true, + Serializer: json.NewYAMLSerializer(json.DefaultMetaFactory, s.creator, s.typer), + }, + } +} + +func (s unstructuredNegotiatedSerializer) EncoderForVersion(encoder runtime.Encoder, gv runtime.GroupVersioner) runtime.Encoder { + return versioning.NewDefaultingCodecForScheme(s.scheme, encoder, nil, gv, nil) +} + +func (s unstructuredNegotiatedSerializer) DecoderToVersion(decoder runtime.Decoder, gv runtime.GroupVersioner) runtime.Decoder { + return versioning.NewDefaultingCodecForScheme(s.scheme, nil, decoder, nil, gv) +} + +type unstructuredObjectTyper struct { +} + +// NewUnstructuredObjectTyper returns an object typer that can deal with unstructured things +func NewUnstructuredObjectTyper() runtime.ObjectTyper { + return unstructuredObjectTyper{} +} + +func (t unstructuredObjectTyper) ObjectKinds(obj runtime.Object) ([]schema.GroupVersionKind, bool, error) { + // Delegate for things other than Unstructured. + if _, ok := obj.(runtime.Unstructured); !ok { + return nil, false, fmt.Errorf("cannot type %T", obj) + } + gvk := obj.GetObjectKind().GroupVersionKind() + if len(gvk.Kind) == 0 { + return nil, false, runtime.NewMissingKindErr("object has no kind field ") + } + if len(gvk.Version) == 0 { + return nil, false, runtime.NewMissingVersionErr("object has no apiVersion field") + } + + return []schema.GroupVersionKind{obj.GetObjectKind().GroupVersionKind()}, false, nil +} + +func (t unstructuredObjectTyper) Recognizes(gvk schema.GroupVersionKind) bool { + return true +} + +type unstructuredCreator struct{} + +// NewUnstructuredCreator returns a simple object creator that always returns an unstructured +func NewUnstructuredCreator() runtime.ObjectCreater { + return unstructuredCreator{} +} + +func (c unstructuredCreator) New(kind schema.GroupVersionKind) (runtime.Object, error) { + ret := &unstructured.Unstructured{} + ret.SetGroupVersionKind(kind) + return ret, nil +} + +type unstructuredDefaulter struct { +} + +// NewUnstructuredDefaulter returns defaulter suitable for unstructured types that doesn't default anything +func NewUnstructuredDefaulter() runtime.ObjectDefaulter { + return unstructuredDefaulter{} +} + +func (d unstructuredDefaulter) Default(in runtime.Object) { +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/zz_generated.deepcopy.go index 1c185139f..9a9f25e8f 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD deleted file mode 100644 index b7dbe0ad9..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/apimachinery/pkg/apis/meta/v1/validation", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go index 26c5a0cdc..96e5f42b7 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go @@ -17,8 +17,6 @@ limitations under the License. package validation import ( - "fmt" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" @@ -78,13 +76,13 @@ func ValidateLabels(labels map[string]string, fldPath *field.Path) field.ErrorLi func ValidateDeleteOptions(options *metav1.DeleteOptions) field.ErrorList { allErrs := field.ErrorList{} if options.OrphanDependents != nil && options.PropagationPolicy != nil { - allErrs = append(allErrs, field.Invalid(field.NewPath(""), options, "OrphanDependents and DeletionPropagation cannot be both set")) + allErrs = append(allErrs, field.Invalid(field.NewPath("propagationPolicy"), options.PropagationPolicy, "orphanDependents and deletionPropagation cannot be both set")) } if options.PropagationPolicy != nil && *options.PropagationPolicy != metav1.DeletePropagationForeground && *options.PropagationPolicy != metav1.DeletePropagationBackground && *options.PropagationPolicy != metav1.DeletePropagationOrphan { - allErrs = append(allErrs, field.Invalid(field.NewPath(""), options, fmt.Sprintf("DeletionPropagation need to be one of %q, %q, %q or nil", metav1.DeletePropagationForeground, metav1.DeletePropagationBackground, metav1.DeletePropagationOrphan))) + allErrs = append(allErrs, field.NotSupported(field.NewPath("propagationPolicy"), options.PropagationPolicy, []string{string(metav1.DeletePropagationForeground), string(metav1.DeletePropagationBackground), string(metav1.DeletePropagationOrphan), "nil"})) } return allErrs } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go index 73308d86e..98dfea095 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.defaults.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.defaults.go index 40d9ab00e..cce2e603a 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.defaults.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.defaults.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD deleted file mode 100644 index 05f33c5b4..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "deepcopy.go", - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "types_swagger_doc_generated.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/deepcopy.go index 2dd440bb7..3b2bedd92 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/deepcopy.go @@ -16,6 +16,8 @@ limitations under the License. package v1beta1 +import "k8s.io/apimachinery/pkg/runtime" + func (in *TableRow) DeepCopy() *TableRow { if in == nil { return nil @@ -26,7 +28,7 @@ func (in *TableRow) DeepCopy() *TableRow { if in.Cells != nil { out.Cells = make([]interface{}, len(in.Cells)) for i := range in.Cells { - out.Cells[i] = deepCopyJSON(in.Cells[i]) + out.Cells[i] = runtime.DeepCopyJSONValue(in.Cells[i]) } } @@ -40,22 +42,3 @@ func (in *TableRow) DeepCopy() *TableRow { in.Object.DeepCopyInto(&out.Object) return out } - -func deepCopyJSON(x interface{}) interface{} { - switch x := x.(type) { - case map[string]interface{}: - clone := make(map[string]interface{}, len(x)) - for k, v := range x { - clone[k] = deepCopyJSON(v) - } - return clone - case []interface{}: - clone := make([]interface{}, len(x)) - for i := range x { - clone[i] = deepCopyJSON(x[i]) - } - return clone - default: - return x - } -} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go index dda05bea4..4e427b3b3 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.proto b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.proto index a9060bf96..472902ad3 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types.go index 7b7c47d82..344c533e1 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types.go @@ -66,8 +66,8 @@ type TableColumnDefinition struct { // TableRow is an individual row in a table. // +protobuf=false type TableRow struct { - // cells will be as wide as headers and may contain strings, numbers, booleans, simple maps, or lists, or - // null. See the type field of the column definition for a more detailed description. + // cells will be as wide as headers and may contain strings, numbers (float64 or int64), booleans, simple + // maps, or lists, or null. See the type field of the column definition for a more detailed description. Cells []interface{} `json:"cells"` // conditions describe additional status of a row that are relevant for a human user. // +optional diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types_swagger_doc_generated.go index 2680fbf7e..7394535d9 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types_swagger_doc_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2016 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ package v1beta1 // // Those methods can be generated by using hack/update-generated-swagger-docs.sh -// AUTO-GENERATED FUNCTIONS START HERE +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_PartialObjectMetadata = map[string]string{ "": "PartialObjectMetadata is a generic representation of any object with ObjectMeta. It allows clients to get access to a particular ObjectMeta schema without knowing the details of the version.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", @@ -80,7 +80,7 @@ func (TableOptions) SwaggerDoc() map[string]string { var map_TableRow = map[string]string{ "": "TableRow is an individual row in a table.", - "cells": "cells will be as wide as headers and may contain strings, numbers, booleans, simple maps, or lists, or null. See the type field of the column definition for a more detailed description.", + "cells": "cells will be as wide as headers and may contain strings, numbers (float64 or int64), booleans, simple maps, or lists, or null. See the type field of the column definition for a more detailed description.", "conditions": "conditions describe additional status of a row that are relevant for a human user.", "object": "This field contains the requested additional information about each object based on the includeObject policy when requesting the Table. If \"None\", this field is empty, if \"Object\" this will be the default serialization of the object for the current API version, and if \"Metadata\" (the default) will contain the object metadata. Check the returned kind and apiVersion of the object before parsing.", } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.deepcopy.go index 226995a21..2e79a131f 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.defaults.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.defaults.go index 544e569dc..73e63fc11 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.defaults.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.defaults.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/BUILD deleted file mode 100644 index 817a0e6ad..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apimachinery/pkg/apis/testapigroup", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/install:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/apis/testapigroup/v1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer/BUILD deleted file mode 100644 index 0f2994c19..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["fuzzer.go"], - importpath = "k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer", - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/install/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/install/BUILD deleted file mode 100644 index 7e3e76d5d..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/install/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/apimachinery/pkg/apis/testapigroup/install", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["roundtrip_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/install/install.go b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/install/install.go index c7ada70f9..6fc079f51 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/install/install.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/install/install.go @@ -19,25 +19,15 @@ limitations under the License. package install import ( - "k8s.io/apimachinery/pkg/apimachinery/announced" - "k8s.io/apimachinery/pkg/apimachinery/registered" "k8s.io/apimachinery/pkg/apis/testapigroup" "k8s.io/apimachinery/pkg/apis/testapigroup/v1" "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) // Install registers the API group and adds types to a scheme -func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { - if err := announced.NewGroupMetaFactory( - &announced.GroupMetaFactoryArgs{ - GroupName: testapigroup.GroupName, - VersionPreferenceOrder: []string{v1.SchemeGroupVersion.Version}, - AddInternalObjectsToScheme: testapigroup.AddToScheme, - }, - announced.VersionToSchemeFunc{ - v1.SchemeGroupVersion.Version: v1.AddToScheme, - }, - ).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil { - panic(err) - } +func Install(scheme *runtime.Scheme) { + utilruntime.Must(testapigroup.AddToScheme(scheme)) + utilruntime.Must(v1.AddToScheme(scheme)) + utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion)) } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/BUILD deleted file mode 100644 index 881684426..000000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "defaults.go", - "doc.go", - "generated.pb.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/apimachinery/pkg/apis/testapigroup/v1", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/gogo/protobuf/sortkeys:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/generated.pb.go index 4ad2352e5..f5d030f7b 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/generated.proto b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/generated.proto index 70f3408d9..480752cdb 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.conversion.go b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.conversion.go index 117a75f32..33d8012c2 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.conversion.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.conversion.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.deepcopy.go index 4b2a9b4f4..ec9acd61a 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.defaults.go b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.defaults.go index 40d9ab00e..cce2e603a 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.defaults.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/zz_generated.defaults.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/zz_generated.deepcopy.go index 341030abd..e107585e3 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/testapigroup/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/BUILD b/vendor/k8s.io/apimachinery/pkg/conversion/BUILD deleted file mode 100644 index 0d2cee729..000000000 --- a/vendor/k8s.io/apimachinery/pkg/conversion/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "converter_test.go", - "helper_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "converter.go", - "deep_equal.go", - "doc.go", - "helper.go", - ], - importpath = "k8s.io/apimachinery/pkg/conversion", - deps = ["//vendor/k8s.io/apimachinery/third_party/forked/golang/reflect:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/conversion/queryparams:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD deleted file mode 100644 index 81bacef70..000000000 --- a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "convert.go", - "doc.go", - ], - importpath = "k8s.io/apimachinery/pkg/conversion/queryparams", -) - -go_test( - name = "go_default_xtest", - srcs = ["convert_test.go"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion/queryparams:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert.go b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert.go index 17b366617..b3804aa42 100644 --- a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert.go +++ b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert.go @@ -174,6 +174,9 @@ func convertStruct(result url.Values, st reflect.Type, sv reflect.Value) { kind = ft.Kind() if !field.IsNil() { field = reflect.Indirect(field) + // If the field is non-nil, it should be added to params + // and the omitempty should be overwite to false + omitempty = false } } diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert_test.go b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert_test.go index b075debf1..1eed5e1fe 100644 --- a/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert_test.go +++ b/vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert_test.go @@ -70,6 +70,7 @@ type childStructs struct { Follow bool `json:"follow,omitempty"` Previous bool `json:"previous,omitempty"` SinceSeconds *int64 `json:"sinceSeconds,omitempty"` + TailLines *int64 `json:"tailLines,omitempty"` SinceTime *metav1.Time `json:"sinceTime,omitempty"` EmptyTime *metav1.Time `json:"emptyTime"` NonPointerTime metav1.Time `json:"nonPointerTime"` @@ -99,6 +100,7 @@ func validateResult(t *testing.T, input interface{}, actual, expected url.Values func TestConvert(t *testing.T) { sinceSeconds := int64(123) + tailLines := int64(0) sinceTime := metav1.Date(2000, 1, 1, 12, 34, 56, 0, time.UTC) tests := []struct { @@ -182,6 +184,7 @@ func TestConvert(t *testing.T) { Follow: true, Previous: true, SinceSeconds: &sinceSeconds, + TailLines: nil, SinceTime: &sinceTime, // test a custom marshaller EmptyTime: nil, // test a nil custom marshaller without omitempty NonPointerTime: sinceTime, @@ -194,10 +197,11 @@ func TestConvert(t *testing.T) { Follow: true, Previous: true, SinceSeconds: &sinceSeconds, + TailLines: &tailLines, SinceTime: nil, // test a nil custom marshaller with omitempty NonPointerTime: sinceTime, }, - expected: url.Values{"container": {"mycontainer"}, "follow": {"true"}, "previous": {"true"}, "sinceSeconds": {"123"}, "emptyTime": {""}, "nonPointerTime": {"2000-01-01T12:34:56Z"}}, + expected: url.Values{"container": {"mycontainer"}, "follow": {"true"}, "previous": {"true"}, "sinceSeconds": {"123"}, "tailLines": {"0"}, "emptyTime": {""}, "nonPointerTime": {"2000-01-01T12:34:56Z"}}, }, } diff --git a/vendor/k8s.io/apimachinery/pkg/fields/BUILD b/vendor/k8s.io/apimachinery/pkg/fields/BUILD deleted file mode 100644 index 383448e0f..000000000 --- a/vendor/k8s.io/apimachinery/pkg/fields/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "fields_test.go", - "selector_test.go", - ], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fields.go", - "requirements.go", - "selector.go", - ], - importpath = "k8s.io/apimachinery/pkg/fields", - deps = ["//vendor/k8s.io/apimachinery/pkg/selection:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/fields/selector.go b/vendor/k8s.io/apimachinery/pkg/fields/selector.go index 3785d8c2f..e3e4453b6 100644 --- a/vendor/k8s.io/apimachinery/pkg/fields/selector.go +++ b/vendor/k8s.io/apimachinery/pkg/fields/selector.go @@ -55,6 +55,21 @@ type Selector interface { DeepCopySelector() Selector } +type nothingSelector struct{} + +func (n nothingSelector) Matches(_ Fields) bool { return false } +func (n nothingSelector) Empty() bool { return false } +func (n nothingSelector) String() string { return "" } +func (n nothingSelector) Requirements() Requirements { return nil } +func (n nothingSelector) DeepCopySelector() Selector { return n } +func (n nothingSelector) RequiresExactMatch(field string) (value string, found bool) { return "", false } +func (n nothingSelector) Transform(fn TransformFunc) (Selector, error) { return n, nil } + +// Nothing returns a selector that matches no fields +func Nothing() Selector { + return nothingSelector{} +} + // Everything returns a selector that matches all fields. func Everything() Selector { return andTerm{} @@ -449,6 +464,12 @@ func OneTermEqualSelector(k, v string) Selector { return &hasTerm{field: k, value: v} } +// OneTermNotEqualSelector returns an object that matches objects where one field/field does not equal one value. +// Cannot return an error. +func OneTermNotEqualSelector(k, v string) Selector { + return ¬HasTerm{field: k, value: v} +} + // AndSelectors creates a selector that is the logical AND of all the given selectors func AndSelectors(selectors ...Selector) Selector { return andTerm(selectors) diff --git a/vendor/k8s.io/apimachinery/pkg/labels/BUILD b/vendor/k8s.io/apimachinery/pkg/labels/BUILD deleted file mode 100644 index a78764f72..000000000 --- a/vendor/k8s.io/apimachinery/pkg/labels/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "labels_test.go", - "selector_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/selection:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "labels.go", - "selector.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apimachinery/pkg/labels", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/selection:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/labels/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/labels/zz_generated.deepcopy.go index a536f9ec9..4d482947f 100644 --- a/vendor/k8s.io/apimachinery/pkg/labels/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/labels/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/BUILD deleted file mode 100644 index 7a53fbc41..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/BUILD +++ /dev/null @@ -1,98 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["swagger_doc_generator_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "codec.go", - "codec_check.go", - "conversion.go", - "converter.go", - "doc.go", - "embedded.go", - "error.go", - "extension.go", - "generated.pb.go", - "helper.go", - "interfaces.go", - "register.go", - "scheme.go", - "scheme_builder.go", - "swagger_doc_generator.go", - "types.go", - "types_proto.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apimachinery/pkg/runtime", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion/queryparams:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = [ - "conversion_test.go", - "converter_test.go", - "embedded_test.go", - "extension_test.go", - "scheme_test.go", - ], - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/testing:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/testing:all-srcs", - ], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/converter.go b/vendor/k8s.io/apimachinery/pkg/runtime/converter.go index f6f7c10de..291d7a4e8 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/converter.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/converter.go @@ -73,7 +73,6 @@ var ( mapStringInterfaceType = reflect.TypeOf(map[string]interface{}{}) stringType = reflect.TypeOf(string("")) int64Type = reflect.TypeOf(int64(0)) - uint64Type = reflect.TypeOf(uint64(0)) float64Type = reflect.TypeOf(float64(0)) boolType = reflect.TypeOf(bool(false)) fieldCache = newFieldsCache() @@ -411,8 +410,7 @@ func (c *unstructuredConverter) ToUnstructured(obj interface{}) (map[string]inte var u map[string]interface{} var err error if unstr, ok := obj.(Unstructured); ok { - // UnstructuredContent() mutates the object so we need to make a copy first - u = unstr.DeepCopyObject().(Unstructured).UnstructuredContent() + u = unstr.UnstructuredContent() } else { t := reflect.TypeOf(obj) value := reflect.ValueOf(obj) @@ -439,22 +437,32 @@ func (c *unstructuredConverter) ToUnstructured(obj interface{}) (map[string]inte } // DeepCopyJSON deep copies the passed value, assuming it is a valid JSON representation i.e. only contains -// types produced by json.Unmarshal(). +// types produced by json.Unmarshal() and also int64. +// bool, int64, float64, string, []interface{}, map[string]interface{}, json.Number and nil func DeepCopyJSON(x map[string]interface{}) map[string]interface{} { return DeepCopyJSONValue(x).(map[string]interface{}) } // DeepCopyJSONValue deep copies the passed value, assuming it is a valid JSON representation i.e. only contains -// types produced by json.Unmarshal(). +// types produced by json.Unmarshal() and also int64. +// bool, int64, float64, string, []interface{}, map[string]interface{}, json.Number and nil func DeepCopyJSONValue(x interface{}) interface{} { switch x := x.(type) { case map[string]interface{}: + if x == nil { + // Typed nil - an interface{} that contains a type map[string]interface{} with a value of nil + return x + } clone := make(map[string]interface{}, len(x)) for k, v := range x { clone[k] = DeepCopyJSONValue(v) } return clone case []interface{}: + if x == nil { + // Typed nil - an interface{} that contains a type []interface{} with a value of nil + return x + } clone := make([]interface{}, len(x)) for i, v := range x { clone[i] = DeepCopyJSONValue(v) @@ -584,10 +592,14 @@ func toUnstructured(sv, dv reflect.Value) error { dv.Set(reflect.ValueOf(sv.Int())) return nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - if dt.Kind() == reflect.Interface && dv.NumMethod() == 0 { - dv.Set(reflect.New(uint64Type)) + uVal := sv.Uint() + if uVal > math.MaxInt64 { + return fmt.Errorf("unsigned value %d does not fit into int64 (overflow)", uVal) } - dv.Set(reflect.ValueOf(sv.Uint())) + if dt.Kind() == reflect.Interface && dv.NumMethod() == 0 { + dv.Set(reflect.New(int64Type)) + } + dv.Set(reflect.ValueOf(int64(uVal))) return nil case reflect.Float32, reflect.Float64: if dt.Kind() == reflect.Interface && dv.NumMethod() == 0 { diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/error.go b/vendor/k8s.io/apimachinery/pkg/runtime/error.go index 86b24840f..778796602 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/error.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/error.go @@ -41,10 +41,18 @@ func NewNotRegisteredErrForTarget(t reflect.Type, target GroupVersioner) error { return ¬RegisteredErr{t: t, target: target} } +func NewNotRegisteredGVKErrForTarget(gvk schema.GroupVersionKind, target GroupVersioner) error { + return ¬RegisteredErr{gvk: gvk, target: target} +} + func (k *notRegisteredErr) Error() string { if k.t != nil && k.target != nil { return fmt.Sprintf("%v is not suitable for converting to %q", k.t, k.target) } + nullGVK := schema.GroupVersionKind{} + if k.gvk != nullGVK && k.target != nil { + return fmt.Sprintf("%q is not suitable for converting to %q", k.gvk.GroupVersion(), k.target) + } if k.t != nil { return fmt.Sprintf("no kind is registered for the type %v", k.t) } diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go index f561fd476..9bcbd7226 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto b/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto index 02e388e90..2ff383915 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/runtime/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go b/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go index 9d00f1650..ba48e6146 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go @@ -174,13 +174,16 @@ type ObjectVersioner interface { // ObjectConvertor converts an object to a different version. type ObjectConvertor interface { - // Convert attempts to convert one object into another, or returns an error. This method does - // not guarantee the in object is not mutated. The context argument will be passed to - // all nested conversions. + // Convert attempts to convert one object into another, or returns an error. This + // method does not mutate the in object, but the in and out object might share data structures, + // i.e. the out object cannot be mutated without mutating the in object as well. + // The context argument will be passed to all nested conversions. Convert(in, out, context interface{}) error // ConvertToVersion takes the provided object and converts it the provided version. This - // method does not guarantee that the in object is not mutated. This method is similar to - // Convert() but handles specific details of choosing the correct output version. + // method does not mutate the in object, but the in and out object might share data structures, + // i.e. the out object cannot be mutated without mutating the in object as well. + // This method is similar to Convert() but handles specific details of choosing the correct + // output version. ConvertToVersion(in Object, gv GroupVersioner) (out Object, err error) ConvertFieldLabel(version, kind, label, value string) (string, string, error) } @@ -234,9 +237,9 @@ type Object interface { // to JSON allowed. type Unstructured interface { Object - // UnstructuredContent returns a non-nil, mutable map of the contents of this object. Values may be + // UnstructuredContent returns a non-nil map with this object's contents. Values may be // []interface{}, map[string]interface{}, or any primitive type. Contents are typically serialized to - // and from JSON. + // and from JSON. SetUnstructuredContent should be used to mutate the contents. UnstructuredContent() map[string]interface{} // SetUnstructuredContent updates the object content to match the provided map. SetUnstructuredContent(map[string]interface{}) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/local_scheme_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/local_scheme_test.go new file mode 100644 index 000000000..45a0dde5e --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/local_scheme_test.go @@ -0,0 +1,150 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package runtime + +import ( + "testing" + + "reflect" + + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/diff" +) + +func TestPreferredVersionsAllGroups(t *testing.T) { + tests := []struct { + name string + versionPriority map[string][]string + observedVersions []schema.GroupVersion + expectedPrioritized map[string][]schema.GroupVersion + expectedPreferred map[schema.GroupVersion]bool + }{ + { + name: "observedOnly", + observedVersions: []schema.GroupVersion{ + {Group: "", Version: "v3"}, + {Group: "foo", Version: "v1"}, + {Group: "foo", Version: "v2"}, + {Group: "", Version: "v1"}, + }, + expectedPrioritized: map[string][]schema.GroupVersion{ + "": { + {Group: "", Version: "v3"}, + {Group: "", Version: "v1"}, + }, + "foo": { + {Group: "foo", Version: "v1"}, + {Group: "foo", Version: "v2"}, + }, + }, + expectedPreferred: map[schema.GroupVersion]bool{ + {Group: "", Version: "v3"}: true, + {Group: "foo", Version: "v1"}: true, + }, + }, + { + name: "specifiedOnly", + versionPriority: map[string][]string{ + "": {"v3", "v1"}, + "foo": {"v1", "v2"}, + }, + expectedPrioritized: map[string][]schema.GroupVersion{ + "": { + {Group: "", Version: "v3"}, + {Group: "", Version: "v1"}, + }, + "foo": { + {Group: "foo", Version: "v1"}, + {Group: "foo", Version: "v2"}, + }, + }, + expectedPreferred: map[schema.GroupVersion]bool{ + {Group: "", Version: "v3"}: true, + {Group: "foo", Version: "v1"}: true, + }, + }, + { + name: "both", + versionPriority: map[string][]string{ + "": {"v3", "v1"}, + "foo": {"v1", "v2"}, + }, + observedVersions: []schema.GroupVersion{ + {Group: "", Version: "v1"}, + {Group: "", Version: "v3"}, + {Group: "", Version: "v4"}, + {Group: "", Version: "v5"}, + {Group: "bar", Version: "v1"}, + {Group: "bar", Version: "v2"}, + }, + expectedPrioritized: map[string][]schema.GroupVersion{ + "": { + {Group: "", Version: "v3"}, + {Group: "", Version: "v1"}, + {Group: "", Version: "v4"}, + {Group: "", Version: "v5"}, + }, + "foo": { + {Group: "foo", Version: "v1"}, + {Group: "foo", Version: "v2"}, + }, + "bar": { + {Group: "bar", Version: "v1"}, + {Group: "bar", Version: "v2"}, + }, + }, + expectedPreferred: map[schema.GroupVersion]bool{ + {Group: "", Version: "v3"}: true, + {Group: "foo", Version: "v1"}: true, + {Group: "bar", Version: "v1"}: true, + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + scheme := NewScheme() + scheme.versionPriority = test.versionPriority + scheme.observedVersions = test.observedVersions + + for group, expected := range test.expectedPrioritized { + actual := scheme.PrioritizedVersionsForGroup(group) + if !reflect.DeepEqual(expected, actual) { + t.Error(diff.ObjectDiff(expected, actual)) + } + } + + prioritizedAll := scheme.PrioritizedVersionsAllGroups() + actualPrioritizedAll := map[string][]schema.GroupVersion{} + for _, actual := range prioritizedAll { + actualPrioritizedAll[actual.Group] = append(actualPrioritizedAll[actual.Group], actual) + } + if !reflect.DeepEqual(test.expectedPrioritized, actualPrioritizedAll) { + t.Error(diff.ObjectDiff(test.expectedPrioritized, actualPrioritizedAll)) + } + + preferredAll := scheme.PreferredVersionAllGroups() + actualPreferredAll := map[schema.GroupVersion]bool{} + for _, actual := range preferredAll { + actualPreferredAll[actual] = true + } + if !reflect.DeepEqual(test.expectedPreferred, actualPreferredAll) { + t.Error(diff.ObjectDiff(test.expectedPreferred, actualPreferredAll)) + } + }) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD deleted file mode 100644 index e81977218..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["group_version_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "generated.pb.go", - "group_version.go", - "interfaces.go", - ], - importpath = "k8s.io/apimachinery/pkg/runtime/schema", - deps = ["//vendor/github.com/gogo/protobuf/proto:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.pb.go index 5357628ad..46c853661 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto b/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto index 50c2f2a63..8655f4818 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version_test.go index 51f26df7f..3934bc45a 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version_test.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version_test.go @@ -134,3 +134,47 @@ func TestKindForGroupVersionKinds(t *testing.T) { } } } + +func TestParseKindArg(t *testing.T) { + tests := []struct { + input string + gvk *GroupVersionKind + gk GroupKind + }{ + {input: "Pod", gk: GroupKind{Kind: "Pod"}}, + {input: ".apps", gk: GroupKind{Group: "apps"}}, + {input: "Pod.", gk: GroupKind{Kind: "Pod"}}, + {input: "StatefulSet.apps", gk: GroupKind{Group: "apps", Kind: "StatefulSet"}}, + {input: "StatefulSet.v1.apps", gvk: &GroupVersionKind{Group: "apps", Version: "v1", Kind: "StatefulSet"}, gk: GroupKind{Group: "v1.apps", Kind: "StatefulSet"}}, + } + for i, test := range tests { + t.Run(test.input, func(t *testing.T) { + gvk, gk := ParseKindArg(test.input) + if (gvk != nil && test.gvk == nil) || (gvk == nil && test.gvk != nil) || (test.gvk != nil && *gvk != *test.gvk) { + t.Errorf("%d: expected output: %#v, got: %#v", i, test.gvk, gvk) + } + if gk != test.gk { + t.Errorf("%d: expected output: %#v, got: %#v", i, test.gk, gk) + } + }) + } +} + +func TestParseGroupKind(t *testing.T) { + tests := []struct { + input string + out GroupKind + }{ + {input: "Pod", out: GroupKind{Kind: "Pod"}}, + {input: ".StatefulSet", out: GroupKind{Group: "StatefulSet"}}, + {input: "StatefulSet.apps", out: GroupKind{Group: "apps", Kind: "StatefulSet"}}, + } + for i, test := range tests { + t.Run(test.input, func(t *testing.T) { + out := ParseGroupKind(test.input) + if out != test.out { + t.Errorf("%d: expected output: %#v, got: %#v", i, test.out, out) + } + }) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go index 3d94a3041..59163d777 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go @@ -21,8 +21,11 @@ import ( "net/url" "reflect" + "strings" + "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/sets" ) // Scheme defines methods for serializing and deserializing API objects, a type @@ -68,6 +71,13 @@ type Scheme struct { // converter stores all registered conversion functions. It also has // default coverting behavior. converter *conversion.Converter + + // versionPriority is a map of groups to ordered lists of versions for those groups indicating the + // default priorities of these versions as registered in the scheme + versionPriority map[string][]string + + // observedVersions keeps track of the order we've seen versions during type registration + observedVersions []schema.GroupVersion } // Function to convert a field selector to internal representation. @@ -82,6 +92,7 @@ func NewScheme() *Scheme { unversionedKinds: map[string]reflect.Type{}, fieldLabelConversionFuncs: map[string]map[string]FieldLabelConversionFunc{}, defaulterFuncs: map[reflect.Type]func(interface{}){}, + versionPriority: map[string][]string{}, } s.converter = conversion.NewConverter(s.nameFunc) @@ -111,7 +122,7 @@ func (s *Scheme) nameFunc(t reflect.Type) string { for _, gvk := range gvks { internalGV := gvk.GroupVersion() - internalGV.Version = "__internal" // this is hacky and maybe should be passed in + internalGV.Version = APIVersionInternal // this is hacky and maybe should be passed in internalGVK := internalGV.WithKind(gvk.Kind) if internalType, exists := s.gvkToType[internalGVK]; exists { @@ -141,6 +152,7 @@ func (s *Scheme) Converter() *conversion.Converter { // TODO: there is discussion about removing unversioned and replacing it with objects that are manifest into // every version with particular schemas. Resolve this method at that point. func (s *Scheme) AddUnversionedTypes(version schema.GroupVersion, types ...Object) { + s.addObservedVersion(version) s.AddKnownTypes(version, types...) for _, obj := range types { t := reflect.TypeOf(obj).Elem() @@ -158,6 +170,7 @@ func (s *Scheme) AddUnversionedTypes(version schema.GroupVersion, types ...Objec // the struct becomes the "kind" field when encoding. Version may not be empty - use the // APIVersionInternal constant if you have a type that does not have a formal version. func (s *Scheme) AddKnownTypes(gv schema.GroupVersion, types ...Object) { + s.addObservedVersion(gv) for _, obj := range types { t := reflect.TypeOf(obj) if t.Kind() != reflect.Ptr { @@ -173,6 +186,7 @@ func (s *Scheme) AddKnownTypes(gv schema.GroupVersion, types ...Object) { // your structs. Version may not be empty - use the APIVersionInternal constant if you have a // type that does not have a formal version. func (s *Scheme) AddKnownTypeWithName(gvk schema.GroupVersionKind, obj Object) { + s.addObservedVersion(gvk.GroupVersion()) t := reflect.TypeOf(obj) if len(gvk.Version) == 0 { panic(fmt.Sprintf("version is required on all types: %s %v", gvk, t)) @@ -620,3 +634,133 @@ func setTargetKind(obj Object, kind schema.GroupVersionKind) { } obj.GetObjectKind().SetGroupVersionKind(kind) } + +// SetVersionPriority allows specifying a precise order of priority. All specified versions must be in the same group, +// and the specified order overwrites any previously specified order for this group +func (s *Scheme) SetVersionPriority(versions ...schema.GroupVersion) error { + groups := sets.String{} + order := []string{} + for _, version := range versions { + if len(version.Version) == 0 || version.Version == APIVersionInternal { + return fmt.Errorf("internal versions cannot be prioritized: %v", version) + } + + groups.Insert(version.Group) + order = append(order, version.Version) + } + if len(groups) != 1 { + return fmt.Errorf("must register versions for exactly one group: %v", strings.Join(groups.List(), ", ")) + } + + s.versionPriority[groups.List()[0]] = order + return nil +} + +// PrioritizedVersionsForGroup returns versions for a single group in priority order +func (s *Scheme) PrioritizedVersionsForGroup(group string) []schema.GroupVersion { + ret := []schema.GroupVersion{} + for _, version := range s.versionPriority[group] { + ret = append(ret, schema.GroupVersion{Group: group, Version: version}) + } + for _, observedVersion := range s.observedVersions { + if observedVersion.Group != group { + continue + } + found := false + for _, existing := range ret { + if existing == observedVersion { + found = true + break + } + } + if !found { + ret = append(ret, observedVersion) + } + } + + return ret +} + +// PrioritizedVersionsAllGroups returns all known versions in their priority order. Groups are random, but +// versions for a single group are prioritized +func (s *Scheme) PrioritizedVersionsAllGroups() []schema.GroupVersion { + ret := []schema.GroupVersion{} + for group, versions := range s.versionPriority { + for _, version := range versions { + ret = append(ret, schema.GroupVersion{Group: group, Version: version}) + } + } + for _, observedVersion := range s.observedVersions { + found := false + for _, existing := range ret { + if existing == observedVersion { + found = true + break + } + } + if !found { + ret = append(ret, observedVersion) + } + } + return ret +} + +// PreferredVersionAllGroups returns the most preferred version for every group. +// group ordering is random. +func (s *Scheme) PreferredVersionAllGroups() []schema.GroupVersion { + ret := []schema.GroupVersion{} + for group, versions := range s.versionPriority { + for _, version := range versions { + ret = append(ret, schema.GroupVersion{Group: group, Version: version}) + break + } + } + for _, observedVersion := range s.observedVersions { + found := false + for _, existing := range ret { + if existing.Group == observedVersion.Group { + found = true + break + } + } + if !found { + ret = append(ret, observedVersion) + } + } + + return ret +} + +// IsGroupRegistered returns true if types for the group have been registered with the scheme +func (s *Scheme) IsGroupRegistered(group string) bool { + for _, observedVersion := range s.observedVersions { + if observedVersion.Group == group { + return true + } + } + return false +} + +// IsVersionRegistered returns true if types for the version have been registered with the scheme +func (s *Scheme) IsVersionRegistered(version schema.GroupVersion) bool { + for _, observedVersion := range s.observedVersions { + if observedVersion == version { + return true + } + } + + return false +} + +func (s *Scheme) addObservedVersion(version schema.GroupVersion) { + if len(version.Version) == 0 || version.Version == APIVersionInternal { + return + } + for _, observedVersion := range s.observedVersions { + if observedVersion == version { + return + } + } + + s.observedVersions = append(s.observedVersions, version) +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD deleted file mode 100644 index bc4cf8ec1..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD +++ /dev/null @@ -1,64 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["codec_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/ghodss/yaml:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "codec_factory.go", - "negotiated_codec.go", - "protobuf_extension.go", - ], - importpath = "k8s.io/apimachinery/pkg/runtime/serializer", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/protobuf:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/streaming:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/testing:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/versioning:all-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/yaml:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD deleted file mode 100644 index 7be13ed47..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["meta_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "json.go", - "meta.go", - ], - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/json", - deps = [ - "//vendor/github.com/ghodss/yaml:go_default_library", - "//vendor/github.com/json-iterator/go:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/framer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = ["json_test.go"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go index 2b795b5b8..068d3f708 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go @@ -75,11 +75,6 @@ func init() { case jsoniter.NumberValue: var number json.Number iter.ReadVal(&number) - u64, err := strconv.ParseUint(string(number), 10, 64) - if err == nil { - *(*interface{})(ptr) = u64 - return - } i64, err := strconv.ParseInt(string(number), 10, 64) if err == nil { *(*interface{})(ptr) = i64 @@ -98,6 +93,20 @@ func init() { jsoniter.RegisterTypeDecoderFunc("interface {}", decodeNumberAsInt64IfPossible) } +// CaseSensitiveJsonIterator returns a jsoniterator API that's configured to be +// case-sensitive when unmarshalling, and otherwise compatible with +// the encoding/json standard library. +func CaseSensitiveJsonIterator() jsoniter.API { + return jsoniter.Config{ + EscapeHTML: true, + SortMapKeys: true, + ValidateJsonRawMessage: true, + CaseSensitive: true, + }.Froze() +} + +var caseSensitiveJsonIterator = CaseSensitiveJsonIterator() + // gvkWithDefaults returns group kind and version defaulting from provided default func gvkWithDefaults(actual, defaultGVK schema.GroupVersionKind) schema.GroupVersionKind { if len(actual.Kind) == 0 { @@ -162,7 +171,7 @@ func (s *Serializer) Decode(originalData []byte, gvk *schema.GroupVersionKind, i types, _, err := s.typer.ObjectKinds(into) switch { case runtime.IsNotRegisteredError(err), isUnstructured: - if err := jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(data, into); err != nil { + if err := caseSensitiveJsonIterator.Unmarshal(data, into); err != nil { return nil, actual, err } return into, actual, nil @@ -186,7 +195,7 @@ func (s *Serializer) Decode(originalData []byte, gvk *schema.GroupVersionKind, i return nil, actual, err } - if err := jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(data, obj); err != nil { + if err := caseSensitiveJsonIterator.Unmarshal(data, obj); err != nil { return nil, actual, err } return obj, actual, nil @@ -195,7 +204,7 @@ func (s *Serializer) Decode(originalData []byte, gvk *schema.GroupVersionKind, i // Encode serializes the provided object to the given writer. func (s *Serializer) Encode(obj runtime.Object, w io.Writer) error { if s.yaml { - json, err := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(obj) + json, err := caseSensitiveJsonIterator.Marshal(obj) if err != nil { return err } @@ -208,7 +217,7 @@ func (s *Serializer) Encode(obj runtime.Object, w io.Writer) error { } if s.pretty { - data, err := jsoniter.ConfigCompatibleWithStandardLibrary.MarshalIndent(obj, "", " ") + data, err := caseSensitiveJsonIterator.MarshalIndent(obj, "", " ") if err != nil { return err } diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json_test.go index c8ae5550c..b3d629a06 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json_test.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json_test.go @@ -30,10 +30,31 @@ import ( type testDecodable struct { Other string - Value int `json:"value"` + Value int `json:"value"` + Spec DecodableSpec `json:"spec"` gvk schema.GroupVersionKind } +// DecodableSpec has 15 fields. json-iterator treats struct with more than 10 +// fields differently from struct that has less than 10 fields. +type DecodableSpec struct { + A int `json:"A"` + B int `json:"B"` + C int `json:"C"` + D int `json:"D"` + E int `json:"E"` + F int `json:"F"` + G int `json:"G"` + H int `json:"h"` + I int `json:"i"` + J int `json:"j"` + K int `json:"k"` + L int `json:"l"` + M int `json:"m"` + N int `json:"n"` + O int `json:"o"` +} + func (d *testDecodable) GetObjectKind() schema.ObjectKind { return d } func (d *testDecodable) SetGroupVersionKind(gvk schema.GroupVersionKind) { d.gvk = gvk } func (d *testDecodable) GroupVersionKind() schema.GroupVersionKind { return d.gvk } @@ -221,6 +242,28 @@ func TestDecode(t *testing.T) { }, }, }, + // Unmarshalling is case-sensitive + { + // "VaLue" should have been "value" + data: []byte(`{"kind":"Test","apiVersion":"other/blah","VaLue":1,"Other":"test"}`), + into: &testDecodable{}, + typer: &mockTyper{err: runtime.NewNotRegisteredErrForKind(schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"})}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + expectedObject: &testDecodable{ + Other: "test", + }, + }, + // Unmarshalling is case-sensitive for big struct. + { + // "b" should have been "B", "I" should have been "i" + data: []byte(`{"kind":"Test","apiVersion":"other/blah","spec": {"A": 1, "b": 2, "h": 3, "I": 4}}`), + into: &testDecodable{}, + typer: &mockTyper{err: runtime.NewNotRegisteredErrForKind(schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"})}, + expectedGVK: &schema.GroupVersionKind{Kind: "Test", Group: "other", Version: "blah"}, + expectedObject: &testDecodable{ + Spec: DecodableSpec{A: 1, H: 3}, + }, + }, } for i, test := range testCases { diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD deleted file mode 100644 index 3eb91d862..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "protobuf.go", - ], - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/framer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD deleted file mode 100644 index de54abb3d..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["recognizer.go"], - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/testing/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/testing/BUILD deleted file mode 100644 index 4e126bc8a..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/testing/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["recognizer_test.go"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/sparse_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/sparse_test.go new file mode 100644 index 000000000..3bc9d13bb --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/sparse_test.go @@ -0,0 +1,91 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package serializer + +import ( + "testing" + + "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/diff" +) + +type FakeV1Obj struct { + metav1.TypeMeta + metav1.ObjectMeta +} + +func (*FakeV1Obj) DeepCopyObject() runtime.Object { + panic("not supported") +} + +type FakeV2DifferentObj struct { + metav1.TypeMeta + metav1.ObjectMeta +} + +func (*FakeV2DifferentObj) DeepCopyObject() runtime.Object { + panic("not supported") +} +func TestSparse(t *testing.T) { + v1 := schema.GroupVersion{Group: "mygroup", Version: "v1"} + v2 := schema.GroupVersion{Group: "mygroup", Version: "v2"} + + scheme := runtime.NewScheme() + scheme.AddKnownTypes(v1, &FakeV1Obj{}) + scheme.AddKnownTypes(v2, &FakeV2DifferentObj{}) + codecs := NewCodecFactory(scheme) + + srcObj1 := &FakeV1Obj{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + srcObj2 := &FakeV2DifferentObj{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} + + encoder := codecs.LegacyCodec(v2, v1) + decoder := codecs.UniversalDecoder(v2, v1) + + srcObj1Bytes, err := runtime.Encode(encoder, srcObj1) + if err != nil { + t.Fatal(err) + } + t.Log(string(srcObj1Bytes)) + srcObj2Bytes, err := runtime.Encode(encoder, srcObj2) + if err != nil { + t.Fatal(err) + } + t.Log(string(srcObj2Bytes)) + + uncastDstObj1, err := runtime.Decode(decoder, srcObj1Bytes) + if err != nil { + t.Fatal(err) + } + uncastDstObj2, err := runtime.Decode(decoder, srcObj2Bytes) + if err != nil { + t.Fatal(err) + } + + // clear typemeta + uncastDstObj1.(*FakeV1Obj).TypeMeta = metav1.TypeMeta{} + uncastDstObj2.(*FakeV2DifferentObj).TypeMeta = metav1.TypeMeta{} + + if !equality.Semantic.DeepEqual(srcObj1, uncastDstObj1) { + t.Fatal(diff.ObjectDiff(srcObj1, uncastDstObj1)) + } + if !equality.Semantic.DeepEqual(srcObj2, uncastDstObj2) { + t.Fatal(diff.ObjectDiff(srcObj2, uncastDstObj2)) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD deleted file mode 100644 index e0589fef7..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["streaming_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/framer:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["streaming.go"], - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing/BUILD deleted file mode 100644 index fbc00c7ca..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/testing", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing/zz_generated.deepcopy.go index 200e92468..8796679dc 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD deleted file mode 100644 index 32e6863c9..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["versioning_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["versioning.go"], - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go index b717fe8fe..7716cc421 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go @@ -19,6 +19,7 @@ package versioning import ( "io" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) @@ -166,9 +167,27 @@ func (c *codec) Decode(data []byte, defaultGVK *schema.GroupVersionKind, into ru // Encode ensures the provided object is output in the appropriate group and version, invoking // conversion if necessary. Unversioned objects (according to the ObjectTyper) are output as is. func (c *codec) Encode(obj runtime.Object, w io.Writer) error { - switch obj.(type) { - case *runtime.Unknown, runtime.Unstructured: + switch obj := obj.(type) { + case *runtime.Unknown: return c.encoder.Encode(obj, w) + case runtime.Unstructured: + // An unstructured list can contain objects of multiple group version kinds. don't short-circuit just + // because the top-level type matches our desired destination type. actually send the object to the converter + // to give it a chance to convert the list items if needed. + if _, ok := obj.(*unstructured.UnstructuredList); !ok { + // avoid conversion roundtrip if GVK is the right one already or is empty (yes, this is a hack, but the old behaviour we rely on in kubectl) + objGVK := obj.GetObjectKind().GroupVersionKind() + if len(objGVK.Version) == 0 { + return c.encoder.Encode(obj, w) + } + targetGVK, ok := c.encodeVersion.KindForGroupVersionKinds([]schema.GroupVersionKind{objGVK}) + if !ok { + return runtime.NewNotRegisteredGVKErrForTarget(objGVK, c.encodeVersion) + } + if targetGVK == objGVK { + return c.encoder.Encode(obj, w) + } + } } gvks, isUnversioned, err := c.typer.ObjectKinds(obj) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning_test.go b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning_test.go index 43c242657..f79b2a7cb 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning_test.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning_test.go @@ -129,25 +129,25 @@ func TestDecode(t *testing.T) { }{ { serializer: &mockSerializer{actual: gvk1}, - convertor: &checkConvertor{groupVersion: schema.GroupVersion{Group: "other", Version: "__internal"}}, + convertor: &checkConvertor{groupVersion: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}}, expectedGVK: gvk1, - decodes: schema.GroupVersion{Group: "other", Version: "__internal"}, + decodes: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}, }, { serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: schema.GroupVersion{Group: "other", Version: "__internal"}}, + convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}}, expectedGVK: gvk1, sameObject: decodable2, - decodes: schema.GroupVersion{Group: "other", Version: "__internal"}, + decodes: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}, }, // defaultGVK.Group is allowed to force a conversion to the destination group { serializer: &mockSerializer{actual: gvk1, obj: decodable1}, defaultGVK: &schema.GroupVersionKind{Group: "force"}, - convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: schema.GroupVersion{Group: "force", Version: "__internal"}}, + convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: schema.GroupVersion{Group: "force", Version: runtime.APIVersionInternal}}, expectedGVK: gvk1, sameObject: decodable2, - decodes: schema.GroupVersion{Group: "force", Version: "__internal"}, + decodes: schema.GroupVersion{Group: "force", Version: runtime.APIVersionInternal}, }, // uses direct conversion for into when objects differ { @@ -184,10 +184,10 @@ func TestDecode(t *testing.T) { into: &runtime.VersionedObjects{Objects: []runtime.Object{}}, serializer: &mockSerializer{actual: gvk1, obj: decodable1}, - convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: schema.GroupVersion{Group: "other", Version: "__internal"}}, + convertor: &checkConvertor{in: decodable1, obj: decodable2, groupVersion: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}}, expectedGVK: gvk1, expectedObject: &runtime.VersionedObjects{Objects: []runtime.Object{decodable1, decodable2}}, - decodes: schema.GroupVersion{Group: "other", Version: "__internal"}, + decodes: schema.GroupVersion{Group: "other", Version: runtime.APIVersionInternal}, }, // decode into the same version as the serialized object diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/yaml/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/serializer/yaml/BUILD deleted file mode 100644 index 104fa7a7b..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/serializer/yaml/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["yaml.go"], - importpath = "k8s.io/apimachinery/pkg/runtime/serializer/yaml", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/testing/BUILD b/vendor/k8s.io/apimachinery/pkg/runtime/testing/BUILD deleted file mode 100644 index cee23e557..000000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/testing/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apimachinery/pkg/runtime/testing", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/testing/types.go b/vendor/k8s.io/apimachinery/pkg/runtime/testing/types.go index 0694e7011..b8d67061d 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/testing/types.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/testing/types.go @@ -263,7 +263,7 @@ func (obj *Unstructured) EachListItem(fn func(runtime.Object) error) error { func (obj *Unstructured) UnstructuredContent() map[string]interface{} { if obj.Object == nil { - obj.Object = make(map[string]interface{}) + return make(map[string]interface{}) } return obj.Object } diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/testing/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/runtime/testing/zz_generated.deepcopy.go index 787bffe56..957cbf9ee 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/testing/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/testing/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/runtime/zz_generated.deepcopy.go index ba89cd235..167de6104 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/selection/BUILD b/vendor/k8s.io/apimachinery/pkg/selection/BUILD deleted file mode 100644 index 3790df9af..000000000 --- a/vendor/k8s.io/apimachinery/pkg/selection/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["operator.go"], - importpath = "k8s.io/apimachinery/pkg/selection", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/test/BUILD b/vendor/k8s.io/apimachinery/pkg/test/BUILD deleted file mode 100644 index b7a2e4db3..000000000 --- a/vendor/k8s.io/apimachinery/pkg/test/BUILD +++ /dev/null @@ -1,65 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "api_meta_help_test.go", - "api_meta_meta_test.go", - "apis_meta_v1_unstructed_unstructure_test.go", - "runtime_helper_test.go", - "runtime_serializer_protobuf_protobuf_test.go", - "runtime_unversioned_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "util.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apimachinery/pkg/test", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/test/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/test/zz_generated.deepcopy.go index 1a080acc7..6cdf98394 100644 --- a/vendor/k8s.io/apimachinery/pkg/test/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/test/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/types/BUILD b/vendor/k8s.io/apimachinery/pkg/types/BUILD deleted file mode 100644 index 3db635c8a..000000000 --- a/vendor/k8s.io/apimachinery/pkg/types/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "namespacedname.go", - "nodename.go", - "patch.go", - "uid.go", - ], - importpath = "k8s.io/apimachinery/pkg/types", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go b/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go index 1e2130da0..88f0de36d 100644 --- a/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go +++ b/vendor/k8s.io/apimachinery/pkg/types/namespacedname.go @@ -18,7 +18,6 @@ package types import ( "fmt" - "strings" ) // NamespacedName comprises a resource name, with a mandatory namespace, @@ -42,19 +41,3 @@ const ( func (n NamespacedName) String() string { return fmt.Sprintf("%s%c%s", n.Namespace, Separator, n.Name) } - -// NewNamespacedNameFromString parses the provided string and returns a NamespacedName. -// The expected format is as per String() above. -// If the input string is invalid, the returned NamespacedName has all empty string field values. -// This allows a single-value return from this function, while still allowing error checks in the caller. -// Note that an input string which does not include exactly one Separator is not a valid input (as it could never -// have neem returned by String() ) -func NewNamespacedNameFromString(s string) NamespacedName { - nn := NamespacedName{} - result := strings.Split(s, string(Separator)) - if len(result) == 2 { - nn.Namespace = result[0] - nn.Name = result[1] - } - return nn -} diff --git a/vendor/k8s.io/apimachinery/pkg/util/cache/BUILD b/vendor/k8s.io/apimachinery/pkg/util/cache/BUILD deleted file mode 100644 index 2fcbae368..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/cache/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "cache_test.go", - "lruexpirecache_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/golang/groupcache/lru:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "cache.go", - "lruexpirecache.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/cache", - deps = ["//vendor/github.com/hashicorp/golang-lru:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/clock/BUILD b/vendor/k8s.io/apimachinery/pkg/util/clock/BUILD deleted file mode 100644 index a9f6be471..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/clock/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["clock_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["clock.go"], - importpath = "k8s.io/apimachinery/pkg/util/clock", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go b/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go index c303a212a..9567f9006 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go +++ b/vendor/k8s.io/apimachinery/pkg/util/clock/clock.go @@ -26,18 +26,12 @@ import ( type Clock interface { Now() time.Time Since(time.Time) time.Duration - After(d time.Duration) <-chan time.Time - NewTimer(d time.Duration) Timer - Sleep(d time.Duration) - Tick(d time.Duration) <-chan time.Time + After(time.Duration) <-chan time.Time + NewTimer(time.Duration) Timer + Sleep(time.Duration) + NewTicker(time.Duration) Ticker } -var ( - _ = Clock(RealClock{}) - _ = Clock(&FakeClock{}) - _ = Clock(&IntervalClock{}) -) - // RealClock really calls time.Now() type RealClock struct{} @@ -62,8 +56,10 @@ func (RealClock) NewTimer(d time.Duration) Timer { } } -func (RealClock) Tick(d time.Duration) <-chan time.Time { - return time.Tick(d) +func (RealClock) NewTicker(d time.Duration) Ticker { + return &realTicker{ + ticker: time.NewTicker(d), + } } func (RealClock) Sleep(d time.Duration) { @@ -137,7 +133,7 @@ func (f *FakeClock) NewTimer(d time.Duration) Timer { return timer } -func (f *FakeClock) Tick(d time.Duration) <-chan time.Time { +func (f *FakeClock) NewTicker(d time.Duration) Ticker { f.lock.Lock() defer f.lock.Unlock() tickTime := f.time.Add(d) @@ -149,7 +145,9 @@ func (f *FakeClock) Tick(d time.Duration) <-chan time.Time { destChan: ch, }) - return ch + return &fakeTicker{ + c: ch, + } } // Move clock by Duration, notify anyone that's called After, Tick, or NewTimer @@ -242,8 +240,8 @@ func (*IntervalClock) NewTimer(d time.Duration) Timer { // Unimplemented, will panic. // TODO: make interval clock use FakeClock so this can be implemented. -func (*IntervalClock) Tick(d time.Duration) <-chan time.Time { - panic("IntervalClock doesn't implement Tick") +func (*IntervalClock) NewTicker(d time.Duration) Ticker { + panic("IntervalClock doesn't implement NewTicker") } func (*IntervalClock) Sleep(d time.Duration) { @@ -258,11 +256,6 @@ type Timer interface { Reset(d time.Duration) bool } -var ( - _ = Timer(&realTimer{}) - _ = Timer(&fakeTimer{}) -) - // realTimer is backed by an actual time.Timer. type realTimer struct { timer *time.Timer @@ -325,3 +318,31 @@ func (f *fakeTimer) Reset(d time.Duration) bool { return active } + +type Ticker interface { + C() <-chan time.Time + Stop() +} + +type realTicker struct { + ticker *time.Ticker +} + +func (t *realTicker) C() <-chan time.Time { + return t.ticker.C +} + +func (t *realTicker) Stop() { + t.ticker.Stop() +} + +type fakeTicker struct { + c <-chan time.Time +} + +func (t *fakeTicker) C() <-chan time.Time { + return t.c +} + +func (t *fakeTicker) Stop() { +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/clock/clock_test.go b/vendor/k8s.io/apimachinery/pkg/util/clock/clock_test.go index 27d34605f..c7b371fc6 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/clock/clock_test.go +++ b/vendor/k8s.io/apimachinery/pkg/util/clock/clock_test.go @@ -21,6 +21,18 @@ import ( "time" ) +var ( + _ = Clock(RealClock{}) + _ = Clock(&FakeClock{}) + _ = Clock(&IntervalClock{}) + + _ = Timer(&realTimer{}) + _ = Timer(&fakeTimer{}) + + _ = Ticker(&realTicker{}) + _ = Ticker(&fakeTicker{}) +) + func TestFakeClock(t *testing.T) { startTime := time.Now() tc := NewFakeClock(startTime) @@ -110,13 +122,13 @@ func TestFakeTick(t *testing.T) { if tc.HasWaiters() { t.Errorf("unexpected waiter?") } - oneSec := tc.Tick(time.Second) + oneSec := tc.NewTicker(time.Second).C() if !tc.HasWaiters() { t.Errorf("unexpected lack of waiter?") } - oneOhOneSec := tc.Tick(time.Second + time.Millisecond) - twoSec := tc.Tick(2 * time.Second) + oneOhOneSec := tc.NewTicker(time.Second + time.Millisecond).C() + twoSec := tc.NewTicker(2 * time.Second).C() select { case <-oneSec: t.Errorf("unexpected channel read") diff --git a/vendor/k8s.io/apimachinery/pkg/util/diff/BUILD b/vendor/k8s.io/apimachinery/pkg/util/diff/BUILD deleted file mode 100644 index 3cd03b435..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/diff/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["diff_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["diff.go"], - importpath = "k8s.io/apimachinery/pkg/util/diff", - deps = [ - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go b/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go index 3d5ec14bf..bce95baf1 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go +++ b/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go @@ -89,20 +89,52 @@ func ObjectReflectDiff(a, b interface{}) string { } out := []string{""} for _, d := range diffs { + elidedA, elidedB := limit(d.a, d.b, 80) out = append(out, fmt.Sprintf("%s:", d.path), - limit(fmt.Sprintf(" a: %#v", d.a), 80), - limit(fmt.Sprintf(" b: %#v", d.b), 80), + fmt.Sprintf(" a: %s", elidedA), + fmt.Sprintf(" b: %s", elidedB), ) } return strings.Join(out, "\n") } -func limit(s string, max int) string { - if len(s) > max { - return s[:max] +// limit: +// 1. stringifies aObj and bObj +// 2. elides identical prefixes if either is too long +// 3. elides remaining content from the end if either is too long +func limit(aObj, bObj interface{}, max int) (string, string) { + elidedPrefix := "" + elidedASuffix := "" + elidedBSuffix := "" + a, b := fmt.Sprintf("%#v", aObj), fmt.Sprintf("%#v", bObj) + for { + switch { + case len(a) > max && len(a) > 4 && len(b) > 4 && a[:4] == b[:4]: + // a is too long, b has data, and the first several characters are the same + elidedPrefix = "..." + a = a[2:] + b = b[2:] + + case len(b) > max && len(b) > 4 && len(a) > 4 && a[:4] == b[:4]: + // b is too long, a has data, and the first several characters are the same + elidedPrefix = "..." + a = a[2:] + b = b[2:] + + case len(a) > max: + a = a[:max] + elidedASuffix = "..." + + case len(b) > max: + b = b[:max] + elidedBSuffix = "..." + + default: + // both are short enough + return elidedPrefix + a + elidedASuffix, elidedPrefix + b + elidedBSuffix + } } - return s } func public(s string) bool { diff --git a/vendor/k8s.io/apimachinery/pkg/util/diff/diff_test.go b/vendor/k8s.io/apimachinery/pkg/util/diff/diff_test.go index 2b72c2f53..d26dba818 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/diff/diff_test.go +++ b/vendor/k8s.io/apimachinery/pkg/util/diff/diff_test.go @@ -94,3 +94,50 @@ func TestStringDiff(t *testing.T) { t.Errorf("diff returned %v", diff) } } + +func TestLimit(t *testing.T) { + testcases := []struct { + a interface{} + b interface{} + expectA string + expectB string + }{ + { + a: `short a`, + b: `short b`, + expectA: `"short a"`, + expectB: `"short b"`, + }, + { + a: `short a`, + b: `long b needs truncating`, + expectA: `"short a"`, + expectB: `"long b ne...`, + }, + { + a: `long a needs truncating`, + b: `long b needs truncating`, + expectA: `...g a needs ...`, + expectB: `...g b needs ...`, + }, + { + a: `long common prefix with different stuff at the end of a`, + b: `long common prefix with different stuff at the end of b`, + expectA: `...end of a"`, + expectB: `...end of b"`, + }, + { + a: `long common prefix with different stuff at the end of a`, + b: `long common prefix with different stuff at the end of b which continues`, + expectA: `...of a"`, + expectB: `...of b which...`, + }, + } + + for _, tc := range testcases { + a, b := limit(tc.a, tc.b, 10) + if a != tc.expectA || b != tc.expectB { + t.Errorf("limit(%q, %q)\n\texpected: %s, %s\n\tgot: %s, %s", tc.a, tc.b, tc.expectA, tc.expectB, a, b) + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/duration/BUILD b/vendor/k8s.io/apimachinery/pkg/util/duration/BUILD deleted file mode 100644 index 6b9e7880e..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/duration/BUILD +++ /dev/null @@ -1,22 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["duration.go"], - importpath = "k8s.io/apimachinery/pkg/util/duration", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/errors/BUILD b/vendor/k8s.io/apimachinery/pkg/util/errors/BUILD deleted file mode 100644 index fa2b74a2c..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/errors/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["errors_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "errors.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/errors", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/framer/BUILD b/vendor/k8s.io/apimachinery/pkg/util/framer/BUILD deleted file mode 100644 index 3a323b113..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/framer/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["framer_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["framer.go"], - importpath = "k8s.io/apimachinery/pkg/util/framer", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD b/vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD deleted file mode 100644 index 5d45073ef..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["httpstream_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "httpstream.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/httpstream", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/util/httpstream/spdy:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD deleted file mode 100644 index 75d6ec0d1..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "connection_test.go", - "roundtripper_test.go", - "upgrade_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/elazarl/goproxy:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "connection.go", - "roundtripper.go", - "upgrade.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/httpstream/spdy", - deps = [ - "//vendor/github.com/docker/spdystream:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/third_party/forked/golang/netutil:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go index d2d3ad8cb..dd781cbc8 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go +++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go @@ -19,6 +19,7 @@ package spdy import ( "bufio" "bytes" + "context" "crypto/tls" "encoding/base64" "fmt" @@ -118,7 +119,7 @@ func (s *SpdyRoundTripper) dial(req *http.Request) (net.Conn, error) { } if proxyURL == nil { - return s.dialWithoutProxy(req.URL) + return s.dialWithoutProxy(req.Context(), req.URL) } // ensure we use a canonical host with proxyReq @@ -136,7 +137,7 @@ func (s *SpdyRoundTripper) dial(req *http.Request) (net.Conn, error) { proxyReq.Header.Set("Proxy-Authorization", pa) } - proxyDialConn, err := s.dialWithoutProxy(proxyURL) + proxyDialConn, err := s.dialWithoutProxy(req.Context(), proxyURL) if err != nil { return nil, err } @@ -187,14 +188,15 @@ func (s *SpdyRoundTripper) dial(req *http.Request) (net.Conn, error) { } // dialWithoutProxy dials the host specified by url, using TLS if appropriate. -func (s *SpdyRoundTripper) dialWithoutProxy(url *url.URL) (net.Conn, error) { +func (s *SpdyRoundTripper) dialWithoutProxy(ctx context.Context, url *url.URL) (net.Conn, error) { dialAddr := netutil.CanonicalAddr(url) if url.Scheme == "http" { if s.Dialer == nil { - return net.Dial("tcp", dialAddr) + var d net.Dialer + return d.DialContext(ctx, "tcp", dialAddr) } else { - return s.Dialer.Dial("tcp", dialAddr) + return s.Dialer.DialContext(ctx, "tcp", dialAddr) } } diff --git a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper_test.go b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper_test.go index 887adbe8f..fb396bca5 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper_test.go +++ b/vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper_test.go @@ -399,7 +399,7 @@ func TestRoundTripRedirects(t *testing.T) { var redirects int32 = 0 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { if redirects < test.redirects { - redirects = atomic.AddInt32(&redirects, 1) + atomic.AddInt32(&redirects, 1) http.Redirect(w, req, "redirect", http.StatusFound) return } diff --git a/vendor/k8s.io/apimachinery/pkg/util/initialization/BUILD b/vendor/k8s.io/apimachinery/pkg/util/initialization/BUILD deleted file mode 100644 index 37691997b..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/initialization/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["initialization.go"], - importpath = "k8s.io/apimachinery/pkg/util/initialization", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD b/vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD deleted file mode 100644 index 73e62bcde..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["intstr_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/ghodss/yaml:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "generated.pb.go", - "intstr.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/intstr", - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -filegroup( - name = "go_default_library_protos", - srcs = ["generated.proto"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go index 161e9a6f8..5c2ac4f23 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto b/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto index 6819d468d..1c3ec732e 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/pkg/util/json/BUILD b/vendor/k8s.io/apimachinery/pkg/util/json/BUILD deleted file mode 100644 index c42821fc8..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/json/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["json.go"], - importpath = "k8s.io/apimachinery/pkg/util/json", -) - -go_test( - name = "go_default_test", - srcs = ["json_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/BUILD b/vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/BUILD deleted file mode 100644 index fcdebdb88..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["patch_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/github.com/ghodss/yaml:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["patch.go"], - importpath = "k8s.io/apimachinery/pkg/util/jsonmergepatch", - deps = [ - "//vendor/github.com/evanphx/json-patch:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/patch.go b/vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/patch.go index e81e4f23a..82e4b4b57 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/patch.go +++ b/vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/patch.go @@ -116,10 +116,26 @@ func keepOrDeleteNullInObj(m map[string]interface{}, keepNull bool) (map[string] case val != nil: switch typedVal := val.(type) { case map[string]interface{}: - filteredMap[key], err = keepOrDeleteNullInObj(typedVal, keepNull) + // Explicitly-set empty maps are treated as values instead of empty patches + if len(typedVal) == 0 { + if !keepNull { + filteredMap[key] = typedVal + } + continue + } + + var filteredSubMap map[string]interface{} + filteredSubMap, err = keepOrDeleteNullInObj(typedVal, keepNull) if err != nil { return nil, err } + + // If the returned filtered submap was empty, this is an empty patch for the entire subdict, so the key + // should not be set + if len(filteredSubMap) != 0 { + filteredMap[key] = filteredSubMap + } + case []interface{}, string, float64, bool, int, int64, nil: // Lists are always replaced in Json, no need to check each entry in the list. if !keepNull { diff --git a/vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/patch_test.go b/vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/patch_test.go index f462bf915..9672deaad 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/patch_test.go +++ b/vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/patch_test.go @@ -62,12 +62,12 @@ testCases: expectedWithoutNull: {} - description: simple map with all non-nil values originalObj: - nonNilKey: foo - nonNilKey: bar + nonNilKey1: foo + nonNilKey2: bar expectedWithNull: {} expectedWithoutNull: - nonNilKey: foo - nonNilKey: bar + nonNilKey1: foo + nonNilKey2: bar - description: nested map originalObj: mapKey: @@ -88,19 +88,52 @@ testCases: mapKey: nilKey1: null nilKey2: null - expectedWithoutNull: - mapKey: {} + expectedWithoutNull: {} - description: nested map that all subkeys are non-nil originalObj: mapKey: - nonNilKey: foo - nonNilKey: bar - expectedWithNull: - mapKey: {} + nonNilKey1: foo + nonNilKey2: bar + expectedWithNull: {} expectedWithoutNull: mapKey: - nonNilKey: foo - nonNilKey: bar + nonNilKey1: foo + nonNilKey2: bar + - description: explicitly empty map as value + originalObj: + mapKey: {} + expectedWithNull: {} + expectedWithoutNull: + mapKey: {} + - description: explicitly empty nested map + originalObj: + mapKey: + nonNilKey: {} + expectedWithNull: {} + expectedWithoutNull: + mapKey: + nonNilKey: {} + - description: multiple expliclty empty nested maps + originalObj: + mapKey: + nonNilKey1: {} + nonNilKey2: {} + expectedWithNull: {} + expectedWithoutNull: + mapKey: + nonNilKey1: {} + nonNilKey2: {} + - description: nested map with non-null value as empty map + originalObj: + mapKey: + nonNilKey: {} + nilKey: null + expectedWithNull: + mapKey: + nilKey: null + expectedWithoutNull: + mapKey: + nonNilKey: {} - description: empty list originalObj: listKey: [] diff --git a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD deleted file mode 100644 index 0ddf97d1d..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "errors.go", - "util.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/mergepatch", - deps = [ - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/ghodss/yaml:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/BUILD b/vendor/k8s.io/apimachinery/pkg/util/net/BUILD deleted file mode 100644 index 9d0fffb11..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/net/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "http_test.go", - "interface_test.go", - "port_range_test.go", - "port_split_test.go", - "util_test.go", - ], - embed = [":go_default_library"], - deps = ["//vendor/github.com/spf13/pflag:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "http.go", - "interface.go", - "port_range.go", - "port_split.go", - "util.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/net", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/net/http2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/http.go b/vendor/k8s.io/apimachinery/pkg/util/net/http.go index bc2a531b9..7ea2df226 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/http.go +++ b/vendor/k8s.io/apimachinery/pkg/util/net/http.go @@ -19,6 +19,7 @@ package net import ( "bufio" "bytes" + "context" "crypto/tls" "fmt" "io" @@ -61,6 +62,9 @@ func JoinPreservingTrailingSlash(elem ...string) string { // differentiate probable errors in connection behavior between normal "this is // disconnected" should use the method. func IsProbableEOF(err error) bool { + if err == nil { + return false + } if uerr, ok := err.(*url.Error); ok { err = uerr.Err } @@ -87,8 +91,8 @@ func SetOldTransportDefaults(t *http.Transport) *http.Transport { // ProxierWithNoProxyCIDR allows CIDR rules in NO_PROXY t.Proxy = NewProxierWithNoProxyCIDR(http.ProxyFromEnvironment) } - if t.Dial == nil { - t.Dial = defaultTransport.Dial + if t.DialContext == nil { + t.DialContext = defaultTransport.DialContext } if t.TLSHandshakeTimeout == 0 { t.TLSHandshakeTimeout = defaultTransport.TLSHandshakeTimeout @@ -116,7 +120,7 @@ type RoundTripperWrapper interface { WrappedRoundTripper() http.RoundTripper } -type DialFunc func(net, addr string) (net.Conn, error) +type DialFunc func(ctx context.Context, net, addr string) (net.Conn, error) func DialerFor(transport http.RoundTripper) (DialFunc, error) { if transport == nil { @@ -125,7 +129,7 @@ func DialerFor(transport http.RoundTripper) (DialFunc, error) { switch transport := transport.(type) { case *http.Transport: - return transport.Dial, nil + return transport.DialContext, nil case RoundTripperWrapper: return DialerFor(transport.WrappedRoundTripper()) default: diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/port_range.go b/vendor/k8s.io/apimachinery/pkg/util/net/port_range.go index 6a50e6186..7b6eca893 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/port_range.go +++ b/vendor/k8s.io/apimachinery/pkg/util/net/port_range.go @@ -43,14 +43,19 @@ func (pr PortRange) String() string { return fmt.Sprintf("%d-%d", pr.Base, pr.Base+pr.Size-1) } -// Set parses a string of the form "min-max", inclusive at both ends, and +// Set parses a string of the form "value", "min-max", or "min+offset", inclusive at both ends, and // sets the PortRange from it. This is part of the flag.Value and pflag.Value // interfaces. func (pr *PortRange) Set(value string) error { - value = strings.TrimSpace(value) + const ( + SinglePortNotation = 1 << iota + HyphenNotation + PlusNotation + ) - // TODO: Accept "80" syntax - // TODO: Accept "80+8" syntax + value = strings.TrimSpace(value) + hyphenIndex := strings.Index(value, "-") + plusIndex := strings.Index(value, "+") if value == "" { pr.Base = 0 @@ -58,20 +63,51 @@ func (pr *PortRange) Set(value string) error { return nil } - hyphenIndex := strings.Index(value, "-") - if hyphenIndex == -1 { - return fmt.Errorf("expected hyphen in port range") + var err error + var low, high int + var notation int + + if plusIndex == -1 && hyphenIndex == -1 { + notation |= SinglePortNotation + } + if hyphenIndex != -1 { + notation |= HyphenNotation + } + if plusIndex != -1 { + notation |= PlusNotation } - var err error - var low int - var high int - low, err = strconv.Atoi(value[:hyphenIndex]) - if err == nil { + switch notation { + case SinglePortNotation: + var port int + port, err = strconv.Atoi(value) + if err != nil { + return err + } + low = port + high = port + case HyphenNotation: + low, err = strconv.Atoi(value[:hyphenIndex]) + if err != nil { + return err + } high, err = strconv.Atoi(value[hyphenIndex+1:]) - } - if err != nil { - return fmt.Errorf("unable to parse port range: %s: %v", value, err) + if err != nil { + return err + } + case PlusNotation: + var offset int + low, err = strconv.Atoi(value[:plusIndex]) + if err != nil { + return err + } + offset, err = strconv.Atoi(value[plusIndex+1:]) + if err != nil { + return err + } + high = low + offset + default: + return fmt.Errorf("unable to parse port range: %s", value) } if low > 65535 || high > 65535 { diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/port_range_test.go b/vendor/k8s.io/apimachinery/pkg/util/net/port_range_test.go index 897b8df61..b4cbe8245 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/port_range_test.go +++ b/vendor/k8s.io/apimachinery/pkg/util/net/port_range_test.go @@ -34,13 +34,21 @@ func TestPortRange(t *testing.T) { {" 100-200 ", true, "100-200", 200, 201}, {"0-0", true, "0-0", 0, 1}, {"", true, "", -1, 0}, - {"100", false, "", -1, -1}, + {"100", true, "100-100", 100, 101}, {"100 - 200", false, "", -1, -1}, {"-100", false, "", -1, -1}, {"100-", false, "", -1, -1}, {"200-100", false, "", -1, -1}, {"60000-70000", false, "", -1, -1}, {"70000-80000", false, "", -1, -1}, + {"70000+80000", false, "", -1, -1}, + {"1+0", true, "1-1", 1, 2}, + {"0+0", true, "0-0", 0, 1}, + {"1+-1", false, "", -1, -1}, + {"1-+1", false, "", -1, -1}, + {"100+200", true, "100-300", 300, 301}, + {"1+65535", false, "", -1, -1}, + {"0+65535", true, "0-65535", 65535, 65536}, } for i := range testCases { @@ -52,7 +60,7 @@ func TestPortRange(t *testing.T) { t.Errorf("expected success, got %q", err) continue } else if err == nil && tc.success == false { - t.Errorf("expected failure") + t.Errorf("expected failure %#v", testCases[i]) continue } else if tc.success { if f.String() != tc.expected { diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD b/vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD deleted file mode 100644 index 69e9734cf..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD +++ /dev/null @@ -1,61 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "dial_test.go", - "transport_test.go", - "upgradeaware_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/github.com/stretchr/testify/require:go_default_library", - "//vendor/golang.org/x/net/websocket:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "dial.go", - "doc.go", - "transport.go", - "upgradeaware.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/proxy", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/mxk/go-flowrate/flowrate:go_default_library", - "//vendor/golang.org/x/net/html:go_default_library", - "//vendor/golang.org/x/net/html/atom:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/third_party/forked/golang/netutil:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go b/vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go index 3da7e965f..37a5be487 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go +++ b/vendor/k8s.io/apimachinery/pkg/util/proxy/dial.go @@ -17,6 +17,7 @@ limitations under the License. package proxy import ( + "context" "crypto/tls" "fmt" "net" @@ -29,7 +30,7 @@ import ( "k8s.io/apimachinery/third_party/forked/golang/netutil" ) -func DialURL(url *url.URL, transport http.RoundTripper) (net.Conn, error) { +func DialURL(ctx context.Context, url *url.URL, transport http.RoundTripper) (net.Conn, error) { dialAddr := netutil.CanonicalAddr(url) dialer, err := utilnet.DialerFor(transport) @@ -40,9 +41,10 @@ func DialURL(url *url.URL, transport http.RoundTripper) (net.Conn, error) { switch url.Scheme { case "http": if dialer != nil { - return dialer("tcp", dialAddr) + return dialer(ctx, "tcp", dialAddr) } - return net.Dial("tcp", dialAddr) + var d net.Dialer + return d.DialContext(ctx, "tcp", dialAddr) case "https": // Get the tls config from the transport if we recognize it var tlsConfig *tls.Config @@ -56,7 +58,7 @@ func DialURL(url *url.URL, transport http.RoundTripper) (net.Conn, error) { if dialer != nil { // We have a dialer; use it to open the connection, then // create a tls client using the connection. - netConn, err := dialer("tcp", dialAddr) + netConn, err := dialer(ctx, "tcp", dialAddr) if err != nil { return nil, err } @@ -86,7 +88,7 @@ func DialURL(url *url.URL, transport http.RoundTripper) (net.Conn, error) { } } else { - // Dial + // Dial. This Dial method does not allow to pass a context unfortunately tlsConn, err = tls.Dial("tcp", dialAddr, tlsConfig) if err != nil { return nil, err diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/dial_test.go b/vendor/k8s.io/apimachinery/pkg/util/proxy/dial_test.go index 8b9f78e4d..6ee594174 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/dial_test.go +++ b/vendor/k8s.io/apimachinery/pkg/util/proxy/dial_test.go @@ -17,6 +17,7 @@ limitations under the License. package proxy import ( + "context" "crypto/tls" "crypto/x509" "fmt" @@ -42,6 +43,7 @@ func TestDialURL(t *testing.T) { if err != nil { t.Fatal(err) } + var d net.Dialer testcases := map[string]struct { TLSConfig *tls.Config @@ -68,25 +70,25 @@ func TestDialURL(t *testing.T) { "insecure, custom dial": { TLSConfig: &tls.Config{InsecureSkipVerify: true}, - Dial: net.Dial, + Dial: d.DialContext, }, "secure, no roots, custom dial": { TLSConfig: &tls.Config{InsecureSkipVerify: false}, - Dial: net.Dial, + Dial: d.DialContext, ExpectError: "unknown authority", }, "secure with roots, custom dial": { TLSConfig: &tls.Config{InsecureSkipVerify: false, RootCAs: roots}, - Dial: net.Dial, + Dial: d.DialContext, }, "secure with mismatched server, custom dial": { TLSConfig: &tls.Config{InsecureSkipVerify: false, RootCAs: roots, ServerName: "bogus.com"}, - Dial: net.Dial, + Dial: d.DialContext, ExpectError: "not bogus.com", }, "secure with matched server, custom dial": { TLSConfig: &tls.Config{InsecureSkipVerify: false, RootCAs: roots, ServerName: "example.com"}, - Dial: net.Dial, + Dial: d.DialContext, }, } @@ -102,7 +104,7 @@ func TestDialURL(t *testing.T) { // Clone() mutates the receiver (!), so also call it on the copy tlsConfigCopy.Clone() transport := &http.Transport{ - Dial: tc.Dial, + DialContext: tc.Dial, TLSClientConfig: tlsConfigCopy, } @@ -125,7 +127,7 @@ func TestDialURL(t *testing.T) { u, _ := url.Parse(ts.URL) _, p, _ := net.SplitHostPort(u.Host) u.Host = net.JoinHostPort("127.0.0.1", p) - conn, err := DialURL(u, transport) + conn, err := DialURL(context.Background(), u, transport) // Make sure dialing doesn't mutate the transport's TLSConfig if !reflect.DeepEqual(tc.TLSConfig, tlsConfigCopy) { diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go b/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go index 2bc19655e..d725b228e 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go +++ b/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware.go @@ -347,7 +347,7 @@ func (h *UpgradeAwareHandler) DialForUpgrade(req *http.Request) (net.Conn, error // dial dials the backend at req.URL and writes req to it. func dial(req *http.Request, transport http.RoundTripper) (net.Conn, error) { - conn, err := DialURL(req.URL, transport) + conn, err := DialURL(req.Context(), req.URL, transport) if err != nil { return nil, fmt.Errorf("error dialing backend: %v", err) } diff --git a/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware_test.go b/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware_test.go index a33b10e58..c5dfde90d 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware_test.go +++ b/vendor/k8s.io/apimachinery/pkg/util/proxy/upgradeaware_test.go @@ -19,6 +19,7 @@ package proxy import ( "bytes" "compress/gzip" + "context" "crypto/tls" "crypto/x509" "errors" @@ -341,6 +342,7 @@ func TestProxyUpgrade(t *testing.T) { if !localhostPool.AppendCertsFromPEM(localhostCert) { t.Errorf("error setting up localhostCert pool") } + var d net.Dialer testcases := map[string]struct { ServerFunc func(http.Handler) *httptest.Server @@ -395,7 +397,7 @@ func TestProxyUpgrade(t *testing.T) { ts.StartTLS() return ts }, - ProxyTransport: utilnet.SetTransportDefaults(&http.Transport{Dial: net.Dial, TLSClientConfig: &tls.Config{RootCAs: localhostPool}}), + ProxyTransport: utilnet.SetTransportDefaults(&http.Transport{DialContext: d.DialContext, TLSClientConfig: &tls.Config{RootCAs: localhostPool}}), }, "https (valid hostname + RootCAs + custom dialer + bearer token)": { ServerFunc: func(h http.Handler) *httptest.Server { @@ -410,9 +412,9 @@ func TestProxyUpgrade(t *testing.T) { ts.StartTLS() return ts }, - ProxyTransport: utilnet.SetTransportDefaults(&http.Transport{Dial: net.Dial, TLSClientConfig: &tls.Config{RootCAs: localhostPool}}), + ProxyTransport: utilnet.SetTransportDefaults(&http.Transport{DialContext: d.DialContext, TLSClientConfig: &tls.Config{RootCAs: localhostPool}}), UpgradeTransport: NewUpgradeRequestRoundTripper( - utilnet.SetOldTransportDefaults(&http.Transport{Dial: net.Dial, TLSClientConfig: &tls.Config{RootCAs: localhostPool}}), + utilnet.SetOldTransportDefaults(&http.Transport{DialContext: d.DialContext, TLSClientConfig: &tls.Config{RootCAs: localhostPool}}), RoundTripperFunc(func(req *http.Request) (*http.Response, error) { req = utilnet.CloneRequest(req) req.Header.Set("Authorization", "Bearer 1234") @@ -496,9 +498,15 @@ func TestProxyUpgradeErrorResponse(t *testing.T) { expectedErr = errors.New("EXPECTED") ) proxy := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - transport := http.DefaultTransport.(*http.Transport) - transport.Dial = func(network, addr string) (net.Conn, error) { - return &fakeConn{err: expectedErr}, nil + transport := &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + return &fakeConn{err: expectedErr}, nil + }, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, } responder = &fakeResponder{t: t, w: w} proxyHandler := NewUpgradeAwareHandler( diff --git a/vendor/k8s.io/apimachinery/pkg/util/rand/BUILD b/vendor/k8s.io/apimachinery/pkg/util/rand/BUILD deleted file mode 100644 index 27126ab59..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/rand/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["rand_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["rand.go"], - importpath = "k8s.io/apimachinery/pkg/util/rand", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD b/vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD deleted file mode 100644 index 9919ad54a..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["constants.go"], - importpath = "k8s.io/apimachinery/pkg/util/remotecommand", - deps = ["//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD b/vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD deleted file mode 100644 index 6407b8bd2..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["runtime_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["runtime.go"], - importpath = "k8s.io/apimachinery/pkg/util/runtime", - deps = ["//vendor/github.com/golang/glog:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go b/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go index d4cec0b88..da32fe12f 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go +++ b/vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go @@ -128,9 +128,8 @@ func (r *rudimentaryErrorBackoff) OnError(error) { r.lastErrorTimeLock.Lock() defer r.lastErrorTimeLock.Unlock() d := time.Since(r.lastErrorTime) - if d < r.minPeriod && d >= 0 { + if d < r.minPeriod { // If the time moves backwards for any reason, do nothing - // TODO: remove check "d >= 0" after go 1.8 is no longer supported time.Sleep(r.minPeriod - d) } r.lastErrorTime = time.Now() @@ -161,3 +160,10 @@ func RecoverFromPanic(err *error) { callers) } } + +// Must panics on non-nil errors. Useful to handling programmer level errors. +func Must(err error) { + if err != nil { + panic(err) + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD b/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD deleted file mode 100644 index ec2f23476..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD +++ /dev/null @@ -1,71 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_kubernetes_build//defs:go.bzl", "go_genrule") -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "byte.go", - "doc.go", - "empty.go", - "int.go", - "int64.go", - "string.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/sets", -) - -go_genrule( - name = "set-gen", - srcs = [ - "//hack/boilerplate:boilerplate.go.txt", - ], - outs = [ - "byte.go", - "doc.go", - "empty.go", - "int.go", - "int64.go", - "string.go", - ], - cmd = """ -$(location //vendor/k8s.io/code-generator/cmd/set-gen) \ - --input-dirs ./vendor/k8s.io/apimachinery/pkg/util/sets/types \ - --output-base $$(dirname $$(dirname $(location :byte.go))) \ - --go-header-file $(location //hack/boilerplate:boilerplate.go.txt) \ - --output-package sets - """, - go_deps = [ - "//vendor/k8s.io/apimachinery/pkg/util/sets/types:go_default_library", - ], - tools = [ - "//vendor/k8s.io/code-generator/cmd/set-gen", - ], -) - -go_test( - name = "go_default_test", - srcs = ["set_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/util/sets/types:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/byte.go b/vendor/k8s.io/apimachinery/pkg/util/sets/byte.go index a460e4b1f..766f4501e 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/byte.go +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/byte.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was autogenerated by set-gen. Do not edit it manually! +// Code generated by set-gen. DO NOT EDIT. package sets @@ -26,7 +26,7 @@ import ( // sets.Byte is a set of bytes, implemented via map[byte]struct{} for minimal memory consumption. type Byte map[byte]Empty -// New creates a Byte from a list of values. +// NewByte creates a Byte from a list of values. func NewByte(items ...byte) Byte { ss := Byte{} ss.Insert(items...) diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/doc.go b/vendor/k8s.io/apimachinery/pkg/util/sets/doc.go index 28a6a7d5c..b152a0bf0 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/doc.go +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was autogenerated by set-gen. Do not edit it manually! +// Code generated by set-gen. DO NOT EDIT. // Package sets has auto-generated set types. package sets diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/empty.go b/vendor/k8s.io/apimachinery/pkg/util/sets/empty.go index cd22b953a..e11e622c5 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/empty.go +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/empty.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was autogenerated by set-gen. Do not edit it manually! +// Code generated by set-gen. DO NOT EDIT. package sets diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/int.go b/vendor/k8s.io/apimachinery/pkg/util/sets/int.go index 0614e9fb0..a0a513cd9 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/int.go +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/int.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was autogenerated by set-gen. Do not edit it manually! +// Code generated by set-gen. DO NOT EDIT. package sets @@ -26,7 +26,7 @@ import ( // sets.Int is a set of ints, implemented via map[int]struct{} for minimal memory consumption. type Int map[int]Empty -// New creates a Int from a list of values. +// NewInt creates a Int from a list of values. func NewInt(items ...int) Int { ss := Int{} ss.Insert(items...) diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/int64.go b/vendor/k8s.io/apimachinery/pkg/util/sets/int64.go index 82e1ba782..9ca9af0c5 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/int64.go +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/int64.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was autogenerated by set-gen. Do not edit it manually! +// Code generated by set-gen. DO NOT EDIT. package sets @@ -26,7 +26,7 @@ import ( // sets.Int64 is a set of int64s, implemented via map[int64]struct{} for minimal memory consumption. type Int64 map[int64]Empty -// New creates a Int64 from a list of values. +// NewInt64 creates a Int64 from a list of values. func NewInt64(items ...int64) Int64 { ss := Int64{} ss.Insert(items...) diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/string.go b/vendor/k8s.io/apimachinery/pkg/util/sets/string.go index baef7a6a2..ba00ad7df 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/string.go +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/string.go @@ -1,5 +1,5 @@ /* -Copyright 2017 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// This file was autogenerated by set-gen. Do not edit it manually! +// Code generated by set-gen. DO NOT EDIT. package sets @@ -26,7 +26,7 @@ import ( // sets.String is a set of strings, implemented via map[string]struct{} for minimal memory consumption. type String map[string]Empty -// New creates a String from a list of values. +// NewString creates a String from a list of values. func NewString(items ...string) String { ss := String{} ss.Insert(items...) diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/types/BUILD b/vendor/k8s.io/apimachinery/pkg/util/sets/types/BUILD deleted file mode 100644 index 50f7528df..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/types/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["types.go"], - importpath = "k8s.io/apimachinery/pkg/util/sets/types", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD deleted file mode 100644 index 2d6088929..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["patch_test.go"], - data = [ - "testdata/swagger-merge-item.json", - "testdata/swagger-precision-item.json", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/davecgh/go-spew/spew:go_default_library", - "//vendor/github.com/ghodss/yaml:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "errors.go", - "meta.go", - "patch.go", - "types.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/strategicpatch", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", - "//vendor/k8s.io/apimachinery/third_party/forked/golang/json:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go index 2f6ade2be..6be328f74 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go +++ b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go @@ -880,6 +880,29 @@ func StrategicMergeMapPatchUsingLookupPatchMeta(original, patch JSONMap, schema return mergeMap(original, patch, schema, mergeOptions) } +// MergeStrategicMergeMapPatchUsingLookupPatchMeta merges strategic merge +// patches retaining `null` fields and parallel lists. If 2 patches change the +// same fields and the latter one will override the former one. If you don't +// want that happen, you need to run func MergingMapsHaveConflicts before +// merging these patches. Applying the resulting merged merge patch to a JSONMap +// yields the same as merging each strategic merge patch to the JSONMap in +// succession. +func MergeStrategicMergeMapPatchUsingLookupPatchMeta(schema LookupPatchMeta, patches ...JSONMap) (JSONMap, error) { + mergeOptions := MergeOptions{ + MergeParallelList: false, + IgnoreUnmatchedNulls: false, + } + merged := JSONMap{} + var err error + for _, patch := range patches { + merged, err = mergeMap(merged, patch, schema, mergeOptions) + if err != nil { + return nil, err + } + } + return merged, nil +} + // handleDirectiveInMergeMap handles the patch directive when merging 2 maps. func handleDirectiveInMergeMap(directive interface{}, patch map[string]interface{}) (map[string]interface{}, error) { if directive == replaceDirective { diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/testing/BUILD b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/testing/BUILD deleted file mode 100644 index 8b4268ffe..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/testing/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["openapi.go"], - importpath = "k8s.io/apimachinery/pkg/util/strategicpatch/testing", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", - "//vendor/github.com/googleapis/gnostic/compiler:go_default_library", - "//vendor/gopkg.in/yaml.v2:go_default_library", - "//vendor/k8s.io/kube-openapi/pkg/util/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/uuid/BUILD b/vendor/k8s.io/apimachinery/pkg/util/uuid/BUILD deleted file mode 100644 index 786d8fbe3..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/uuid/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["uuid.go"], - importpath = "k8s.io/apimachinery/pkg/util/uuid", - deps = [ - "//vendor/github.com/pborman/uuid:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/BUILD b/vendor/k8s.io/apimachinery/pkg/util/validation/BUILD deleted file mode 100644 index db599cbb7..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/validation/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["validation_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["validation.go"], - importpath = "k8s.io/apimachinery/pkg/util/validation", - deps = ["//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD b/vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD deleted file mode 100644 index fc59dd81c..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "errors_test.go", - "path_test.go", - ], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "errors.go", - "path.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/validation/field", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/wait/BUILD b/vendor/k8s.io/apimachinery/pkg/util/wait/BUILD deleted file mode 100644 index c062f3818..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/wait/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["wait_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "wait.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/wait", - deps = ["//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go b/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go index 0997de806..a25e92465 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go +++ b/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go @@ -284,12 +284,32 @@ func PollImmediateInfinite(interval time.Duration, condition ConditionFunc) erro // PollUntil tries a condition func until it returns true, an error or stopCh is // closed. // -// PolUntil always waits interval before the first run of 'condition'. +// PollUntil always waits interval before the first run of 'condition'. // 'condition' will always be invoked at least once. func PollUntil(interval time.Duration, condition ConditionFunc, stopCh <-chan struct{}) error { return WaitFor(poller(interval, 0), condition, stopCh) } +// PollImmediateUntil tries a condition func until it returns true, an error or stopCh is closed. +// +// PollImmediateUntil runs the 'condition' before waiting for the interval. +// 'condition' will always be invoked at least once. +func PollImmediateUntil(interval time.Duration, condition ConditionFunc, stopCh <-chan struct{}) error { + done, err := condition() + if err != nil { + return err + } + if done { + return nil + } + select { + case <-stopCh: + return ErrWaitTimeout + default: + return PollUntil(interval, condition, stopCh) + } +} + // WaitFunc creates a channel that receives an item every time a test // should be executed and is closed when the last test should be invoked. type WaitFunc func(done <-chan struct{}) <-chan struct{} diff --git a/vendor/k8s.io/apimachinery/pkg/util/waitgroup/BUILD b/vendor/k8s.io/apimachinery/pkg/util/waitgroup/BUILD deleted file mode 100644 index 6cba6d176..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/waitgroup/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "waitgroup.go", - ], - importpath = "k8s.io/apimachinery/pkg/util/waitgroup", - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["waitgroup_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD b/vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD deleted file mode 100644 index 596ea292a..000000000 --- a/vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["decoder_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["decoder.go"], - importpath = "k8s.io/apimachinery/pkg/util/yaml", - deps = [ - "//vendor/github.com/ghodss/yaml:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/version/BUILD b/vendor/k8s.io/apimachinery/pkg/version/BUILD deleted file mode 100644 index bdccf7b3a..000000000 --- a/vendor/k8s.io/apimachinery/pkg/version/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "types.go", - ], - importpath = "k8s.io/apimachinery/pkg/version", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/version/helpers.go b/vendor/k8s.io/apimachinery/pkg/version/helpers.go new file mode 100644 index 000000000..5e041d6f3 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/version/helpers.go @@ -0,0 +1,88 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package version + +import ( + "regexp" + "strconv" + "strings" +) + +type versionType int + +const ( + // Bigger the version type number, higher priority it is + versionTypeAlpha versionType = iota + versionTypeBeta + versionTypeGA +) + +var kubeVersionRegex = regexp.MustCompile("^v([\\d]+)(?:(alpha|beta)([\\d]+))?$") + +func parseKubeVersion(v string) (majorVersion int, vType versionType, minorVersion int, ok bool) { + var err error + submatches := kubeVersionRegex.FindStringSubmatch(v) + if len(submatches) != 4 { + return 0, 0, 0, false + } + switch submatches[2] { + case "alpha": + vType = versionTypeAlpha + case "beta": + vType = versionTypeBeta + case "": + vType = versionTypeGA + default: + return 0, 0, 0, false + } + if majorVersion, err = strconv.Atoi(submatches[1]); err != nil { + return 0, 0, 0, false + } + if vType != versionTypeGA { + if minorVersion, err = strconv.Atoi(submatches[3]); err != nil { + return 0, 0, 0, false + } + } + return majorVersion, vType, minorVersion, true +} + +// CompareKubeAwareVersionStrings compares two kube-like version strings. +// Kube-like version strings are starting with a v, followed by a major version, optional "alpha" or "beta" strings +// followed by a minor version (e.g. v1, v2beta1). Versions will be sorted based on GA/alpha/beta first and then major +// and minor versions. e.g. v2, v1, v1beta2, v1beta1, v1alpha1. +func CompareKubeAwareVersionStrings(v1, v2 string) int { + if v1 == v2 { + return 0 + } + v1major, v1type, v1minor, ok1 := parseKubeVersion(v1) + v2major, v2type, v2minor, ok2 := parseKubeVersion(v2) + switch { + case !ok1 && !ok2: + return strings.Compare(v2, v1) + case !ok1 && ok2: + return -1 + case ok1 && !ok2: + return 1 + } + if v1type != v2type { + return int(v1type) - int(v2type) + } + if v1major != v2major { + return v1major - v2major + } + return v1minor - v2minor +} diff --git a/vendor/k8s.io/apimachinery/pkg/version/helpers_test.go b/vendor/k8s.io/apimachinery/pkg/version/helpers_test.go new file mode 100644 index 000000000..863a53697 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/version/helpers_test.go @@ -0,0 +1,52 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package version + +import ( + "testing" +) + +func TestCompareKubeAwareVersionStrings(t *testing.T) { + tests := []*struct { + v1, v2 string + expectedGreater bool + }{ + {"v1", "v2", false}, + {"v2", "v1", true}, + {"v10", "v2", true}, + {"v1", "v2alpha1", true}, + {"v1", "v2beta1", true}, + {"v1alpha2", "v1alpha1", true}, + {"v1beta1", "v2alpha3", true}, + {"v1alpha10", "v1alpha2", true}, + {"v1beta10", "v1beta2", true}, + {"foo", "v1beta2", false}, + {"bar", "foo", true}, + {"version1", "version2", true}, // Non kube-like versions are sorted alphabetically + {"version1", "version10", true}, // Non kube-like versions are sorted alphabetically + } + + for _, tc := range tests { + if e, a := tc.expectedGreater, CompareKubeAwareVersionStrings(tc.v1, tc.v2) > 0; e != a { + if e { + t.Errorf("expected %s to be greater than %s", tc.v1, tc.v2) + } else { + t.Errorf("expected %s to be less than than %s", tc.v1, tc.v2) + } + } + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/watch/BUILD b/vendor/k8s.io/apimachinery/pkg/watch/BUILD deleted file mode 100644 index 3106af8f1..000000000 --- a/vendor/k8s.io/apimachinery/pkg/watch/BUILD +++ /dev/null @@ -1,69 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "filter.go", - "mux.go", - "streamwatcher.go", - "until.go", - "watch.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/apimachinery/pkg/watch", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = [ - "filter_test.go", - "mux_test.go", - "streamwatcher_test.go", - "watch_test.go", - ], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["until_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/pkg/watch/filter.go b/vendor/k8s.io/apimachinery/pkg/watch/filter.go index 3ca27f22c..22c9449f5 100644 --- a/vendor/k8s.io/apimachinery/pkg/watch/filter.go +++ b/vendor/k8s.io/apimachinery/pkg/watch/filter.go @@ -62,11 +62,7 @@ func (fw *filteredWatch) Stop() { // loop waits for new values, filters them, and resends them. func (fw *filteredWatch) loop() { defer close(fw.result) - for { - event, ok := <-fw.incoming.ResultChan() - if !ok { - break - } + for event := range fw.incoming.ResultChan() { filtered, keep := fw.f(event) if keep { fw.result <- filtered diff --git a/vendor/k8s.io/apimachinery/pkg/watch/mux.go b/vendor/k8s.io/apimachinery/pkg/watch/mux.go index a65088c1c..0ac8dc4ef 100644 --- a/vendor/k8s.io/apimachinery/pkg/watch/mux.go +++ b/vendor/k8s.io/apimachinery/pkg/watch/mux.go @@ -204,11 +204,7 @@ func (m *Broadcaster) Shutdown() { func (m *Broadcaster) loop() { // Deliberately not catching crashes here. Yes, bring down the process if there's a // bug in watch.Broadcaster. - for { - event, ok := <-m.incoming - if !ok { - break - } + for event := range m.incoming { if event.Type == internalRunFunctionMarker { event.Object.(functionFakeRuntimeObject)() continue diff --git a/vendor/k8s.io/apimachinery/pkg/watch/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/watch/zz_generated.deepcopy.go index b1b19d118..0d266ffb6 100644 --- a/vendor/k8s.io/apimachinery/pkg/watch/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/watch/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD deleted file mode 100644 index 7ece664d0..000000000 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["fields.go"], - importpath = "k8s.io/apimachinery/third_party/forked/golang/json", -) - -go_test( - name = "go_default_test", - srcs = ["fields_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD b/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD deleted file mode 100644 index 1df290578..000000000 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["addr.go"], - importpath = "k8s.io/apimachinery/third_party/forked/golang/netutil", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD b/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD deleted file mode 100644 index 22c8ec049..000000000 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["deep_equal_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["deep_equal.go"], - importpath = "k8s.io/apimachinery/third_party/forked/golang/reflect", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal.go b/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal.go index 9e45dbe1d..7ed1d1cff 100644 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal.go +++ b/vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal.go @@ -44,7 +44,7 @@ func (e Equalities) AddFunc(eqFunc interface{}) error { return fmt.Errorf("expected func, got: %v", ft) } if ft.NumIn() != 2 { - return fmt.Errorf("expected three 'in' params, got: %v", ft) + return fmt.Errorf("expected two 'in' params, got: %v", ft) } if ft.NumOut() != 1 { return fmt.Errorf("expected one 'out' param, got: %v", ft) diff --git a/vendor/k8s.io/client-go/.github/PULL_REQUEST_TEMPLATE.md b/vendor/k8s.io/client-go/.github/PULL_REQUEST_TEMPLATE.md index e559c074b..6aed9889c 100644 --- a/vendor/k8s.io/client-go/.github/PULL_REQUEST_TEMPLATE.md +++ b/vendor/k8s.io/client-go/.github/PULL_REQUEST_TEMPLATE.md @@ -1,2 +1,3 @@ -Sorry, we do not accept changes directly against this repository. Please see -CONTRIBUTING.md for information on where and how to contribute instead. +Sorry, we do not accept changes directly against this repository, unless the +change is to the `README.md` itself. Please see +`CONTRIBUTING.md` for information on where and how to contribute instead. diff --git a/vendor/k8s.io/client-go/CHANGELOG.md b/vendor/k8s.io/client-go/CHANGELOG.md index bfa8a453d..030611620 100644 --- a/vendor/k8s.io/client-go/CHANGELOG.md +++ b/vendor/k8s.io/client-go/CHANGELOG.md @@ -5,6 +5,119 @@ https://github.com/kubernetes/client-go/issues/234. Changes in `k8s.io/api` and `k8s.io/apimachinery` are mentioned here because `k8s.io/client-go` depends on them. +# v7.0.0 + +**Breaking Changes:** + +* Google Cloud Service Account email addresses can now be used in RBAC Role bindings since the default scopes now include the `userinfo.email` scope. This is a breaking change if the numeric uniqueIDs of the Google service accounts were being used in RBAC role bindings. The behavior can be overridden by explicitly specifying the scope values as comma-separated string in the `users[*].config.scopes` field in the `KUBECONFIG` file. + + * [https://github.com/kubernetes/kubernetes/pull/58141](https://github.com/kubernetes/kubernetes/pull/58141) + +* [k8s.io/api] The `ConfigOK` node condition has been renamed to `KubeletConfigOk`. + + * [https://github.com/kubernetes/kubernetes/pull/59905](https://github.com/kubernetes/kubernetes/pull/59905) + +**New Features:** + +* Subresource support is added to the dynamic client. + + * [https://github.com/kubernetes/kubernetes/pull/56717](https://github.com/kubernetes/kubernetes/pull/56717) + +* A watch method is added to the Fake Client. + + * [https://github.com/kubernetes/kubernetes/pull/57504](https://github.com/kubernetes/kubernetes/pull/57504) + +* `ListOptions` can be modified when creating a `ListWatch`. + + * [https://github.com/kubernetes/kubernetes/pull/57508](https://github.com/kubernetes/kubernetes/pull/57508) + +* A `/token` subresource for ServiceAccount is added. + + * [https://github.com/kubernetes/kubernetes/pull/58111](https://github.com/kubernetes/kubernetes/pull/58111) + +* If an informer delivery fails, the particular notification is skipped and continued the next time. + + * [https://github.com/kubernetes/kubernetes/pull/58394](https://github.com/kubernetes/kubernetes/pull/58394) + +* Certificate manager will no longer wait until the initial rotation succeeds or fails before returning from `Start()`. + + * [https://github.com/kubernetes/kubernetes/pull/58930](https://github.com/kubernetes/kubernetes/pull/58930) + +* [k8s.io/api] `VolumeScheduling` and `LocalPersistentVolume` features are beta and enabled by default. The PersistentVolume NodeAffinity alpha annotation is deprecated and will be removed in a future release. + + * [https://github.com/kubernetes/kubernetes/pull/59391](https://github.com/kubernetes/kubernetes/pull/59391) + +* [k8s.io/api] The `PodSecurityPolicy` API has been moved to the `policy/v1beta1` API group. The `PodSecurityPolicy` API in the `extensions/v1beta1` API group is deprecated and will be removed in a future release. + + * [https://github.com/kubernetes/kubernetes/pull/54933](https://github.com/kubernetes/kubernetes/pull/54933) + +* [k8s.io/api] ConfigMap objects now support binary data via a new `binaryData` field. + + * [https://github.com/kubernetes/kubernetes/pull/57938](https://github.com/kubernetes/kubernetes/pull/57938) + +* [k8s.io/api] Service account TokenRequest API is added. + + * [https://github.com/kubernetes/kubernetes/pull/58027](https://github.com/kubernetes/kubernetes/pull/58027) + +* [k8s.io/api] FSType is added in CSI volume source to specify filesystems. + + * [https://github.com/kubernetes/kubernetes/pull/58209](https://github.com/kubernetes/kubernetes/pull/58209) + +* [k8s.io/api] v1beta1 VolumeAttachment API is added. + + * [https://github.com/kubernetes/kubernetes/pull/58462](https://github.com/kubernetes/kubernetes/pull/58462) + +* [k8s.io/api] `v1.Pod` now has a field `ShareProcessNamespace` to configure whether a single process namespace should be shared between all containers in a pod. This feature is in alpha preview. + + * [https://github.com/kubernetes/kubernetes/pull/58716](https://github.com/kubernetes/kubernetes/pull/58716) + +* [k8s.io/api] Add `NominatedNodeName` field to `PodStatus`. This field is set when a pod preempts other pods on the node. + + * [https://github.com/kubernetes/kubernetes/pull/58990](https://github.com/kubernetes/kubernetes/pull/58990) + +* [k8s.io/api] Promote `CSIPersistentVolumeSourc`e to beta. + + * [https://github.com/kubernetes/kubernetes/pull/59157](https://github.com/kubernetes/kubernetes/pull/59157) + +* [k8s.io/api] Promote `DNSPolicy` and `DNSConfig` in `PodSpec` to beta. + + * [https://github.com/kubernetes/kubernetes/pull/59771](https://github.com/kubernetes/kubernetes/pull/59771) + +* [k8s.io/api] External metric types are added to the HPA API. + + * [https://github.com/kubernetes/kubernetes/pull/60096](https://github.com/kubernetes/kubernetes/pull/60096) + +* [k8s.io/apimachinery] The `meta.k8s.io/v1alpha1` objects for retrieving tabular responses from the server (`Table`) or fetching just the `ObjectMeta` for an object (as `PartialObjectMetadata`) are now beta as part of `meta.k8s.io/v1beta1`. Clients may request alternate representations of normal Kubernetes objects by passing an `Accept` header like `application/json;as=Table;g=meta.k8s.io;v=v1beta1` or `application/json;as=PartialObjectMetadata;g=meta.k8s.io;v1=v1beta1`. Older servers will ignore this representation or return an error if it is not available. Clients may request fallback to the normal object by adding a non-qualified mime-type to their `Accept` header like `application/json` - the server will then respond with either the alternate representation if it is supported or the fallback mime-type which is the normal object response. + + * [https://github.com/kubernetes/kubernetes/pull/59059](https://github.com/kubernetes/kubernetes/pull/59059) + + +**Bug fixes and Improvements:** + +* Port-forwarding of TCP6 ports is fixed. + + * [https://github.com/kubernetes/kubernetes/pull/57457](https://github.com/kubernetes/kubernetes/pull/57457) + +* A race condition in SharedInformer that could violate the sequential delivery guarantee and cause panics on shutdown is fixed. + + * [https://github.com/kubernetes/kubernetes/pull/59828](https://github.com/kubernetes/kubernetes/pull/59828) + +* [k8s.io/api] PersistentVolume flexVolume sources can now reference secrets in a namespace other than the PersistentVolumeClaim's namespace. + + * [https://github.com/kubernetes/kubernetes/pull/56460](https://github.com/kubernetes/kubernetes/pull/56460) + +* [k8s.io/apimachinery] YAMLDecoder Read can now return the number of bytes read. + + * [https://github.com/kubernetes/kubernetes/pull/57000](https://github.com/kubernetes/kubernetes/pull/57000) + +* [k8s.io/apimachinery] YAMLDecoder Read now tracks rest of buffer on `io.ErrShortBuffer`. + + * [https://github.com/kubernetes/kubernetes/pull/58817](https://github.com/kubernetes/kubernetes/pull/58817) + +* [k8s.io/apimachinery] Prompt required merge key in the error message while applying a strategic merge patch. + + * [https://github.com/kubernetes/kubernetes/pull/57854](https://github.com/kubernetes/kubernetes/pull/57854) + # v6.0.0 **Breaking Changes:** diff --git a/vendor/k8s.io/client-go/Godeps/Godeps.json b/vendor/k8s.io/client-go/Godeps/Godeps.json index 3598fddc7..779a338f1 100644 --- a/vendor/k8s.io/client-go/Godeps/Godeps.json +++ b/vendor/k8s.io/client-go/Godeps/Godeps.json @@ -1,7 +1,7 @@ { "ImportPath": "k8s.io/client-go", "GoVersion": "go1.9", - "GodepVersion": "v79", + "GodepVersion": "v80", "Packages": [ "./..." ], @@ -16,19 +16,19 @@ }, { "ImportPath": "github.com/Azure/go-autorest/autorest", - "Rev": "d4e6b95c12a08b4de2d48b45d5b4d594e5d32fab" + "Rev": "1ff28809256a84bb6966640ff3d0371af82ccba4" }, { "ImportPath": "github.com/Azure/go-autorest/autorest/adal", - "Rev": "d4e6b95c12a08b4de2d48b45d5b4d594e5d32fab" + "Rev": "1ff28809256a84bb6966640ff3d0371af82ccba4" }, { "ImportPath": "github.com/Azure/go-autorest/autorest/azure", - "Rev": "d4e6b95c12a08b4de2d48b45d5b4d594e5d32fab" + "Rev": "1ff28809256a84bb6966640ff3d0371af82ccba4" }, { "ImportPath": "github.com/Azure/go-autorest/autorest/date", - "Rev": "d4e6b95c12a08b4de2d48b45d5b4d594e5d32fab" + "Rev": "1ff28809256a84bb6966640ff3d0371af82ccba4" }, { "ImportPath": "github.com/davecgh/go-spew/spew", @@ -68,23 +68,27 @@ }, { "ImportPath": "github.com/golang/protobuf/proto", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/golang/protobuf/ptypes", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/golang/protobuf/ptypes/any", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/golang/protobuf/ptypes/duration", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" }, { "ImportPath": "github.com/golang/protobuf/ptypes/timestamp", - "Rev": "1643683e1b54a9e88ad26d98f81400c8c9d9f4f9" + "Rev": "b4deda0973fb4c70b50d226b1af49f3da59f5265" + }, + { + "ImportPath": "github.com/google/btree", + "Rev": "7d79101e329e5a3adf994758c578dab82b90c017" }, { "ImportPath": "github.com/google/gofuzz", @@ -104,31 +108,39 @@ }, { "ImportPath": "github.com/gophercloud/gophercloud", - "Rev": "6da026c32e2d622cc242d32984259c77237aefe1" + "Rev": "781450b3c4fcb4f5182bcc5133adb4b2e4a09d1d" }, { "ImportPath": "github.com/gophercloud/gophercloud/openstack", - "Rev": "6da026c32e2d622cc242d32984259c77237aefe1" + "Rev": "781450b3c4fcb4f5182bcc5133adb4b2e4a09d1d" }, { "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tenants", - "Rev": "6da026c32e2d622cc242d32984259c77237aefe1" + "Rev": "781450b3c4fcb4f5182bcc5133adb4b2e4a09d1d" }, { "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v2/tokens", - "Rev": "6da026c32e2d622cc242d32984259c77237aefe1" + "Rev": "781450b3c4fcb4f5182bcc5133adb4b2e4a09d1d" }, { "ImportPath": "github.com/gophercloud/gophercloud/openstack/identity/v3/tokens", - "Rev": "6da026c32e2d622cc242d32984259c77237aefe1" + "Rev": "781450b3c4fcb4f5182bcc5133adb4b2e4a09d1d" }, { "ImportPath": "github.com/gophercloud/gophercloud/openstack/utils", - "Rev": "6da026c32e2d622cc242d32984259c77237aefe1" + "Rev": "781450b3c4fcb4f5182bcc5133adb4b2e4a09d1d" }, { "ImportPath": "github.com/gophercloud/gophercloud/pagination", - "Rev": "6da026c32e2d622cc242d32984259c77237aefe1" + "Rev": "781450b3c4fcb4f5182bcc5133adb4b2e4a09d1d" + }, + { + "ImportPath": "github.com/gregjones/httpcache", + "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" + }, + { + "ImportPath": "github.com/gregjones/httpcache/diskcache", + "Rev": "787624de3eb7bd915c329cba748687a3b22666a6" }, { "ImportPath": "github.com/hashicorp/golang-lru", @@ -138,17 +150,25 @@ "ImportPath": "github.com/hashicorp/golang-lru/simplelru", "Rev": "a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4" }, - { - "ImportPath": "github.com/howeyc/gopass", - "Rev": "bf9dde6d0d2c004a008c27aaee91170c786f6db8" - }, { "ImportPath": "github.com/imdario/mergo", "Rev": "6633656539c1639d9d78127b7d47c622b5d7b6dc" }, { "ImportPath": "github.com/json-iterator/go", - "Rev": "13f86432b882000a51c6e610c620974462691a97" + "Rev": "f2b4162afba35581b6d4a50d3b8f34e33c144682" + }, + { + "ImportPath": "github.com/modern-go/concurrent", + "Rev": "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" + }, + { + "ImportPath": "github.com/modern-go/reflect2", + "Rev": "05fbef0ca5da472bbf96c9322b84a53edc03c9fd" + }, + { + "ImportPath": "github.com/peterbourgon/diskv", + "Rev": "5f041e8faa004a95c88a202771f4cc3e991971e6" }, { "ImportPath": "github.com/pmezard/go-difflib/difflib", @@ -156,15 +176,15 @@ }, { "ImportPath": "github.com/spf13/pflag", - "Rev": "4c012f6dcd9546820e378d0bdda4d8fc772cdfea" + "Rev": "583c0c0531f06d5278b7d917446061adc344b5cd" }, { "ImportPath": "github.com/stretchr/testify/assert", - "Rev": "f6abca593680b2315d2075e0f5e2a9751e3f431a" + "Rev": "c679ae2cc0cb27ec3293fea7e254e47386f05d69" }, { "ImportPath": "golang.org/x/crypto/ssh/terminal", - "Rev": "81e90905daefcd6fd217b62423c0908922eadb30" + "Rev": "49796115aa4b964c318aad4f3084fdb41e9aa067" }, { "ImportPath": "golang.org/x/net/context", @@ -248,335 +268,327 @@ }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/admissionregistration/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/events/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/imagepolicy/v1alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" + }, + { + "ImportPath": "k8s.io/api/scheduling/v1beta1", + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/storage/v1alpha1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "73d903622b7391f3312dcbac6483fed484e185f8" + "Rev": "072894a440bdee3a891dea811fe42902311cd2a3" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/testing", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/testing/fuzzer", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/testing/roundtrip", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/apimachinery", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/announced", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" - }, - { - "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/registered", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "302974c03f7e50f16561ba237db776ab93594ef6" + "Rev": "103fd098999dc9c0c88536f5c9ad2e5da39373ae" }, { "ImportPath": "k8s.io/kube-openapi/pkg/util/proto", - "Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" + "Rev": "91cfa479c814065e420cee7ed227db0f63a5854e" } ] } diff --git a/vendor/k8s.io/client-go/OWNERS b/vendor/k8s.io/client-go/OWNERS index 44a4c9e1f..b39916829 100644 --- a/vendor/k8s.io/client-go/OWNERS +++ b/vendor/k8s.io/client-go/OWNERS @@ -1,44 +1,15 @@ approvers: - caesarxuchao - deads2k -- krousey - lavalamp +- liggitt - smarterclayton - sttts -- liggitt reviewers: -- thockin -- lavalamp -- smarterclayton -- wojtek-t -- deads2k -- yujuhong -- derekwaynecarr - caesarxuchao -- vishh -- mikedanese +- deads2k +- lavalamp - liggitt -- nikhiljindal -- gmarek -- erictune -- davidopp -- pmorie -- sttts -- dchen1107 -- saad-ali -- zmerlynn -- luxas -- janetkuo -- justinsb -- roberthbailey -- ncdc -- tallclair -- yifan-gu -- eparis -- mwielgus -- timothysc -- feiskyer -- jlowdermilk - soltysh -- piosz -- jsafrane +- sttts +- yliaog diff --git a/vendor/k8s.io/client-go/README.md b/vendor/k8s.io/client-go/README.md index 82f41d738..4e5e42207 100644 --- a/vendor/k8s.io/client-go/README.md +++ b/vendor/k8s.io/client-go/README.md @@ -2,7 +2,7 @@ Go clients for talking to a [kubernetes](http://kubernetes.io/) cluster. -We currently recommend using the v6.0.0 tag. See [INSTALL.md](/INSTALL.md) for +We currently recommend using the v7.0.0 tag. See [INSTALL.md](/INSTALL.md) for detailed installation instructions. `go get k8s.io/client-go/...` works, but will give you head and doesn't handle the dependencies well. @@ -91,16 +91,17 @@ We will backport bugfixes--but not new features--into older versions of #### Compatibility matrix -| | Kubernetes 1.4 | Kubernetes 1.5 | Kubernetes 1.6 | Kubernetes 1.7 | Kubernetes 1.8 | Kubernetes 1.9 | -|---------------------|----------------|----------------|----------------|----------------|----------------|----------------| -| client-go 1.4 | ✓ | - | - | - | - | - | -| client-go 1.5 | + | - | - | - | - | - | -| client-go 2.0 | +- | ✓ | +- | +- | +- | +- | -| client-go 3.0 | +- | +- | ✓ | - | +- | +- | -| client-go 4.0 | +- | +- | +- | ✓ | +- | +- | -| client-go 5.0 | +- | +- | +- | +- | ✓ | +- | -| client-go 6.0 | +- | +- | +- | +- | +- | ✓ | -| client-go HEAD | +- | +- | +- | +- | +- | + | +| | Kubernetes 1.4 | Kubernetes 1.5 | Kubernetes 1.6 | Kubernetes 1.7 | Kubernetes 1.8 | Kubernetes 1.9 | Kubernetes 1.10 | +|---------------------|----------------|----------------|----------------|----------------|----------------|----------------|-----------------| +| client-go 1.4 | ✓ | - | - | - | - | - | - | +| client-go 1.5 | + | - | - | - | - | - | - | +| client-go 2.0 | +- | ✓ | +- | +- | +- | +- | +- | +| client-go 3.0 | +- | +- | ✓ | - | +- | +- | +- | +| client-go 4.0 | +- | +- | +- | ✓ | +- | +- | +- | +| client-go 5.0 | +- | +- | +- | +- | ✓ | +- | +- | +| client-go 6.0 | +- | +- | +- | +- | +- | ✓ | +- | +| client-go 7.0 | +- | +- | +- | +- | +- | +- | ✓ | +| client-go HEAD | +- | +- | +- | +- | +- | + | + | Key: @@ -125,9 +126,10 @@ between client-go versions. | client-go 1.5 | Kubernetes main repo, 1.5 branch | = - | | client-go 2.0 | Kubernetes main repo, 1.5 branch | = - | | client-go 3.0 | Kubernetes main repo, 1.6 branch | = - | -| client-go 4.0 | Kubernetes main repo, 1.7 branch | ✓ | +| client-go 4.0 | Kubernetes main repo, 1.7 branch | = - | | client-go 5.0 | Kubernetes main repo, 1.8 branch | ✓ | | client-go 6.0 | Kubernetes main repo, 1.9 branch | ✓ | +| client-go 7.0 | Kubernetes main repo, 1.10 branch | ✓ | | client-go HEAD | Kubernetes main repo, master branch | ✓ | Key: @@ -152,7 +154,7 @@ existing users won't be broken. ### Kubernetes tags -As of October 2017, client-go is still a mirror of +As of April 2018, client-go is still a mirror of [k8s.io/kubernetes/staging/src/client-go](https://github.com/kubernetes/kubernetes/tree/master/staging/src/k8s.io/client-go), the code development is still done in the staging area. Since Kubernetes 1.8 release, when syncing the code from the staging area, we also sync the Kubernetes diff --git a/vendor/k8s.io/client-go/SECURITY_CONTACTS b/vendor/k8s.io/client-go/SECURITY_CONTACTS new file mode 100644 index 000000000..0648a8ebf --- /dev/null +++ b/vendor/k8s.io/client-go/SECURITY_CONTACTS @@ -0,0 +1,17 @@ +# Defined below are the security contacts for this repo. +# +# They are the contact point for the Product Security Team to reach out +# to for triaging and handling of incoming issues. +# +# The below names agree to abide by the +# [Embargo Policy](https://github.com/kubernetes/sig-release/blob/master/security-release-process-documentation/security-release-process.md#embargo-policy) +# and will be removed and replaced if they violate that agreement. +# +# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE +# INSTRUCTIONS AT https://kubernetes.io/security/ + +cjcullen +jessfraz +liggitt +philips +tallclair diff --git a/vendor/k8s.io/client-go/deprecated-dynamic/bad_debt.go b/vendor/k8s.io/client-go/deprecated-dynamic/bad_debt.go new file mode 100644 index 000000000..51e4a5830 --- /dev/null +++ b/vendor/k8s.io/client-go/deprecated-dynamic/bad_debt.go @@ -0,0 +1,79 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package deprecated_dynamic + +import ( + "encoding/json" + "io" + "strings" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" +) + +// dynamicCodec is a codec that wraps the standard unstructured codec +// with special handling for Status objects. +// Deprecated only used by test code and its wrong +type dynamicCodec struct{} + +func (dynamicCodec) Decode(data []byte, gvk *schema.GroupVersionKind, obj runtime.Object) (runtime.Object, *schema.GroupVersionKind, error) { + obj, gvk, err := unstructured.UnstructuredJSONScheme.Decode(data, gvk, obj) + if err != nil { + return nil, nil, err + } + + if _, ok := obj.(*metav1.Status); !ok && strings.ToLower(gvk.Kind) == "status" { + obj = &metav1.Status{} + err := json.Unmarshal(data, obj) + if err != nil { + return nil, nil, err + } + } + + return obj, gvk, nil +} + +func (dynamicCodec) Encode(obj runtime.Object, w io.Writer) error { + return unstructured.UnstructuredJSONScheme.Encode(obj, w) +} + +// ContentConfig returns a rest.ContentConfig for dynamic types. +// Deprecated only used by test code and its wrong +func ContentConfig() rest.ContentConfig { + var jsonInfo runtime.SerializerInfo + // TODO: scheme.Codecs here should become "pkg/apis/server/scheme" which is the minimal core you need + // to talk to a kubernetes server + for _, info := range scheme.Codecs.SupportedMediaTypes() { + if info.MediaType == runtime.ContentTypeJSON { + jsonInfo = info + break + } + } + + jsonInfo.Serializer = dynamicCodec{} + jsonInfo.PrettySerializer = nil + return rest.ContentConfig{ + AcceptContentTypes: runtime.ContentTypeJSON, + ContentType: runtime.ContentTypeJSON, + NegotiatedSerializer: serializer.NegotiatedSerializerWrapper(jsonInfo), + } +} diff --git a/vendor/k8s.io/client-go/deprecated-dynamic/client.go b/vendor/k8s.io/client-go/deprecated-dynamic/client.go new file mode 100644 index 000000000..0974fe64d --- /dev/null +++ b/vendor/k8s.io/client-go/deprecated-dynamic/client.go @@ -0,0 +1,131 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package dynamic provides a client interface to arbitrary Kubernetes +// APIs that exposes common high level operations and exposes common +// metadata. +package deprecated_dynamic + +import ( + "strings" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/dynamic" + restclient "k8s.io/client-go/rest" +) + +// Interface is a Kubernetes client that allows you to access metadata +// and manipulate metadata of a Kubernetes API group. +type Interface interface { + // Resource returns an API interface to the specified resource for this client's + // group and version. If resource is not a namespaced resource, then namespace + // is ignored. The ResourceInterface inherits the parameter codec of this client. + Resource(resource *metav1.APIResource, namespace string) ResourceInterface +} + +// ResourceInterface is an API interface to a specific resource under a +// dynamic client. +type ResourceInterface interface { + // List returns a list of objects for this resource. + List(opts metav1.ListOptions) (runtime.Object, error) + // Get gets the resource with the specified name. + Get(name string, opts metav1.GetOptions) (*unstructured.Unstructured, error) + // Delete deletes the resource with the specified name. + Delete(name string, opts *metav1.DeleteOptions) error + // DeleteCollection deletes a collection of objects. + DeleteCollection(deleteOptions *metav1.DeleteOptions, listOptions metav1.ListOptions) error + // Create creates the provided resource. + Create(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) + // Update updates the provided resource. + Update(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) + // Watch returns a watch.Interface that watches the resource. + Watch(opts metav1.ListOptions) (watch.Interface, error) + // Patch patches the provided resource. + Patch(name string, pt types.PatchType, data []byte) (*unstructured.Unstructured, error) +} + +// Client is a Kubernetes client that allows you to access metadata +// and manipulate metadata of a Kubernetes API group, and implements Interface. +type Client struct { + version schema.GroupVersion + delegate dynamic.Interface +} + +// NewClient returns a new client based on the passed in config. The +// codec is ignored, as the dynamic client uses it's own codec. +func NewClient(conf *restclient.Config, version schema.GroupVersion) (*Client, error) { + delegate, err := dynamic.NewForConfig(conf) + if err != nil { + return nil, err + } + + return &Client{version: version, delegate: delegate}, nil +} + +// Resource returns an API interface to the specified resource for this client's +// group and version. If resource is not a namespaced resource, then namespace +// is ignored. The ResourceInterface inherits the parameter codec of c. +func (c *Client) Resource(resource *metav1.APIResource, namespace string) ResourceInterface { + resourceTokens := strings.SplitN(resource.Name, "/", 2) + subresources := []string{} + if len(resourceTokens) > 1 { + subresources = strings.Split(resourceTokens[1], "/") + } + + if len(namespace) == 0 { + return oldResourceShim(c.delegate.Resource(c.version.WithResource(resourceTokens[0])), subresources) + } + return oldResourceShim(c.delegate.Resource(c.version.WithResource(resourceTokens[0])).Namespace(namespace), subresources) +} + +// the old interfaces used the wrong type for lists. this fixes that +func oldResourceShim(in dynamic.ResourceInterface, subresources []string) ResourceInterface { + return oldResourceShimType{ResourceInterface: in, subresources: subresources} +} + +type oldResourceShimType struct { + dynamic.ResourceInterface + subresources []string +} + +func (s oldResourceShimType) Create(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { + return s.ResourceInterface.Create(obj, s.subresources...) +} + +func (s oldResourceShimType) Update(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { + return s.ResourceInterface.Update(obj, s.subresources...) +} + +func (s oldResourceShimType) Delete(name string, opts *metav1.DeleteOptions) error { + return s.ResourceInterface.Delete(name, opts, s.subresources...) +} + +func (s oldResourceShimType) Get(name string, opts metav1.GetOptions) (*unstructured.Unstructured, error) { + return s.ResourceInterface.Get(name, opts, s.subresources...) +} + +func (s oldResourceShimType) List(opts metav1.ListOptions) (runtime.Object, error) { + return s.ResourceInterface.List(opts) +} + +func (s oldResourceShimType) Patch(name string, pt types.PatchType, data []byte) (*unstructured.Unstructured, error) { + return s.ResourceInterface.Patch(name, pt, data, s.subresources...) +} diff --git a/vendor/k8s.io/client-go/dynamic/client_pool.go b/vendor/k8s.io/client-go/deprecated-dynamic/client_pool.go similarity index 98% rename from vendor/k8s.io/client-go/dynamic/client_pool.go rename to vendor/k8s.io/client-go/deprecated-dynamic/client_pool.go index a5e1b2978..36dc54ce4 100644 --- a/vendor/k8s.io/client-go/dynamic/client_pool.go +++ b/vendor/k8s.io/client-go/deprecated-dynamic/client_pool.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package dynamic +package deprecated_dynamic import ( "sync" @@ -113,7 +113,7 @@ func (c *clientPoolImpl) ClientForGroupVersionKind(kind schema.GroupVersionKind) // we need to make a client conf.GroupVersion = &gv - dynamicClient, err := NewClient(conf) + dynamicClient, err := NewClient(conf, gv) if err != nil { return nil, err } diff --git a/vendor/k8s.io/client-go/deprecated-dynamic/client_test.go b/vendor/k8s.io/client-go/deprecated-dynamic/client_test.go new file mode 100644 index 000000000..790474522 --- /dev/null +++ b/vendor/k8s.io/client-go/deprecated-dynamic/client_test.go @@ -0,0 +1,623 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package deprecated_dynamic + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http" + "net/http/httptest" + "reflect" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer/streaming" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/watch" + restclient "k8s.io/client-go/rest" + restclientwatch "k8s.io/client-go/rest/watch" +) + +func getJSON(version, kind, name string) []byte { + return []byte(fmt.Sprintf(`{"apiVersion": %q, "kind": %q, "metadata": {"name": %q}}`, version, kind, name)) +} + +func getListJSON(version, kind string, items ...[]byte) []byte { + json := fmt.Sprintf(`{"apiVersion": %q, "kind": %q, "items": [%s]}`, + version, kind, bytes.Join(items, []byte(","))) + return []byte(json) +} + +func getObject(version, kind, name string) *unstructured.Unstructured { + return &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": version, + "kind": kind, + "metadata": map[string]interface{}{ + "name": name, + }, + }, + } +} + +func getClientServer(gv *schema.GroupVersion, h func(http.ResponseWriter, *http.Request)) (Interface, *httptest.Server, error) { + srv := httptest.NewServer(http.HandlerFunc(h)) + cl, err := NewClient(&restclient.Config{ + Host: srv.URL, + ContentConfig: restclient.ContentConfig{GroupVersion: gv}, + }, *gv) + if err != nil { + srv.Close() + return nil, nil, err + } + return cl, srv, nil +} + +func TestList(t *testing.T) { + tcs := []struct { + name string + namespace string + path string + resp []byte + want *unstructured.UnstructuredList + }{ + { + name: "normal_list", + path: "/apis/gtest/vtest/rtest", + resp: getListJSON("vTest", "rTestList", + getJSON("vTest", "rTest", "item1"), + getJSON("vTest", "rTest", "item2")), + want: &unstructured.UnstructuredList{ + Object: map[string]interface{}{ + "apiVersion": "vTest", + "kind": "rTestList", + }, + Items: []unstructured.Unstructured{ + *getObject("vTest", "rTest", "item1"), + *getObject("vTest", "rTest", "item2"), + }, + }, + }, + { + name: "namespaced_list", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest", + resp: getListJSON("vTest", "rTestList", + getJSON("vTest", "rTest", "item1"), + getJSON("vTest", "rTest", "item2")), + want: &unstructured.UnstructuredList{ + Object: map[string]interface{}{ + "apiVersion": "vTest", + "kind": "rTestList", + }, + Items: []unstructured.Unstructured{ + *getObject("vTest", "rTest", "item1"), + *getObject("vTest", "rTest", "item2"), + }, + }, + }, + } + for _, tc := range tcs { + gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} + resource := &metav1.APIResource{Name: "rtest", Namespaced: len(tc.namespace) != 0} + cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + t.Errorf("List(%q) got HTTP method %s. wanted GET", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("List(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + w.Write(tc.resp) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + got, err := cl.Resource(resource, tc.namespace).List(metav1.ListOptions{}) + if err != nil { + t.Errorf("unexpected error when listing %q: %v", tc.name, err) + continue + } + + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("List(%q) want: %v\ngot: %v", tc.name, tc.want, got) + } + } +} + +func TestGet(t *testing.T) { + tcs := []struct { + resource string + namespace string + name string + path string + resp []byte + want *unstructured.Unstructured + }{ + { + resource: "rtest", + name: "normal_get", + path: "/apis/gtest/vtest/rtest/normal_get", + resp: getJSON("vTest", "rTest", "normal_get"), + want: getObject("vTest", "rTest", "normal_get"), + }, + { + resource: "rtest", + namespace: "nstest", + name: "namespaced_get", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_get", + resp: getJSON("vTest", "rTest", "namespaced_get"), + want: getObject("vTest", "rTest", "namespaced_get"), + }, + { + resource: "rtest/srtest", + name: "normal_subresource_get", + path: "/apis/gtest/vtest/rtest/normal_subresource_get/srtest", + resp: getJSON("vTest", "srTest", "normal_subresource_get"), + want: getObject("vTest", "srTest", "normal_subresource_get"), + }, + { + resource: "rtest/srtest", + namespace: "nstest", + name: "namespaced_subresource_get", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_get/srtest", + resp: getJSON("vTest", "srTest", "namespaced_subresource_get"), + want: getObject("vTest", "srTest", "namespaced_subresource_get"), + }, + } + for _, tc := range tcs { + gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} + resource := &metav1.APIResource{Name: tc.resource, Namespaced: len(tc.namespace) != 0} + cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + t.Errorf("Get(%q) got HTTP method %s. wanted GET", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Get(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + w.Write(tc.resp) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + got, err := cl.Resource(resource, tc.namespace).Get(tc.name, metav1.GetOptions{}) + if err != nil { + t.Errorf("unexpected error when getting %q: %v", tc.name, err) + continue + } + + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("Get(%q) want: %v\ngot: %v", tc.name, tc.want, got) + } + } +} + +func TestDelete(t *testing.T) { + background := metav1.DeletePropagationBackground + uid := types.UID("uid") + + statusOK := &metav1.Status{ + TypeMeta: metav1.TypeMeta{Kind: "Status"}, + Status: metav1.StatusSuccess, + } + tcs := []struct { + namespace string + name string + path string + deleteOptions *metav1.DeleteOptions + }{ + { + name: "normal_delete", + path: "/apis/gtest/vtest/rtest/normal_delete", + }, + { + namespace: "nstest", + name: "namespaced_delete", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_delete", + }, + { + namespace: "nstest", + name: "namespaced_delete_with_options", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_delete_with_options", + deleteOptions: &metav1.DeleteOptions{Preconditions: &metav1.Preconditions{UID: &uid}, PropagationPolicy: &background}, + }, + } + for _, tc := range tcs { + gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} + resource := &metav1.APIResource{Name: "rtest", Namespaced: len(tc.namespace) != 0} + cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "DELETE" { + t.Errorf("Delete(%q) got HTTP method %s. wanted DELETE", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Delete(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + unstructured.UnstructuredJSONScheme.Encode(statusOK, w) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + err = cl.Resource(resource, tc.namespace).Delete(tc.name, tc.deleteOptions) + if err != nil { + t.Errorf("unexpected error when deleting %q: %v", tc.name, err) + continue + } + } +} + +func TestDeleteCollection(t *testing.T) { + statusOK := &metav1.Status{ + TypeMeta: metav1.TypeMeta{Kind: "Status"}, + Status: metav1.StatusSuccess, + } + tcs := []struct { + namespace string + name string + path string + }{ + { + name: "normal_delete_collection", + path: "/apis/gtest/vtest/rtest", + }, + { + namespace: "nstest", + name: "namespaced_delete_collection", + path: "/apis/gtest/vtest/namespaces/nstest/rtest", + }, + } + for _, tc := range tcs { + gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} + resource := &metav1.APIResource{Name: "rtest", Namespaced: len(tc.namespace) != 0} + cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "DELETE" { + t.Errorf("DeleteCollection(%q) got HTTP method %s. wanted DELETE", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("DeleteCollection(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + unstructured.UnstructuredJSONScheme.Encode(statusOK, w) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + err = cl.Resource(resource, tc.namespace).DeleteCollection(nil, metav1.ListOptions{}) + if err != nil { + t.Errorf("unexpected error when deleting collection %q: %v", tc.name, err) + continue + } + } +} + +func TestCreate(t *testing.T) { + tcs := []struct { + resource string + name string + namespace string + obj *unstructured.Unstructured + path string + }{ + { + resource: "rtest", + name: "normal_create", + path: "/apis/gtest/vtest/rtest", + obj: getObject("gtest/vTest", "rTest", "normal_create"), + }, + { + resource: "rtest", + name: "namespaced_create", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest", + obj: getObject("gtest/vTest", "rTest", "namespaced_create"), + }, + } + for _, tc := range tcs { + gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} + resource := &metav1.APIResource{Name: tc.resource, Namespaced: len(tc.namespace) != 0} + cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + t.Errorf("Create(%q) got HTTP method %s. wanted POST", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Create(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + data, err := ioutil.ReadAll(r.Body) + if err != nil { + t.Errorf("Create(%q) unexpected error reading body: %v", tc.name, err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.Write(data) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + got, err := cl.Resource(resource, tc.namespace).Create(tc.obj) + if err != nil { + t.Errorf("unexpected error when creating %q: %v", tc.name, err) + continue + } + + if !reflect.DeepEqual(got, tc.obj) { + t.Errorf("Create(%q) want: %v\ngot: %v", tc.name, tc.obj, got) + } + } +} + +func TestUpdate(t *testing.T) { + tcs := []struct { + resource string + name string + namespace string + obj *unstructured.Unstructured + path string + }{ + { + resource: "rtest", + name: "normal_update", + path: "/apis/gtest/vtest/rtest/normal_update", + obj: getObject("gtest/vTest", "rTest", "normal_update"), + }, + { + resource: "rtest", + name: "namespaced_update", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_update", + obj: getObject("gtest/vTest", "rTest", "namespaced_update"), + }, + { + resource: "rtest/srtest", + name: "normal_subresource_update", + path: "/apis/gtest/vtest/rtest/normal_update/srtest", + obj: getObject("gtest/vTest", "srTest", "normal_update"), + }, + { + resource: "rtest/srtest", + name: "namespaced_subresource_update", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_update/srtest", + obj: getObject("gtest/vTest", "srTest", "namespaced_update"), + }, + } + for _, tc := range tcs { + gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} + resource := &metav1.APIResource{Name: tc.resource, Namespaced: len(tc.namespace) != 0} + cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "PUT" { + t.Errorf("Update(%q) got HTTP method %s. wanted PUT", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Update(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + w.Header().Set("Content-Type", runtime.ContentTypeJSON) + data, err := ioutil.ReadAll(r.Body) + if err != nil { + t.Errorf("Update(%q) unexpected error reading body: %v", tc.name, err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.Write(data) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + got, err := cl.Resource(resource, tc.namespace).Update(tc.obj) + if err != nil { + t.Errorf("unexpected error when updating %q: %v", tc.name, err) + continue + } + + if !reflect.DeepEqual(got, tc.obj) { + t.Errorf("Update(%q) want: %v\ngot: %v", tc.name, tc.obj, got) + } + } +} + +func TestWatch(t *testing.T) { + tcs := []struct { + name string + namespace string + events []watch.Event + path string + query string + }{ + { + name: "normal_watch", + path: "/apis/gtest/vtest/rtest", + query: "watch=true", + events: []watch.Event{ + {Type: watch.Added, Object: getObject("gtest/vTest", "rTest", "normal_watch")}, + {Type: watch.Modified, Object: getObject("gtest/vTest", "rTest", "normal_watch")}, + {Type: watch.Deleted, Object: getObject("gtest/vTest", "rTest", "normal_watch")}, + }, + }, + { + name: "namespaced_watch", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest", + query: "watch=true", + events: []watch.Event{ + {Type: watch.Added, Object: getObject("gtest/vTest", "rTest", "namespaced_watch")}, + {Type: watch.Modified, Object: getObject("gtest/vTest", "rTest", "namespaced_watch")}, + {Type: watch.Deleted, Object: getObject("gtest/vTest", "rTest", "namespaced_watch")}, + }, + }, + } + for _, tc := range tcs { + gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} + resource := &metav1.APIResource{Name: "rtest", Namespaced: len(tc.namespace) != 0} + cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + t.Errorf("Watch(%q) got HTTP method %s. wanted GET", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Watch(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + if r.URL.RawQuery != tc.query { + t.Errorf("Watch(%q) got query %s. wanted %s", tc.name, r.URL.RawQuery, tc.query) + } + + enc := restclientwatch.NewEncoder(streaming.NewEncoder(w, dynamicCodec{}), dynamicCodec{}) + for _, e := range tc.events { + enc.Encode(&e) + } + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + watcher, err := cl.Resource(resource, tc.namespace).Watch(metav1.ListOptions{}) + if err != nil { + t.Errorf("unexpected error when watching %q: %v", tc.name, err) + continue + } + + for _, want := range tc.events { + got := <-watcher.ResultChan() + if !reflect.DeepEqual(got, want) { + t.Errorf("Watch(%q) want: %v\ngot: %v", tc.name, want, got) + } + } + } +} + +func TestPatch(t *testing.T) { + tcs := []struct { + resource string + name string + namespace string + patch []byte + want *unstructured.Unstructured + path string + }{ + { + resource: "rtest", + name: "normal_patch", + path: "/apis/gtest/vtest/rtest/normal_patch", + patch: getJSON("gtest/vTest", "rTest", "normal_patch"), + want: getObject("gtest/vTest", "rTest", "normal_patch"), + }, + { + resource: "rtest", + name: "namespaced_patch", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_patch", + patch: getJSON("gtest/vTest", "rTest", "namespaced_patch"), + want: getObject("gtest/vTest", "rTest", "namespaced_patch"), + }, + { + resource: "rtest/srtest", + name: "normal_subresource_patch", + path: "/apis/gtest/vtest/rtest/normal_subresource_patch/srtest", + patch: getJSON("gtest/vTest", "srTest", "normal_subresource_patch"), + want: getObject("gtest/vTest", "srTest", "normal_subresource_patch"), + }, + { + resource: "rtest/srtest", + name: "namespaced_subresource_patch", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_patch/srtest", + patch: getJSON("gtest/vTest", "srTest", "namespaced_subresource_patch"), + want: getObject("gtest/vTest", "srTest", "namespaced_subresource_patch"), + }, + } + for _, tc := range tcs { + gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} + resource := &metav1.APIResource{Name: tc.resource, Namespaced: len(tc.namespace) != 0} + cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + if r.Method != "PATCH" { + t.Errorf("Patch(%q) got HTTP method %s. wanted PATCH", tc.name, r.Method) + } + + if r.URL.Path != tc.path { + t.Errorf("Patch(%q) got path %s. wanted %s", tc.name, r.URL.Path, tc.path) + } + + content := r.Header.Get("Content-Type") + if content != string(types.StrategicMergePatchType) { + t.Errorf("Patch(%q) got Content-Type %s. wanted %s", tc.name, content, types.StrategicMergePatchType) + } + + data, err := ioutil.ReadAll(r.Body) + if err != nil { + t.Errorf("Patch(%q) unexpected error reading body: %v", tc.name, err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + w.Write(data) + }) + if err != nil { + t.Errorf("unexpected error when creating client: %v", err) + continue + } + defer srv.Close() + + got, err := cl.Resource(resource, tc.namespace).Patch(tc.name, types.StrategicMergePatchType, tc.patch) + if err != nil { + t.Errorf("unexpected error when patching %q: %v", tc.name, err) + continue + } + + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("Patch(%q) want: %v\ngot: %v", tc.name, tc.want, got) + } + } +} diff --git a/vendor/k8s.io/client-go/discovery/BUILD b/vendor/k8s.io/client-go/discovery/BUILD deleted file mode 100644 index 19523ba53..000000000 --- a/vendor/k8s.io/client-go/discovery/BUILD +++ /dev/null @@ -1,75 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "discovery_client.go", - "helper.go", - "restmapper.go", - "unstructured.go", - ], - importpath = "k8s.io/client-go/discovery", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/golang/protobuf/proto:go_default_library", - "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/version:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = [ - "discovery_client_test.go", - "helper_blackbox_test.go", - "restmapper_test.go", - ], - deps = [ - "//vendor/github.com/gogo/protobuf/proto:go_default_library", - "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/version:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/rest/fake:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/discovery/cached:all-srcs", - "//staging/src/k8s.io/client-go/discovery/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/discovery/cached/BUILD b/vendor/k8s.io/client-go/discovery/cached/BUILD deleted file mode 100644 index 279e0ff9a..000000000 --- a/vendor/k8s.io/client-go/discovery/cached/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["memcache_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/discovery/fake:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["memcache.go"], - importpath = "k8s.io/client-go/discovery/cached", - deps = [ - "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/version:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/discovery/cached/memcache.go b/vendor/k8s.io/client-go/discovery/cached/memcache.go index 585b4c80d..d4313bcf3 100644 --- a/vendor/k8s.io/client-go/discovery/cached/memcache.go +++ b/vendor/k8s.io/client-go/discovery/cached/memcache.go @@ -96,18 +96,12 @@ func (d *memCacheClient) RESTClient() restclient.Interface { return d.delegate.RESTClient() } -// TODO: Should this also be cached? The results seem more likely to be -// inconsistent with ServerGroups and ServerResources given the requirement to -// actively Invalidate. func (d *memCacheClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) { - return d.delegate.ServerPreferredResources() + return discovery.ServerPreferredResources(d) } -// TODO: Should this also be cached? The results seem more likely to be -// inconsistent with ServerGroups and ServerResources given the requirement to -// actively Invalidate. func (d *memCacheClient) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) { - return d.delegate.ServerPreferredNamespacedResources() + return discovery.ServerPreferredNamespacedResources(d) } func (d *memCacheClient) ServerVersion() (*version.Info, error) { diff --git a/vendor/k8s.io/client-go/discovery/cached_discovery.go b/vendor/k8s.io/client-go/discovery/cached_discovery.go new file mode 100644 index 000000000..aca46546e --- /dev/null +++ b/vendor/k8s.io/client-go/discovery/cached_discovery.go @@ -0,0 +1,282 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package discovery + +import ( + "errors" + "io/ioutil" + "net/http" + "os" + "path/filepath" + "sync" + "time" + + "github.com/golang/glog" + "github.com/googleapis/gnostic/OpenAPIv2" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/version" + "k8s.io/client-go/kubernetes/scheme" + restclient "k8s.io/client-go/rest" +) + +// CachedDiscoveryClient implements the functions that discovery server-supported API groups, +// versions and resources. +type CachedDiscoveryClient struct { + delegate DiscoveryInterface + + // cacheDirectory is the directory where discovery docs are held. It must be unique per host:port combination to work well. + cacheDirectory string + + // ttl is how long the cache should be considered valid + ttl time.Duration + + // mutex protects the variables below + mutex sync.Mutex + + // ourFiles are all filenames of cache files created by this process + ourFiles map[string]struct{} + // invalidated is true if all cache files should be ignored that are not ours (e.g. after Invalidate() was called) + invalidated bool + // fresh is true if all used cache files were ours + fresh bool +} + +var _ CachedDiscoveryInterface = &CachedDiscoveryClient{} + +// ServerResourcesForGroupVersion returns the supported resources for a group and version. +func (d *CachedDiscoveryClient) ServerResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error) { + filename := filepath.Join(d.cacheDirectory, groupVersion, "serverresources.json") + cachedBytes, err := d.getCachedFile(filename) + // don't fail on errors, we either don't have a file or won't be able to run the cached check. Either way we can fallback. + if err == nil { + cachedResources := &metav1.APIResourceList{} + if err := runtime.DecodeInto(scheme.Codecs.UniversalDecoder(), cachedBytes, cachedResources); err == nil { + glog.V(10).Infof("returning cached discovery info from %v", filename) + return cachedResources, nil + } + } + + liveResources, err := d.delegate.ServerResourcesForGroupVersion(groupVersion) + if err != nil { + glog.V(3).Infof("skipped caching discovery info due to %v", err) + return liveResources, err + } + if liveResources == nil || len(liveResources.APIResources) == 0 { + glog.V(3).Infof("skipped caching discovery info, no resources found") + return liveResources, err + } + + if err := d.writeCachedFile(filename, liveResources); err != nil { + glog.V(3).Infof("failed to write cache to %v due to %v", filename, err) + } + + return liveResources, nil +} + +// ServerResources returns the supported resources for all groups and versions. +func (d *CachedDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) { + return ServerResources(d) +} + +func (d *CachedDiscoveryClient) ServerGroups() (*metav1.APIGroupList, error) { + filename := filepath.Join(d.cacheDirectory, "servergroups.json") + cachedBytes, err := d.getCachedFile(filename) + // don't fail on errors, we either don't have a file or won't be able to run the cached check. Either way we can fallback. + if err == nil { + cachedGroups := &metav1.APIGroupList{} + if err := runtime.DecodeInto(scheme.Codecs.UniversalDecoder(), cachedBytes, cachedGroups); err == nil { + glog.V(10).Infof("returning cached discovery info from %v", filename) + return cachedGroups, nil + } + } + + liveGroups, err := d.delegate.ServerGroups() + if err != nil { + glog.V(3).Infof("skipped caching discovery info due to %v", err) + return liveGroups, err + } + if liveGroups == nil || len(liveGroups.Groups) == 0 { + glog.V(3).Infof("skipped caching discovery info, no groups found") + return liveGroups, err + } + + if err := d.writeCachedFile(filename, liveGroups); err != nil { + glog.V(3).Infof("failed to write cache to %v due to %v", filename, err) + } + + return liveGroups, nil +} + +func (d *CachedDiscoveryClient) getCachedFile(filename string) ([]byte, error) { + // after invalidation ignore cache files not created by this process + d.mutex.Lock() + _, ourFile := d.ourFiles[filename] + if d.invalidated && !ourFile { + d.mutex.Unlock() + return nil, errors.New("cache invalidated") + } + d.mutex.Unlock() + + file, err := os.Open(filename) + if err != nil { + return nil, err + } + defer file.Close() + + fileInfo, err := file.Stat() + if err != nil { + return nil, err + } + + if time.Now().After(fileInfo.ModTime().Add(d.ttl)) { + return nil, errors.New("cache expired") + } + + // the cache is present and its valid. Try to read and use it. + cachedBytes, err := ioutil.ReadAll(file) + if err != nil { + return nil, err + } + + d.mutex.Lock() + defer d.mutex.Unlock() + d.fresh = d.fresh && ourFile + + return cachedBytes, nil +} + +func (d *CachedDiscoveryClient) writeCachedFile(filename string, obj runtime.Object) error { + if err := os.MkdirAll(filepath.Dir(filename), 0755); err != nil { + return err + } + + bytes, err := runtime.Encode(scheme.Codecs.LegacyCodec(), obj) + if err != nil { + return err + } + + f, err := ioutil.TempFile(filepath.Dir(filename), filepath.Base(filename)+".") + if err != nil { + return err + } + defer os.Remove(f.Name()) + _, err = f.Write(bytes) + if err != nil { + return err + } + + err = os.Chmod(f.Name(), 0755) + if err != nil { + return err + } + + name := f.Name() + err = f.Close() + if err != nil { + return err + } + + // atomic rename + d.mutex.Lock() + defer d.mutex.Unlock() + err = os.Rename(name, filename) + if err == nil { + d.ourFiles[filename] = struct{}{} + } + return err +} + +func (d *CachedDiscoveryClient) RESTClient() restclient.Interface { + return d.delegate.RESTClient() +} + +func (d *CachedDiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) { + return ServerPreferredResources(d) +} + +func (d *CachedDiscoveryClient) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) { + return ServerPreferredNamespacedResources(d) +} + +func (d *CachedDiscoveryClient) ServerVersion() (*version.Info, error) { + return d.delegate.ServerVersion() +} + +func (d *CachedDiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) { + return d.delegate.OpenAPISchema() +} + +func (d *CachedDiscoveryClient) Fresh() bool { + d.mutex.Lock() + defer d.mutex.Unlock() + + return d.fresh +} + +func (d *CachedDiscoveryClient) Invalidate() { + d.mutex.Lock() + defer d.mutex.Unlock() + + d.ourFiles = map[string]struct{}{} + d.fresh = true + d.invalidated = true +} + +// NewCachedDiscoveryClientForConfig creates a new DiscoveryClient for the given config, and wraps +// the created client in a CachedDiscoveryClient. The provided configuration is updated with a +// custom transport that understands cache responses. +// We receive two distinct cache directories for now, in order to preserve old behavior +// which makes use of the --cache-dir flag value for storing cache data from the CacheRoundTripper, +// and makes use of the hardcoded destination (~/.kube/cache/discovery/...) for storing +// CachedDiscoveryClient cache data. If httpCacheDir is empty, the restconfig's transport will not +// be updated with a roundtripper that understands cache responses. +// If discoveryCacheDir is empty, cached server resource data will be looked up in the current directory. +// TODO(juanvallejo): the value of "--cache-dir" should be honored. Consolidate discoveryCacheDir with httpCacheDir +// so that server resources and http-cache data are stored in the same location, provided via config flags. +func NewCachedDiscoveryClientForConfig(config *restclient.Config, discoveryCacheDir, httpCacheDir string, ttl time.Duration) (*CachedDiscoveryClient, error) { + if len(httpCacheDir) > 0 { + // update the given restconfig with a custom roundtripper that + // understands how to handle cache responses. + wt := config.WrapTransport + config.WrapTransport = func(rt http.RoundTripper) http.RoundTripper { + if wt != nil { + rt = wt(rt) + } + return newCacheRoundTripper(httpCacheDir, rt) + } + } + + discoveryClient, err := NewDiscoveryClientForConfig(config) + if err != nil { + return nil, err + } + + return newCachedDiscoveryClient(discoveryClient, discoveryCacheDir, ttl), nil +} + +// NewCachedDiscoveryClient creates a new DiscoveryClient. cacheDirectory is the directory where discovery docs are held. It must be unique per host:port combination to work well. +func newCachedDiscoveryClient(delegate DiscoveryInterface, cacheDirectory string, ttl time.Duration) *CachedDiscoveryClient { + return &CachedDiscoveryClient{ + delegate: delegate, + cacheDirectory: cacheDirectory, + ttl: ttl, + ourFiles: map[string]struct{}{}, + fresh: true, + } +} diff --git a/vendor/k8s.io/client-go/discovery/cached_discovery_test.go b/vendor/k8s.io/client-go/discovery/cached_discovery_test.go new file mode 100644 index 000000000..278931c2d --- /dev/null +++ b/vendor/k8s.io/client-go/discovery/cached_discovery_test.go @@ -0,0 +1,169 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package discovery + +import ( + "io/ioutil" + "os" + "testing" + "time" + + "github.com/googleapis/gnostic/OpenAPIv2" + "github.com/stretchr/testify/assert" + + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/version" + restclient "k8s.io/client-go/rest" + "k8s.io/client-go/rest/fake" +) + +func TestCachedDiscoveryClient_Fresh(t *testing.T) { + assert := assert.New(t) + + d, err := ioutil.TempDir("", "") + assert.NoError(err) + defer os.RemoveAll(d) + + c := fakeDiscoveryClient{} + cdc := newCachedDiscoveryClient(&c, d, 60*time.Second) + assert.True(cdc.Fresh(), "should be fresh after creation") + + cdc.ServerGroups() + assert.True(cdc.Fresh(), "should be fresh after groups call without cache") + assert.Equal(c.groupCalls, 1) + + cdc.ServerGroups() + assert.True(cdc.Fresh(), "should be fresh after another groups call") + assert.Equal(c.groupCalls, 1) + + cdc.ServerResources() + assert.True(cdc.Fresh(), "should be fresh after resources call") + assert.Equal(c.resourceCalls, 1) + + cdc.ServerResources() + assert.True(cdc.Fresh(), "should be fresh after another resources call") + assert.Equal(c.resourceCalls, 1) + + cdc = newCachedDiscoveryClient(&c, d, 60*time.Second) + cdc.ServerGroups() + assert.False(cdc.Fresh(), "should NOT be fresh after recreation with existing groups cache") + assert.Equal(c.groupCalls, 1) + + cdc.ServerResources() + assert.False(cdc.Fresh(), "should NOT be fresh after recreation with existing resources cache") + assert.Equal(c.resourceCalls, 1) + + cdc.Invalidate() + assert.True(cdc.Fresh(), "should be fresh after cache invalidation") + + cdc.ServerResources() + assert.True(cdc.Fresh(), "should ignore existing resources cache after invalidation") + assert.Equal(c.resourceCalls, 2) +} + +func TestNewCachedDiscoveryClient_TTL(t *testing.T) { + assert := assert.New(t) + + d, err := ioutil.TempDir("", "") + assert.NoError(err) + defer os.RemoveAll(d) + + c := fakeDiscoveryClient{} + cdc := newCachedDiscoveryClient(&c, d, 1*time.Nanosecond) + cdc.ServerGroups() + assert.Equal(c.groupCalls, 1) + + time.Sleep(1 * time.Second) + + cdc.ServerGroups() + assert.Equal(c.groupCalls, 2) +} + +type fakeDiscoveryClient struct { + groupCalls int + resourceCalls int + versionCalls int + openAPICalls int + + serverResourcesHandler func() ([]*metav1.APIResourceList, error) +} + +var _ DiscoveryInterface = &fakeDiscoveryClient{} + +func (c *fakeDiscoveryClient) RESTClient() restclient.Interface { + return &fake.RESTClient{} +} + +func (c *fakeDiscoveryClient) ServerGroups() (*metav1.APIGroupList, error) { + c.groupCalls = c.groupCalls + 1 + return &metav1.APIGroupList{ + Groups: []metav1.APIGroup{ + { + Name: "a", + Versions: []metav1.GroupVersionForDiscovery{ + { + GroupVersion: "a/v1", + Version: "v1", + }, + }, + PreferredVersion: metav1.GroupVersionForDiscovery{ + GroupVersion: "a/v1", + Version: "v1", + }, + }, + }, + }, nil +} + +func (c *fakeDiscoveryClient) ServerResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error) { + c.resourceCalls = c.resourceCalls + 1 + if groupVersion == "a/v1" { + return &metav1.APIResourceList{APIResources: []metav1.APIResource{{Name: "widgets", Kind: "Widget"}}}, nil + } + + return nil, errors.NewNotFound(schema.GroupResource{}, "") +} + +func (c *fakeDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) { + c.resourceCalls = c.resourceCalls + 1 + if c.serverResourcesHandler != nil { + return c.serverResourcesHandler() + } + return []*metav1.APIResourceList{}, nil +} + +func (c *fakeDiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) { + c.resourceCalls = c.resourceCalls + 1 + return nil, nil +} + +func (c *fakeDiscoveryClient) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) { + c.resourceCalls = c.resourceCalls + 1 + return nil, nil +} + +func (c *fakeDiscoveryClient) ServerVersion() (*version.Info, error) { + c.versionCalls = c.versionCalls + 1 + return &version.Info{}, nil +} + +func (c *fakeDiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) { + c.openAPICalls = c.openAPICalls + 1 + return &openapi_v2.Document{}, nil +} diff --git a/vendor/k8s.io/client-go/discovery/discovery_client.go b/vendor/k8s.io/client-go/discovery/discovery_client.go index 3c685a955..a96602974 100644 --- a/vendor/k8s.io/client-go/discovery/discovery_client.go +++ b/vendor/k8s.io/client-go/discovery/discovery_client.go @@ -22,6 +22,8 @@ import ( "net/url" "sort" "strings" + "sync" + "time" "github.com/golang/protobuf/proto" "github.com/googleapis/gnostic/OpenAPIv2" @@ -31,6 +33,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/version" "k8s.io/client-go/kubernetes/scheme" restclient "k8s.io/client-go/rest" @@ -41,6 +44,9 @@ const ( defaultRetries = 2 // protobuf mime type mimePb = "application/com.github.proto-openapi.spec.v2@v1.0+protobuf" + // defaultTimeout is the maximum amount of time per request when no timeout has been set on a RESTClient. + // Defaults to 32s in order to have a distinguishable length of time, relative to other timeouts that exist. + defaultTimeout = 32 * time.Second ) // DiscoveryInterface holds the methods that discover server-supported API groups, @@ -183,33 +189,7 @@ func (d *DiscoveryClient) ServerResourcesForGroupVersion(groupVersion string) (r // serverResources returns the supported resources for all groups and versions. func (d *DiscoveryClient) serverResources() ([]*metav1.APIResourceList, error) { - apiGroups, err := d.ServerGroups() - if err != nil { - return nil, err - } - - result := []*metav1.APIResourceList{} - failedGroups := make(map[schema.GroupVersion]error) - - for _, apiGroup := range apiGroups.Groups { - for _, version := range apiGroup.Versions { - gv := schema.GroupVersion{Group: apiGroup.Name, Version: version.Version} - resources, err := d.ServerResourcesForGroupVersion(version.GroupVersion) - if err != nil { - // TODO: maybe restrict this to NotFound errors - failedGroups[gv] = err - continue - } - - result = append(result, resources) - } - } - - if len(failedGroups) == 0 { - return result, nil - } - - return result, &ErrGroupDiscoveryFailed{Groups: failedGroups} + return ServerResources(d) } // ServerResources returns the supported resources for all groups and versions. @@ -242,14 +222,46 @@ func IsGroupDiscoveryFailedError(err error) bool { // serverPreferredResources returns the supported resources with the version preferred by the server. func (d *DiscoveryClient) serverPreferredResources() ([]*metav1.APIResourceList, error) { + return ServerPreferredResources(d) +} + +// ServerResources uses the provided discovery interface to look up supported resources for all groups and versions. +func ServerResources(d DiscoveryInterface) ([]*metav1.APIResourceList, error) { + apiGroups, err := d.ServerGroups() + if err != nil { + return nil, err + } + + groupVersionResources, failedGroups := fetchGroupVersionResources(d, apiGroups) + + // order results by group/version discovery order + result := []*metav1.APIResourceList{} + for _, apiGroup := range apiGroups.Groups { + for _, version := range apiGroup.Versions { + gv := schema.GroupVersion{Group: apiGroup.Name, Version: version.Version} + if resources, ok := groupVersionResources[gv]; ok { + result = append(result, resources) + } + } + } + + if len(failedGroups) == 0 { + return result, nil + } + + return result, &ErrGroupDiscoveryFailed{Groups: failedGroups} +} + +// ServerPreferredResources uses the provided discovery interface to look up preferred resources +func ServerPreferredResources(d DiscoveryInterface) ([]*metav1.APIResourceList, error) { serverGroupList, err := d.ServerGroups() if err != nil { return nil, err } - result := []*metav1.APIResourceList{} - failedGroups := make(map[schema.GroupVersion]error) + groupVersionResources, failedGroups := fetchGroupVersionResources(d, serverGroupList) + result := []*metav1.APIResourceList{} grVersions := map[schema.GroupResource]string{} // selected version of a GroupResource grApiResources := map[schema.GroupResource]*metav1.APIResource{} // selected APIResource for a GroupResource gvApiResourceLists := map[schema.GroupVersion]*metav1.APIResourceList{} // blueprint for a APIResourceList for later grouping @@ -257,10 +269,9 @@ func (d *DiscoveryClient) serverPreferredResources() ([]*metav1.APIResourceList, for _, apiGroup := range serverGroupList.Groups { for _, version := range apiGroup.Versions { groupVersion := schema.GroupVersion{Group: apiGroup.Name, Version: version.Version} - apiResourceList, err := d.ServerResourcesForGroupVersion(version.GroupVersion) - if err != nil { - // TODO: maybe restrict this to NotFound errors - failedGroups[groupVersion] = err + + apiResourceList, ok := groupVersionResources[groupVersion] + if !ok { continue } @@ -302,6 +313,41 @@ func (d *DiscoveryClient) serverPreferredResources() ([]*metav1.APIResourceList, return result, &ErrGroupDiscoveryFailed{Groups: failedGroups} } +// fetchServerResourcesForGroupVersions uses the discovery client to fetch the resources for the specified groups in parallel +func fetchGroupVersionResources(d DiscoveryInterface, apiGroups *metav1.APIGroupList) (map[schema.GroupVersion]*metav1.APIResourceList, map[schema.GroupVersion]error) { + groupVersionResources := make(map[schema.GroupVersion]*metav1.APIResourceList) + failedGroups := make(map[schema.GroupVersion]error) + + wg := &sync.WaitGroup{} + resultLock := &sync.Mutex{} + for _, apiGroup := range apiGroups.Groups { + for _, version := range apiGroup.Versions { + groupVersion := schema.GroupVersion{Group: apiGroup.Name, Version: version.Version} + wg.Add(1) + go func() { + defer wg.Done() + defer utilruntime.HandleCrash() + + apiResourceList, err := d.ServerResourcesForGroupVersion(groupVersion.String()) + + // lock to record results + resultLock.Lock() + defer resultLock.Unlock() + + if err != nil { + // TODO: maybe restrict this to NotFound errors + failedGroups[groupVersion] = err + } else { + groupVersionResources[groupVersion] = apiResourceList + } + }() + } + } + wg.Wait() + + return groupVersionResources, failedGroups +} + // ServerPreferredResources returns the supported resources with the version preferred by the // server. func (d *DiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) { @@ -311,7 +357,12 @@ func (d *DiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, // ServerPreferredNamespacedResources returns the supported namespaced resources with the // version preferred by the server. func (d *DiscoveryClient) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) { - all, err := d.ServerPreferredResources() + return ServerPreferredNamespacedResources(d) +} + +// ServerPreferredNamespacedResources uses the provided discovery interface to look up preferred namespaced resources +func ServerPreferredNamespacedResources(d DiscoveryInterface) ([]*metav1.APIResourceList, error) { + all, err := ServerPreferredResources(d) return FilteredBy(ResourcePredicateFunc(func(groupVersion string, r *metav1.APIResource) bool { return r.Namespaced }), all), err @@ -335,7 +386,7 @@ func (d *DiscoveryClient) ServerVersion() (*version.Info, error) { func (d *DiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) { data, err := d.restClient.Get().AbsPath("/openapi/v2").SetHeader("Accept", mimePb).Do().Raw() if err != nil { - if errors.IsForbidden(err) || errors.IsNotFound(err) { + if errors.IsForbidden(err) || errors.IsNotFound(err) || errors.IsNotAcceptable(err) { // single endpoint not found/registered in old server, try to fetch old endpoint // TODO(roycaihw): remove this in 1.11 data, err = d.restClient.Get().AbsPath("/swagger-2.0.0.pb-v1").Do().Raw() @@ -373,6 +424,9 @@ func withRetries(maxRetries int, f func() ([]*metav1.APIResourceList, error)) ([ func setDiscoveryDefaults(config *restclient.Config) error { config.APIPath = "" config.GroupVersion = nil + if config.Timeout == 0 { + config.Timeout = defaultTimeout + } codec := runtime.NoopEncoder{Decoder: scheme.Codecs.UniversalDecoder()} config.NegotiatedSerializer = serializer.NegotiatedSerializerWrapper(runtime.SerializerInfo{Serializer: codec}) if len(config.UserAgent) == 0 { diff --git a/vendor/k8s.io/client-go/discovery/discovery_client_test.go b/vendor/k8s.io/client-go/discovery/discovery_client_test.go index ad855139a..10e494322 100644 --- a/vendor/k8s.io/client-go/discovery/discovery_client_test.go +++ b/vendor/k8s.io/client-go/discovery/discovery_client_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package discovery_test +package discovery import ( "encoding/json" @@ -27,12 +27,13 @@ import ( "github.com/gogo/protobuf/proto" "github.com/googleapis/gnostic/OpenAPIv2" + "github.com/stretchr/testify/assert" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/version" - . "k8s.io/client-go/discovery" restclient "k8s.io/client-go/rest" ) @@ -130,6 +131,12 @@ func TestGetServerGroupsWithBrokenServer(t *testing.T) { } } +func TestTimeoutIsSet(t *testing.T) { + cfg := &restclient.Config{} + setDiscoveryDefaults(cfg) + assert.Equal(t, defaultTimeout, cfg.Timeout) +} + func TestGetServerResourcesWithV1Server(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { var obj interface{} @@ -183,6 +190,14 @@ func TestGetServerResources(t *testing.T) { {Name: "jobs", Namespaced: true, Kind: "Job"}, }, } + beta2 := metav1.APIResourceList{ + GroupVersion: "extensions/v1beta2", + APIResources: []metav1.APIResource{ + {Name: "deployments", Namespaced: true, Kind: "Deployment"}, + {Name: "ingresses", Namespaced: true, Kind: "Ingress"}, + {Name: "jobs", Namespaced: true, Kind: "Job"}, + }, + } tests := []struct { resourcesList *metav1.APIResourceList path string @@ -215,6 +230,8 @@ func TestGetServerResources(t *testing.T) { list = &stable case "/apis/extensions/v1beta1": list = &beta + case "/apis/extensions/v1beta2": + list = &beta2 case "/api": list = &metav1.APIVersions{ Versions: []string{ @@ -225,8 +242,10 @@ func TestGetServerResources(t *testing.T) { list = &metav1.APIGroupList{ Groups: []metav1.APIGroup{ { + Name: "extensions", Versions: []metav1.GroupVersionForDiscovery{ - {GroupVersion: "extensions/v1beta1"}, + {GroupVersion: "extensions/v1beta1", Version: "v1beta1"}, + {GroupVersion: "extensions/v1beta2", Version: "v1beta2"}, }, }, }, @@ -268,11 +287,10 @@ func TestGetServerResources(t *testing.T) { if err != nil { t.Errorf("unexpected error: %v", err) } - serverGroupVersions := sets.NewString(groupVersions(serverResources)...) - for _, api := range []string{"v1", "extensions/v1beta1"} { - if !serverGroupVersions.Has(api) { - t.Errorf("missing expected api %q in %v", api, serverResources) - } + serverGroupVersions := groupVersions(serverResources) + expectedGroupVersions := []string{"v1", "extensions/v1beta1", "extensions/v1beta2"} + if !reflect.DeepEqual(expectedGroupVersions, serverGroupVersions) { + t.Errorf("unexpected group versions: %v", diff.ObjectReflectDiff(expectedGroupVersions, serverGroupVersions)) } } @@ -326,12 +344,12 @@ var returnedOpenAPI = openapi_v2.Document{ }, } -func openapiSchemaDeprecatedFakeServer() (*httptest.Server, error) { +func openapiSchemaDeprecatedFakeServer(status int) (*httptest.Server, error) { var sErr error server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - // old server returns 403 on new endpoint request if req.URL.Path == "/openapi/v2" { - w.WriteHeader(http.StatusForbidden) + // write the error status for the new endpoint request + w.WriteHeader(status) return } if req.URL.Path != "/swagger-2.0.0.pb-v1" { @@ -398,8 +416,42 @@ func TestGetOpenAPISchema(t *testing.T) { } } -func TestGetOpenAPISchemaFallback(t *testing.T) { - server, err := openapiSchemaDeprecatedFakeServer() +func TestGetOpenAPISchemaForbiddenFallback(t *testing.T) { + server, err := openapiSchemaDeprecatedFakeServer(http.StatusForbidden) + if err != nil { + t.Errorf("unexpected error starting fake server: %v", err) + } + defer server.Close() + + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + got, err := client.OpenAPISchema() + if err != nil { + t.Fatalf("unexpected error getting openapi: %v", err) + } + if e, a := returnedOpenAPI, *got; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } +} + +func TestGetOpenAPISchemaNotFoundFallback(t *testing.T) { + server, err := openapiSchemaDeprecatedFakeServer(http.StatusNotFound) + if err != nil { + t.Errorf("unexpected error starting fake server: %v", err) + } + defer server.Close() + + client := NewDiscoveryClientForConfigOrDie(&restclient.Config{Host: server.URL}) + got, err := client.OpenAPISchema() + if err != nil { + t.Fatalf("unexpected error getting openapi: %v", err) + } + if e, a := returnedOpenAPI, *got; !reflect.DeepEqual(e, a) { + t.Errorf("expected %v, got %v", e, a) + } +} + +func TestGetOpenAPISchemaNotAcceptableFallback(t *testing.T) { + server, err := openapiSchemaDeprecatedFakeServer(http.StatusNotAcceptable) if err != nil { t.Errorf("unexpected error starting fake server: %v", err) } @@ -584,7 +636,7 @@ func TestServerPreferredResourcesRetries(t *testing.T) { { Name: "extensions", Versions: []metav1.GroupVersionForDiscovery{ - {GroupVersion: "extensions/v1beta1"}, + {GroupVersion: "extensions/v1beta1", Version: "v1beta1"}, }, PreferredVersion: metav1.GroupVersionForDiscovery{ GroupVersion: "extensions/v1beta1", diff --git a/vendor/k8s.io/client-go/discovery/fake/BUILD b/vendor/k8s.io/client-go/discovery/fake/BUILD deleted file mode 100644 index 5b50832a8..000000000 --- a/vendor/k8s.io/client-go/discovery/fake/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["discovery.go"], - importpath = "k8s.io/client-go/discovery/fake", - deps = [ - "//vendor/github.com/googleapis/gnostic/OpenAPIv2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/version:go_default_library", - "//vendor/k8s.io/client-go/pkg/version:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_xtest", - srcs = ["discovery_test.go"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/version:go_default_library", - "//vendor/k8s.io/client-go/discovery/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", - ], -) diff --git a/vendor/k8s.io/client-go/discovery/round_tripper.go b/vendor/k8s.io/client-go/discovery/round_tripper.go new file mode 100644 index 000000000..2e352b888 --- /dev/null +++ b/vendor/k8s.io/client-go/discovery/round_tripper.go @@ -0,0 +1,51 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package transport provides a round tripper capable of caching HTTP responses. +package discovery + +import ( + "net/http" + "path/filepath" + + "github.com/gregjones/httpcache" + "github.com/gregjones/httpcache/diskcache" + "github.com/peterbourgon/diskv" +) + +type cacheRoundTripper struct { + rt *httpcache.Transport +} + +// newCacheRoundTripper creates a roundtripper that reads the ETag on +// response headers and send the If-None-Match header on subsequent +// corresponding requests. +func newCacheRoundTripper(cacheDir string, rt http.RoundTripper) http.RoundTripper { + d := diskv.New(diskv.Options{ + BasePath: cacheDir, + TempDir: filepath.Join(cacheDir, ".diskv-temp"), + }) + t := httpcache.NewTransport(diskcache.NewWithDiskv(d)) + t.Transport = rt + + return &cacheRoundTripper{rt: t} +} + +func (rt *cacheRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + return rt.rt.RoundTrip(req) +} + +func (rt *cacheRoundTripper) WrappedRoundTripper() http.RoundTripper { return rt.rt.Transport } diff --git a/vendor/k8s.io/client-go/discovery/round_tripper_test.go b/vendor/k8s.io/client-go/discovery/round_tripper_test.go new file mode 100644 index 000000000..b15e2e771 --- /dev/null +++ b/vendor/k8s.io/client-go/discovery/round_tripper_test.go @@ -0,0 +1,95 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package discovery + +import ( + "bytes" + "io/ioutil" + "net/http" + "net/url" + "os" + "testing" +) + +// copied from k8s.io/client-go/transport/round_trippers_test.go +type testRoundTripper struct { + Request *http.Request + Response *http.Response + Err error +} + +func (rt *testRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + rt.Request = req + return rt.Response, rt.Err +} + +func TestCacheRoundTripper(t *testing.T) { + rt := &testRoundTripper{} + cacheDir, err := ioutil.TempDir("", "cache-rt") + defer os.RemoveAll(cacheDir) + if err != nil { + t.Fatal(err) + } + cache := newCacheRoundTripper(cacheDir, rt) + + // First call, caches the response + req := &http.Request{ + Method: http.MethodGet, + URL: &url.URL{Host: "localhost"}, + } + rt.Response = &http.Response{ + Header: http.Header{"ETag": []string{`"123456"`}}, + Body: ioutil.NopCloser(bytes.NewReader([]byte("Content"))), + StatusCode: http.StatusOK, + } + resp, err := cache.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + content, err := ioutil.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + if string(content) != "Content" { + t.Errorf(`Expected Body to be "Content", got %q`, string(content)) + } + + // Second call, returns cached response + req = &http.Request{ + Method: http.MethodGet, + URL: &url.URL{Host: "localhost"}, + } + rt.Response = &http.Response{ + StatusCode: http.StatusNotModified, + Body: ioutil.NopCloser(bytes.NewReader([]byte("Other Content"))), + } + + resp, err = cache.RoundTrip(req) + if err != nil { + t.Fatal(err) + } + + // Read body and make sure we have the initial content + content, err = ioutil.ReadAll(resp.Body) + resp.Body.Close() + if err != nil { + t.Fatal(err) + } + if string(content) != "Content" { + t.Errorf("Invalid content read from cache %q", string(content)) + } +} diff --git a/vendor/k8s.io/client-go/discovery/unstructured.go b/vendor/k8s.io/client-go/discovery/unstructured.go index fa7f2ec06..81913a414 100644 --- a/vendor/k8s.io/client-go/discovery/unstructured.go +++ b/vendor/k8s.io/client-go/discovery/unstructured.go @@ -26,31 +26,17 @@ import ( // UnstructuredObjectTyper provides a runtime.ObjectTyper implementation for // runtime.Unstructured object based on discovery information. type UnstructuredObjectTyper struct { - registered map[schema.GroupVersionKind]bool - typers []runtime.ObjectTyper + typers []runtime.ObjectTyper } // NewUnstructuredObjectTyper returns a runtime.ObjectTyper for // unstructured objects based on discovery information. It accepts a list of fallback typers // for handling objects that are not runtime.Unstructured. It does not delegate the Recognizes // check, only ObjectKinds. -func NewUnstructuredObjectTyper(groupResources []*APIGroupResources, typers ...runtime.ObjectTyper) *UnstructuredObjectTyper { +// TODO this only works for the apiextensions server and doesn't recognize any types. Move to point of use. +func NewUnstructuredObjectTyper(typers ...runtime.ObjectTyper) *UnstructuredObjectTyper { dot := &UnstructuredObjectTyper{ - registered: make(map[schema.GroupVersionKind]bool), - typers: typers, - } - for _, group := range groupResources { - for _, discoveryVersion := range group.Group.Versions { - resources, ok := group.VersionedResources[discoveryVersion.Version] - if !ok { - continue - } - - gv := schema.GroupVersion{Group: group.Group.Name, Version: discoveryVersion.Version} - for _, resource := range resources { - dot.registered[gv.WithKind(resource.Kind)] = true - } - } + typers: typers, } return dot } @@ -89,7 +75,7 @@ func (d *UnstructuredObjectTyper) ObjectKinds(obj runtime.Object) (gvks []schema // Recognizes returns true if the provided group,version,kind was in the // discovery information. func (d *UnstructuredObjectTyper) Recognizes(gvk schema.GroupVersionKind) bool { - return d.registered[gvk] + return false } var _ runtime.ObjectTyper = &UnstructuredObjectTyper{} diff --git a/vendor/k8s.io/client-go/dynamic/BUILD b/vendor/k8s.io/client-go/dynamic/BUILD deleted file mode 100644 index 3642f6a0f..000000000 --- a/vendor/k8s.io/client-go/dynamic/BUILD +++ /dev/null @@ -1,68 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "client_test.go", - "dynamic_util_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/rest/watch:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "client.go", - "client_pool.go", - "dynamic_util.go", - ], - importpath = "k8s.io/client-go/dynamic", - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion/queryparams:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/dynamic/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/dynamic/client.go b/vendor/k8s.io/client-go/dynamic/client.go deleted file mode 100644 index 833e43537..000000000 --- a/vendor/k8s.io/client-go/dynamic/client.go +++ /dev/null @@ -1,379 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package dynamic provides a client interface to arbitrary Kubernetes -// APIs that exposes common high level operations and exposes common -// metadata. -package dynamic - -import ( - "encoding/json" - "errors" - "io" - "net/url" - "strings" - - "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/conversion/queryparams" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/kubernetes/scheme" - restclient "k8s.io/client-go/rest" - "k8s.io/client-go/util/flowcontrol" -) - -// Interface is a Kubernetes client that allows you to access metadata -// and manipulate metadata of a Kubernetes API group. -type Interface interface { - // GetRateLimiter returns the rate limiter for this client. - GetRateLimiter() flowcontrol.RateLimiter - // Resource returns an API interface to the specified resource for this client's - // group and version. If resource is not a namespaced resource, then namespace - // is ignored. The ResourceInterface inherits the parameter codec of this client. - Resource(resource *metav1.APIResource, namespace string) ResourceInterface - // ParameterCodec returns a client with the provided parameter codec. - ParameterCodec(parameterCodec runtime.ParameterCodec) Interface -} - -// ResourceInterface is an API interface to a specific resource under a -// dynamic client. -type ResourceInterface interface { - // List returns a list of objects for this resource. - List(opts metav1.ListOptions) (runtime.Object, error) - // Get gets the resource with the specified name. - Get(name string, opts metav1.GetOptions) (*unstructured.Unstructured, error) - // Delete deletes the resource with the specified name. - Delete(name string, opts *metav1.DeleteOptions) error - // DeleteCollection deletes a collection of objects. - DeleteCollection(deleteOptions *metav1.DeleteOptions, listOptions metav1.ListOptions) error - // Create creates the provided resource. - Create(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) - // Update updates the provided resource. - Update(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) - // Watch returns a watch.Interface that watches the resource. - Watch(opts metav1.ListOptions) (watch.Interface, error) - // Patch patches the provided resource. - Patch(name string, pt types.PatchType, data []byte) (*unstructured.Unstructured, error) -} - -// Client is a Kubernetes client that allows you to access metadata -// and manipulate metadata of a Kubernetes API group, and implements Interface. -type Client struct { - cl *restclient.RESTClient - parameterCodec runtime.ParameterCodec -} - -// NewClient returns a new client based on the passed in config. The -// codec is ignored, as the dynamic client uses it's own codec. -func NewClient(conf *restclient.Config) (*Client, error) { - // avoid changing the original config - confCopy := *conf - conf = &confCopy - - contentConfig := ContentConfig() - contentConfig.GroupVersion = conf.GroupVersion - if conf.NegotiatedSerializer != nil { - contentConfig.NegotiatedSerializer = conf.NegotiatedSerializer - } - conf.ContentConfig = contentConfig - - if conf.APIPath == "" { - conf.APIPath = "/api" - } - - if len(conf.UserAgent) == 0 { - conf.UserAgent = restclient.DefaultKubernetesUserAgent() - } - - cl, err := restclient.RESTClientFor(conf) - if err != nil { - return nil, err - } - - return &Client{cl: cl}, nil -} - -// GetRateLimiter returns rate limier. -func (c *Client) GetRateLimiter() flowcontrol.RateLimiter { - return c.cl.GetRateLimiter() -} - -// Resource returns an API interface to the specified resource for this client's -// group and version. If resource is not a namespaced resource, then namespace -// is ignored. The ResourceInterface inherits the parameter codec of c. -func (c *Client) Resource(resource *metav1.APIResource, namespace string) ResourceInterface { - return &ResourceClient{ - cl: c.cl, - resource: resource, - ns: namespace, - parameterCodec: c.parameterCodec, - } -} - -// ParameterCodec returns a client with the provided parameter codec. -func (c *Client) ParameterCodec(parameterCodec runtime.ParameterCodec) Interface { - return &Client{ - cl: c.cl, - parameterCodec: parameterCodec, - } -} - -// ResourceClient is an API interface to a specific resource under a -// dynamic client, and implements ResourceInterface. -type ResourceClient struct { - cl *restclient.RESTClient - resource *metav1.APIResource - ns string - parameterCodec runtime.ParameterCodec -} - -func (rc *ResourceClient) parseResourceSubresourceName() (string, []string) { - var resourceName string - var subresourceName []string - if strings.Contains(rc.resource.Name, "/") { - resourceName = strings.Split(rc.resource.Name, "/")[0] - subresourceName = strings.Split(rc.resource.Name, "/")[1:] - } else { - resourceName = rc.resource.Name - } - - return resourceName, subresourceName -} - -// List returns a list of objects for this resource. -func (rc *ResourceClient) List(opts metav1.ListOptions) (runtime.Object, error) { - parameterEncoder := rc.parameterCodec - if parameterEncoder == nil { - parameterEncoder = defaultParameterEncoder - } - return rc.cl.Get(). - NamespaceIfScoped(rc.ns, rc.resource.Namespaced). - Resource(rc.resource.Name). - VersionedParams(&opts, parameterEncoder). - Do(). - Get() -} - -// Get gets the resource with the specified name. -func (rc *ResourceClient) Get(name string, opts metav1.GetOptions) (*unstructured.Unstructured, error) { - parameterEncoder := rc.parameterCodec - if parameterEncoder == nil { - parameterEncoder = defaultParameterEncoder - } - result := new(unstructured.Unstructured) - resourceName, subresourceName := rc.parseResourceSubresourceName() - err := rc.cl.Get(). - NamespaceIfScoped(rc.ns, rc.resource.Namespaced). - Resource(resourceName). - SubResource(subresourceName...). - VersionedParams(&opts, parameterEncoder). - Name(name). - Do(). - Into(result) - return result, err -} - -// Delete deletes the resource with the specified name. -func (rc *ResourceClient) Delete(name string, opts *metav1.DeleteOptions) error { - return rc.cl.Delete(). - NamespaceIfScoped(rc.ns, rc.resource.Namespaced). - Resource(rc.resource.Name). - Name(name). - Body(opts). - Do(). - Error() -} - -// DeleteCollection deletes a collection of objects. -func (rc *ResourceClient) DeleteCollection(deleteOptions *metav1.DeleteOptions, listOptions metav1.ListOptions) error { - parameterEncoder := rc.parameterCodec - if parameterEncoder == nil { - parameterEncoder = defaultParameterEncoder - } - return rc.cl.Delete(). - NamespaceIfScoped(rc.ns, rc.resource.Namespaced). - Resource(rc.resource.Name). - VersionedParams(&listOptions, parameterEncoder). - Body(deleteOptions). - Do(). - Error() -} - -// Create creates the provided resource. -func (rc *ResourceClient) Create(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { - result := new(unstructured.Unstructured) - resourceName, subresourceName := rc.parseResourceSubresourceName() - req := rc.cl.Post(). - NamespaceIfScoped(rc.ns, rc.resource.Namespaced). - Resource(resourceName). - Body(obj) - if len(subresourceName) > 0 { - // If the provided resource is a subresource, the POST request should contain - // object name. Examples of subresources that support Create operation: - // core/v1/pods/{name}/binding - // core/v1/pods/{name}/eviction - // extensions/v1beta1/deployments/{name}/rollback - // apps/v1beta1/deployments/{name}/rollback - // NOTE: Currently our system assumes every subresource object has the same - // name as the parent resource object. E.g. a pods/binding object having - // metadada.name "foo" means pod "foo" is being bound. We may need to - // change this if we break the assumption in the future. - req = req.SubResource(subresourceName...). - Name(obj.GetName()) - } - err := req.Do(). - Into(result) - return result, err -} - -// Update updates the provided resource. -func (rc *ResourceClient) Update(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { - result := new(unstructured.Unstructured) - if len(obj.GetName()) == 0 { - return result, errors.New("object missing name") - } - resourceName, subresourceName := rc.parseResourceSubresourceName() - err := rc.cl.Put(). - NamespaceIfScoped(rc.ns, rc.resource.Namespaced). - Resource(resourceName). - SubResource(subresourceName...). - // NOTE: Currently our system assumes every subresource object has the same - // name as the parent resource object. E.g. a pods/binding object having - // metadada.name "foo" means pod "foo" is being bound. We may need to - // change this if we break the assumption in the future. - Name(obj.GetName()). - Body(obj). - Do(). - Into(result) - return result, err -} - -// Watch returns a watch.Interface that watches the resource. -func (rc *ResourceClient) Watch(opts metav1.ListOptions) (watch.Interface, error) { - parameterEncoder := rc.parameterCodec - if parameterEncoder == nil { - parameterEncoder = defaultParameterEncoder - } - opts.Watch = true - return rc.cl.Get(). - NamespaceIfScoped(rc.ns, rc.resource.Namespaced). - Resource(rc.resource.Name). - VersionedParams(&opts, parameterEncoder). - Watch() -} - -// Patch applies the patch and returns the patched resource. -func (rc *ResourceClient) Patch(name string, pt types.PatchType, data []byte) (*unstructured.Unstructured, error) { - result := new(unstructured.Unstructured) - resourceName, subresourceName := rc.parseResourceSubresourceName() - err := rc.cl.Patch(pt). - NamespaceIfScoped(rc.ns, rc.resource.Namespaced). - Resource(resourceName). - SubResource(subresourceName...). - Name(name). - Body(data). - Do(). - Into(result) - return result, err -} - -// dynamicCodec is a codec that wraps the standard unstructured codec -// with special handling for Status objects. -type dynamicCodec struct{} - -func (dynamicCodec) Decode(data []byte, gvk *schema.GroupVersionKind, obj runtime.Object) (runtime.Object, *schema.GroupVersionKind, error) { - obj, gvk, err := unstructured.UnstructuredJSONScheme.Decode(data, gvk, obj) - if err != nil { - return nil, nil, err - } - - if _, ok := obj.(*metav1.Status); !ok && strings.ToLower(gvk.Kind) == "status" { - obj = &metav1.Status{} - err := json.Unmarshal(data, obj) - if err != nil { - return nil, nil, err - } - } - - return obj, gvk, nil -} - -func (dynamicCodec) Encode(obj runtime.Object, w io.Writer) error { - return unstructured.UnstructuredJSONScheme.Encode(obj, w) -} - -// ContentConfig returns a restclient.ContentConfig for dynamic types. -func ContentConfig() restclient.ContentConfig { - var jsonInfo runtime.SerializerInfo - // TODO: scheme.Codecs here should become "pkg/apis/server/scheme" which is the minimal core you need - // to talk to a kubernetes server - for _, info := range scheme.Codecs.SupportedMediaTypes() { - if info.MediaType == runtime.ContentTypeJSON { - jsonInfo = info - break - } - } - - jsonInfo.Serializer = dynamicCodec{} - jsonInfo.PrettySerializer = nil - return restclient.ContentConfig{ - AcceptContentTypes: runtime.ContentTypeJSON, - ContentType: runtime.ContentTypeJSON, - NegotiatedSerializer: serializer.NegotiatedSerializerWrapper(jsonInfo), - } -} - -// paramaterCodec is a codec converts an API object to query -// parameters without trying to convert to the target version. -type parameterCodec struct{} - -func (parameterCodec) EncodeParameters(obj runtime.Object, to schema.GroupVersion) (url.Values, error) { - return queryparams.Convert(obj) -} - -func (parameterCodec) DecodeParameters(parameters url.Values, from schema.GroupVersion, into runtime.Object) error { - return errors.New("DecodeParameters not implemented on dynamic parameterCodec") -} - -var defaultParameterEncoder runtime.ParameterCodec = parameterCodec{} - -type versionedParameterEncoderWithV1Fallback struct{} - -func (versionedParameterEncoderWithV1Fallback) EncodeParameters(obj runtime.Object, to schema.GroupVersion) (url.Values, error) { - ret, err := scheme.ParameterCodec.EncodeParameters(obj, to) - if err != nil && runtime.IsNotRegisteredError(err) { - // fallback to v1 - return scheme.ParameterCodec.EncodeParameters(obj, v1.SchemeGroupVersion) - } - return ret, err -} - -func (versionedParameterEncoderWithV1Fallback) DecodeParameters(parameters url.Values, from schema.GroupVersion, into runtime.Object) error { - return errors.New("DecodeParameters not implemented on versionedParameterEncoderWithV1Fallback") -} - -// VersionedParameterEncoderWithV1Fallback is useful for encoding query -// parameters for custom resources. It tries to convert object to the -// specified version before converting it to query parameters, and falls back to -// converting to v1 if the object is not registered in the specified version. -// For the record, currently API server always treats query parameters sent to a -// custom resource endpoint as v1. -var VersionedParameterEncoderWithV1Fallback runtime.ParameterCodec = versionedParameterEncoderWithV1Fallback{} diff --git a/vendor/k8s.io/client-go/dynamic/client_test.go b/vendor/k8s.io/client-go/dynamic/client_test.go index ffa550ed5..e8fe93867 100644 --- a/vendor/k8s.io/client-go/dynamic/client_test.go +++ b/vendor/k8s.io/client-go/dynamic/client_test.go @@ -58,11 +58,10 @@ func getObject(version, kind, name string) *unstructured.Unstructured { } } -func getClientServer(gv *schema.GroupVersion, h func(http.ResponseWriter, *http.Request)) (Interface, *httptest.Server, error) { +func getClientServer(h func(http.ResponseWriter, *http.Request)) (Interface, *httptest.Server, error) { srv := httptest.NewServer(http.HandlerFunc(h)) - cl, err := NewClient(&restclient.Config{ - Host: srv.URL, - ContentConfig: restclient.ContentConfig{GroupVersion: gv}, + cl, err := NewForConfig(&restclient.Config{ + Host: srv.URL, }) if err != nil { srv.Close() @@ -81,7 +80,7 @@ func TestList(t *testing.T) { }{ { name: "normal_list", - path: "/api/gtest/vtest/rtest", + path: "/apis/gtest/vtest/rtest", resp: getListJSON("vTest", "rTestList", getJSON("vTest", "rTest", "item1"), getJSON("vTest", "rTest", "item2")), @@ -99,7 +98,7 @@ func TestList(t *testing.T) { { name: "namespaced_list", namespace: "nstest", - path: "/api/gtest/vtest/namespaces/nstest/rtest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest", resp: getListJSON("vTest", "rTestList", getJSON("vTest", "rTest", "item1"), getJSON("vTest", "rTest", "item2")), @@ -116,9 +115,8 @@ func TestList(t *testing.T) { }, } for _, tc := range tcs { - gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} - resource := &metav1.APIResource{Name: "rtest", Namespaced: len(tc.namespace) != 0} - cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: "rtest"} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { t.Errorf("List(%q) got HTTP method %s. wanted GET", tc.name, r.Method) } @@ -136,7 +134,7 @@ func TestList(t *testing.T) { } defer srv.Close() - got, err := cl.Resource(resource, tc.namespace).List(metav1.ListOptions{}) + got, err := cl.Resource(resource).Namespace(tc.namespace).List(metav1.ListOptions{}) if err != nil { t.Errorf("unexpected error when listing %q: %v", tc.name, err) continue @@ -150,17 +148,18 @@ func TestList(t *testing.T) { func TestGet(t *testing.T) { tcs := []struct { - resource string - namespace string - name string - path string - resp []byte - want *unstructured.Unstructured + resource string + subresource []string + namespace string + name string + path string + resp []byte + want *unstructured.Unstructured }{ { resource: "rtest", name: "normal_get", - path: "/api/gtest/vtest/rtest/normal_get", + path: "/apis/gtest/vtest/rtest/normal_get", resp: getJSON("vTest", "rTest", "normal_get"), want: getObject("vTest", "rTest", "normal_get"), }, @@ -168,30 +167,31 @@ func TestGet(t *testing.T) { resource: "rtest", namespace: "nstest", name: "namespaced_get", - path: "/api/gtest/vtest/namespaces/nstest/rtest/namespaced_get", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_get", resp: getJSON("vTest", "rTest", "namespaced_get"), want: getObject("vTest", "rTest", "namespaced_get"), }, { - resource: "rtest/srtest", - name: "normal_subresource_get", - path: "/api/gtest/vtest/rtest/normal_subresource_get/srtest", - resp: getJSON("vTest", "srTest", "normal_subresource_get"), - want: getObject("vTest", "srTest", "normal_subresource_get"), + resource: "rtest", + subresource: []string{"srtest"}, + name: "normal_subresource_get", + path: "/apis/gtest/vtest/rtest/normal_subresource_get/srtest", + resp: getJSON("vTest", "srTest", "normal_subresource_get"), + want: getObject("vTest", "srTest", "normal_subresource_get"), }, { - resource: "rtest/srtest", - namespace: "nstest", - name: "namespaced_subresource_get", - path: "/api/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_get/srtest", - resp: getJSON("vTest", "srTest", "namespaced_subresource_get"), - want: getObject("vTest", "srTest", "namespaced_subresource_get"), + resource: "rtest", + subresource: []string{"srtest"}, + namespace: "nstest", + name: "namespaced_subresource_get", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_get/srtest", + resp: getJSON("vTest", "srTest", "namespaced_subresource_get"), + want: getObject("vTest", "srTest", "namespaced_subresource_get"), }, } for _, tc := range tcs { - gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} - resource := &metav1.APIResource{Name: tc.resource, Namespaced: len(tc.namespace) != 0} - cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: tc.resource} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { t.Errorf("Get(%q) got HTTP method %s. wanted GET", tc.name, r.Method) } @@ -209,7 +209,7 @@ func TestGet(t *testing.T) { } defer srv.Close() - got, err := cl.Resource(resource, tc.namespace).Get(tc.name, metav1.GetOptions{}) + got, err := cl.Resource(resource).Namespace(tc.namespace).Get(tc.name, metav1.GetOptions{}, tc.subresource...) if err != nil { t.Errorf("unexpected error when getting %q: %v", tc.name, err) continue @@ -222,29 +222,50 @@ func TestGet(t *testing.T) { } func TestDelete(t *testing.T) { + background := metav1.DeletePropagationBackground + uid := types.UID("uid") + statusOK := &metav1.Status{ TypeMeta: metav1.TypeMeta{Kind: "Status"}, Status: metav1.StatusSuccess, } tcs := []struct { - namespace string - name string - path string + subresource []string + namespace string + name string + path string + deleteOptions *metav1.DeleteOptions }{ { name: "normal_delete", - path: "/api/gtest/vtest/rtest/normal_delete", + path: "/apis/gtest/vtest/rtest/normal_delete", }, { namespace: "nstest", name: "namespaced_delete", - path: "/api/gtest/vtest/namespaces/nstest/rtest/namespaced_delete", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_delete", + }, + { + subresource: []string{"srtest"}, + name: "normal_delete", + path: "/apis/gtest/vtest/rtest/normal_delete/srtest", + }, + { + subresource: []string{"srtest"}, + namespace: "nstest", + name: "namespaced_delete", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_delete/srtest", + }, + { + namespace: "nstest", + name: "namespaced_delete_with_options", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_delete_with_options", + deleteOptions: &metav1.DeleteOptions{Preconditions: &metav1.Preconditions{UID: &uid}, PropagationPolicy: &background}, }, } for _, tc := range tcs { - gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} - resource := &metav1.APIResource{Name: "rtest", Namespaced: len(tc.namespace) != 0} - cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: "rtest"} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { if r.Method != "DELETE" { t.Errorf("Delete(%q) got HTTP method %s. wanted DELETE", tc.name, r.Method) } @@ -262,7 +283,7 @@ func TestDelete(t *testing.T) { } defer srv.Close() - err = cl.Resource(resource, tc.namespace).Delete(tc.name, nil) + err = cl.Resource(resource).Namespace(tc.namespace).Delete(tc.name, tc.deleteOptions, tc.subresource...) if err != nil { t.Errorf("unexpected error when deleting %q: %v", tc.name, err) continue @@ -282,18 +303,17 @@ func TestDeleteCollection(t *testing.T) { }{ { name: "normal_delete_collection", - path: "/api/gtest/vtest/rtest", + path: "/apis/gtest/vtest/rtest", }, { namespace: "nstest", name: "namespaced_delete_collection", - path: "/api/gtest/vtest/namespaces/nstest/rtest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest", }, } for _, tc := range tcs { - gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} - resource := &metav1.APIResource{Name: "rtest", Namespaced: len(tc.namespace) != 0} - cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: "rtest"} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { if r.Method != "DELETE" { t.Errorf("DeleteCollection(%q) got HTTP method %s. wanted DELETE", tc.name, r.Method) } @@ -311,7 +331,7 @@ func TestDeleteCollection(t *testing.T) { } defer srv.Close() - err = cl.Resource(resource, tc.namespace).DeleteCollection(nil, metav1.ListOptions{}) + err = cl.Resource(resource).Namespace(tc.namespace).DeleteCollection(nil, metav1.ListOptions{}) if err != nil { t.Errorf("unexpected error when deleting collection %q: %v", tc.name, err) continue @@ -321,43 +341,45 @@ func TestDeleteCollection(t *testing.T) { func TestCreate(t *testing.T) { tcs := []struct { - resource string - name string - namespace string - obj *unstructured.Unstructured - path string + resource string + subresource []string + name string + namespace string + obj *unstructured.Unstructured + path string }{ { resource: "rtest", name: "normal_create", - path: "/api/gtest/vtest/rtest", - obj: getObject("vTest", "rTest", "normal_create"), + path: "/apis/gtest/vtest/rtest", + obj: getObject("gtest/vTest", "rTest", "normal_create"), }, { resource: "rtest", name: "namespaced_create", namespace: "nstest", - path: "/api/gtest/vtest/namespaces/nstest/rtest", - obj: getObject("vTest", "rTest", "namespaced_create"), + path: "/apis/gtest/vtest/namespaces/nstest/rtest", + obj: getObject("gtest/vTest", "rTest", "namespaced_create"), }, { - resource: "rtest/srtest", - name: "normal_subresource_create", - path: "/api/gtest/vtest/rtest/normal_subresource_create/srtest", - obj: getObject("vTest", "srTest", "normal_subresource_create"), + resource: "rtest", + subresource: []string{"srtest"}, + name: "normal_subresource_create", + path: "/apis/gtest/vtest/rtest/normal_subresource_create/srtest", + obj: getObject("vTest", "srTest", "normal_subresource_create"), }, { - resource: "rtest/srtest", - name: "namespaced_subresource_create", - namespace: "nstest", - path: "/api/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_create/srtest", - obj: getObject("vTest", "srTest", "namespaced_subresource_create"), + resource: "rtest/", + subresource: []string{"srtest"}, + name: "namespaced_subresource_create", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_create/srtest", + obj: getObject("vTest", "srTest", "namespaced_subresource_create"), }, } for _, tc := range tcs { - gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} - resource := &metav1.APIResource{Name: tc.resource, Namespaced: len(tc.namespace) != 0} - cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: tc.resource} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { t.Errorf("Create(%q) got HTTP method %s. wanted POST", tc.name, r.Method) } @@ -382,7 +404,7 @@ func TestCreate(t *testing.T) { } defer srv.Close() - got, err := cl.Resource(resource, tc.namespace).Create(tc.obj) + got, err := cl.Resource(resource).Namespace(tc.namespace).Create(tc.obj, tc.subresource...) if err != nil { t.Errorf("unexpected error when creating %q: %v", tc.name, err) continue @@ -396,43 +418,45 @@ func TestCreate(t *testing.T) { func TestUpdate(t *testing.T) { tcs := []struct { - resource string - name string - namespace string - obj *unstructured.Unstructured - path string + resource string + subresource []string + name string + namespace string + obj *unstructured.Unstructured + path string }{ { resource: "rtest", name: "normal_update", - path: "/api/gtest/vtest/rtest/normal_update", - obj: getObject("vTest", "rTest", "normal_update"), + path: "/apis/gtest/vtest/rtest/normal_update", + obj: getObject("gtest/vTest", "rTest", "normal_update"), }, { resource: "rtest", name: "namespaced_update", namespace: "nstest", - path: "/api/gtest/vtest/namespaces/nstest/rtest/namespaced_update", - obj: getObject("vTest", "rTest", "namespaced_update"), + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_update", + obj: getObject("gtest/vTest", "rTest", "namespaced_update"), }, { - resource: "rtest/srtest", - name: "normal_subresource_update", - path: "/api/gtest/vtest/rtest/normal_update/srtest", - obj: getObject("vTest", "srTest", "normal_update"), + resource: "rtest", + subresource: []string{"srtest"}, + name: "normal_subresource_update", + path: "/apis/gtest/vtest/rtest/normal_update/srtest", + obj: getObject("gtest/vTest", "srTest", "normal_update"), }, { - resource: "rtest/srtest", - name: "namespaced_subresource_update", - namespace: "nstest", - path: "/api/gtest/vtest/namespaces/nstest/rtest/namespaced_update/srtest", - obj: getObject("vTest", "srTest", "namespaced_update"), + resource: "rtest", + subresource: []string{"srtest"}, + name: "namespaced_subresource_update", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_update/srtest", + obj: getObject("gtest/vTest", "srTest", "namespaced_update"), }, } for _, tc := range tcs { - gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} - resource := &metav1.APIResource{Name: tc.resource, Namespaced: len(tc.namespace) != 0} - cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: tc.resource} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { if r.Method != "PUT" { t.Errorf("Update(%q) got HTTP method %s. wanted PUT", tc.name, r.Method) } @@ -457,7 +481,7 @@ func TestUpdate(t *testing.T) { } defer srv.Close() - got, err := cl.Resource(resource, tc.namespace).Update(tc.obj) + got, err := cl.Resource(resource).Namespace(tc.namespace).Update(tc.obj, tc.subresource...) if err != nil { t.Errorf("unexpected error when updating %q: %v", tc.name, err) continue @@ -479,30 +503,29 @@ func TestWatch(t *testing.T) { }{ { name: "normal_watch", - path: "/api/gtest/vtest/rtest", + path: "/apis/gtest/vtest/rtest", query: "watch=true", events: []watch.Event{ - {Type: watch.Added, Object: getObject("vTest", "rTest", "normal_watch")}, - {Type: watch.Modified, Object: getObject("vTest", "rTest", "normal_watch")}, - {Type: watch.Deleted, Object: getObject("vTest", "rTest", "normal_watch")}, + {Type: watch.Added, Object: getObject("gtest/vTest", "rTest", "normal_watch")}, + {Type: watch.Modified, Object: getObject("gtest/vTest", "rTest", "normal_watch")}, + {Type: watch.Deleted, Object: getObject("gtest/vTest", "rTest", "normal_watch")}, }, }, { name: "namespaced_watch", namespace: "nstest", - path: "/api/gtest/vtest/namespaces/nstest/rtest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest", query: "watch=true", events: []watch.Event{ - {Type: watch.Added, Object: getObject("vTest", "rTest", "namespaced_watch")}, - {Type: watch.Modified, Object: getObject("vTest", "rTest", "namespaced_watch")}, - {Type: watch.Deleted, Object: getObject("vTest", "rTest", "namespaced_watch")}, + {Type: watch.Added, Object: getObject("gtest/vTest", "rTest", "namespaced_watch")}, + {Type: watch.Modified, Object: getObject("gtest/vTest", "rTest", "namespaced_watch")}, + {Type: watch.Deleted, Object: getObject("gtest/vTest", "rTest", "namespaced_watch")}, }, }, } for _, tc := range tcs { - gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} - resource := &metav1.APIResource{Name: "rtest", Namespaced: len(tc.namespace) != 0} - cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: "rtest"} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { t.Errorf("Watch(%q) got HTTP method %s. wanted GET", tc.name, r.Method) } @@ -514,7 +537,7 @@ func TestWatch(t *testing.T) { t.Errorf("Watch(%q) got query %s. wanted %s", tc.name, r.URL.RawQuery, tc.query) } - enc := restclientwatch.NewEncoder(streaming.NewEncoder(w, dynamicCodec{}), dynamicCodec{}) + enc := restclientwatch.NewEncoder(streaming.NewEncoder(w, unstructured.UnstructuredJSONScheme), unstructured.UnstructuredJSONScheme) for _, e := range tc.events { enc.Encode(&e) } @@ -525,7 +548,7 @@ func TestWatch(t *testing.T) { } defer srv.Close() - watcher, err := cl.Resource(resource, tc.namespace).Watch(metav1.ListOptions{}) + watcher, err := cl.Resource(resource).Namespace(tc.namespace).Watch(metav1.ListOptions{}) if err != nil { t.Errorf("unexpected error when watching %q: %v", tc.name, err) continue @@ -542,48 +565,50 @@ func TestWatch(t *testing.T) { func TestPatch(t *testing.T) { tcs := []struct { - resource string - name string - namespace string - patch []byte - want *unstructured.Unstructured - path string + resource string + subresource []string + name string + namespace string + patch []byte + want *unstructured.Unstructured + path string }{ { resource: "rtest", name: "normal_patch", - path: "/api/gtest/vtest/rtest/normal_patch", - patch: getJSON("vTest", "rTest", "normal_patch"), - want: getObject("vTest", "rTest", "normal_patch"), + path: "/apis/gtest/vtest/rtest/normal_patch", + patch: getJSON("gtest/vTest", "rTest", "normal_patch"), + want: getObject("gtest/vTest", "rTest", "normal_patch"), }, { resource: "rtest", name: "namespaced_patch", namespace: "nstest", - path: "/api/gtest/vtest/namespaces/nstest/rtest/namespaced_patch", - patch: getJSON("vTest", "rTest", "namespaced_patch"), - want: getObject("vTest", "rTest", "namespaced_patch"), + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_patch", + patch: getJSON("gtest/vTest", "rTest", "namespaced_patch"), + want: getObject("gtest/vTest", "rTest", "namespaced_patch"), }, { - resource: "rtest/srtest", - name: "normal_subresource_patch", - path: "/api/gtest/vtest/rtest/normal_subresource_patch/srtest", - patch: getJSON("vTest", "srTest", "normal_subresource_patch"), - want: getObject("vTest", "srTest", "normal_subresource_patch"), + resource: "rtest", + subresource: []string{"srtest"}, + name: "normal_subresource_patch", + path: "/apis/gtest/vtest/rtest/normal_subresource_patch/srtest", + patch: getJSON("gtest/vTest", "srTest", "normal_subresource_patch"), + want: getObject("gtest/vTest", "srTest", "normal_subresource_patch"), }, { - resource: "rtest/srtest", - name: "namespaced_subresource_patch", - namespace: "nstest", - path: "/api/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_patch/srtest", - patch: getJSON("vTest", "srTest", "namespaced_subresource_patch"), - want: getObject("vTest", "srTest", "namespaced_subresource_patch"), + resource: "rtest", + subresource: []string{"srtest"}, + name: "namespaced_subresource_patch", + namespace: "nstest", + path: "/apis/gtest/vtest/namespaces/nstest/rtest/namespaced_subresource_patch/srtest", + patch: getJSON("gtest/vTest", "srTest", "namespaced_subresource_patch"), + want: getObject("gtest/vTest", "srTest", "namespaced_subresource_patch"), }, } for _, tc := range tcs { - gv := &schema.GroupVersion{Group: "gtest", Version: "vtest"} - resource := &metav1.APIResource{Name: tc.resource, Namespaced: len(tc.namespace) != 0} - cl, srv, err := getClientServer(gv, func(w http.ResponseWriter, r *http.Request) { + resource := schema.GroupVersionResource{Group: "gtest", Version: "vtest", Resource: tc.resource} + cl, srv, err := getClientServer(func(w http.ResponseWriter, r *http.Request) { if r.Method != "PATCH" { t.Errorf("Patch(%q) got HTTP method %s. wanted PATCH", tc.name, r.Method) } @@ -613,7 +638,7 @@ func TestPatch(t *testing.T) { } defer srv.Close() - got, err := cl.Resource(resource, tc.namespace).Patch(tc.name, types.StrategicMergePatchType, tc.patch) + got, err := cl.Resource(resource).Namespace(tc.namespace).Patch(tc.name, types.StrategicMergePatchType, tc.patch, tc.subresource...) if err != nil { t.Errorf("unexpected error when patching %q: %v", tc.name, err) continue @@ -624,11 +649,3 @@ func TestPatch(t *testing.T) { } } } - -func TestVersionedParameterEncoderWithV1Fallback(t *testing.T) { - enc := VersionedParameterEncoderWithV1Fallback - _, err := enc.EncodeParameters(&metav1.ListOptions{}, schema.GroupVersion{Group: "foo.bar.com", Version: "v4"}) - if err != nil { - t.Errorf("Unexpected error: %v", err) - } -} diff --git a/vendor/k8s.io/client-go/dynamic/dynamic_util.go b/vendor/k8s.io/client-go/dynamic/dynamic_util.go deleted file mode 100644 index c2cf0daea..000000000 --- a/vendor/k8s.io/client-go/dynamic/dynamic_util.go +++ /dev/null @@ -1,96 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package dynamic - -import ( - "fmt" - - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// VersionInterfaces provides an object converter and metadata -// accessor appropriate for use with unstructured objects. -func VersionInterfaces(schema.GroupVersion) (*meta.VersionInterfaces, error) { - return &meta.VersionInterfaces{ - ObjectConvertor: &unstructured.UnstructuredObjectConverter{}, - MetadataAccessor: meta.NewAccessor(), - }, nil -} - -// NewDiscoveryRESTMapper returns a RESTMapper based on discovery information. -func NewDiscoveryRESTMapper(resources []*metav1.APIResourceList, versionFunc meta.VersionInterfacesFunc) (*meta.DefaultRESTMapper, error) { - rm := meta.NewDefaultRESTMapper(nil, versionFunc) - for _, resourceList := range resources { - gv, err := schema.ParseGroupVersion(resourceList.GroupVersion) - if err != nil { - return nil, err - } - - for _, resource := range resourceList.APIResources { - gvk := gv.WithKind(resource.Kind) - scope := meta.RESTScopeRoot - if resource.Namespaced { - scope = meta.RESTScopeNamespace - } - rm.Add(gvk, scope) - } - } - return rm, nil -} - -// ObjectTyper provides an ObjectTyper implementation for -// unstructured.Unstructured object based on discovery information. -type ObjectTyper struct { - registered map[schema.GroupVersionKind]bool -} - -// NewObjectTyper constructs an ObjectTyper from discovery information. -func NewObjectTyper(resources []*metav1.APIResourceList) (runtime.ObjectTyper, error) { - ot := &ObjectTyper{registered: make(map[schema.GroupVersionKind]bool)} - for _, resourceList := range resources { - gv, err := schema.ParseGroupVersion(resourceList.GroupVersion) - if err != nil { - return nil, err - } - - for _, resource := range resourceList.APIResources { - ot.registered[gv.WithKind(resource.Kind)] = true - } - } - return ot, nil -} - -// ObjectKinds returns a slice of one element with the -// group,version,kind of the provided object, or an error if the -// object is not *unstructured.Unstructured or has no group,version,kind -// information. -func (ot *ObjectTyper) ObjectKinds(obj runtime.Object) ([]schema.GroupVersionKind, bool, error) { - if _, ok := obj.(*unstructured.Unstructured); !ok { - return nil, false, fmt.Errorf("type %T is invalid for determining dynamic object types", obj) - } - return []schema.GroupVersionKind{obj.GetObjectKind().GroupVersionKind()}, false, nil -} - -// Recognizes returns true if the provided group,version,kind was in -// the discovery information. -func (ot *ObjectTyper) Recognizes(gvk schema.GroupVersionKind) bool { - return ot.registered[gvk] -} diff --git a/vendor/k8s.io/client-go/dynamic/dynamic_util_test.go b/vendor/k8s.io/client-go/dynamic/dynamic_util_test.go deleted file mode 100644 index cdc68e018..000000000 --- a/vendor/k8s.io/client-go/dynamic/dynamic_util_test.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package dynamic - -import ( - "testing" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -func TestDiscoveryRESTMapper(t *testing.T) { - resources := []*metav1.APIResourceList{ - { - GroupVersion: "test/beta1", - APIResources: []metav1.APIResource{ - { - Name: "test_kinds", - Namespaced: true, - Kind: "test_kind", - }, - }, - }, - } - - gvk := schema.GroupVersionKind{ - Group: "test", - Version: "beta1", - Kind: "test_kind", - } - - mapper, err := NewDiscoveryRESTMapper(resources, VersionInterfaces) - if err != nil { - t.Fatalf("unexpected error creating mapper: %s", err) - } - - for _, res := range []schema.GroupVersionResource{ - { - Group: "test", - Version: "beta1", - Resource: "test_kinds", - }, - { - Version: "beta1", - Resource: "test_kinds", - }, - { - Group: "test", - Resource: "test_kinds", - }, - { - Resource: "test_kinds", - }, - } { - got, err := mapper.KindFor(res) - if err != nil { - t.Errorf("KindFor(%#v) unexpected error: %s", res, err) - continue - } - - if got != gvk { - t.Errorf("KindFor(%#v) = %#v; want %#v", res, got, gvk) - } - } -} diff --git a/vendor/k8s.io/client-go/dynamic/fake/BUILD b/vendor/k8s.io/client-go/dynamic/fake/BUILD deleted file mode 100644 index d006188f8..000000000 --- a/vendor/k8s.io/client-go/dynamic/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "client.go", - "client_pool.go", - ], - importpath = "k8s.io/client-go/dynamic/fake", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/dynamic:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/dynamic/fake/client.go b/vendor/k8s.io/client-go/dynamic/fake/client.go deleted file mode 100644 index 8399076c2..000000000 --- a/vendor/k8s.io/client-go/dynamic/fake/client.go +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package fake provides a fake client interface to arbitrary Kubernetes -// APIs that exposes common high level operations and exposes common -// metadata. -package fake - -import ( - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/labels" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/testing" - "k8s.io/client-go/util/flowcontrol" -) - -// FakeClient is a fake implementation of dynamic.Interface. -type FakeClient struct { - GroupVersion schema.GroupVersion - - *testing.Fake -} - -// GetRateLimiter returns the rate limiter for this client. -func (c *FakeClient) GetRateLimiter() flowcontrol.RateLimiter { - return nil -} - -// Resource returns an API interface to the specified resource for this client's -// group and version. If resource is not a namespaced resource, then namespace -// is ignored. The ResourceClient inherits the parameter codec of this client -func (c *FakeClient) Resource(resource *metav1.APIResource, namespace string) dynamic.ResourceInterface { - return &FakeResourceClient{ - Resource: c.GroupVersion.WithResource(resource.Name), - Kind: c.GroupVersion.WithKind(resource.Kind), - Namespace: namespace, - - Fake: c.Fake, - } -} - -// ParameterCodec returns a client with the provided parameter codec. -func (c *FakeClient) ParameterCodec(parameterCodec runtime.ParameterCodec) dynamic.Interface { - return &FakeClient{ - Fake: c.Fake, - } -} - -// FakeResourceClient is a fake implementation of dynamic.ResourceInterface -type FakeResourceClient struct { - Resource schema.GroupVersionResource - Kind schema.GroupVersionKind - Namespace string - - *testing.Fake -} - -// List returns a list of objects for this resource. -func (c *FakeResourceClient) List(opts metav1.ListOptions) (runtime.Object, error) { - obj, err := c.Fake. - Invokes(testing.NewListAction(c.Resource, c.Kind, c.Namespace, opts), &unstructured.UnstructuredList{}) - - if obj == nil { - return nil, err - } - - label, _, _ := testing.ExtractFromListOptions(opts) - if label == nil { - label = labels.Everything() - } - list := &unstructured.UnstructuredList{} - for _, item := range obj.(*unstructured.UnstructuredList).Items { - if label.Matches(labels.Set(item.GetLabels())) { - list.Items = append(list.Items, item) - } - } - return list, err -} - -// Get gets the resource with the specified name. -func (c *FakeResourceClient) Get(name string, opts metav1.GetOptions) (*unstructured.Unstructured, error) { - obj, err := c.Fake. - Invokes(testing.NewGetAction(c.Resource, c.Namespace, name), &unstructured.Unstructured{}) - - if obj == nil { - return nil, err - } - - return obj.(*unstructured.Unstructured), err -} - -// Delete deletes the resource with the specified name. -func (c *FakeResourceClient) Delete(name string, opts *metav1.DeleteOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteAction(c.Resource, c.Namespace, name), &unstructured.Unstructured{}) - - return err -} - -// DeleteCollection deletes a collection of objects. -func (c *FakeResourceClient) DeleteCollection(deleteOptions *metav1.DeleteOptions, listOptions metav1.ListOptions) error { - _, err := c.Fake. - Invokes(testing.NewDeleteCollectionAction(c.Resource, c.Namespace, listOptions), &unstructured.Unstructured{}) - - return err -} - -// Create creates the provided resource. -func (c *FakeResourceClient) Create(inObj *unstructured.Unstructured) (*unstructured.Unstructured, error) { - obj, err := c.Fake. - Invokes(testing.NewCreateAction(c.Resource, c.Namespace, inObj), &unstructured.Unstructured{}) - - if obj == nil { - return nil, err - } - return obj.(*unstructured.Unstructured), err -} - -// Update updates the provided resource. -func (c *FakeResourceClient) Update(inObj *unstructured.Unstructured) (*unstructured.Unstructured, error) { - obj, err := c.Fake. - Invokes(testing.NewUpdateAction(c.Resource, c.Namespace, inObj), &unstructured.Unstructured{}) - - if obj == nil { - return nil, err - } - return obj.(*unstructured.Unstructured), err -} - -// Watch returns a watch.Interface that watches the resource. -func (c *FakeResourceClient) Watch(opts metav1.ListOptions) (watch.Interface, error) { - return c.Fake. - InvokesWatch(testing.NewWatchAction(c.Resource, c.Namespace, opts)) -} - -// Patch patches the provided resource. -func (c *FakeResourceClient) Patch(name string, pt types.PatchType, data []byte) (*unstructured.Unstructured, error) { - obj, err := c.Fake. - Invokes(testing.NewPatchAction(c.Resource, c.Namespace, name, data), &unstructured.Unstructured{}) - - if obj == nil { - return nil, err - } - return obj.(*unstructured.Unstructured), err -} diff --git a/vendor/k8s.io/client-go/dynamic/fake/client_pool.go b/vendor/k8s.io/client-go/dynamic/fake/client_pool.go deleted file mode 100644 index 7ec114892..000000000 --- a/vendor/k8s.io/client-go/dynamic/fake/client_pool.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package fake provides a fake client interface to arbitrary Kubernetes -// APIs that exposes common high level operations and exposes common -// metadata. -package fake - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/client-go/dynamic" - "k8s.io/client-go/testing" -) - -// FakeClientPool provides a fake implementation of dynamic.ClientPool. -// It assumes resource GroupVersions are the same as their corresponding kind GroupVersions. -type FakeClientPool struct { - testing.Fake -} - -// ClientForGroupVersionKind returns a client configured for the specified groupVersionResource. -// Resource may be empty. -func (p *FakeClientPool) ClientForGroupVersionResource(resource schema.GroupVersionResource) (dynamic.Interface, error) { - return p.ClientForGroupVersionKind(resource.GroupVersion().WithKind("")) -} - -// ClientForGroupVersionKind returns a client configured for the specified groupVersionKind. -// Kind may be empty. -func (p *FakeClientPool) ClientForGroupVersionKind(kind schema.GroupVersionKind) (dynamic.Interface, error) { - // we can just create a new client every time for testing purposes - return &FakeClient{ - GroupVersion: kind.GroupVersion(), - Fake: &p.Fake, - }, nil -} diff --git a/vendor/k8s.io/client-go/dynamic/fake/simple.go b/vendor/k8s.io/client-go/dynamic/fake/simple.go new file mode 100644 index 000000000..a71cec50e --- /dev/null +++ b/vendor/k8s.io/client-go/dynamic/fake/simple.go @@ -0,0 +1,363 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package fake + +import ( + "strings" + + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/testing" +) + +func NewSimpleDynamicClient(scheme *runtime.Scheme, objects ...runtime.Object) *FakeDynamicClient { + codecs := serializer.NewCodecFactory(scheme) + o := testing.NewObjectTracker(scheme, codecs.UniversalDecoder()) + for _, obj := range objects { + if err := o.Add(obj); err != nil { + panic(err) + } + } + + cs := &FakeDynamicClient{} + cs.AddReactor("*", "*", testing.ObjectReaction(o)) + cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { + gvr := action.GetResource() + ns := action.GetNamespace() + watch, err := o.Watch(gvr, ns) + if err != nil { + return false, nil, err + } + return true, watch, nil + }) + + return cs +} + +// Clientset implements clientset.Interface. Meant to be embedded into a +// struct to get a default implementation. This makes faking out just the method +// you want to test easier. +type FakeDynamicClient struct { + testing.Fake + scheme *runtime.Scheme +} + +type dynamicResourceClient struct { + client *FakeDynamicClient + namespace string + resource schema.GroupVersionResource +} + +var _ dynamic.Interface = &FakeDynamicClient{} + +func (c *FakeDynamicClient) Resource(resource schema.GroupVersionResource) dynamic.NamespaceableResourceInterface { + return &dynamicResourceClient{client: c, resource: resource} +} + +func (c *dynamicResourceClient) Namespace(ns string) dynamic.ResourceInterface { + ret := *c + ret.namespace = ns + return &ret +} + +func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) { + var uncastRet runtime.Object + var err error + switch { + case len(c.namespace) == 0 && len(subresources) == 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewRootCreateAction(c.resource, obj), obj) + + case len(c.namespace) == 0 && len(subresources) > 0: + accessor, err := meta.Accessor(obj) + if err != nil { + return nil, err + } + name := accessor.GetName() + uncastRet, err = c.client.Fake. + Invokes(testing.NewRootCreateSubresourceAction(c.resource, name, strings.Join(subresources, "/"), obj), obj) + + case len(c.namespace) > 0 && len(subresources) == 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewCreateAction(c.resource, c.namespace, obj), obj) + + case len(c.namespace) > 0 && len(subresources) > 0: + accessor, err := meta.Accessor(obj) + if err != nil { + return nil, err + } + name := accessor.GetName() + uncastRet, err = c.client.Fake. + Invokes(testing.NewCreateSubresourceAction(c.resource, name, strings.Join(subresources, "/"), c.namespace, obj), obj) + + } + + if err != nil { + return nil, err + } + if uncastRet == nil { + return nil, err + } + + ret := &unstructured.Unstructured{} + if err := c.client.scheme.Convert(uncastRet, ret, nil); err != nil { + return nil, err + } + return ret, err +} + +func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) { + var uncastRet runtime.Object + var err error + switch { + case len(c.namespace) == 0 && len(subresources) == 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewRootUpdateAction(c.resource, obj), obj) + + case len(c.namespace) == 0 && len(subresources) > 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewRootUpdateSubresourceAction(c.resource, strings.Join(subresources, "/"), obj), obj) + + case len(c.namespace) > 0 && len(subresources) == 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewUpdateAction(c.resource, c.namespace, obj), obj) + + case len(c.namespace) > 0 && len(subresources) > 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewUpdateSubresourceAction(c.resource, strings.Join(subresources, "/"), c.namespace, obj), obj) + + } + + if err != nil { + return nil, err + } + if uncastRet == nil { + return nil, err + } + + ret := &unstructured.Unstructured{} + if err := c.client.scheme.Convert(uncastRet, ret, nil); err != nil { + return nil, err + } + return ret, err +} + +func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { + var uncastRet runtime.Object + var err error + switch { + case len(c.namespace) == 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewRootUpdateSubresourceAction(c.resource, "status", obj), obj) + + case len(c.namespace) > 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewUpdateSubresourceAction(c.resource, "status", c.namespace, obj), obj) + + } + + if err != nil { + return nil, err + } + if uncastRet == nil { + return nil, err + } + + ret := &unstructured.Unstructured{} + if err := c.client.scheme.Convert(uncastRet, ret, nil); err != nil { + return nil, err + } + return ret, err +} + +func (c *dynamicResourceClient) Delete(name string, opts *metav1.DeleteOptions, subresources ...string) error { + var err error + switch { + case len(c.namespace) == 0 && len(subresources) == 0: + _, err = c.client.Fake. + Invokes(testing.NewRootDeleteAction(c.resource, name), &metav1.Status{Status: "dynamic delete fail"}) + + case len(c.namespace) == 0 && len(subresources) > 0: + _, err = c.client.Fake. + Invokes(testing.NewRootDeleteSubresourceAction(c.resource, strings.Join(subresources, "/"), name), &metav1.Status{Status: "dynamic delete fail"}) + + case len(c.namespace) > 0 && len(subresources) == 0: + _, err = c.client.Fake. + Invokes(testing.NewDeleteAction(c.resource, c.namespace, name), &metav1.Status{Status: "dynamic delete fail"}) + + case len(c.namespace) > 0 && len(subresources) > 0: + _, err = c.client.Fake. + Invokes(testing.NewDeleteSubresourceAction(c.resource, strings.Join(subresources, "/"), c.namespace, name), &metav1.Status{Status: "dynamic delete fail"}) + } + + return err +} + +func (c *dynamicResourceClient) DeleteCollection(opts *metav1.DeleteOptions, listOptions metav1.ListOptions) error { + var err error + switch { + case len(c.namespace) == 0: + action := testing.NewRootDeleteCollectionAction(c.resource, listOptions) + _, err = c.client.Fake.Invokes(action, &metav1.Status{Status: "dynamic deletecollection fail"}) + + case len(c.namespace) > 0: + action := testing.NewDeleteCollectionAction(c.resource, c.namespace, listOptions) + _, err = c.client.Fake.Invokes(action, &metav1.Status{Status: "dynamic deletecollection fail"}) + + } + + return err +} + +func (c *dynamicResourceClient) Get(name string, opts metav1.GetOptions, subresources ...string) (*unstructured.Unstructured, error) { + var uncastRet runtime.Object + var err error + switch { + case len(c.namespace) == 0 && len(subresources) == 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewRootGetAction(c.resource, name), &metav1.Status{Status: "dynamic get fail"}) + + case len(c.namespace) == 0 && len(subresources) > 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewRootGetSubresourceAction(c.resource, strings.Join(subresources, "/"), name), &metav1.Status{Status: "dynamic get fail"}) + + case len(c.namespace) > 0 && len(subresources) == 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewGetAction(c.resource, c.namespace, name), &metav1.Status{Status: "dynamic get fail"}) + + case len(c.namespace) > 0 && len(subresources) > 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewGetSubresourceAction(c.resource, c.namespace, strings.Join(subresources, "/"), name), &metav1.Status{Status: "dynamic get fail"}) + } + + if err != nil { + return nil, err + } + if uncastRet == nil { + return nil, err + } + + ret := &unstructured.Unstructured{} + if err := c.client.scheme.Convert(uncastRet, ret, nil); err != nil { + return nil, err + } + return ret, err +} + +func (c *dynamicResourceClient) List(opts metav1.ListOptions) (*unstructured.UnstructuredList, error) { + var obj runtime.Object + var err error + switch { + case len(c.namespace) == 0: + obj, err = c.client.Fake. + Invokes(testing.NewRootListAction(c.resource, schema.GroupVersionKind{Version: "v1", Kind: "List"}, opts), &metav1.Status{Status: "dynamic list fail"}) + + case len(c.namespace) > 0: + obj, err = c.client.Fake. + Invokes(testing.NewListAction(c.resource, schema.GroupVersionKind{Version: "v1", Kind: "List"}, c.namespace, opts), &metav1.Status{Status: "dynamic list fail"}) + + } + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + + retUnstructured := &unstructured.Unstructured{} + if err := c.client.scheme.Convert(obj, retUnstructured, nil); err != nil { + return nil, err + } + entireList, err := retUnstructured.ToList() + if err != nil { + return nil, err + } + + list := &unstructured.UnstructuredList{} + for _, item := range entireList.Items { + metadata, err := meta.Accessor(item) + if err != nil { + return nil, err + } + if label.Matches(labels.Set(metadata.GetLabels())) { + list.Items = append(list.Items, item) + } + } + return list, nil +} + +func (c *dynamicResourceClient) Watch(opts metav1.ListOptions) (watch.Interface, error) { + switch { + case len(c.namespace) == 0: + return c.client.Fake. + InvokesWatch(testing.NewRootWatchAction(c.resource, opts)) + + case len(c.namespace) > 0: + return c.client.Fake. + InvokesWatch(testing.NewWatchAction(c.resource, c.namespace, opts)) + + } + + panic("math broke") +} + +func (c *dynamicResourceClient) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (*unstructured.Unstructured, error) { + var uncastRet runtime.Object + var err error + switch { + case len(c.namespace) == 0 && len(subresources) == 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewRootPatchAction(c.resource, name, data), &metav1.Status{Status: "dynamic patch fail"}) + + case len(c.namespace) == 0 && len(subresources) > 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewRootPatchSubresourceAction(c.resource, name, data, subresources...), &metav1.Status{Status: "dynamic patch fail"}) + + case len(c.namespace) > 0 && len(subresources) == 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewPatchAction(c.resource, c.namespace, name, data), &metav1.Status{Status: "dynamic patch fail"}) + + case len(c.namespace) > 0 && len(subresources) > 0: + uncastRet, err = c.client.Fake. + Invokes(testing.NewPatchSubresourceAction(c.resource, c.namespace, name, data, subresources...), &metav1.Status{Status: "dynamic patch fail"}) + + } + + if err != nil { + return nil, err + } + if uncastRet == nil { + return nil, err + } + + ret := &unstructured.Unstructured{} + if err := c.client.scheme.Convert(uncastRet, ret, nil); err != nil { + return nil, err + } + return ret, err +} diff --git a/vendor/k8s.io/client-go/dynamic/interface.go b/vendor/k8s.io/client-go/dynamic/interface.go new file mode 100644 index 000000000..3f364f872 --- /dev/null +++ b/vendor/k8s.io/client-go/dynamic/interface.go @@ -0,0 +1,59 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package dynamic + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/watch" +) + +type Interface interface { + Resource(resource schema.GroupVersionResource) NamespaceableResourceInterface +} + +type ResourceInterface interface { + Create(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) + Update(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) + UpdateStatus(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) + Delete(name string, options *metav1.DeleteOptions, subresources ...string) error + DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error + Get(name string, options metav1.GetOptions, subresources ...string) (*unstructured.Unstructured, error) + List(opts metav1.ListOptions) (*unstructured.UnstructuredList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (*unstructured.Unstructured, error) +} + +type NamespaceableResourceInterface interface { + Namespace(string) ResourceInterface + ResourceInterface +} + +// APIPathResolverFunc knows how to convert a groupVersion to its API path. The Kind field is optional. +// TODO find a better place to move this for existing callers +type APIPathResolverFunc func(kind schema.GroupVersionKind) string + +// LegacyAPIPathResolverFunc can resolve paths properly with the legacy API. +// TODO find a better place to move this for existing callers +func LegacyAPIPathResolverFunc(kind schema.GroupVersionKind) string { + if len(kind.Group) == 0 { + return "/api" + } + return "/apis" +} diff --git a/vendor/k8s.io/client-go/dynamic/scheme.go b/vendor/k8s.io/client-go/dynamic/scheme.go new file mode 100644 index 000000000..c4aa081f9 --- /dev/null +++ b/vendor/k8s.io/client-go/dynamic/scheme.go @@ -0,0 +1,98 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package dynamic + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/runtime/serializer/json" + "k8s.io/apimachinery/pkg/runtime/serializer/versioning" +) + +var watchScheme = runtime.NewScheme() +var basicScheme = runtime.NewScheme() +var deleteScheme = runtime.NewScheme() +var parameterScheme = runtime.NewScheme() +var deleteOptionsCodec = serializer.NewCodecFactory(deleteScheme) +var dynamicParameterCodec = runtime.NewParameterCodec(parameterScheme) + +var versionV1 = schema.GroupVersion{Version: "v1"} + +func init() { + metav1.AddToGroupVersion(watchScheme, versionV1) + metav1.AddToGroupVersion(basicScheme, versionV1) + metav1.AddToGroupVersion(parameterScheme, versionV1) + metav1.AddToGroupVersion(deleteScheme, versionV1) +} + +var watchJsonSerializerInfo = runtime.SerializerInfo{ + MediaType: "application/json", + EncodesAsText: true, + Serializer: json.NewSerializer(json.DefaultMetaFactory, watchScheme, watchScheme, false), + PrettySerializer: json.NewSerializer(json.DefaultMetaFactory, watchScheme, watchScheme, true), + StreamSerializer: &runtime.StreamSerializerInfo{ + EncodesAsText: true, + Serializer: json.NewSerializer(json.DefaultMetaFactory, watchScheme, watchScheme, false), + Framer: json.Framer, + }, +} + +// watchNegotiatedSerializer is used to read the wrapper of the watch stream +type watchNegotiatedSerializer struct{} + +var watchNegotiatedSerializerInstance = watchNegotiatedSerializer{} + +func (s watchNegotiatedSerializer) SupportedMediaTypes() []runtime.SerializerInfo { + return []runtime.SerializerInfo{watchJsonSerializerInfo} +} + +func (s watchNegotiatedSerializer) EncoderForVersion(encoder runtime.Encoder, gv runtime.GroupVersioner) runtime.Encoder { + return versioning.NewDefaultingCodecForScheme(watchScheme, encoder, nil, gv, nil) +} + +func (s watchNegotiatedSerializer) DecoderToVersion(decoder runtime.Decoder, gv runtime.GroupVersioner) runtime.Decoder { + return versioning.NewDefaultingCodecForScheme(watchScheme, nil, decoder, nil, gv) +} + +// basicNegotiatedSerializer is used to handle discovery and error handling serialization +type basicNegotiatedSerializer struct{} + +func (s basicNegotiatedSerializer) SupportedMediaTypes() []runtime.SerializerInfo { + return []runtime.SerializerInfo{ + { + MediaType: "application/json", + EncodesAsText: true, + Serializer: json.NewSerializer(json.DefaultMetaFactory, basicScheme, basicScheme, false), + PrettySerializer: json.NewSerializer(json.DefaultMetaFactory, basicScheme, basicScheme, true), + StreamSerializer: &runtime.StreamSerializerInfo{ + EncodesAsText: true, + Serializer: json.NewSerializer(json.DefaultMetaFactory, basicScheme, basicScheme, false), + Framer: json.Framer, + }, + }, + } +} + +func (s basicNegotiatedSerializer) EncoderForVersion(encoder runtime.Encoder, gv runtime.GroupVersioner) runtime.Encoder { + return versioning.NewDefaultingCodecForScheme(watchScheme, encoder, nil, gv, nil) +} + +func (s basicNegotiatedSerializer) DecoderToVersion(decoder runtime.Decoder, gv runtime.GroupVersioner) runtime.Decoder { + return versioning.NewDefaultingCodecForScheme(watchScheme, nil, decoder, nil, gv) +} diff --git a/vendor/k8s.io/client-go/dynamic/simple.go b/vendor/k8s.io/client-go/dynamic/simple.go new file mode 100644 index 000000000..88e9cc2b0 --- /dev/null +++ b/vendor/k8s.io/client-go/dynamic/simple.go @@ -0,0 +1,287 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package dynamic + +import ( + "io" + + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer/streaming" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/rest" +) + +type dynamicClient struct { + client *rest.RESTClient +} + +var _ Interface = &dynamicClient{} + +func NewForConfig(inConfig *rest.Config) (Interface, error) { + config := rest.CopyConfig(inConfig) + // for serializing the options + config.GroupVersion = &schema.GroupVersion{} + config.APIPath = "/if-you-see-this-search-for-the-break" + config.AcceptContentTypes = "application/json" + config.ContentType = "application/json" + config.NegotiatedSerializer = basicNegotiatedSerializer{} // this gets used for discovery and error handling types + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + restClient, err := rest.RESTClientFor(config) + if err != nil { + return nil, err + } + + return &dynamicClient{client: restClient}, nil +} + +type dynamicResourceClient struct { + client *dynamicClient + namespace string + resource schema.GroupVersionResource +} + +func (c *dynamicClient) Resource(resource schema.GroupVersionResource) NamespaceableResourceInterface { + return &dynamicResourceClient{client: c, resource: resource} +} + +func (c *dynamicResourceClient) Namespace(ns string) ResourceInterface { + ret := *c + ret.namespace = ns + return &ret +} + +func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) { + outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj) + if err != nil { + return nil, err + } + name := "" + if len(subresources) > 0 { + accessor, err := meta.Accessor(obj) + if err != nil { + return nil, err + } + name = accessor.GetName() + } + + result := c.client.client.Post().AbsPath(append(c.makeURLSegments(name), subresources...)...).Body(outBytes).Do() + if err := result.Error(); err != nil { + return nil, err + } + + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + return uncastObj.(*unstructured.Unstructured), nil +} + +func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) { + accessor, err := meta.Accessor(obj) + if err != nil { + return nil, err + } + outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj) + if err != nil { + return nil, err + } + + result := c.client.client.Put().AbsPath(append(c.makeURLSegments(accessor.GetName()), subresources...)...).Body(outBytes).Do() + if err := result.Error(); err != nil { + return nil, err + } + + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + return uncastObj.(*unstructured.Unstructured), nil +} + +func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { + accessor, err := meta.Accessor(obj) + if err != nil { + return nil, err + } + + outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj) + if err != nil { + return nil, err + } + + result := c.client.client.Put().AbsPath(append(c.makeURLSegments(accessor.GetName()), "status")...).Body(outBytes).Do() + if err := result.Error(); err != nil { + return nil, err + } + + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + return uncastObj.(*unstructured.Unstructured), nil +} + +func (c *dynamicResourceClient) Delete(name string, opts *metav1.DeleteOptions, subresources ...string) error { + if opts == nil { + opts = &metav1.DeleteOptions{} + } + deleteOptionsByte, err := runtime.Encode(deleteOptionsCodec.LegacyCodec(schema.GroupVersion{Version: "v1"}), opts) + if err != nil { + return err + } + + result := c.client.client.Delete().AbsPath(append(c.makeURLSegments(name), subresources...)...).Body(deleteOptionsByte).Do() + return result.Error() +} + +func (c *dynamicResourceClient) DeleteCollection(opts *metav1.DeleteOptions, listOptions metav1.ListOptions) error { + if opts == nil { + opts = &metav1.DeleteOptions{} + } + deleteOptionsByte, err := runtime.Encode(deleteOptionsCodec.LegacyCodec(schema.GroupVersion{Version: "v1"}), opts) + if err != nil { + return err + } + + result := c.client.client.Delete().AbsPath(c.makeURLSegments("")...).Body(deleteOptionsByte).SpecificallyVersionedParams(&listOptions, dynamicParameterCodec, versionV1).Do() + return result.Error() +} + +func (c *dynamicResourceClient) Get(name string, opts metav1.GetOptions, subresources ...string) (*unstructured.Unstructured, error) { + result := c.client.client.Get().AbsPath(append(c.makeURLSegments(name), subresources...)...).SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).Do() + if err := result.Error(); err != nil { + return nil, err + } + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + return uncastObj.(*unstructured.Unstructured), nil +} + +func (c *dynamicResourceClient) List(opts metav1.ListOptions) (*unstructured.UnstructuredList, error) { + result := c.client.client.Get().AbsPath(c.makeURLSegments("")...).SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).Do() + if err := result.Error(); err != nil { + return nil, err + } + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + if list, ok := uncastObj.(*unstructured.UnstructuredList); ok { + return list, nil + } + + list, err := uncastObj.(*unstructured.Unstructured).ToList() + if err != nil { + return nil, err + } + return list, nil +} + +func (c *dynamicResourceClient) Watch(opts metav1.ListOptions) (watch.Interface, error) { + internalGV := schema.GroupVersions{ + {Group: c.resource.Group, Version: runtime.APIVersionInternal}, + // always include the legacy group as a decoding target to handle non-error `Status` return types + {Group: "", Version: runtime.APIVersionInternal}, + } + s := &rest.Serializers{ + Encoder: watchNegotiatedSerializerInstance.EncoderForVersion(watchJsonSerializerInfo.Serializer, c.resource.GroupVersion()), + Decoder: watchNegotiatedSerializerInstance.DecoderToVersion(watchJsonSerializerInfo.Serializer, internalGV), + + RenegotiatedDecoder: func(contentType string, params map[string]string) (runtime.Decoder, error) { + return watchNegotiatedSerializerInstance.DecoderToVersion(watchJsonSerializerInfo.Serializer, internalGV), nil + }, + StreamingSerializer: watchJsonSerializerInfo.StreamSerializer.Serializer, + Framer: watchJsonSerializerInfo.StreamSerializer.Framer, + } + + wrappedDecoderFn := func(body io.ReadCloser) streaming.Decoder { + framer := s.Framer.NewFrameReader(body) + return streaming.NewDecoder(framer, s.StreamingSerializer) + } + + opts.Watch = true + return c.client.client.Get().AbsPath(c.makeURLSegments("")...). + SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1). + WatchWithSpecificDecoders(wrappedDecoderFn, unstructured.UnstructuredJSONScheme) +} + +func (c *dynamicResourceClient) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (*unstructured.Unstructured, error) { + result := c.client.client.Patch(pt).AbsPath(append(c.makeURLSegments(name), subresources...)...).Body(data).Do() + if err := result.Error(); err != nil { + return nil, err + } + retBytes, err := result.Raw() + if err != nil { + return nil, err + } + uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes) + if err != nil { + return nil, err + } + return uncastObj.(*unstructured.Unstructured), nil +} + +func (c *dynamicResourceClient) makeURLSegments(name string) []string { + url := []string{} + if len(c.resource.Group) == 0 { + url = append(url, "api") + } else { + url = append(url, "apis", c.resource.Group) + } + url = append(url, c.resource.Version) + + if len(c.namespace) > 0 { + url = append(url, "namespaces", c.namespace) + } + url = append(url, c.resource.Resource) + + if len(name) > 0 { + url = append(url, name) + } + + return url +} diff --git a/vendor/k8s.io/client-go/examples/create-update-delete-deployment/BUILD b/vendor/k8s.io/client-go/examples/create-update-delete-deployment/BUILD deleted file mode 100644 index 2da72ec9f..000000000 --- a/vendor/k8s.io/client-go/examples/create-update-delete-deployment/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_binary", - "go_library", -) - -go_binary( - name = "create-update-delete-deployment", - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["main.go"], - importpath = "k8s.io/client-go/examples/create-update-delete-deployment", - deps = [ - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", - "//vendor/k8s.io/client-go/util/homedir:go_default_library", - "//vendor/k8s.io/client-go/util/retry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/examples/create-update-delete-deployment/main.go b/vendor/k8s.io/client-go/examples/create-update-delete-deployment/main.go index f6d622745..333ada018 100644 --- a/vendor/k8s.io/client-go/examples/create-update-delete-deployment/main.go +++ b/vendor/k8s.io/client-go/examples/create-update-delete-deployment/main.go @@ -24,7 +24,7 @@ import ( "os" "path/filepath" - appsv1beta1 "k8s.io/api/apps/v1beta1" + appsv1 "k8s.io/api/apps/v1" apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" @@ -53,14 +53,19 @@ func main() { panic(err) } - deploymentsClient := clientset.AppsV1beta1().Deployments(apiv1.NamespaceDefault) + deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault) - deployment := &appsv1beta1.Deployment{ + deployment := &appsv1.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: "demo-deployment", }, - Spec: appsv1beta1.DeploymentSpec{ + Spec: appsv1.DeploymentSpec{ Replicas: int32Ptr(2), + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "app": "demo", + }, + }, Template: apiv1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ @@ -128,27 +133,6 @@ func main() { } fmt.Println("Updated deployment...") - // Rollback Deployment - prompt() - fmt.Println("Rolling back deployment...") - // Once again use RetryOnConflict to avoid update conflicts - retryErr = retry.RetryOnConflict(retry.DefaultRetry, func() error { - result, getErr := deploymentsClient.Get("demo-deployment", metav1.GetOptions{}) - if getErr != nil { - panic(fmt.Errorf("Failed to get latest version of Deployment: %v", getErr)) - } - - result.Spec.RollbackTo = &appsv1beta1.RollbackConfig{ - Revision: 0, // can be specific revision number, or 0 for last revision - } - _, updateErr := deploymentsClient.Update(result) - return updateErr - }) - if retryErr != nil { - panic(fmt.Errorf("Rollback failed: %v", retryErr)) - } - fmt.Println("Rolled back deployment...") - // List Deployments prompt() fmt.Printf("Listing deployments in namespace %q:\n", apiv1.NamespaceDefault) diff --git a/vendor/k8s.io/client-go/examples/in-cluster-client-configuration/BUILD b/vendor/k8s.io/client-go/examples/in-cluster-client-configuration/BUILD deleted file mode 100644 index f4146ae37..000000000 --- a/vendor/k8s.io/client-go/examples/in-cluster-client-configuration/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_binary", - "go_library", -) - -go_binary( - name = "in-cluster-client-configuration", - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["main.go"], - importpath = "k8s.io/client-go/examples/in-cluster-client-configuration", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/examples/out-of-cluster-client-configuration/BUILD b/vendor/k8s.io/client-go/examples/out-of-cluster-client-configuration/BUILD deleted file mode 100644 index 2fda9686f..000000000 --- a/vendor/k8s.io/client-go/examples/out-of-cluster-client-configuration/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_binary", - "go_library", -) - -go_binary( - name = "out-of-cluster-client-configuration", - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["main.go"], - importpath = "k8s.io/client-go/examples/out-of-cluster-client-configuration", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/examples/workqueue/BUILD b/vendor/k8s.io/client-go/examples/workqueue/BUILD deleted file mode 100644 index 8c3c7cb51..000000000 --- a/vendor/k8s.io/client-go/examples/workqueue/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_binary", - "go_library", -) - -go_binary( - name = "workqueue", - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["main.go"], - importpath = "k8s.io/client-go/examples/workqueue", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", - "//vendor/k8s.io/client-go/util/workqueue:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/BUILD b/vendor/k8s.io/client-go/informers/BUILD deleted file mode 100644 index 99486a1c8..000000000 --- a/vendor/k8s.io/client-go/informers/BUILD +++ /dev/null @@ -1,91 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "factory.go", - "generic.go", - ], - importpath = "k8s.io/client-go/informers", - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/informers/admissionregistration:go_default_library", - "//vendor/k8s.io/client-go/informers/apps:go_default_library", - "//vendor/k8s.io/client-go/informers/autoscaling:go_default_library", - "//vendor/k8s.io/client-go/informers/batch:go_default_library", - "//vendor/k8s.io/client-go/informers/certificates:go_default_library", - "//vendor/k8s.io/client-go/informers/core:go_default_library", - "//vendor/k8s.io/client-go/informers/events:go_default_library", - "//vendor/k8s.io/client-go/informers/extensions:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/networking:go_default_library", - "//vendor/k8s.io/client-go/informers/policy:go_default_library", - "//vendor/k8s.io/client-go/informers/rbac:go_default_library", - "//vendor/k8s.io/client-go/informers/scheduling:go_default_library", - "//vendor/k8s.io/client-go/informers/settings:go_default_library", - "//vendor/k8s.io/client-go/informers/storage:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/admissionregistration:all-srcs", - "//staging/src/k8s.io/client-go/informers/apps:all-srcs", - "//staging/src/k8s.io/client-go/informers/autoscaling:all-srcs", - "//staging/src/k8s.io/client-go/informers/batch:all-srcs", - "//staging/src/k8s.io/client-go/informers/certificates:all-srcs", - "//staging/src/k8s.io/client-go/informers/core:all-srcs", - "//staging/src/k8s.io/client-go/informers/events:all-srcs", - "//staging/src/k8s.io/client-go/informers/extensions:all-srcs", - "//staging/src/k8s.io/client-go/informers/internalinterfaces:all-srcs", - "//staging/src/k8s.io/client-go/informers/networking:all-srcs", - "//staging/src/k8s.io/client-go/informers/policy:all-srcs", - "//staging/src/k8s.io/client-go/informers/rbac:all-srcs", - "//staging/src/k8s.io/client-go/informers/scheduling:all-srcs", - "//staging/src/k8s.io/client-go/informers/settings:all-srcs", - "//staging/src/k8s.io/client-go/informers/storage:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/BUILD b/vendor/k8s.io/client-go/informers/admissionregistration/BUILD deleted file mode 100644 index 6f93c10a2..000000000 --- a/vendor/k8s.io/client-go/informers/admissionregistration/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/admissionregistration", - deps = [ - "//vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/informers/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/admissionregistration/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/informers/admissionregistration/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/interface.go b/vendor/k8s.io/client-go/informers/admissionregistration/interface.go index 138dccc26..7a0783cc3 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/interface.go +++ b/vendor/k8s.io/client-go/informers/admissionregistration/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/BUILD deleted file mode 100644 index 7292f8ca2..000000000 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "initializerconfiguration.go", - "interface.go", - ], - importpath = "k8s.io/client-go/informers/admissionregistration/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/initializerconfiguration.go b/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/initializerconfiguration.go index 659a04caf..463ca00e7 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/initializerconfiguration.go +++ b/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/initializerconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/interface.go b/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/interface.go index 54df1caf3..0f47d65d8 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/interface.go +++ b/vendor/k8s.io/client-go/informers/admissionregistration/v1alpha1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/BUILD deleted file mode 100644 index e66e6eb44..000000000 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "mutatingwebhookconfiguration.go", - "validatingwebhookconfiguration.go", - ], - importpath = "k8s.io/client-go/informers/admissionregistration/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/interface.go index 5364c1ae1..d1e2b61be 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/interface.go +++ b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go index 6e65a86c3..58f065de2 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/validatingwebhookconfiguration.go b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/validatingwebhookconfiguration.go index 42d16177c..bfa89cef5 100644 --- a/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/validatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/informers/admissionregistration/v1beta1/validatingwebhookconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/BUILD b/vendor/k8s.io/client-go/informers/apps/BUILD deleted file mode 100644 index 80615b108..000000000 --- a/vendor/k8s.io/client-go/informers/apps/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/apps", - deps = [ - "//vendor/k8s.io/client-go/informers/apps/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/apps/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/apps/v1beta2:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/apps/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/apps/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/informers/apps/v1beta2:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/apps/interface.go b/vendor/k8s.io/client-go/informers/apps/interface.go index 7013d4d6f..02eefe584 100644 --- a/vendor/k8s.io/client-go/informers/apps/interface.go +++ b/vendor/k8s.io/client-go/informers/apps/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1/BUILD b/vendor/k8s.io/client-go/informers/apps/v1/BUILD deleted file mode 100644 index 233e26101..000000000 --- a/vendor/k8s.io/client-go/informers/apps/v1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "daemonset.go", - "deployment.go", - "interface.go", - "replicaset.go", - "statefulset.go", - ], - importpath = "k8s.io/client-go/informers/apps/v1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/apps/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/apps/v1/controllerrevision.go b/vendor/k8s.io/client-go/informers/apps/v1/controllerrevision.go index 3fe6630ff..58bf42146 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/controllerrevision.go +++ b/vendor/k8s.io/client-go/informers/apps/v1/controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1/daemonset.go b/vendor/k8s.io/client-go/informers/apps/v1/daemonset.go index 4e10d6f6f..14d890ba3 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/daemonset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1/daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1/deployment.go b/vendor/k8s.io/client-go/informers/apps/v1/deployment.go index e08f42ddb..dd8587508 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/deployment.go +++ b/vendor/k8s.io/client-go/informers/apps/v1/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1/interface.go b/vendor/k8s.io/client-go/informers/apps/v1/interface.go index f3abfa9aa..fab1e76bd 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/interface.go +++ b/vendor/k8s.io/client-go/informers/apps/v1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1/replicaset.go b/vendor/k8s.io/client-go/informers/apps/v1/replicaset.go index 2a17836cb..b1ab1ebe7 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/replicaset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1/replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1/statefulset.go b/vendor/k8s.io/client-go/informers/apps/v1/statefulset.go index e7084af58..f488e3b98 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1/statefulset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1/statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/apps/v1beta1/BUILD deleted file mode 100644 index 80ca939e1..000000000 --- a/vendor/k8s.io/client-go/informers/apps/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "deployment.go", - "interface.go", - "statefulset.go", - ], - importpath = "k8s.io/client-go/informers/apps/v1beta1", - deps = [ - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/apps/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta1/controllerrevision.go b/vendor/k8s.io/client-go/informers/apps/v1beta1/controllerrevision.go index b4878e724..4283d3822 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta1/controllerrevision.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta1/controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta1/deployment.go b/vendor/k8s.io/client-go/informers/apps/v1beta1/deployment.go index 589ec39a5..1e7620beb 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta1/deployment.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta1/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/apps/v1beta1/interface.go index c0a487ca2..326939cd1 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta1/interface.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta1/statefulset.go b/vendor/k8s.io/client-go/informers/apps/v1beta1/statefulset.go index f12364c51..94fd0f93c 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta1/statefulset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta1/statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/BUILD b/vendor/k8s.io/client-go/informers/apps/v1beta2/BUILD deleted file mode 100644 index 5b0137bb2..000000000 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "daemonset.go", - "deployment.go", - "interface.go", - "replicaset.go", - "statefulset.go", - ], - importpath = "k8s.io/client-go/informers/apps/v1beta2", - deps = [ - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/apps/v1beta2:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/controllerrevision.go b/vendor/k8s.io/client-go/informers/apps/v1beta2/controllerrevision.go index a2f3ceaac..28e241b18 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/controllerrevision.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/daemonset.go b/vendor/k8s.io/client-go/informers/apps/v1beta2/daemonset.go index 700895e61..bb25a1945 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/daemonset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/deployment.go b/vendor/k8s.io/client-go/informers/apps/v1beta2/deployment.go index ba1a3cf9b..457ca30a1 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/deployment.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/interface.go b/vendor/k8s.io/client-go/informers/apps/v1beta2/interface.go index 93a1940d9..ded89bd5b 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/interface.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/replicaset.go b/vendor/k8s.io/client-go/informers/apps/v1beta2/replicaset.go index 6a46b810b..1558c1416 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/replicaset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/apps/v1beta2/statefulset.go b/vendor/k8s.io/client-go/informers/apps/v1beta2/statefulset.go index 841cbd8ab..ae929d656 100644 --- a/vendor/k8s.io/client-go/informers/apps/v1beta2/statefulset.go +++ b/vendor/k8s.io/client-go/informers/apps/v1beta2/statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/autoscaling/BUILD b/vendor/k8s.io/client-go/informers/autoscaling/BUILD deleted file mode 100644 index 7ad9e975e..000000000 --- a/vendor/k8s.io/client-go/informers/autoscaling/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/autoscaling", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/client-go/informers/autoscaling/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/autoscaling/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/autoscaling/v2beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/autoscaling/interface.go b/vendor/k8s.io/client-go/informers/autoscaling/interface.go index 347d6f628..1494d19d6 100644 --- a/vendor/k8s.io/client-go/informers/autoscaling/interface.go +++ b/vendor/k8s.io/client-go/informers/autoscaling/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v1/BUILD b/vendor/k8s.io/client-go/informers/autoscaling/v1/BUILD deleted file mode 100644 index 5c3ba46bc..000000000 --- a/vendor/k8s.io/client-go/informers/autoscaling/v1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "horizontalpodautoscaler.go", - "interface.go", - ], - importpath = "k8s.io/client-go/informers/autoscaling/v1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/autoscaling/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/informers/autoscaling/v1/horizontalpodautoscaler.go index 1215c7f3b..71991b7f5 100644 --- a/vendor/k8s.io/client-go/informers/autoscaling/v1/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/informers/autoscaling/v1/horizontalpodautoscaler.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v1/interface.go b/vendor/k8s.io/client-go/informers/autoscaling/v1/interface.go index ffa7a168e..601d0f77f 100644 --- a/vendor/k8s.io/client-go/informers/autoscaling/v1/interface.go +++ b/vendor/k8s.io/client-go/informers/autoscaling/v1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/BUILD b/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/BUILD deleted file mode 100644 index 3439a4ed2..000000000 --- a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "horizontalpodautoscaler.go", - "interface.go", - ], - importpath = "k8s.io/client-go/informers/autoscaling/v2beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/horizontalpodautoscaler.go index 208757de3..1546eb9b5 100644 --- a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/horizontalpodautoscaler.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/interface.go b/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/interface.go index 37ce2bc5f..ff5d44b09 100644 --- a/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/interface.go +++ b/vendor/k8s.io/client-go/informers/autoscaling/v2beta1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/batch/BUILD b/vendor/k8s.io/client-go/informers/batch/BUILD deleted file mode 100644 index 9199107c7..000000000 --- a/vendor/k8s.io/client-go/informers/batch/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/batch", - deps = [ - "//vendor/k8s.io/client-go/informers/batch/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/batch/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/batch/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/batch/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/informers/batch/v2alpha1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/batch/interface.go b/vendor/k8s.io/client-go/informers/batch/interface.go index f08227ba4..fa428869d 100644 --- a/vendor/k8s.io/client-go/informers/batch/interface.go +++ b/vendor/k8s.io/client-go/informers/batch/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/batch/v1/BUILD b/vendor/k8s.io/client-go/informers/batch/v1/BUILD deleted file mode 100644 index ed4825488..000000000 --- a/vendor/k8s.io/client-go/informers/batch/v1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "job.go", - ], - importpath = "k8s.io/client-go/informers/batch/v1", - deps = [ - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/batch/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/batch/v1/interface.go b/vendor/k8s.io/client-go/informers/batch/v1/interface.go index 5a09dc7ce..67d71adc2 100644 --- a/vendor/k8s.io/client-go/informers/batch/v1/interface.go +++ b/vendor/k8s.io/client-go/informers/batch/v1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/batch/v1/job.go b/vendor/k8s.io/client-go/informers/batch/v1/job.go index 36d3cef42..6be8a025e 100644 --- a/vendor/k8s.io/client-go/informers/batch/v1/job.go +++ b/vendor/k8s.io/client-go/informers/batch/v1/job.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/batch/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/batch/v1beta1/BUILD deleted file mode 100644 index 20f4ac3c4..000000000 --- a/vendor/k8s.io/client-go/informers/batch/v1beta1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "cronjob.go", - "interface.go", - ], - importpath = "k8s.io/client-go/informers/batch/v1beta1", - deps = [ - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/batch/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/batch/v1beta1/cronjob.go b/vendor/k8s.io/client-go/informers/batch/v1beta1/cronjob.go index 9dfaed490..3ace60109 100644 --- a/vendor/k8s.io/client-go/informers/batch/v1beta1/cronjob.go +++ b/vendor/k8s.io/client-go/informers/batch/v1beta1/cronjob.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/batch/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/batch/v1beta1/interface.go index 3ba8401ac..76cae22d6 100644 --- a/vendor/k8s.io/client-go/informers/batch/v1beta1/interface.go +++ b/vendor/k8s.io/client-go/informers/batch/v1beta1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/batch/v2alpha1/BUILD b/vendor/k8s.io/client-go/informers/batch/v2alpha1/BUILD deleted file mode 100644 index 4684ca4b4..000000000 --- a/vendor/k8s.io/client-go/informers/batch/v2alpha1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "cronjob.go", - "interface.go", - ], - importpath = "k8s.io/client-go/informers/batch/v2alpha1", - deps = [ - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go b/vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go index 82bc9422f..6608e4614 100644 --- a/vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go +++ b/vendor/k8s.io/client-go/informers/batch/v2alpha1/cronjob.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/batch/v2alpha1/interface.go b/vendor/k8s.io/client-go/informers/batch/v2alpha1/interface.go index 3c2780fd2..6c5bf236f 100644 --- a/vendor/k8s.io/client-go/informers/batch/v2alpha1/interface.go +++ b/vendor/k8s.io/client-go/informers/batch/v2alpha1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/certificates/BUILD b/vendor/k8s.io/client-go/informers/certificates/BUILD deleted file mode 100644 index bbe39da8b..000000000 --- a/vendor/k8s.io/client-go/informers/certificates/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/certificates", - deps = [ - "//vendor/k8s.io/client-go/informers/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/certificates/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/certificates/interface.go b/vendor/k8s.io/client-go/informers/certificates/interface.go index 9b3121186..cff455403 100644 --- a/vendor/k8s.io/client-go/informers/certificates/interface.go +++ b/vendor/k8s.io/client-go/informers/certificates/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/certificates/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/certificates/v1beta1/BUILD deleted file mode 100644 index d8ada3891..000000000 --- a/vendor/k8s.io/client-go/informers/certificates/v1beta1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "certificatesigningrequest.go", - "interface.go", - ], - importpath = "k8s.io/client-go/informers/certificates/v1beta1", - deps = [ - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/certificates/v1beta1/certificatesigningrequest.go b/vendor/k8s.io/client-go/informers/certificates/v1beta1/certificatesigningrequest.go index a3d6c2d6a..b442ff788 100644 --- a/vendor/k8s.io/client-go/informers/certificates/v1beta1/certificatesigningrequest.go +++ b/vendor/k8s.io/client-go/informers/certificates/v1beta1/certificatesigningrequest.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/certificates/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/certificates/v1beta1/interface.go index 718f370ee..258dd1d0e 100644 --- a/vendor/k8s.io/client-go/informers/certificates/v1beta1/interface.go +++ b/vendor/k8s.io/client-go/informers/certificates/v1beta1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/BUILD b/vendor/k8s.io/client-go/informers/core/BUILD deleted file mode 100644 index 694589909..000000000 --- a/vendor/k8s.io/client-go/informers/core/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/core", - deps = [ - "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/core/v1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/core/interface.go b/vendor/k8s.io/client-go/informers/core/interface.go index aba68f349..de8396b51 100644 --- a/vendor/k8s.io/client-go/informers/core/interface.go +++ b/vendor/k8s.io/client-go/informers/core/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/BUILD b/vendor/k8s.io/client-go/informers/core/v1/BUILD deleted file mode 100644 index 1d459c5db..000000000 --- a/vendor/k8s.io/client-go/informers/core/v1/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "componentstatus.go", - "configmap.go", - "endpoints.go", - "event.go", - "interface.go", - "limitrange.go", - "namespace.go", - "node.go", - "persistentvolume.go", - "persistentvolumeclaim.go", - "pod.go", - "podtemplate.go", - "replicationcontroller.go", - "resourcequota.go", - "secret.go", - "service.go", - "serviceaccount.go", - ], - importpath = "k8s.io/client-go/informers/core/v1", - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/core/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/core/v1/componentstatus.go b/vendor/k8s.io/client-go/informers/core/v1/componentstatus.go index 33fc65a52..cc60d480f 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/componentstatus.go +++ b/vendor/k8s.io/client-go/informers/core/v1/componentstatus.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/configmap.go b/vendor/k8s.io/client-go/informers/core/v1/configmap.go index 618e74994..ebd86c2d8 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/configmap.go +++ b/vendor/k8s.io/client-go/informers/core/v1/configmap.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/endpoints.go b/vendor/k8s.io/client-go/informers/core/v1/endpoints.go index fa56fbc25..b7362d080 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/endpoints.go +++ b/vendor/k8s.io/client-go/informers/core/v1/endpoints.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/event.go b/vendor/k8s.io/client-go/informers/core/v1/event.go index 515784175..905db2dba 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/event.go +++ b/vendor/k8s.io/client-go/informers/core/v1/event.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/interface.go b/vendor/k8s.io/client-go/informers/core/v1/interface.go index 9580dd9e0..b2216a05c 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/interface.go +++ b/vendor/k8s.io/client-go/informers/core/v1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/limitrange.go b/vendor/k8s.io/client-go/informers/core/v1/limitrange.go index 8edffdfb7..39d0340df 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/limitrange.go +++ b/vendor/k8s.io/client-go/informers/core/v1/limitrange.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/namespace.go b/vendor/k8s.io/client-go/informers/core/v1/namespace.go index e1925fed1..5830c88f5 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/namespace.go +++ b/vendor/k8s.io/client-go/informers/core/v1/namespace.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/node.go b/vendor/k8s.io/client-go/informers/core/v1/node.go index dc829bcd6..202cb3b7b 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/node.go +++ b/vendor/k8s.io/client-go/informers/core/v1/node.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/persistentvolume.go b/vendor/k8s.io/client-go/informers/core/v1/persistentvolume.go index b3ed3c0d0..3f9af92a3 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/persistentvolume.go +++ b/vendor/k8s.io/client-go/informers/core/v1/persistentvolume.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/persistentvolumeclaim.go b/vendor/k8s.io/client-go/informers/core/v1/persistentvolumeclaim.go index 9b4fde573..b4946e849 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/persistentvolumeclaim.go +++ b/vendor/k8s.io/client-go/informers/core/v1/persistentvolumeclaim.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/pod.go b/vendor/k8s.io/client-go/informers/core/v1/pod.go index 18e61b225..e964d5812 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/pod.go +++ b/vendor/k8s.io/client-go/informers/core/v1/pod.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/podtemplate.go b/vendor/k8s.io/client-go/informers/core/v1/podtemplate.go index a7de79b18..542fd032e 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/podtemplate.go +++ b/vendor/k8s.io/client-go/informers/core/v1/podtemplate.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/replicationcontroller.go b/vendor/k8s.io/client-go/informers/core/v1/replicationcontroller.go index df0a1d604..c5c009b07 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/replicationcontroller.go +++ b/vendor/k8s.io/client-go/informers/core/v1/replicationcontroller.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/resourcequota.go b/vendor/k8s.io/client-go/informers/core/v1/resourcequota.go index 89a56acb8..85ea9098b 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/resourcequota.go +++ b/vendor/k8s.io/client-go/informers/core/v1/resourcequota.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/secret.go b/vendor/k8s.io/client-go/informers/core/v1/secret.go index 05939c861..6c0c5a847 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/secret.go +++ b/vendor/k8s.io/client-go/informers/core/v1/secret.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/service.go b/vendor/k8s.io/client-go/informers/core/v1/service.go index 0e8aa0f7a..c2bb80250 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/service.go +++ b/vendor/k8s.io/client-go/informers/core/v1/service.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/core/v1/serviceaccount.go b/vendor/k8s.io/client-go/informers/core/v1/serviceaccount.go index bf3b5a7bb..2d0b94a63 100644 --- a/vendor/k8s.io/client-go/informers/core/v1/serviceaccount.go +++ b/vendor/k8s.io/client-go/informers/core/v1/serviceaccount.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/events/BUILD b/vendor/k8s.io/client-go/informers/events/BUILD deleted file mode 100644 index cf87d7c56..000000000 --- a/vendor/k8s.io/client-go/informers/events/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/events", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/client-go/informers/events/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/events/v1beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/events/interface.go b/vendor/k8s.io/client-go/informers/events/interface.go index e8ad97c3c..af30a3913 100644 --- a/vendor/k8s.io/client-go/informers/events/interface.go +++ b/vendor/k8s.io/client-go/informers/events/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/events/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/events/v1beta1/BUILD deleted file mode 100644 index 7f398d3ef..000000000 --- a/vendor/k8s.io/client-go/informers/events/v1beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "event.go", - "interface.go", - ], - importpath = "k8s.io/client-go/informers/events/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/events/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/events/v1beta1/event.go b/vendor/k8s.io/client-go/informers/events/v1beta1/event.go index 8f2b27cf5..cb757c5bc 100644 --- a/vendor/k8s.io/client-go/informers/events/v1beta1/event.go +++ b/vendor/k8s.io/client-go/informers/events/v1beta1/event.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/events/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/events/v1beta1/interface.go index 0c67badb2..c71888c9a 100644 --- a/vendor/k8s.io/client-go/informers/events/v1beta1/interface.go +++ b/vendor/k8s.io/client-go/informers/events/v1beta1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/extensions/BUILD b/vendor/k8s.io/client-go/informers/extensions/BUILD deleted file mode 100644 index 070358e20..000000000 --- a/vendor/k8s.io/client-go/informers/extensions/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/extensions", - deps = [ - "//vendor/k8s.io/client-go/informers/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/extensions/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/extensions/interface.go b/vendor/k8s.io/client-go/informers/extensions/interface.go index 93d912ca5..94a66d385 100644 --- a/vendor/k8s.io/client-go/informers/extensions/interface.go +++ b/vendor/k8s.io/client-go/informers/extensions/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/extensions/v1beta1/BUILD deleted file mode 100644 index 7f11d7bdf..000000000 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "daemonset.go", - "deployment.go", - "ingress.go", - "interface.go", - "podsecuritypolicy.go", - "replicaset.go", - ], - importpath = "k8s.io/client-go/informers/extensions/v1beta1", - deps = [ - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/daemonset.go b/vendor/k8s.io/client-go/informers/extensions/v1beta1/daemonset.go index 0f24af5ca..3064384b2 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/daemonset.go +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/deployment.go b/vendor/k8s.io/client-go/informers/extensions/v1beta1/deployment.go index 980eecb0f..a6b8b68e6 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/deployment.go +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/ingress.go b/vendor/k8s.io/client-go/informers/extensions/v1beta1/ingress.go index b250d22a3..ec8147c19 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/ingress.go +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/ingress.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/extensions/v1beta1/interface.go index 10aa1b704..a259d27ae 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/interface.go +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/informers/extensions/v1beta1/podsecuritypolicy.go index 76b83b823..15414d8ed 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/podsecuritypolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/extensions/v1beta1/replicaset.go b/vendor/k8s.io/client-go/informers/extensions/v1beta1/replicaset.go index 31c6a1b86..a63d769e5 100644 --- a/vendor/k8s.io/client-go/informers/extensions/v1beta1/replicaset.go +++ b/vendor/k8s.io/client-go/informers/extensions/v1beta1/replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/factory.go b/vendor/k8s.io/client-go/informers/factory.go index 455afc2b9..902195d6c 100644 --- a/vendor/k8s.io/client-go/informers/factory.go +++ b/vendor/k8s.io/client-go/informers/factory.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -45,12 +45,16 @@ import ( cache "k8s.io/client-go/tools/cache" ) +// SharedInformerOption defines the functional option type for SharedInformerFactory. +type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory + type sharedInformerFactory struct { client kubernetes.Interface namespace string tweakListOptions internalinterfaces.TweakListOptionsFunc lock sync.Mutex defaultResync time.Duration + customResync map[reflect.Type]time.Duration informers map[reflect.Type]cache.SharedIndexInformer // startedInformers is used for tracking which informers have been started. @@ -58,23 +62,62 @@ type sharedInformerFactory struct { startedInformers map[reflect.Type]bool } -// NewSharedInformerFactory constructs a new instance of sharedInformerFactory +// WithCustomResyncConfig sets a custom resync period for the specified informer types. +func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + for k, v := range resyncConfig { + factory.customResync[reflect.TypeOf(k)] = v + } + return factory + } +} + +// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory. +func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.tweakListOptions = tweakListOptions + return factory + } +} + +// WithNamespace limits the SharedInformerFactory to the specified namespace. +func WithNamespace(namespace string) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.namespace = namespace + return factory + } +} + +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. func NewSharedInformerFactory(client kubernetes.Interface, defaultResync time.Duration) SharedInformerFactory { - return NewFilteredSharedInformerFactory(client, defaultResync, v1.NamespaceAll, nil) + return NewSharedInformerFactoryWithOptions(client, defaultResync) } // NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory. // Listers obtained via this SharedInformerFactory will be subject to the same filters // as specified here. +// Deprecated: Please use NewSharedInformerFactoryWithOptions instead func NewFilteredSharedInformerFactory(client kubernetes.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory { - return &sharedInformerFactory{ + return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions)) +} + +// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options. +func NewSharedInformerFactoryWithOptions(client kubernetes.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory { + factory := &sharedInformerFactory{ client: client, - namespace: namespace, - tweakListOptions: tweakListOptions, + namespace: v1.NamespaceAll, defaultResync: defaultResync, informers: make(map[reflect.Type]cache.SharedIndexInformer), startedInformers: make(map[reflect.Type]bool), + customResync: make(map[reflect.Type]time.Duration), } + + // Apply all options + for _, opt := range options { + factory = opt(factory) + } + + return factory } // Start initializes all requested informers. @@ -123,7 +166,13 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal if exists { return informer } - informer = newFunc(f.client, f.defaultResync) + + resyncPeriod, exists := f.customResync[informerType] + if !exists { + resyncPeriod = f.defaultResync + } + + informer = newFunc(f.client, resyncPeriod) f.informers[informerType] = informer return informer diff --git a/vendor/k8s.io/client-go/informers/generic.go b/vendor/k8s.io/client-go/informers/generic.go index 801267edf..08c43906f 100644 --- a/vendor/k8s.io/client-go/informers/generic.go +++ b/vendor/k8s.io/client-go/informers/generic.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -41,6 +41,7 @@ import ( rbac_v1alpha1 "k8s.io/api/rbac/v1alpha1" rbac_v1beta1 "k8s.io/api/rbac/v1beta1" scheduling_v1alpha1 "k8s.io/api/scheduling/v1alpha1" + scheduling_v1beta1 "k8s.io/api/scheduling/v1beta1" settings_v1alpha1 "k8s.io/api/settings/v1alpha1" storage_v1 "k8s.io/api/storage/v1" storage_v1alpha1 "k8s.io/api/storage/v1alpha1" @@ -235,6 +236,10 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource case scheduling_v1alpha1.SchemeGroupVersion.WithResource("priorityclasses"): return &genericInformer{resource: resource.GroupResource(), informer: f.Scheduling().V1alpha1().PriorityClasses().Informer()}, nil + // Group=scheduling.k8s.io, Version=v1beta1 + case scheduling_v1beta1.SchemeGroupVersion.WithResource("priorityclasses"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Scheduling().V1beta1().PriorityClasses().Informer()}, nil + // Group=settings.k8s.io, Version=v1alpha1 case settings_v1alpha1.SchemeGroupVersion.WithResource("podpresets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Settings().V1alpha1().PodPresets().Informer()}, nil diff --git a/vendor/k8s.io/client-go/informers/internalinterfaces/BUILD b/vendor/k8s.io/client-go/informers/internalinterfaces/BUILD deleted file mode 100644 index 5b20c78f7..000000000 --- a/vendor/k8s.io/client-go/informers/internalinterfaces/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["factory_interfaces.go"], - importpath = "k8s.io/client-go/informers/internalinterfaces", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/internalinterfaces/factory_interfaces.go b/vendor/k8s.io/client-go/informers/internalinterfaces/factory_interfaces.go index 4e2a28fc7..5e05516b1 100644 --- a/vendor/k8s.io/client-go/informers/internalinterfaces/factory_interfaces.go +++ b/vendor/k8s.io/client-go/informers/internalinterfaces/factory_interfaces.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/networking/BUILD b/vendor/k8s.io/client-go/informers/networking/BUILD deleted file mode 100644 index 3219e7d02..000000000 --- a/vendor/k8s.io/client-go/informers/networking/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/networking", - deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/networking/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/networking/v1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/networking/interface.go b/vendor/k8s.io/client-go/informers/networking/interface.go index 0f6c45649..989e8fa0f 100644 --- a/vendor/k8s.io/client-go/informers/networking/interface.go +++ b/vendor/k8s.io/client-go/informers/networking/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/networking/v1/BUILD b/vendor/k8s.io/client-go/informers/networking/v1/BUILD deleted file mode 100644 index dc6f32696..000000000 --- a/vendor/k8s.io/client-go/informers/networking/v1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "networkpolicy.go", - ], - importpath = "k8s.io/client-go/informers/networking/v1", - deps = [ - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/networking/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/networking/v1/interface.go b/vendor/k8s.io/client-go/informers/networking/v1/interface.go index 819a86146..84dc6476a 100644 --- a/vendor/k8s.io/client-go/informers/networking/v1/interface.go +++ b/vendor/k8s.io/client-go/informers/networking/v1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/networking/v1/networkpolicy.go b/vendor/k8s.io/client-go/informers/networking/v1/networkpolicy.go index 20ac9909d..51e0bdf19 100644 --- a/vendor/k8s.io/client-go/informers/networking/v1/networkpolicy.go +++ b/vendor/k8s.io/client-go/informers/networking/v1/networkpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/policy/BUILD b/vendor/k8s.io/client-go/informers/policy/BUILD deleted file mode 100644 index 882d54d5e..000000000 --- a/vendor/k8s.io/client-go/informers/policy/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/policy", - deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/policy/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/policy/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/policy/interface.go b/vendor/k8s.io/client-go/informers/policy/interface.go index e77ab2b24..1859fca82 100644 --- a/vendor/k8s.io/client-go/informers/policy/interface.go +++ b/vendor/k8s.io/client-go/informers/policy/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/policy/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/policy/v1beta1/BUILD deleted file mode 100644 index 547a0a397..000000000 --- a/vendor/k8s.io/client-go/informers/policy/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "poddisruptionbudget.go", - "podsecuritypolicy.go", - ], - importpath = "k8s.io/client-go/informers/policy/v1beta1", - deps = [ - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/policy/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/policy/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/policy/v1beta1/interface.go index b368f068f..a6c1825d2 100644 --- a/vendor/k8s.io/client-go/informers/policy/v1beta1/interface.go +++ b/vendor/k8s.io/client-go/informers/policy/v1beta1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/policy/v1beta1/poddisruptionbudget.go b/vendor/k8s.io/client-go/informers/policy/v1beta1/poddisruptionbudget.go index d5178652a..d305e617b 100644 --- a/vendor/k8s.io/client-go/informers/policy/v1beta1/poddisruptionbudget.go +++ b/vendor/k8s.io/client-go/informers/policy/v1beta1/poddisruptionbudget.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/policy/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/informers/policy/v1beta1/podsecuritypolicy.go index c9bcc8bab..12a16acde 100644 --- a/vendor/k8s.io/client-go/informers/policy/v1beta1/podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/informers/policy/v1beta1/podsecuritypolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/BUILD b/vendor/k8s.io/client-go/informers/rbac/BUILD deleted file mode 100644 index e2afef934..000000000 --- a/vendor/k8s.io/client-go/informers/rbac/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/rbac", - deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/rbac/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/informers/rbac/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/rbac/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/rbac/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/informers/rbac/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/rbac/interface.go b/vendor/k8s.io/client-go/informers/rbac/interface.go index ac491ee42..228811f8a 100644 --- a/vendor/k8s.io/client-go/informers/rbac/interface.go +++ b/vendor/k8s.io/client-go/informers/rbac/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/BUILD b/vendor/k8s.io/client-go/informers/rbac/v1/BUILD deleted file mode 100644 index 4278890e8..000000000 --- a/vendor/k8s.io/client-go/informers/rbac/v1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "interface.go", - "role.go", - "rolebinding.go", - ], - importpath = "k8s.io/client-go/informers/rbac/v1", - deps = [ - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/rbac/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/clusterrole.go b/vendor/k8s.io/client-go/informers/rbac/v1/clusterrole.go index f541957a2..d5e10cadd 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1/clusterrole.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1/clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go index bf1d7bdc1..027d11b60 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1/clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/interface.go b/vendor/k8s.io/client-go/informers/rbac/v1/interface.go index fca0e807b..7f99c9454 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1/interface.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/role.go b/vendor/k8s.io/client-go/informers/rbac/v1/role.go index f08e1fde3..9c9f4f84b 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1/role.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1/role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1/rolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1/rolebinding.go index f91c2ef03..73cd3056d 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1/rolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1/rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/BUILD deleted file mode 100644 index 345e10c6f..000000000 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "interface.go", - "role.go", - "rolebinding.go", - ], - importpath = "k8s.io/client-go/informers/rbac/v1alpha1", - deps = [ - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrole.go b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrole.go index 9293439f4..76aa466cd 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrole.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrolebinding.go index d13561274..851eb39dc 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/interface.go b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/interface.go index 1c972ec82..d27c79987 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/interface.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/role.go b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/role.go index 5b4148fa9..be847445e 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/role.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/rolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/rolebinding.go index 54bae16e7..20e7159e3 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1alpha1/rolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1alpha1/rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/rbac/v1beta1/BUILD deleted file mode 100644 index 0ed73f4ec..000000000 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "interface.go", - "role.go", - "rolebinding.go", - ], - importpath = "k8s.io/client-go/informers/rbac/v1beta1", - deps = [ - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrole.go b/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrole.go index f429eeca1..d79c75c9b 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrole.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrolebinding.go index 5900eae9a..f6b64816b 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1beta1/clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/rbac/v1beta1/interface.go index c36d644e1..04add43af 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/interface.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1beta1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/role.go b/vendor/k8s.io/client-go/informers/rbac/v1beta1/role.go index 479044b42..fc1c56879 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/role.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1beta1/role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/rbac/v1beta1/rolebinding.go b/vendor/k8s.io/client-go/informers/rbac/v1beta1/rolebinding.go index 34feed183..9bbf70200 100644 --- a/vendor/k8s.io/client-go/informers/rbac/v1beta1/rolebinding.go +++ b/vendor/k8s.io/client-go/informers/rbac/v1beta1/rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/scheduling/BUILD b/vendor/k8s.io/client-go/informers/scheduling/BUILD deleted file mode 100644 index 14c2a70b9..000000000 --- a/vendor/k8s.io/client-go/informers/scheduling/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/scheduling", - deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/scheduling/v1alpha1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/scheduling/v1alpha1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/scheduling/interface.go b/vendor/k8s.io/client-go/informers/scheduling/interface.go index 89aaac195..16d030c30 100644 --- a/vendor/k8s.io/client-go/informers/scheduling/interface.go +++ b/vendor/k8s.io/client-go/informers/scheduling/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -21,12 +21,15 @@ package scheduling import ( internalinterfaces "k8s.io/client-go/informers/internalinterfaces" v1alpha1 "k8s.io/client-go/informers/scheduling/v1alpha1" + v1beta1 "k8s.io/client-go/informers/scheduling/v1beta1" ) // Interface provides access to each of this group's versions. type Interface interface { // V1alpha1 provides access to shared informers for resources in V1alpha1. V1alpha1() v1alpha1.Interface + // V1beta1 provides access to shared informers for resources in V1beta1. + V1beta1() v1beta1.Interface } type group struct { @@ -44,3 +47,8 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList func (g *group) V1alpha1() v1alpha1.Interface { return v1alpha1.New(g.factory, g.namespace, g.tweakListOptions) } + +// V1beta1 returns a new v1beta1.Interface. +func (g *group) V1beta1() v1beta1.Interface { + return v1beta1.New(g.factory, g.namespace, g.tweakListOptions) +} diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD deleted file mode 100644 index b168cda49..000000000 --- a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "priorityclass.go", - ], - importpath = "k8s.io/client-go/informers/scheduling/v1alpha1", - deps = [ - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/interface.go b/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/interface.go index 091dd90b6..cd908d14e 100644 --- a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/interface.go +++ b/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/priorityclass.go b/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/priorityclass.go index 8a27631be..481df0499 100644 --- a/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/priorityclass.go +++ b/vendor/k8s.io/client-go/informers/scheduling/v1alpha1/priorityclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/scheduling/v1beta1/interface.go new file mode 100644 index 000000000..52840a9ce --- /dev/null +++ b/vendor/k8s.io/client-go/informers/scheduling/v1beta1/interface.go @@ -0,0 +1,45 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1beta1 + +import ( + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // PriorityClasses returns a PriorityClassInformer. + PriorityClasses() PriorityClassInformer +} + +type version struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// PriorityClasses returns a PriorityClassInformer. +func (v *version) PriorityClasses() PriorityClassInformer { + return &priorityClassInformer{factory: v.factory, tweakListOptions: v.tweakListOptions} +} diff --git a/vendor/k8s.io/client-go/informers/scheduling/v1beta1/priorityclass.go b/vendor/k8s.io/client-go/informers/scheduling/v1beta1/priorityclass.go new file mode 100644 index 000000000..ff61e58de --- /dev/null +++ b/vendor/k8s.io/client-go/informers/scheduling/v1beta1/priorityclass.go @@ -0,0 +1,88 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1beta1 + +import ( + time "time" + + scheduling_v1beta1 "k8s.io/api/scheduling/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1beta1 "k8s.io/client-go/listers/scheduling/v1beta1" + cache "k8s.io/client-go/tools/cache" +) + +// PriorityClassInformer provides access to a shared informer and lister for +// PriorityClasses. +type PriorityClassInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1beta1.PriorityClassLister +} + +type priorityClassInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// NewPriorityClassInformer constructs a new informer for PriorityClass type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewPriorityClassInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredPriorityClassInformer(client, resyncPeriod, indexers, nil) +} + +// NewFilteredPriorityClassInformer constructs a new informer for PriorityClass type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredPriorityClassInformer(client kubernetes.Interface, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.SchedulingV1beta1().PriorityClasses().List(options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.SchedulingV1beta1().PriorityClasses().Watch(options) + }, + }, + &scheduling_v1beta1.PriorityClass{}, + resyncPeriod, + indexers, + ) +} + +func (f *priorityClassInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredPriorityClassInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *priorityClassInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&scheduling_v1beta1.PriorityClass{}, f.defaultInformer) +} + +func (f *priorityClassInformer) Lister() v1beta1.PriorityClassLister { + return v1beta1.NewPriorityClassLister(f.Informer().GetIndexer()) +} diff --git a/vendor/k8s.io/client-go/informers/settings/BUILD b/vendor/k8s.io/client-go/informers/settings/BUILD deleted file mode 100644 index 5dc3cfd14..000000000 --- a/vendor/k8s.io/client-go/informers/settings/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/settings", - deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/settings/v1alpha1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/settings/v1alpha1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/settings/interface.go b/vendor/k8s.io/client-go/informers/settings/interface.go index cc134f706..d91e49867 100644 --- a/vendor/k8s.io/client-go/informers/settings/interface.go +++ b/vendor/k8s.io/client-go/informers/settings/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/settings/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/settings/v1alpha1/BUILD deleted file mode 100644 index fd24549e8..000000000 --- a/vendor/k8s.io/client-go/informers/settings/v1alpha1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "podpreset.go", - ], - importpath = "k8s.io/client-go/informers/settings/v1alpha1", - deps = [ - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/settings/v1alpha1/interface.go b/vendor/k8s.io/client-go/informers/settings/v1alpha1/interface.go index d2964352a..250220469 100644 --- a/vendor/k8s.io/client-go/informers/settings/v1alpha1/interface.go +++ b/vendor/k8s.io/client-go/informers/settings/v1alpha1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/settings/v1alpha1/podpreset.go b/vendor/k8s.io/client-go/informers/settings/v1alpha1/podpreset.go index 7e241b2be..c4596c828 100644 --- a/vendor/k8s.io/client-go/informers/settings/v1alpha1/podpreset.go +++ b/vendor/k8s.io/client-go/informers/settings/v1alpha1/podpreset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/storage/BUILD b/vendor/k8s.io/client-go/informers/storage/BUILD deleted file mode 100644 index 56e9e1850..000000000 --- a/vendor/k8s.io/client-go/informers/storage/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["interface.go"], - importpath = "k8s.io/client-go/informers/storage", - deps = [ - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/informers/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/informers/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/informers/storage/v1beta1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/informers/storage/v1:all-srcs", - "//staging/src/k8s.io/client-go/informers/storage/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/informers/storage/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/storage/interface.go b/vendor/k8s.io/client-go/informers/storage/interface.go index 6581a2a8d..8245aa60c 100644 --- a/vendor/k8s.io/client-go/informers/storage/interface.go +++ b/vendor/k8s.io/client-go/informers/storage/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/storage/v1/BUILD b/vendor/k8s.io/client-go/informers/storage/v1/BUILD deleted file mode 100644 index 29c0b883d..000000000 --- a/vendor/k8s.io/client-go/informers/storage/v1/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "storageclass.go", - ], - importpath = "k8s.io/client-go/informers/storage/v1", - deps = [ - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/storage/v1/interface.go b/vendor/k8s.io/client-go/informers/storage/v1/interface.go index ebdb1d98a..d7e4b5c49 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1/interface.go +++ b/vendor/k8s.io/client-go/informers/storage/v1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/storage/v1/storageclass.go b/vendor/k8s.io/client-go/informers/storage/v1/storageclass.go index 5ef571eb4..ae90b53b4 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1/storageclass.go +++ b/vendor/k8s.io/client-go/informers/storage/v1/storageclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/storage/v1alpha1/BUILD b/vendor/k8s.io/client-go/informers/storage/v1alpha1/BUILD deleted file mode 100644 index 1871ff496..000000000 --- a/vendor/k8s.io/client-go/informers/storage/v1alpha1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "volumeattachment.go", - ], - importpath = "k8s.io/client-go/informers/storage/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/informers/storage/v1alpha1/interface.go b/vendor/k8s.io/client-go/informers/storage/v1alpha1/interface.go index f1b1a9bbd..d389b73fa 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1alpha1/interface.go +++ b/vendor/k8s.io/client-go/informers/storage/v1alpha1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/storage/v1alpha1/volumeattachment.go b/vendor/k8s.io/client-go/informers/storage/v1alpha1/volumeattachment.go index 506517acd..01c468582 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1alpha1/volumeattachment.go +++ b/vendor/k8s.io/client-go/informers/storage/v1alpha1/volumeattachment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/storage/v1beta1/BUILD b/vendor/k8s.io/client-go/informers/storage/v1beta1/BUILD deleted file mode 100644 index 64aae5165..000000000 --- a/vendor/k8s.io/client-go/informers/storage/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "interface.go", - "storageclass.go", - "volumeattachment.go", - ], - importpath = "k8s.io/client-go/informers/storage/v1beta1", - deps = [ - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/informers/internalinterfaces:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/listers/storage/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/informers/storage/v1beta1/interface.go b/vendor/k8s.io/client-go/informers/storage/v1beta1/interface.go index 5a63728f1..aa11c2bb6 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1beta1/interface.go +++ b/vendor/k8s.io/client-go/informers/storage/v1beta1/interface.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/storage/v1beta1/storageclass.go b/vendor/k8s.io/client-go/informers/storage/v1beta1/storageclass.go index 0b4edbf52..1c2f3490c 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1beta1/storageclass.go +++ b/vendor/k8s.io/client-go/informers/storage/v1beta1/storageclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/informers/storage/v1beta1/volumeattachment.go b/vendor/k8s.io/client-go/informers/storage/v1beta1/volumeattachment.go index ae3c2fd71..63fa12f0e 100644 --- a/vendor/k8s.io/client-go/informers/storage/v1beta1/volumeattachment.go +++ b/vendor/k8s.io/client-go/informers/storage/v1beta1/volumeattachment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/BUILD b/vendor/k8s.io/client-go/kubernetes/BUILD deleted file mode 100644 index 0ef4f8671..000000000 --- a/vendor/k8s.io/client-go/kubernetes/BUILD +++ /dev/null @@ -1,95 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clientset.go", - "doc.go", - "import.go", - ], - importpath = "k8s.io/client-go/kubernetes", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/networking/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/fake:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/scheme:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/settings/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1:all-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/clientset.go b/vendor/k8s.io/client-go/kubernetes/clientset.go index d867a58b2..9d0eace46 100644 --- a/vendor/k8s.io/client-go/kubernetes/clientset.go +++ b/vendor/k8s.io/client-go/kubernetes/clientset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,7 +19,6 @@ limitations under the License. package kubernetes import ( - glog "github.com/golang/glog" discovery "k8s.io/client-go/discovery" admissionregistrationv1alpha1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1" admissionregistrationv1beta1 "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1" @@ -45,6 +44,7 @@ import ( rbacv1alpha1 "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1" rbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1" schedulingv1alpha1 "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1" + schedulingv1beta1 "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1" settingsv1alpha1 "k8s.io/client-go/kubernetes/typed/settings/v1alpha1" storagev1 "k8s.io/client-go/kubernetes/typed/storage/v1" storagev1alpha1 "k8s.io/client-go/kubernetes/typed/storage/v1alpha1" @@ -105,8 +105,9 @@ type Interface interface { RbacV1beta1() rbacv1beta1.RbacV1beta1Interface RbacV1alpha1() rbacv1alpha1.RbacV1alpha1Interface SchedulingV1alpha1() schedulingv1alpha1.SchedulingV1alpha1Interface + SchedulingV1beta1() schedulingv1beta1.SchedulingV1beta1Interface // Deprecated: please explicitly pick a version if possible. - Scheduling() schedulingv1alpha1.SchedulingV1alpha1Interface + Scheduling() schedulingv1beta1.SchedulingV1beta1Interface SettingsV1alpha1() settingsv1alpha1.SettingsV1alpha1Interface // Deprecated: please explicitly pick a version if possible. Settings() settingsv1alpha1.SettingsV1alpha1Interface @@ -145,6 +146,7 @@ type Clientset struct { rbacV1beta1 *rbacv1beta1.RbacV1beta1Client rbacV1alpha1 *rbacv1alpha1.RbacV1alpha1Client schedulingV1alpha1 *schedulingv1alpha1.SchedulingV1alpha1Client + schedulingV1beta1 *schedulingv1beta1.SchedulingV1beta1Client settingsV1alpha1 *settingsv1alpha1.SettingsV1alpha1Client storageV1beta1 *storagev1beta1.StorageV1beta1Client storageV1 *storagev1.StorageV1Client @@ -349,10 +351,15 @@ func (c *Clientset) SchedulingV1alpha1() schedulingv1alpha1.SchedulingV1alpha1In return c.schedulingV1alpha1 } +// SchedulingV1beta1 retrieves the SchedulingV1beta1Client +func (c *Clientset) SchedulingV1beta1() schedulingv1beta1.SchedulingV1beta1Interface { + return c.schedulingV1beta1 +} + // Deprecated: Scheduling retrieves the default version of SchedulingClient. // Please explicitly pick a version. -func (c *Clientset) Scheduling() schedulingv1alpha1.SchedulingV1alpha1Interface { - return c.schedulingV1alpha1 +func (c *Clientset) Scheduling() schedulingv1beta1.SchedulingV1beta1Interface { + return c.schedulingV1beta1 } // SettingsV1alpha1 retrieves the SettingsV1alpha1Client @@ -499,6 +506,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { if err != nil { return nil, err } + cs.schedulingV1beta1, err = schedulingv1beta1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } cs.settingsV1alpha1, err = settingsv1alpha1.NewForConfig(&configShallowCopy) if err != nil { return nil, err @@ -518,7 +529,6 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) if err != nil { - glog.Errorf("failed to create the DiscoveryClient: %v", err) return nil, err } return &cs, nil @@ -552,6 +562,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { cs.rbacV1beta1 = rbacv1beta1.NewForConfigOrDie(c) cs.rbacV1alpha1 = rbacv1alpha1.NewForConfigOrDie(c) cs.schedulingV1alpha1 = schedulingv1alpha1.NewForConfigOrDie(c) + cs.schedulingV1beta1 = schedulingv1beta1.NewForConfigOrDie(c) cs.settingsV1alpha1 = settingsv1alpha1.NewForConfigOrDie(c) cs.storageV1beta1 = storagev1beta1.NewForConfigOrDie(c) cs.storageV1 = storagev1.NewForConfigOrDie(c) @@ -588,6 +599,7 @@ func New(c rest.Interface) *Clientset { cs.rbacV1beta1 = rbacv1beta1.New(c) cs.rbacV1alpha1 = rbacv1alpha1.New(c) cs.schedulingV1alpha1 = schedulingv1alpha1.New(c) + cs.schedulingV1beta1 = schedulingv1beta1.New(c) cs.settingsV1alpha1 = settingsv1alpha1.New(c) cs.storageV1beta1 = storagev1beta1.New(c) cs.storageV1 = storagev1.New(c) diff --git a/vendor/k8s.io/client-go/kubernetes/doc.go b/vendor/k8s.io/client-go/kubernetes/doc.go index c5870c01a..b272334ad 100644 --- a/vendor/k8s.io/client-go/kubernetes/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/fake/BUILD deleted file mode 100644 index c30d43ffb..000000000 --- a/vendor/k8s.io/client-go/kubernetes/fake/BUILD +++ /dev/null @@ -1,124 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clientset_generated.go", - "doc.go", - "register.go", - ], - importpath = "k8s.io/client-go/kubernetes/fake", - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", - "//vendor/k8s.io/api/authorization/v1:go_default_library", - "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/discovery/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/networking/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go b/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go index 0eb5ac9e5..b764b21b6 100644 --- a/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go +++ b/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -72,6 +72,8 @@ import ( fakerbacv1beta1 "k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake" schedulingv1alpha1 "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1" fakeschedulingv1alpha1 "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake" + schedulingv1beta1 "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1" + fakeschedulingv1beta1 "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake" settingsv1alpha1 "k8s.io/client-go/kubernetes/typed/settings/v1alpha1" fakesettingsv1alpha1 "k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake" storagev1 "k8s.io/client-go/kubernetes/typed/storage/v1" @@ -95,9 +97,10 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { } } - fakePtr := testing.Fake{} - fakePtr.AddReactor("*", "*", testing.ObjectReaction(o)) - fakePtr.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { + cs := &Clientset{} + cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake} + cs.AddReactor("*", "*", testing.ObjectReaction(o)) + cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { gvr := action.GetResource() ns := action.GetNamespace() watch, err := o.Watch(gvr, ns) @@ -107,7 +110,7 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { return true, watch, nil }) - return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}} + return cs } // Clientset implements clientset.Interface. Meant to be embedded into a @@ -309,9 +312,14 @@ func (c *Clientset) SchedulingV1alpha1() schedulingv1alpha1.SchedulingV1alpha1In return &fakeschedulingv1alpha1.FakeSchedulingV1alpha1{Fake: &c.Fake} } -// Scheduling retrieves the SchedulingV1alpha1Client -func (c *Clientset) Scheduling() schedulingv1alpha1.SchedulingV1alpha1Interface { - return &fakeschedulingv1alpha1.FakeSchedulingV1alpha1{Fake: &c.Fake} +// SchedulingV1beta1 retrieves the SchedulingV1beta1Client +func (c *Clientset) SchedulingV1beta1() schedulingv1beta1.SchedulingV1beta1Interface { + return &fakeschedulingv1beta1.FakeSchedulingV1beta1{Fake: &c.Fake} +} + +// Scheduling retrieves the SchedulingV1beta1Client +func (c *Clientset) Scheduling() schedulingv1beta1.SchedulingV1beta1Interface { + return &fakeschedulingv1beta1.FakeSchedulingV1beta1{Fake: &c.Fake} } // SettingsV1alpha1 retrieves the SettingsV1alpha1Client diff --git a/vendor/k8s.io/client-go/kubernetes/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/fake/doc.go index 0bc260bca..9b99e7167 100644 --- a/vendor/k8s.io/client-go/kubernetes/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/fake/register.go b/vendor/k8s.io/client-go/kubernetes/fake/register.go index 45fdf124c..88e168fa6 100644 --- a/vendor/k8s.io/client-go/kubernetes/fake/register.go +++ b/vendor/k8s.io/client-go/kubernetes/fake/register.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -43,6 +43,7 @@ import ( rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" rbacv1beta1 "k8s.io/api/rbac/v1beta1" schedulingv1alpha1 "k8s.io/api/scheduling/v1alpha1" + schedulingv1beta1 "k8s.io/api/scheduling/v1beta1" settingsv1alpha1 "k8s.io/api/settings/v1alpha1" storagev1 "k8s.io/api/storage/v1" storagev1alpha1 "k8s.io/api/storage/v1alpha1" @@ -101,6 +102,7 @@ func AddToScheme(scheme *runtime.Scheme) { rbacv1beta1.AddToScheme(scheme) rbacv1alpha1.AddToScheme(scheme) schedulingv1alpha1.AddToScheme(scheme) + schedulingv1beta1.AddToScheme(scheme) settingsv1alpha1.AddToScheme(scheme) storagev1beta1.AddToScheme(scheme) storagev1.AddToScheme(scheme) diff --git a/vendor/k8s.io/client-go/kubernetes/scheme/BUILD b/vendor/k8s.io/client-go/kubernetes/scheme/BUILD deleted file mode 100644 index 1bb118aa0..000000000 --- a/vendor/k8s.io/client-go/kubernetes/scheme/BUILD +++ /dev/null @@ -1,62 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importpath = "k8s.io/client-go/kubernetes/scheme", - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", - "//vendor/k8s.io/api/authorization/v1:go_default_library", - "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/scheme/doc.go b/vendor/k8s.io/client-go/kubernetes/scheme/doc.go index 5c5c8debb..7dc375616 100644 --- a/vendor/k8s.io/client-go/kubernetes/scheme/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/scheme/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/scheme/register.go b/vendor/k8s.io/client-go/kubernetes/scheme/register.go index 66e2dcd18..86584cf83 100644 --- a/vendor/k8s.io/client-go/kubernetes/scheme/register.go +++ b/vendor/k8s.io/client-go/kubernetes/scheme/register.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -43,6 +43,7 @@ import ( rbacv1alpha1 "k8s.io/api/rbac/v1alpha1" rbacv1beta1 "k8s.io/api/rbac/v1beta1" schedulingv1alpha1 "k8s.io/api/scheduling/v1alpha1" + schedulingv1beta1 "k8s.io/api/scheduling/v1beta1" settingsv1alpha1 "k8s.io/api/settings/v1alpha1" storagev1 "k8s.io/api/storage/v1" storagev1alpha1 "k8s.io/api/storage/v1alpha1" @@ -101,6 +102,7 @@ func AddToScheme(scheme *runtime.Scheme) { rbacv1beta1.AddToScheme(scheme) rbacv1alpha1.AddToScheme(scheme) schedulingv1alpha1.AddToScheme(scheme) + schedulingv1beta1.AddToScheme(scheme) settingsv1alpha1.AddToScheme(scheme) storagev1beta1.AddToScheme(scheme) storagev1.AddToScheme(scheme) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/BUILD deleted file mode 100644 index 6ad245311..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "admissionregistration_client.go", - "doc.go", - "generated_expansion.go", - "initializerconfiguration.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/admissionregistration_client.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/admissionregistration_client.go index 8137129fc..5e02f7227 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/admissionregistration_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/admissionregistration_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/doc.go index 69ca30111..df51baa4d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/BUILD deleted file mode 100644 index a70c2bef0..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_admissionregistration_client.go", - "fake_initializerconfiguration.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_admissionregistration_client.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_admissionregistration_client.go index 2917c0ae4..8457aec27 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_admissionregistration_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_admissionregistration_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_initializerconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_initializerconfiguration.go index 699261cd4..b927dae2c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_initializerconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/fake/fake_initializerconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeInitializerConfigurations) List(opts v1.ListOptions) (result *v1alp if label == nil { label = labels.Everything() } - list := &v1alpha1.InitializerConfigurationList{} + list := &v1alpha1.InitializerConfigurationList{ListMeta: obj.(*v1alpha1.InitializerConfigurationList).ListMeta} for _, item := range obj.(*v1alpha1.InitializerConfigurationList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/generated_expansion.go index 710bc4ea4..1e29b96f4 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/initializerconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/initializerconfiguration.go index 77c6b8fcc..e014ea72b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/initializerconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/initializerconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/BUILD deleted file mode 100644 index 197f738eb..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "admissionregistration_client.go", - "doc.go", - "generated_expansion.go", - "mutatingwebhookconfiguration.go", - "validatingwebhookconfiguration.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/admissionregistration_client.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/admissionregistration_client.go index 44b20b577..b13ea7953 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/admissionregistration_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/admissionregistration_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/BUILD deleted file mode 100644 index 4e615188d..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_admissionregistration_client.go", - "fake_mutatingwebhookconfiguration.go", - "fake_validatingwebhookconfiguration.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_admissionregistration_client.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_admissionregistration_client.go index 3255acb47..1a988ddba 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_admissionregistration_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_admissionregistration_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_mutatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_mutatingwebhookconfiguration.go index 044636ead..e06888cc1 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_mutatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_mutatingwebhookconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeMutatingWebhookConfigurations) List(opts v1.ListOptions) (result *v if label == nil { label = labels.Everything() } - list := &v1beta1.MutatingWebhookConfigurationList{} + list := &v1beta1.MutatingWebhookConfigurationList{ListMeta: obj.(*v1beta1.MutatingWebhookConfigurationList).ListMeta} for _, item := range obj.(*v1beta1.MutatingWebhookConfigurationList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_validatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_validatingwebhookconfiguration.go index f06582d4e..1069634e2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_validatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/fake/fake_validatingwebhookconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeValidatingWebhookConfigurations) List(opts v1.ListOptions) (result if label == nil { label = labels.Everything() } - list := &v1beta1.ValidatingWebhookConfigurationList{} + list := &v1beta1.ValidatingWebhookConfigurationList{ListMeta: obj.(*v1beta1.ValidatingWebhookConfigurationList).ListMeta} for _, item := range obj.(*v1beta1.ValidatingWebhookConfigurationList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/generated_expansion.go index 293697555..2aeb9c98a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/mutatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/mutatingwebhookconfiguration.go index d37f68448..cb0157102 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/mutatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/mutatingwebhookconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingwebhookconfiguration.go b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingwebhookconfiguration.go index 30dcfddbc..3a9339f6c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingwebhookconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/BUILD deleted file mode 100644 index 5d77a94df..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "apps_client.go", - "controllerrevision.go", - "daemonset.go", - "deployment.go", - "doc.go", - "generated_expansion.go", - "replicaset.go", - "statefulset.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/apps_client.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/apps_client.go index b0af79806..da19c7596 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/apps_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/apps_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go index 26d020747..ac9d62790 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go index 73fd1e9bd..b50ac2557 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go index 1a3e8f730..e2b1b1886 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/doc.go index d007a2903..3af5d054f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/BUILD deleted file mode 100644 index 912b2755d..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_apps_client.go", - "fake_controllerrevision.go", - "fake_daemonset.go", - "fake_deployment.go", - "fake_replicaset.go", - "fake_statefulset.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1/fake", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_apps_client.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_apps_client.go index 11accc235..458df0fa3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_apps_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_apps_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_controllerrevision.go index fb43bea4c..0655803d8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeControllerRevisions) List(opts v1.ListOptions) (result *apps_v1.Con if label == nil { label = labels.Everything() } - list := &apps_v1.ControllerRevisionList{} + list := &apps_v1.ControllerRevisionList{ListMeta: obj.(*apps_v1.ControllerRevisionList).ListMeta} for _, item := range obj.(*apps_v1.ControllerRevisionList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_daemonset.go index 0ee4cd33d..47cdca788 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeDaemonSets) List(opts v1.ListOptions) (result *apps_v1.DaemonSetLis if label == nil { label = labels.Everything() } - list := &apps_v1.DaemonSetList{} + list := &apps_v1.DaemonSetList{ListMeta: obj.(*apps_v1.DaemonSetList).ListMeta} for _, item := range obj.(*apps_v1.DaemonSetList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_deployment.go index 852b628ad..dab4f40c3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeDeployments) List(opts v1.ListOptions) (result *apps_v1.DeploymentL if label == nil { label = labels.Everything() } - list := &apps_v1.DeploymentList{} + list := &apps_v1.DeploymentList{ListMeta: obj.(*apps_v1.DeploymentList).ListMeta} for _, item := range obj.(*apps_v1.DeploymentList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_replicaset.go index 03f7558d4..948091bed 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeReplicaSets) List(opts v1.ListOptions) (result *apps_v1.ReplicaSetL if label == nil { label = labels.Everything() } - list := &apps_v1.ReplicaSetList{} + list := &apps_v1.ReplicaSetList{ListMeta: obj.(*apps_v1.ReplicaSetList).ListMeta} for _, item := range obj.(*apps_v1.ReplicaSetList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_statefulset.go index af0a90720..19cb2fad5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/fake/fake_statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeStatefulSets) List(opts v1.ListOptions) (result *apps_v1.StatefulSe if label == nil { label = labels.Everything() } - list := &apps_v1.StatefulSetList{} + list := &apps_v1.StatefulSetList{ListMeta: obj.(*apps_v1.StatefulSetList).ListMeta} for _, item := range obj.(*apps_v1.StatefulSetList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/generated_expansion.go index 0f603bb8c..88cfe4ecb 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go index f2f9c7256..21614cbe1 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go index 78fe23f84..3ef5b8880 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD deleted file mode 100644 index 18dca7163..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "apps_client.go", - "controllerrevision.go", - "deployment.go", - "doc.go", - "generated_expansion.go", - "scale.go", - "statefulset.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1beta1", - deps = [ - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/apps_client.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/apps_client.go index 1aebc2176..4d882e26e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/apps_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/apps_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/controllerrevision.go index 312ba3c47..ec8fa9242 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/deployment.go index 2ff58aeac..365e06f3f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/BUILD deleted file mode 100644 index ef39b5d3d..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_apps_client.go", - "fake_controllerrevision.go", - "fake_deployment.go", - "fake_scale.go", - "fake_statefulset.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake", - deps = [ - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_apps_client.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_apps_client.go index 5cc316882..2ff602be9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_apps_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_apps_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_controllerrevision.go index 2360bb07a..924194891 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeControllerRevisions) List(opts v1.ListOptions) (result *v1beta1.Con if label == nil { label = labels.Everything() } - list := &v1beta1.ControllerRevisionList{} + list := &v1beta1.ControllerRevisionList{ListMeta: obj.(*v1beta1.ControllerRevisionList).ListMeta} for _, item := range obj.(*v1beta1.ControllerRevisionList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_deployment.go index 5282d8cd9..c4749c52b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeDeployments) List(opts v1.ListOptions) (result *v1beta1.DeploymentL if label == nil { label = labels.Everything() } - list := &v1beta1.DeploymentList{} + list := &v1beta1.DeploymentList{ListMeta: obj.(*v1beta1.DeploymentList).ListMeta} for _, item := range obj.(*v1beta1.DeploymentList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_scale.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_scale.go index 72615c803..de71947e5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_scale.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_scale.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_statefulset.go index 6e1d7a560..b0f194a7d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/fake/fake_statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeStatefulSets) List(opts v1.ListOptions) (result *v1beta1.StatefulSe if label == nil { label = labels.Everything() } - list := &v1beta1.StatefulSetList{} + list := &v1beta1.StatefulSetList{ListMeta: obj.(*v1beta1.StatefulSetList).ListMeta} for _, item := range obj.(*v1beta1.StatefulSetList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/generated_expansion.go index a44a94b63..b2bfd73a7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/scale.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/scale.go index e8c507326..cef27bd14 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/scale.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/scale.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/statefulset.go index 6f89ca73a..651745451 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD deleted file mode 100644 index 0af42bcf8..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "apps_client.go", - "controllerrevision.go", - "daemonset.go", - "deployment.go", - "doc.go", - "generated_expansion.go", - "replicaset.go", - "scale.go", - "statefulset.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1beta2", - deps = [ - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/apps_client.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/apps_client.go index 8d5a78c44..27549499f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/apps_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/apps_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/controllerrevision.go index 28b30e8be..1271cc623 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/daemonset.go index c21fc50a8..683c06812 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/deployment.go index 270be527e..9a04513f1 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/doc.go index 01d0ed2c2..56518ef7f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/BUILD deleted file mode 100644 index d965ed1b2..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_apps_client.go", - "fake_controllerrevision.go", - "fake_daemonset.go", - "fake_deployment.go", - "fake_replicaset.go", - "fake_scale.go", - "fake_statefulset.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake", - deps = [ - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_apps_client.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_apps_client.go index 7223cd24e..f7d79d352 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_apps_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_apps_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_controllerrevision.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_controllerrevision.go index 720972e7d..954ac35df 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_controllerrevision.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeControllerRevisions) List(opts v1.ListOptions) (result *v1beta2.Con if label == nil { label = labels.Everything() } - list := &v1beta2.ControllerRevisionList{} + list := &v1beta2.ControllerRevisionList{ListMeta: obj.(*v1beta2.ControllerRevisionList).ListMeta} for _, item := range obj.(*v1beta2.ControllerRevisionList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_daemonset.go index 3576b8427..38a147550 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeDaemonSets) List(opts v1.ListOptions) (result *v1beta2.DaemonSetLis if label == nil { label = labels.Everything() } - list := &v1beta2.DaemonSetList{} + list := &v1beta2.DaemonSetList{ListMeta: obj.(*v1beta2.DaemonSetList).ListMeta} for _, item := range obj.(*v1beta2.DaemonSetList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_deployment.go index 1f654a3cc..cae232242 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeDeployments) List(opts v1.ListOptions) (result *v1beta2.DeploymentL if label == nil { label = labels.Everything() } - list := &v1beta2.DeploymentList{} + list := &v1beta2.DeploymentList{ListMeta: obj.(*v1beta2.DeploymentList).ListMeta} for _, item := range obj.(*v1beta2.DeploymentList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_replicaset.go index f8e69a3a3..05fa78931 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeReplicaSets) List(opts v1.ListOptions) (result *v1beta2.ReplicaSetL if label == nil { label = labels.Everything() } - list := &v1beta2.ReplicaSetList{} + list := &v1beta2.ReplicaSetList{ListMeta: obj.(*v1beta2.ReplicaSetList).ListMeta} for _, item := range obj.(*v1beta2.ReplicaSetList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_scale.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_scale.go index fb5eb5c59..b06b7e8e3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_scale.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_scale.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_statefulset.go index 0413428eb..fe7851286 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/fake/fake_statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeStatefulSets) List(opts v1.ListOptions) (result *v1beta2.StatefulSe if label == nil { label = labels.Everything() } - list := &v1beta2.StatefulSetList{} + list := &v1beta2.StatefulSetList{ListMeta: obj.(*v1beta2.StatefulSetList).ListMeta} for _, item := range obj.(*v1beta2.StatefulSetList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/generated_expansion.go index a88e1721f..bceae5986 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/replicaset.go index 298ec26a2..9fd9de930 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/scale.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/scale.go index 84f27a797..f8d6a7fb0 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/scale.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/scale.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/statefulset.go b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/statefulset.go index 64b7c8c8f..095601e15 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/statefulset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD deleted file mode 100644 index b89498dea..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "authentication_client.go", - "doc.go", - "generated_expansion.go", - "tokenreview.go", - "tokenreview_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/authentication/v1", - deps = [ - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/authentication_client.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/authentication_client.go index 25b86152d..3bdcee598 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/authentication_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/authentication_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/doc.go index d007a2903..3af5d054f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/BUILD deleted file mode 100644 index b2c995baf..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_authentication_client.go", - "fake_tokenreview.go", - "fake_tokenreview_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/authentication/v1/fake", - deps = [ - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/fake_authentication_client.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/fake_authentication_client.go index 93a0633e8..ee06a6cdd 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/fake_authentication_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/fake_authentication_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/fake_tokenreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/fake_tokenreview.go index d98aa03d8..e2a7f72b6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/fake_tokenreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/fake/fake_tokenreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/generated_expansion.go index 7c92b9147..177209ec6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/tokenreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/tokenreview.go index 88f759f2b..25a8d6a17 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/tokenreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/tokenreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD deleted file mode 100644 index ddbe7e984..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "authentication_client.go", - "doc.go", - "generated_expansion.go", - "tokenreview.go", - "tokenreview_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", - deps = [ - "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/authentication_client.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/authentication_client.go index 744c26c9e..7f3334a0c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/authentication_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/authentication_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/BUILD deleted file mode 100644 index b9800aac7..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_authentication_client.go", - "fake_tokenreview.go", - "fake_tokenreview_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake", - deps = [ - "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/fake_authentication_client.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/fake_authentication_client.go index abc1fedd1..7299653ca 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/fake_authentication_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/fake_authentication_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/fake_tokenreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/fake_tokenreview.go index c7c3e5631..63b6b6a85 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/fake_tokenreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/fake/fake_tokenreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/generated_expansion.go index 7fd68c803..f6df76963 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/tokenreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/tokenreview.go index fa611825e..0ac3561e1 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/tokenreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/tokenreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD deleted file mode 100644 index f6255f38c..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "authorization_client.go", - "doc.go", - "generated_expansion.go", - "localsubjectaccessreview.go", - "localsubjectaccessreview_expansion.go", - "selfsubjectaccessreview.go", - "selfsubjectaccessreview_expansion.go", - "selfsubjectrulesreview.go", - "selfsubjectrulesreview_expansion.go", - "subjectaccessreview.go", - "subjectaccessreview_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/authorization/v1", - deps = [ - "//vendor/k8s.io/api/authorization/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/authorization_client.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/authorization_client.go index 852720f34..e84b90084 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/authorization_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/authorization_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/doc.go index d007a2903..3af5d054f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/BUILD deleted file mode 100644 index cfea68c78..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_authorization_client.go", - "fake_localsubjectaccessreview.go", - "fake_localsubjectaccessreview_expansion.go", - "fake_selfsubjectaccessreview.go", - "fake_selfsubjectaccessreview_expansion.go", - "fake_selfsubjectrulesreview.go", - "fake_selfsubjectrulesreview_expansion.go", - "fake_subjectaccessreview.go", - "fake_subjectaccessreview_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/authorization/v1/fake", - deps = [ - "//vendor/k8s.io/api/authorization/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_authorization_client.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_authorization_client.go index 5db9b9f34..f7e823450 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_authorization_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_authorization_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_localsubjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_localsubjectaccessreview.go index 5f1aab8a4..778ba9cea 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_localsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_localsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_selfsubjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_selfsubjectaccessreview.go index 7e466e1ec..a43a980ba 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_selfsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_selfsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_selfsubjectrulesreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_selfsubjectrulesreview.go index 82c1ac9cf..243f2e89e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_selfsubjectrulesreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_selfsubjectrulesreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_subjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_subjectaccessreview.go index cbc440e71..d07e56254 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_subjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/fake/fake_subjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/generated_expansion.go index 7c92b9147..177209ec6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/localsubjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/localsubjectaccessreview.go index 20461f132..0292c7861 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/localsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/localsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectaccessreview.go index 202e7c90d..1e3a45817 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectrulesreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectrulesreview.go index 5fb1cab5c..50a0233eb 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectrulesreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectrulesreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/subjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/subjectaccessreview.go index 881641494..9c09008c3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/subjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/subjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD deleted file mode 100644 index 793ec39b5..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/BUILD +++ /dev/null @@ -1,46 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "authorization_client.go", - "doc.go", - "generated_expansion.go", - "localsubjectaccessreview.go", - "localsubjectaccessreview_expansion.go", - "selfsubjectaccessreview.go", - "selfsubjectaccessreview_expansion.go", - "selfsubjectrulesreview.go", - "selfsubjectrulesreview_expansion.go", - "subjectaccessreview.go", - "subjectaccessreview_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", - deps = [ - "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/authorization_client.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/authorization_client.go index cbe5bdcee..7f236f6e3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/authorization_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/authorization_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/BUILD deleted file mode 100644 index d3fd9e81b..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_authorization_client.go", - "fake_generated_expansion.go", - "fake_localsubjectaccessreview.go", - "fake_localsubjectaccessreview_expansion.go", - "fake_selfsubjectaccessreview.go", - "fake_selfsubjectaccessreview_expansion.go", - "fake_selfsubjectrulesreview.go", - "fake_selfsubjectrulesreview_expansion.go", - "fake_subjectaccessreview.go", - "fake_subjectaccessreview_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake", - deps = [ - "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_authorization_client.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_authorization_client.go index 7c3fc1746..8e328a57b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_authorization_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_authorization_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_localsubjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_localsubjectaccessreview.go index c7949a7df..d02d05e5d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_localsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_localsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_selfsubjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_selfsubjectaccessreview.go index 20904d179..8f98ce7a3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_selfsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_selfsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_selfsubjectrulesreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_selfsubjectrulesreview.go index 2acd5f279..d8466b4c8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_selfsubjectrulesreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_selfsubjectrulesreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_subjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_subjectaccessreview.go index 218ed3d8f..0d0abdb72 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_subjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/fake/fake_subjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/generated_expansion.go index 7fd68c803..f6df76963 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/localsubjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/localsubjectaccessreview.go index 8029837f9..f5e86a76a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/localsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/localsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectaccessreview.go index 36feb1530..906712cc3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectrulesreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectrulesreview.go index 57079c8d9..56c0f99d4 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectrulesreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectrulesreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/subjectaccessreview.go b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/subjectaccessreview.go index d91fa87ec..79f1ec535 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/subjectaccessreview.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/subjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD deleted file mode 100644 index 30e434a68..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "autoscaling_client.go", - "doc.go", - "generated_expansion.go", - "horizontalpodautoscaler.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v1", - deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/autoscaling_client.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/autoscaling_client.go index b336bbd39..2bd49e2db 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/autoscaling_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/autoscaling_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/doc.go index d007a2903..3af5d054f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/BUILD deleted file mode 100644 index 3cabf19c5..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_autoscaling_client.go", - "fake_horizontalpodautoscaler.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake", - deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_autoscaling_client.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_autoscaling_client.go index 540eb5f5c..99e26fcf3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_autoscaling_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_autoscaling_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_horizontalpodautoscaler.go index 532e6f51c..f774fc5dc 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/fake/fake_horizontalpodautoscaler.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeHorizontalPodAutoscalers) List(opts v1.ListOptions) (result *autosc if label == nil { label = labels.Everything() } - list := &autoscaling_v1.HorizontalPodAutoscalerList{} + list := &autoscaling_v1.HorizontalPodAutoscalerList{ListMeta: obj.(*autoscaling_v1.HorizontalPodAutoscalerList).ListMeta} for _, item := range obj.(*autoscaling_v1.HorizontalPodAutoscalerList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/generated_expansion.go index a5c694ffb..c60028b05 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go index 9245e41a2..2da25e96b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/BUILD deleted file mode 100644 index 1bb145072..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "autoscaling_client.go", - "doc.go", - "generated_expansion.go", - "horizontalpodautoscaler.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/autoscaling_client.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/autoscaling_client.go index 25446452f..3a49b26b3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/autoscaling_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/autoscaling_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/doc.go index 1f70aedf8..06fd344c0 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/BUILD deleted file mode 100644 index 6d7d87326..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_autoscaling_client.go", - "fake_horizontalpodautoscaler.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_autoscaling_client.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_autoscaling_client.go index 6d3437a23..be8e0f48e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_autoscaling_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_autoscaling_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_horizontalpodautoscaler.go index 549196c5e..2d860341a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/fake/fake_horizontalpodautoscaler.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeHorizontalPodAutoscalers) List(opts v1.ListOptions) (result *v2beta if label == nil { label = labels.Everything() } - list := &v2beta1.HorizontalPodAutoscalerList{} + list := &v2beta1.HorizontalPodAutoscalerList{ListMeta: obj.(*v2beta1.HorizontalPodAutoscalerList).ListMeta} for _, item := range obj.(*v2beta1.HorizontalPodAutoscalerList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/generated_expansion.go index 561fbb0e6..6f1704f1e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/horizontalpodautoscaler.go index 1be9b80ca..4ac8cce71 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/horizontalpodautoscaler.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD deleted file mode 100644 index 2af6de364..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "batch_client.go", - "doc.go", - "generated_expansion.go", - "job.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/batch/v1", - deps = [ - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/batch_client.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/batch_client.go index c092a3ca1..d5e35e6b2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/batch_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/batch_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/doc.go index d007a2903..3af5d054f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/BUILD deleted file mode 100644 index 384e15eee..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_batch_client.go", - "fake_job.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/batch/v1/fake", - deps = [ - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_batch_client.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_batch_client.go index 27d54c4c4..c90dd7561 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_batch_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_batch_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_job.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_job.go index 4d9ba490f..6a83115ba 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_job.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/fake/fake_job.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeJobs) List(opts v1.ListOptions) (result *batch_v1.JobList, err erro if label == nil { label = labels.Everything() } - list := &batch_v1.JobList{} + list := &batch_v1.JobList{ListMeta: obj.(*batch_v1.JobList).ListMeta} for _, item := range obj.(*batch_v1.JobList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/generated_expansion.go index 04a37a49d..dc4142934 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go index dc0c79997..f714d3de5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/BUILD deleted file mode 100644 index 58e0a6afa..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "batch_client.go", - "cronjob.go", - "doc.go", - "generated_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/batch/v1beta1", - deps = [ - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/batch_client.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/batch_client.go index 5ee39b5be..aa71ca833 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/batch_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/batch_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/cronjob.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/cronjob.go index 32ac52fac..04637c36a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/cronjob.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/cronjob.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/BUILD deleted file mode 100644 index 8fd1c81ec..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_batch_client.go", - "fake_cronjob.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake", - deps = [ - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_batch_client.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_batch_client.go index 9de70f8fe..6f350aed9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_batch_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_batch_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_cronjob.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_cronjob.go index 756585d7d..d80ef5e67 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_cronjob.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/fake/fake_cronjob.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeCronJobs) List(opts v1.ListOptions) (result *v1beta1.CronJobList, e if label == nil { label = labels.Everything() } - list := &v1beta1.CronJobList{} + list := &v1beta1.CronJobList{ListMeta: obj.(*v1beta1.CronJobList).ListMeta} for _, item := range obj.(*v1beta1.CronJobList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/generated_expansion.go index a093bbad4..145e14a99 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD deleted file mode 100644 index c698053ad..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "batch_client.go", - "cronjob.go", - "doc.go", - "generated_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", - deps = [ - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/batch_client.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/batch_client.go index ff26a76d5..e6c6306b8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/batch_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/batch_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/cronjob.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/cronjob.go index e5b135314..4d922f9ae 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/cronjob.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/cronjob.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/doc.go index ba60ac54b..3efe0d284 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/BUILD deleted file mode 100644 index 659470373..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_batch_client.go", - "fake_cronjob.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake", - deps = [ - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_batch_client.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_batch_client.go index 52ad499cc..3e478cde9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_batch_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_batch_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_cronjob.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_cronjob.go index f80e94cae..75c0b1733 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_cronjob.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/fake/fake_cronjob.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeCronJobs) List(opts v1.ListOptions) (result *v2alpha1.CronJobList, if label == nil { label = labels.Everything() } - list := &v2alpha1.CronJobList{} + list := &v2alpha1.CronJobList{ListMeta: obj.(*v2alpha1.CronJobList).ListMeta} for _, item := range obj.(*v2alpha1.CronJobList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/generated_expansion.go index ed2c942b0..34dafc464 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD deleted file mode 100644 index 1caeb018f..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "certificates_client.go", - "certificatesigningrequest.go", - "certificatesigningrequest_expansion.go", - "doc.go", - "generated_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", - deps = [ - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificates_client.go b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificates_client.go index 7d69ce9f6..baac42ee2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificates_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificates_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest.go b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest.go index ecca7aedc..b39169a8f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/BUILD deleted file mode 100644 index 6fa63d82a..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_certificates_client.go", - "fake_certificatesigningrequest.go", - "fake_certificatesigningrequest_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake", - deps = [ - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificates_client.go b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificates_client.go index 455ac56b5..29d8b088e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificates_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificates_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificatesigningrequest.go b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificatesigningrequest.go index f3ea4c464..dfd517195 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificatesigningrequest.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/fake/fake_certificatesigningrequest.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeCertificateSigningRequests) List(opts v1.ListOptions) (result *v1be if label == nil { label = labels.Everything() } - list := &v1beta1.CertificateSigningRequestList{} + list := &v1beta1.CertificateSigningRequestList{ListMeta: obj.(*v1beta1.CertificateSigningRequestList).ListMeta} for _, item := range obj.(*v1beta1.CertificateSigningRequestList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/generated_expansion.go index 7fd68c803..f6df76963 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/BUILD deleted file mode 100644 index 4c9f03aa4..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/BUILD +++ /dev/null @@ -1,70 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "componentstatus.go", - "configmap.go", - "core_client.go", - "doc.go", - "endpoints.go", - "event.go", - "event_expansion.go", - "generated_expansion.go", - "limitrange.go", - "namespace.go", - "namespace_expansion.go", - "node.go", - "node_expansion.go", - "persistentvolume.go", - "persistentvolumeclaim.go", - "pod.go", - "pod_expansion.go", - "podtemplate.go", - "replicationcontroller.go", - "resourcequota.go", - "secret.go", - "service.go", - "service_expansion.go", - "serviceaccount.go", - "serviceaccount_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/core/v1", - deps = [ - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/reference:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go index 1717e7c19..6ae5a6681 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go index 6e7a12e5d..3ae229f42 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/core_client.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/core_client.go index 1c86c47d4..044a28ebd 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/core_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/core_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/doc.go index d007a2903..3af5d054f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go index 03b2a6919..2868baaa1 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go index b9570e689..565062345 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/BUILD deleted file mode 100644 index 7403a4997..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_componentstatus.go", - "fake_configmap.go", - "fake_core_client.go", - "fake_endpoints.go", - "fake_event.go", - "fake_event_expansion.go", - "fake_limitrange.go", - "fake_namespace.go", - "fake_namespace_expansion.go", - "fake_node.go", - "fake_node_expansion.go", - "fake_persistentvolume.go", - "fake_persistentvolumeclaim.go", - "fake_pod.go", - "fake_pod_expansion.go", - "fake_podtemplate.go", - "fake_replicationcontroller.go", - "fake_resourcequota.go", - "fake_secret.go", - "fake_service.go", - "fake_service_expansion.go", - "fake_serviceaccount.go", - "fake_serviceaccount_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/core/v1/fake", - deps = [ - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_componentstatus.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_componentstatus.go index 42039aea9..2f2420730 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_componentstatus.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_componentstatus.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeComponentStatuses) List(opts v1.ListOptions) (result *core_v1.Compo if label == nil { label = labels.Everything() } - list := &core_v1.ComponentStatusList{} + list := &core_v1.ComponentStatusList{ListMeta: obj.(*core_v1.ComponentStatusList).ListMeta} for _, item := range obj.(*core_v1.ComponentStatusList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_configmap.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_configmap.go index 8de1cde17..1bc7757fb 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_configmap.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_configmap.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeConfigMaps) List(opts v1.ListOptions) (result *core_v1.ConfigMapLis if label == nil { label = labels.Everything() } - list := &core_v1.ConfigMapList{} + list := &core_v1.ConfigMapList{ListMeta: obj.(*core_v1.ConfigMapList).ListMeta} for _, item := range obj.(*core_v1.ConfigMapList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_core_client.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_core_client.go index b30c02de1..5ad90943c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_core_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_core_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_endpoints.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_endpoints.go index 7b54929f6..eb5eac981 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_endpoints.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_endpoints.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeEndpoints) List(opts v1.ListOptions) (result *core_v1.EndpointsList if label == nil { label = labels.Everything() } - list := &core_v1.EndpointsList{} + list := &core_v1.EndpointsList{ListMeta: obj.(*core_v1.EndpointsList).ListMeta} for _, item := range obj.(*core_v1.EndpointsList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_event.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_event.go index 5ba47f419..458b8c153 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_event.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_event.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeEvents) List(opts v1.ListOptions) (result *core_v1.EventList, err e if label == nil { label = labels.Everything() } - list := &core_v1.EventList{} + list := &core_v1.EventList{ListMeta: obj.(*core_v1.EventList).ListMeta} for _, item := range obj.(*core_v1.EventList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_limitrange.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_limitrange.go index bd736980e..c5156c7c0 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_limitrange.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_limitrange.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeLimitRanges) List(opts v1.ListOptions) (result *core_v1.LimitRangeL if label == nil { label = labels.Everything() } - list := &core_v1.LimitRangeList{} + list := &core_v1.LimitRangeList{ListMeta: obj.(*core_v1.LimitRangeList).ListMeta} for _, item := range obj.(*core_v1.LimitRangeList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_namespace.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_namespace.go index 84743469a..32aae1389 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_namespace.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_namespace.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeNamespaces) List(opts v1.ListOptions) (result *core_v1.NamespaceLis if label == nil { label = labels.Everything() } - list := &core_v1.NamespaceList{} + list := &core_v1.NamespaceList{ListMeta: obj.(*core_v1.NamespaceList).ListMeta} for _, item := range obj.(*core_v1.NamespaceList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) @@ -112,14 +112,6 @@ func (c *FakeNamespaces) Delete(name string, options *v1.DeleteOptions) error { return err } -// DeleteCollection deletes a collection of objects. -func (c *FakeNamespaces) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewRootDeleteCollectionAction(namespacesResource, listOptions) - - _, err := c.Fake.Invokes(action, &core_v1.NamespaceList{}) - return err -} - // Patch applies the patch and returns the patched namespace. func (c *FakeNamespaces) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *core_v1.Namespace, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_node.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_node.go index c7e042fc8..8b99bb8e4 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_node.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_node.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeNodes) List(opts v1.ListOptions) (result *core_v1.NodeList, err err if label == nil { label = labels.Everything() } - list := &core_v1.NodeList{} + list := &core_v1.NodeList{ListMeta: obj.(*core_v1.NodeList).ListMeta} for _, item := range obj.(*core_v1.NodeList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolume.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolume.go index 1be38a89e..5742936d2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolume.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolume.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakePersistentVolumes) List(opts v1.ListOptions) (result *core_v1.Persi if label == nil { label = labels.Everything() } - list := &core_v1.PersistentVolumeList{} + list := &core_v1.PersistentVolumeList{ListMeta: obj.(*core_v1.PersistentVolumeList).ListMeta} for _, item := range obj.(*core_v1.PersistentVolumeList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolumeclaim.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolumeclaim.go index ea189bb9c..d2d17984c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolumeclaim.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_persistentvolumeclaim.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakePersistentVolumeClaims) List(opts v1.ListOptions) (result *core_v1. if label == nil { label = labels.Everything() } - list := &core_v1.PersistentVolumeClaimList{} + list := &core_v1.PersistentVolumeClaimList{ListMeta: obj.(*core_v1.PersistentVolumeClaimList).ListMeta} for _, item := range obj.(*core_v1.PersistentVolumeClaimList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_pod.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_pod.go index 6f5faef99..2960b12ae 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_pod.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_pod.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakePods) List(opts v1.ListOptions) (result *core_v1.PodList, err error if label == nil { label = labels.Everything() } - list := &core_v1.PodList{} + list := &core_v1.PodList{ListMeta: obj.(*core_v1.PodList).ListMeta} for _, item := range obj.(*core_v1.PodList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_podtemplate.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_podtemplate.go index 1dd272e78..3ae6ca551 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_podtemplate.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_podtemplate.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakePodTemplates) List(opts v1.ListOptions) (result *core_v1.PodTemplat if label == nil { label = labels.Everything() } - list := &core_v1.PodTemplateList{} + list := &core_v1.PodTemplateList{ListMeta: obj.(*core_v1.PodTemplateList).ListMeta} for _, item := range obj.(*core_v1.PodTemplateList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_replicationcontroller.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_replicationcontroller.go index 047831a31..f25235ff2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_replicationcontroller.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_replicationcontroller.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -63,7 +63,7 @@ func (c *FakeReplicationControllers) List(opts v1.ListOptions) (result *core_v1. if label == nil { label = labels.Everything() } - list := &core_v1.ReplicationControllerList{} + list := &core_v1.ReplicationControllerList{ListMeta: obj.(*core_v1.ReplicationControllerList).ListMeta} for _, item := range obj.(*core_v1.ReplicationControllerList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_resourcequota.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_resourcequota.go index afdc8c88a..9c6ae20a2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_resourcequota.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_resourcequota.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeResourceQuotas) List(opts v1.ListOptions) (result *core_v1.Resource if label == nil { label = labels.Everything() } - list := &core_v1.ResourceQuotaList{} + list := &core_v1.ResourceQuotaList{ListMeta: obj.(*core_v1.ResourceQuotaList).ListMeta} for _, item := range obj.(*core_v1.ResourceQuotaList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_secret.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_secret.go index abf7db090..e1eeea5f8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_secret.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_secret.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeSecrets) List(opts v1.ListOptions) (result *core_v1.SecretList, err if label == nil { label = labels.Everything() } - list := &core_v1.SecretList{} + list := &core_v1.SecretList{ListMeta: obj.(*core_v1.SecretList).ListMeta} for _, item := range obj.(*core_v1.SecretList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_service.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_service.go index 7ce885ae8..aa23e0efa 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_service.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_service.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeServices) List(opts v1.ListOptions) (result *core_v1.ServiceList, e if label == nil { label = labels.Everything() } - list := &core_v1.ServiceList{} + list := &core_v1.ServiceList{ListMeta: obj.(*core_v1.ServiceList).ListMeta} for _, item := range obj.(*core_v1.ServiceList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) @@ -120,14 +120,6 @@ func (c *FakeServices) Delete(name string, options *v1.DeleteOptions) error { return err } -// DeleteCollection deletes a collection of objects. -func (c *FakeServices) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { - action := testing.NewDeleteCollectionAction(servicesResource, c.ns, listOptions) - - _, err := c.Fake.Invokes(action, &core_v1.ServiceList{}) - return err -} - // Patch applies the patch and returns the patched service. func (c *FakeServices) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *core_v1.Service, err error) { obj, err := c.Fake. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_serviceaccount.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_serviceaccount.go index 635b2c32b..1d5837f8b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_serviceaccount.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_serviceaccount.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeServiceAccounts) List(opts v1.ListOptions) (result *core_v1.Service if label == nil { label = labels.Everything() } - list := &core_v1.ServiceAccountList{} + list := &core_v1.ServiceAccountList{ListMeta: obj.(*core_v1.ServiceAccountList).ListMeta} for _, item := range obj.(*core_v1.ServiceAccountList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/generated_expansion.go index 430bd6c5a..6e8591b12 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go index b67997d70..396e5ca4b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go index a298d7c02..707b3e971 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -39,7 +39,6 @@ type NamespaceInterface interface { Update(*v1.Namespace) (*v1.Namespace, error) UpdateStatus(*v1.Namespace) (*v1.Namespace, error) Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error Get(name string, options meta_v1.GetOptions) (*v1.Namespace, error) List(opts meta_v1.ListOptions) (*v1.NamespaceList, error) Watch(opts meta_v1.ListOptions) (watch.Interface, error) @@ -139,16 +138,6 @@ func (c *namespaces) Delete(name string, options *meta_v1.DeleteOptions) error { Error() } -// DeleteCollection deletes a collection of objects. -func (c *namespaces) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { - return c.client.Delete(). - Resource("namespaces"). - VersionedParams(&listOptions, scheme.ParameterCodec). - Body(options). - Do(). - Error() -} - // Patch applies the patch and returns the patched namespace. func (c *namespaces) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Namespace, err error) { result = &v1.Namespace{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go index b16f92f00..1462d2549 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go index f23b95f30..f9010119b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go index f168a985a..59253d5ef 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go index 423d81ad8..8eb7ba8bd 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go index 730b54330..d99d8c3b5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go index a0f36a1fa..7741f970a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go index 011e72a91..7662a0280 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go index 931afb5db..5d149f8cc 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go index 156bcc235..ec8646a27 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -39,7 +39,6 @@ type ServiceInterface interface { Update(*v1.Service) (*v1.Service, error) UpdateStatus(*v1.Service) (*v1.Service, error) Delete(name string, options *meta_v1.DeleteOptions) error - DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error Get(name string, options meta_v1.GetOptions) (*v1.Service, error) List(opts meta_v1.ListOptions) (*v1.ServiceList, error) Watch(opts meta_v1.ListOptions) (watch.Interface, error) @@ -148,17 +147,6 @@ func (c *services) Delete(name string, options *meta_v1.DeleteOptions) error { Error() } -// DeleteCollection deletes a collection of objects. -func (c *services) DeleteCollection(options *meta_v1.DeleteOptions, listOptions meta_v1.ListOptions) error { - return c.client.Delete(). - Namespace(c.ns). - Resource("services"). - VersionedParams(&listOptions, scheme.ParameterCodec). - Body(options). - Do(). - Error() -} - // Patch applies the patch and returns the patched service. func (c *services) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.Service, err error) { result = &v1.Service{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go index 0a87feb5b..ba2a27948 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/BUILD deleted file mode 100644 index 307884cc4..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "event.go", - "events_client.go", - "generated_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/events/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event.go index e8737cf9e..af7d060d5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/events_client.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/events_client.go index 7225d90d8..fb59635bb 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/events_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/events_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/BUILD deleted file mode 100644 index b9a692e5c..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_event.go", - "fake_events_client.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/events/v1beta1/fake", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_event.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_event.go index 02fa70fbd..b210e40a0 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_event.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_event.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeEvents) List(opts v1.ListOptions) (result *v1beta1.EventList, err e if label == nil { label = labels.Everything() } - list := &v1beta1.EventList{} + list := &v1beta1.EventList{ListMeta: obj.(*v1beta1.EventList).ListMeta} for _, item := range obj.(*v1beta1.EventList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_events_client.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_events_client.go index c6eb06623..875c774e3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_events_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake/fake_events_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/generated_expansion.go index 871411abb..e27f693f8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD deleted file mode 100644 index 5ad976867..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/BUILD +++ /dev/null @@ -1,51 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "daemonset.go", - "deployment.go", - "deployment_expansion.go", - "doc.go", - "extensions_client.go", - "generated_expansion.go", - "ingress.go", - "podsecuritypolicy.go", - "replicaset.go", - "scale.go", - "scale_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", - deps = [ - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/daemonset.go index 20cd58728..85294be4b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go index 91ada9e54..89183d285 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/extensions_client.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/extensions_client.go index c359a58f2..1961ffc7c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/extensions_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/extensions_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/BUILD deleted file mode 100644 index e62ff5bc8..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_daemonset.go", - "fake_deployment.go", - "fake_deployment_expansion.go", - "fake_extensions_client.go", - "fake_ingress.go", - "fake_podsecuritypolicy.go", - "fake_replicaset.go", - "fake_scale.go", - "fake_scale_expansion.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake", - deps = [ - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_daemonset.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_daemonset.go index 083bed820..3a760b317 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_daemonset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeDaemonSets) List(opts v1.ListOptions) (result *v1beta1.DaemonSetLis if label == nil { label = labels.Everything() } - list := &v1beta1.DaemonSetList{} + list := &v1beta1.DaemonSetList{ListMeta: obj.(*v1beta1.DaemonSetList).ListMeta} for _, item := range obj.(*v1beta1.DaemonSetList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_deployment.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_deployment.go index 1ce8fb34b..f032a5563 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_deployment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeDeployments) List(opts v1.ListOptions) (result *v1beta1.DeploymentL if label == nil { label = labels.Everything() } - list := &v1beta1.DeploymentList{} + list := &v1beta1.DeploymentList{ListMeta: obj.(*v1beta1.DeploymentList).ListMeta} for _, item := range obj.(*v1beta1.DeploymentList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_extensions_client.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_extensions_client.go index d8b6741e6..1aba34f9d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_extensions_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_extensions_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_ingress.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_ingress.go index 60efe17c8..55257a88a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_ingress.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_ingress.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeIngresses) List(opts v1.ListOptions) (result *v1beta1.IngressList, if label == nil { label = labels.Everything() } - list := &v1beta1.IngressList{} + list := &v1beta1.IngressList{ListMeta: obj.(*v1beta1.IngressList).ListMeta} for _, item := range obj.(*v1beta1.IngressList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_podsecuritypolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_podsecuritypolicy.go index c381e62f1..70b5dac28 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_podsecuritypolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakePodSecurityPolicies) List(opts v1.ListOptions) (result *v1beta1.Pod if label == nil { label = labels.Everything() } - list := &v1beta1.PodSecurityPolicyList{} + list := &v1beta1.PodSecurityPolicyList{ListMeta: obj.(*v1beta1.PodSecurityPolicyList).ListMeta} for _, item := range obj.(*v1beta1.PodSecurityPolicyList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_replicaset.go index 20e8f76f6..2ab8f244f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeReplicaSets) List(opts v1.ListOptions) (result *v1beta1.ReplicaSetL if label == nil { label = labels.Everything() } - list := &v1beta1.ReplicaSetList{} + list := &v1beta1.ReplicaSetList{ListMeta: obj.(*v1beta1.ReplicaSetList).ListMeta} for _, item := range obj.(*v1beta1.ReplicaSetList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_scale.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_scale.go index 0bbcbd15f..02c4d0bab 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_scale.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/fake/fake_scale.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/generated_expansion.go index eef05e765..cfaeebd05 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/ingress.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/ingress.go index 26b21baa5..f8b664cbd 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/ingress.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/ingress.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/podsecuritypolicy.go index 19475a5c0..8099d7730 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/podsecuritypolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/replicaset.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/replicaset.go index b307ac70e..7e61fa2d1 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/replicaset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/scale.go b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/scale.go index e654d9537..6ee677acd 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/scale.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/scale.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD deleted file mode 100644 index 7a2e3e2b1..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "networking_client.go", - "networkpolicy.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/networking/v1", - deps = [ - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/networking/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/doc.go index d007a2903..3af5d054f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/BUILD deleted file mode 100644 index bc84632da..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_networking_client.go", - "fake_networkpolicy.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/networking/v1/fake", - deps = [ - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/networking/v1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networking_client.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networking_client.go index 8bce64250..6b135c636 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networking_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networking_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networkpolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networkpolicy.go index fbab3ca16..4bf7ef7ca 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networkpolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/fake/fake_networkpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeNetworkPolicies) List(opts v1.ListOptions) (result *networking_v1.N if label == nil { label = labels.Everything() } - list := &networking_v1.NetworkPolicyList{} + list := &networking_v1.NetworkPolicyList{ListMeta: obj.(*networking_v1.NetworkPolicyList).ListMeta} for _, item := range obj.(*networking_v1.NetworkPolicyList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/generated_expansion.go index c6dd5c323..7d77495fa 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networking_client.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networking_client.go index ac8200f82..8684db456 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networking_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networking_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go index b0a85c5c5..c2eb2e792 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD deleted file mode 100644 index 92606b3c4..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "eviction.go", - "eviction_expansion.go", - "generated_expansion.go", - "poddisruptionbudget.go", - "podsecuritypolicy.go", - "policy_client.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/policy/v1beta1", - deps = [ - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/eviction.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/eviction.go index b0abf6563..12e8e76ed 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/eviction.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/eviction.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/BUILD deleted file mode 100644 index 9b6941ce9..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_eviction.go", - "fake_eviction_expansion.go", - "fake_poddisruptionbudget.go", - "fake_podsecuritypolicy.go", - "fake_policy_client.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake", - deps = [ - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_eviction.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_eviction.go index 06aba37b4..b8f6f3eae 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_eviction.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_eviction.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_poddisruptionbudget.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_poddisruptionbudget.go index d85a67e4f..3f2e78b31 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_poddisruptionbudget.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_poddisruptionbudget.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakePodDisruptionBudgets) List(opts v1.ListOptions) (result *v1beta1.Po if label == nil { label = labels.Everything() } - list := &v1beta1.PodDisruptionBudgetList{} + list := &v1beta1.PodDisruptionBudgetList{ListMeta: obj.(*v1beta1.PodDisruptionBudgetList).ListMeta} for _, item := range obj.(*v1beta1.PodDisruptionBudgetList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_podsecuritypolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_podsecuritypolicy.go index 068515a36..0df9aa15f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_podsecuritypolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakePodSecurityPolicies) List(opts v1.ListOptions) (result *v1beta1.Pod if label == nil { label = labels.Everything() } - list := &v1beta1.PodSecurityPolicyList{} + list := &v1beta1.PodSecurityPolicyList{ListMeta: obj.(*v1beta1.PodSecurityPolicyList).ListMeta} for _, item := range obj.(*v1beta1.PodSecurityPolicyList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_policy_client.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_policy_client.go index 3b7e5415e..9c780bf1f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_policy_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_policy_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/generated_expansion.go index d39f527be..078c16d5c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/poddisruptionbudget.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/poddisruptionbudget.go index d154dfcf8..a11f27eb2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/poddisruptionbudget.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/poddisruptionbudget.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go index de6760b14..355be1e9c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/policy_client.go b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/policy_client.go index f45cfdf37..020e185e6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/policy_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/policy_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD deleted file mode 100644 index 76e85d4fc..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "doc.go", - "generated_expansion.go", - "rbac_client.go", - "role.go", - "rolebinding.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1", - deps = [ - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go index e1af3a99b..f3db3beb5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go index c49ac6dd2..21dda4980 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/doc.go index d007a2903..3af5d054f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/BUILD deleted file mode 100644 index 4e92a39ba..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_clusterrole.go", - "fake_clusterrolebinding.go", - "fake_rbac_client.go", - "fake_role.go", - "fake_rolebinding.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1/fake", - deps = [ - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrole.go index b07323c50..01e62aeb5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeClusterRoles) List(opts v1.ListOptions) (result *rbac_v1.ClusterRol if label == nil { label = labels.Everything() } - list := &rbac_v1.ClusterRoleList{} + list := &rbac_v1.ClusterRoleList{ListMeta: obj.(*rbac_v1.ClusterRoleList).ListMeta} for _, item := range obj.(*rbac_v1.ClusterRoleList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrolebinding.go index 5e960c8ca..e5c054c9c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeClusterRoleBindings) List(opts v1.ListOptions) (result *rbac_v1.Clu if label == nil { label = labels.Everything() } - list := &rbac_v1.ClusterRoleBindingList{} + list := &rbac_v1.ClusterRoleBindingList{ListMeta: obj.(*rbac_v1.ClusterRoleBindingList).ListMeta} for _, item := range obj.(*rbac_v1.ClusterRoleBindingList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rbac_client.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rbac_client.go index 5311f0618..426fd70d6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rbac_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rbac_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_role.go index 733760de2..413c70c09 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeRoles) List(opts v1.ListOptions) (result *rbac_v1.RoleList, err err if label == nil { label = labels.Everything() } - list := &rbac_v1.RoleList{} + list := &rbac_v1.RoleList{ListMeta: obj.(*rbac_v1.RoleList).ListMeta} for _, item := range obj.(*rbac_v1.RoleList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rolebinding.go index 11a75f939..536377b30 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/fake/fake_rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeRoleBindings) List(opts v1.ListOptions) (result *rbac_v1.RoleBindin if label == nil { label = labels.Everything() } - list := &rbac_v1.RoleBindingList{} + list := &rbac_v1.RoleBindingList{ListMeta: obj.(*rbac_v1.RoleBindingList).ListMeta} for _, item := range obj.(*rbac_v1.RoleBindingList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/generated_expansion.go index 0977cc00c..e3f1b02e3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rbac_client.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rbac_client.go index e5b7b561d..e3855bb9b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rbac_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rbac_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go index 678e284b7..cb7c5c4e8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go index 7fd9e29fa..a19010fa8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD deleted file mode 100644 index 11065cf6a..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "doc.go", - "generated_expansion.go", - "rbac_client.go", - "role.go", - "rolebinding.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", - deps = [ - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrole.go index 901ef7f46..37a545762 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrolebinding.go index c5c5360b9..605078906 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/doc.go index 69ca30111..df51baa4d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/BUILD deleted file mode 100644 index 461fd09a0..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_clusterrole.go", - "fake_clusterrolebinding.go", - "fake_rbac_client.go", - "fake_role.go", - "fake_rolebinding.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake", - deps = [ - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrole.go index 1b3eec014..13fbce4e7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeClusterRoles) List(opts v1.ListOptions) (result *v1alpha1.ClusterRo if label == nil { label = labels.Everything() } - list := &v1alpha1.ClusterRoleList{} + list := &v1alpha1.ClusterRoleList{ListMeta: obj.(*v1alpha1.ClusterRoleList).ListMeta} for _, item := range obj.(*v1alpha1.ClusterRoleList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrolebinding.go index d54eb6f25..5076543d9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeClusterRoleBindings) List(opts v1.ListOptions) (result *v1alpha1.Cl if label == nil { label = labels.Everything() } - list := &v1alpha1.ClusterRoleBindingList{} + list := &v1alpha1.ClusterRoleBindingList{ListMeta: obj.(*v1alpha1.ClusterRoleBindingList).ListMeta} for _, item := range obj.(*v1alpha1.ClusterRoleBindingList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rbac_client.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rbac_client.go index 12a96c5b6..3447e9be8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rbac_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rbac_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_role.go index 8c365efcb..24d8efee3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeRoles) List(opts v1.ListOptions) (result *v1alpha1.RoleList, err er if label == nil { label = labels.Everything() } - list := &v1alpha1.RoleList{} + list := &v1alpha1.RoleList{ListMeta: obj.(*v1alpha1.RoleList).ListMeta} for _, item := range obj.(*v1alpha1.RoleList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rolebinding.go index 4346589a8..cb01ef99d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/fake/fake_rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeRoleBindings) List(opts v1.ListOptions) (result *v1alpha1.RoleBindi if label == nil { label = labels.Everything() } - list := &v1alpha1.RoleBindingList{} + list := &v1alpha1.RoleBindingList{ListMeta: obj.(*v1alpha1.RoleBindingList).ListMeta} for _, item := range obj.(*v1alpha1.RoleBindingList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/generated_expansion.go index aebf50655..b8b5c7869 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rbac_client.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rbac_client.go index 06b5f5cab..de83531ed 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rbac_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rbac_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/role.go index 8af1d7784..aa6954bb5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rolebinding.go index 43888d066..0941b8e86 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD deleted file mode 100644 index e750f1e17..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "doc.go", - "generated_expansion.go", - "rbac_client.go", - "role.go", - "rolebinding.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", - deps = [ - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrole.go index fd6effd46..bac951c87 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrolebinding.go index 469307000..96c91de6e 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/BUILD deleted file mode 100644 index 0ab08b3e3..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_clusterrole.go", - "fake_clusterrolebinding.go", - "fake_rbac_client.go", - "fake_role.go", - "fake_rolebinding.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake", - deps = [ - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrole.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrole.go index 738ca1ea9..62a832197 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrole.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeClusterRoles) List(opts v1.ListOptions) (result *v1beta1.ClusterRol if label == nil { label = labels.Everything() } - list := &v1beta1.ClusterRoleList{} + list := &v1beta1.ClusterRoleList{ListMeta: obj.(*v1beta1.ClusterRoleList).ListMeta} for _, item := range obj.(*v1beta1.ClusterRoleList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrolebinding.go index 144bf70d3..c9ab47269 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeClusterRoleBindings) List(opts v1.ListOptions) (result *v1beta1.Clu if label == nil { label = labels.Everything() } - list := &v1beta1.ClusterRoleBindingList{} + list := &v1beta1.ClusterRoleBindingList{ListMeta: obj.(*v1beta1.ClusterRoleBindingList).ListMeta} for _, item := range obj.(*v1beta1.ClusterRoleBindingList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rbac_client.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rbac_client.go index 0856ee084..bdbc246b7 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rbac_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rbac_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_role.go index 2e9d46b51..45b07a001 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeRoles) List(opts v1.ListOptions) (result *v1beta1.RoleList, err err if label == nil { label = labels.Everything() } - list := &v1beta1.RoleList{} + list := &v1beta1.RoleList{ListMeta: obj.(*v1beta1.RoleList).ListMeta} for _, item := range obj.(*v1beta1.RoleList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rolebinding.go index bb363d874..1efd40005 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/fake/fake_rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakeRoleBindings) List(opts v1.ListOptions) (result *v1beta1.RoleBindin if label == nil { label = labels.Everything() } - list := &v1beta1.RoleBindingList{} + list := &v1beta1.RoleBindingList{ListMeta: obj.(*v1beta1.RoleBindingList).ListMeta} for _, item := range obj.(*v1beta1.RoleBindingList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/generated_expansion.go index 538b09833..e7be79f8d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rbac_client.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rbac_client.go index eecdd45a8..46718d731 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rbac_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rbac_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/role.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/role.go index 363b2c6cd..66f382c07 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/role.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rolebinding.go b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rolebinding.go index 8d9f1f617..67d3d331b 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rolebinding.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD deleted file mode 100644 index db9b36f32..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "priorityclass.go", - "scheduling_client.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", - deps = [ - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/doc.go index 69ca30111..df51baa4d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/BUILD deleted file mode 100644 index f5c9c6436..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_priorityclass.go", - "fake_scheduling_client.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake", - deps = [ - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_priorityclass.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_priorityclass.go index 9946411e2..8ab4421a9 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_priorityclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_priorityclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakePriorityClasses) List(opts v1.ListOptions) (result *v1alpha1.Priori if label == nil { label = labels.Everything() } - list := &v1alpha1.PriorityClassList{} + list := &v1alpha1.PriorityClassList{ListMeta: obj.(*v1alpha1.PriorityClassList).ListMeta} for _, item := range obj.(*v1alpha1.PriorityClassList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_scheduling_client.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_scheduling_client.go index 6e0a9659e..974ba193f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_scheduling_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/fake/fake_scheduling_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/generated_expansion.go index 682f0f3bf..52f81d881 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/priorityclass.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/priorityclass.go index 055a0e3f3..6845d25c3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/priorityclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/priorityclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/scheduling_client.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/scheduling_client.go index f030b319e..375f41b8d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/scheduling_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/scheduling_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/doc.go new file mode 100644 index 000000000..771101956 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/doc.go @@ -0,0 +1,20 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated typed clients. +package v1beta1 diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/doc.go new file mode 100644 index 000000000..16f443990 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/doc.go @@ -0,0 +1,20 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// Package fake has the automatically generated clients. +package fake diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_priorityclass.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_priorityclass.go new file mode 100644 index 000000000..e234fec66 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_priorityclass.go @@ -0,0 +1,120 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v1beta1 "k8s.io/api/scheduling/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakePriorityClasses implements PriorityClassInterface +type FakePriorityClasses struct { + Fake *FakeSchedulingV1beta1 +} + +var priorityclassesResource = schema.GroupVersionResource{Group: "scheduling.k8s.io", Version: "v1beta1", Resource: "priorityclasses"} + +var priorityclassesKind = schema.GroupVersionKind{Group: "scheduling.k8s.io", Version: "v1beta1", Kind: "PriorityClass"} + +// Get takes name of the priorityClass, and returns the corresponding priorityClass object, and an error if there is any. +func (c *FakePriorityClasses) Get(name string, options v1.GetOptions) (result *v1beta1.PriorityClass, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootGetAction(priorityclassesResource, name), &v1beta1.PriorityClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.PriorityClass), err +} + +// List takes label and field selectors, and returns the list of PriorityClasses that match those selectors. +func (c *FakePriorityClasses) List(opts v1.ListOptions) (result *v1beta1.PriorityClassList, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootListAction(priorityclassesResource, priorityclassesKind, opts), &v1beta1.PriorityClassList{}) + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1beta1.PriorityClassList{ListMeta: obj.(*v1beta1.PriorityClassList).ListMeta} + for _, item := range obj.(*v1beta1.PriorityClassList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested priorityClasses. +func (c *FakePriorityClasses) Watch(opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewRootWatchAction(priorityclassesResource, opts)) +} + +// Create takes the representation of a priorityClass and creates it. Returns the server's representation of the priorityClass, and an error, if there is any. +func (c *FakePriorityClasses) Create(priorityClass *v1beta1.PriorityClass) (result *v1beta1.PriorityClass, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootCreateAction(priorityclassesResource, priorityClass), &v1beta1.PriorityClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.PriorityClass), err +} + +// Update takes the representation of a priorityClass and updates it. Returns the server's representation of the priorityClass, and an error, if there is any. +func (c *FakePriorityClasses) Update(priorityClass *v1beta1.PriorityClass) (result *v1beta1.PriorityClass, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootUpdateAction(priorityclassesResource, priorityClass), &v1beta1.PriorityClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.PriorityClass), err +} + +// Delete takes name of the priorityClass and deletes it. Returns an error if one occurs. +func (c *FakePriorityClasses) Delete(name string, options *v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewRootDeleteAction(priorityclassesResource, name), &v1beta1.PriorityClass{}) + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakePriorityClasses) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + action := testing.NewRootDeleteCollectionAction(priorityclassesResource, listOptions) + + _, err := c.Fake.Invokes(action, &v1beta1.PriorityClassList{}) + return err +} + +// Patch applies the patch and returns the patched priorityClass. +func (c *FakePriorityClasses) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.PriorityClass, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(priorityclassesResource, name, data, subresources...), &v1beta1.PriorityClass{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.PriorityClass), err +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_scheduling_client.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_scheduling_client.go new file mode 100644 index 000000000..4a6878a45 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/fake/fake_scheduling_client.go @@ -0,0 +1,40 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v1beta1 "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1" + rest "k8s.io/client-go/rest" + testing "k8s.io/client-go/testing" +) + +type FakeSchedulingV1beta1 struct { + *testing.Fake +} + +func (c *FakeSchedulingV1beta1) PriorityClasses() v1beta1.PriorityClassInterface { + return &FakePriorityClasses{c} +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *FakeSchedulingV1beta1) RESTClient() rest.Interface { + var ret *rest.RESTClient + return ret +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/generated_expansion.go new file mode 100644 index 000000000..3bab873e6 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/generated_expansion.go @@ -0,0 +1,21 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1beta1 + +type PriorityClassExpansion interface{} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/priorityclass.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/priorityclass.go new file mode 100644 index 000000000..57b9766e4 --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/priorityclass.go @@ -0,0 +1,147 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/scheduling/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// PriorityClassesGetter has a method to return a PriorityClassInterface. +// A group's client should implement this interface. +type PriorityClassesGetter interface { + PriorityClasses() PriorityClassInterface +} + +// PriorityClassInterface has methods to work with PriorityClass resources. +type PriorityClassInterface interface { + Create(*v1beta1.PriorityClass) (*v1beta1.PriorityClass, error) + Update(*v1beta1.PriorityClass) (*v1beta1.PriorityClass, error) + Delete(name string, options *v1.DeleteOptions) error + DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error + Get(name string, options v1.GetOptions) (*v1beta1.PriorityClass, error) + List(opts v1.ListOptions) (*v1beta1.PriorityClassList, error) + Watch(opts v1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.PriorityClass, err error) + PriorityClassExpansion +} + +// priorityClasses implements PriorityClassInterface +type priorityClasses struct { + client rest.Interface +} + +// newPriorityClasses returns a PriorityClasses +func newPriorityClasses(c *SchedulingV1beta1Client) *priorityClasses { + return &priorityClasses{ + client: c.RESTClient(), + } +} + +// Get takes name of the priorityClass, and returns the corresponding priorityClass object, and an error if there is any. +func (c *priorityClasses) Get(name string, options v1.GetOptions) (result *v1beta1.PriorityClass, err error) { + result = &v1beta1.PriorityClass{} + err = c.client.Get(). + Resource("priorityclasses"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of PriorityClasses that match those selectors. +func (c *priorityClasses) List(opts v1.ListOptions) (result *v1beta1.PriorityClassList, err error) { + result = &v1beta1.PriorityClassList{} + err = c.client.Get(). + Resource("priorityclasses"). + VersionedParams(&opts, scheme.ParameterCodec). + Do(). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested priorityClasses. +func (c *priorityClasses) Watch(opts v1.ListOptions) (watch.Interface, error) { + opts.Watch = true + return c.client.Get(). + Resource("priorityclasses"). + VersionedParams(&opts, scheme.ParameterCodec). + Watch() +} + +// Create takes the representation of a priorityClass and creates it. Returns the server's representation of the priorityClass, and an error, if there is any. +func (c *priorityClasses) Create(priorityClass *v1beta1.PriorityClass) (result *v1beta1.PriorityClass, err error) { + result = &v1beta1.PriorityClass{} + err = c.client.Post(). + Resource("priorityclasses"). + Body(priorityClass). + Do(). + Into(result) + return +} + +// Update takes the representation of a priorityClass and updates it. Returns the server's representation of the priorityClass, and an error, if there is any. +func (c *priorityClasses) Update(priorityClass *v1beta1.PriorityClass) (result *v1beta1.PriorityClass, err error) { + result = &v1beta1.PriorityClass{} + err = c.client.Put(). + Resource("priorityclasses"). + Name(priorityClass.Name). + Body(priorityClass). + Do(). + Into(result) + return +} + +// Delete takes name of the priorityClass and deletes it. Returns an error if one occurs. +func (c *priorityClasses) Delete(name string, options *v1.DeleteOptions) error { + return c.client.Delete(). + Resource("priorityclasses"). + Name(name). + Body(options). + Do(). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *priorityClasses) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error { + return c.client.Delete(). + Resource("priorityclasses"). + VersionedParams(&listOptions, scheme.ParameterCodec). + Body(options). + Do(). + Error() +} + +// Patch applies the patch and returns the patched priorityClass. +func (c *priorityClasses) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.PriorityClass, err error) { + result = &v1beta1.PriorityClass{} + err = c.client.Patch(pt). + Resource("priorityclasses"). + SubResource(subresources...). + Name(name). + Body(data). + Do(). + Into(result) + return +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/scheduling_client.go b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/scheduling_client.go new file mode 100644 index 000000000..6feec4aec --- /dev/null +++ b/vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/scheduling_client.go @@ -0,0 +1,90 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/scheduling/v1beta1" + serializer "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +type SchedulingV1beta1Interface interface { + RESTClient() rest.Interface + PriorityClassesGetter +} + +// SchedulingV1beta1Client is used to interact with features provided by the scheduling.k8s.io group. +type SchedulingV1beta1Client struct { + restClient rest.Interface +} + +func (c *SchedulingV1beta1Client) PriorityClasses() PriorityClassInterface { + return newPriorityClasses(c) +} + +// NewForConfig creates a new SchedulingV1beta1Client for the given config. +func NewForConfig(c *rest.Config) (*SchedulingV1beta1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &SchedulingV1beta1Client{client}, nil +} + +// NewForConfigOrDie creates a new SchedulingV1beta1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *SchedulingV1beta1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new SchedulingV1beta1Client for the given RESTClient. +func New(c rest.Interface) *SchedulingV1beta1Client { + return &SchedulingV1beta1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1beta1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *SchedulingV1beta1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/BUILD deleted file mode 100644 index a1abc87e3..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "podpreset.go", - "settings_client.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", - deps = [ - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/doc.go index 69ca30111..df51baa4d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/BUILD deleted file mode 100644 index f8823f465..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_podpreset.go", - "fake_settings_client.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake", - deps = [ - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/fake_podpreset.go b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/fake_podpreset.go index 512b38f54..90eaccec5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/fake_podpreset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/fake_podpreset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,7 +62,7 @@ func (c *FakePodPresets) List(opts v1.ListOptions) (result *v1alpha1.PodPresetLi if label == nil { label = labels.Everything() } - list := &v1alpha1.PodPresetList{} + list := &v1alpha1.PodPresetList{ListMeta: obj.(*v1alpha1.PodPresetList).ListMeta} for _, item := range obj.(*v1alpha1.PodPresetList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/fake_settings_client.go b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/fake_settings_client.go index fb07a8248..a142edfed 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/fake_settings_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/fake/fake_settings_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/generated_expansion.go index f0dbcc607..23d9f94d5 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/podpreset.go b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/podpreset.go index 25ed8f543..f000ae486 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/podpreset.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/podpreset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/settings_client.go b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/settings_client.go index 77fa64040..c2a03b960 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/settings_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/settings_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD deleted file mode 100644 index 0c5507141..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "storage_client.go", - "storageclass.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1", - deps = [ - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/doc.go index d007a2903..3af5d054f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/BUILD deleted file mode 100644 index be83e85f8..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_storage_client.go", - "fake_storageclass.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1/fake", - deps = [ - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storage_client.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storage_client.go index 9ba1f5104..fc6f98cf6 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storage_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storage_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storageclass.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storageclass.go index 147ad8028..2b0e279bb 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storageclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/fake/fake_storageclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeStorageClasses) List(opts v1.ListOptions) (result *storage_v1.Stora if label == nil { label = labels.Everything() } - list := &storage_v1.StorageClassList{} + list := &storage_v1.StorageClassList{ListMeta: obj.(*storage_v1.StorageClassList).ListMeta} for _, item := range obj.(*storage_v1.StorageClassList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/generated_expansion.go index 08fedd7ed..2bea7ec7f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storage_client.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storage_client.go index 36a189c46..ac48f4916 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storage_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storage_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go index 24133cd62..74410b245 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/BUILD deleted file mode 100644 index 155421963..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "storage_client.go", - "volumeattachment.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/doc.go index 69ca30111..df51baa4d 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/BUILD deleted file mode 100644 index a509ba7fc..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_storage_client.go", - "fake_volumeattachment.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_storage_client.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_storage_client.go index 5a9ed0964..1a4d9f56f 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_storage_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_storage_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_volumeattachment.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_volumeattachment.go index c5db88531..af04b681c 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_volumeattachment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/fake/fake_volumeattachment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeVolumeAttachments) List(opts v1.ListOptions) (result *v1alpha1.Volu if label == nil { label = labels.Everything() } - list := &v1alpha1.VolumeAttachmentList{} + list := &v1alpha1.VolumeAttachmentList{ListMeta: obj.(*v1alpha1.VolumeAttachmentList).ListMeta} for _, item := range obj.(*v1alpha1.VolumeAttachmentList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/generated_expansion.go index e3fc3f399..cdb7ab2f8 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/storage_client.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/storage_client.go index 63834e462..c52f630ac 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/storage_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/storage_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattachment.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattachment.go index 7bf79a6c1..e6af00185 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattachment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattachment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD deleted file mode 100644 index 79d13929c..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "generated_expansion.go", - "storage_client.go", - "storageclass.go", - "volumeattachment.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1beta1", - deps = [ - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/doc.go index 11ae7049d..771101956 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/BUILD b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/BUILD deleted file mode 100644 index 743008884..000000000 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "fake_storage_client.go", - "fake_storageclass.go", - "fake_volumeattachment.go", - ], - importpath = "k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake", - deps = [ - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/doc.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/doc.go index 87a1873ed..16f443990 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/doc.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/doc.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storage_client.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storage_client.go index a81d90542..e0e3f1d78 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storage_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storage_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storageclass.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storageclass.go index ce1e72d53..cbfbab1a3 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storageclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_storageclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeStorageClasses) List(opts v1.ListOptions) (result *v1beta1.StorageC if label == nil { label = labels.Everything() } - list := &v1beta1.StorageClassList{} + list := &v1beta1.StorageClassList{ListMeta: obj.(*v1beta1.StorageClassList).ListMeta} for _, item := range obj.(*v1beta1.StorageClassList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_volumeattachment.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_volumeattachment.go index 8bbf197dd..04c0c463a 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_volumeattachment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_volumeattachment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -59,7 +59,7 @@ func (c *FakeVolumeAttachments) List(opts v1.ListOptions) (result *v1beta1.Volum if label == nil { label = labels.Everything() } - list := &v1beta1.VolumeAttachmentList{} + list := &v1beta1.VolumeAttachmentList{ListMeta: obj.(*v1beta1.VolumeAttachmentList).ListMeta} for _, item := range obj.(*v1beta1.VolumeAttachmentList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/generated_expansion.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/generated_expansion.go index 5bb931f05..559f88f67 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/generated_expansion.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/generated_expansion.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storage_client.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storage_client.go index 4ca05be6f..4bdebb878 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storage_client.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storage_client.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storageclass.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storageclass.go index 63047a7fb..fbe1fd4c2 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storageclass.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storageclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go index fab0801b0..5cd2d3919 100644 --- a/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go +++ b/vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/BUILD deleted file mode 100644 index df0364232..000000000 --- a/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "initializerconfiguration.go", - ], - importpath = "k8s.io/client-go/listers/admissionregistration/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/expansion_generated.go b/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/expansion_generated.go index 868ee66cf..2c9f9f6a6 100644 --- a/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/initializerconfiguration.go b/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/initializerconfiguration.go index a2cc796dc..dbd7301fc 100644 --- a/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/initializerconfiguration.go +++ b/vendor/k8s.io/client-go/listers/admissionregistration/v1alpha1/initializerconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/BUILD deleted file mode 100644 index d5128618f..000000000 --- a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "mutatingwebhookconfiguration.go", - "validatingwebhookconfiguration.go", - ], - importpath = "k8s.io/client-go/listers/admissionregistration/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/admissionregistration/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/expansion_generated.go index 93dddb5ff..8960abc4f 100644 --- a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go b/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go index 015587e80..b38732c36 100644 --- a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/mutatingwebhookconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/validatingwebhookconfiguration.go b/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/validatingwebhookconfiguration.go index 243589b2f..b89c9bbe2 100644 --- a/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/validatingwebhookconfiguration.go +++ b/vendor/k8s.io/client-go/listers/admissionregistration/v1beta1/validatingwebhookconfiguration.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1/BUILD b/vendor/k8s.io/client-go/listers/apps/v1/BUILD deleted file mode 100644 index fb3cfbbb6..000000000 --- a/vendor/k8s.io/client-go/listers/apps/v1/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "daemonset.go", - "daemonset_expansion.go", - "deployment.go", - "deployment_expansion.go", - "expansion_generated.go", - "replicaset.go", - "replicaset_expansion.go", - "statefulset.go", - "statefulset_expansion.go", - ], - importpath = "k8s.io/client-go/listers/apps/v1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/apps/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/apps/v1/controllerrevision.go b/vendor/k8s.io/client-go/listers/apps/v1/controllerrevision.go index 19f567e82..9029805a3 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1/controllerrevision.go +++ b/vendor/k8s.io/client-go/listers/apps/v1/controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1/daemonset.go b/vendor/k8s.io/client-go/listers/apps/v1/daemonset.go index 7fcd1e063..b022ecc4a 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1/daemonset.go +++ b/vendor/k8s.io/client-go/listers/apps/v1/daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1/deployment.go b/vendor/k8s.io/client-go/listers/apps/v1/deployment.go index 2d2ecf0cf..d1be7156e 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1/deployment.go +++ b/vendor/k8s.io/client-go/listers/apps/v1/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/apps/v1/expansion_generated.go index 1e8bf6fec..7f5815f79 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/apps/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1/replicaset.go b/vendor/k8s.io/client-go/listers/apps/v1/replicaset.go index 99fb92ff4..d487ef656 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1/replicaset.go +++ b/vendor/k8s.io/client-go/listers/apps/v1/replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1/statefulset.go b/vendor/k8s.io/client-go/listers/apps/v1/statefulset.go index 6ad54b71f..cc0031858 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1/statefulset.go +++ b/vendor/k8s.io/client-go/listers/apps/v1/statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/apps/v1beta1/BUILD deleted file mode 100644 index f6ddce530..000000000 --- a/vendor/k8s.io/client-go/listers/apps/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "deployment.go", - "expansion_generated.go", - "scale.go", - "statefulset.go", - "statefulset_expansion.go", - ], - importpath = "k8s.io/client-go/listers/apps/v1beta1", - deps = [ - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta1/controllerrevision.go b/vendor/k8s.io/client-go/listers/apps/v1beta1/controllerrevision.go index 95aeb0236..d84a865b3 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta1/controllerrevision.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta1/controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta1/deployment.go b/vendor/k8s.io/client-go/listers/apps/v1beta1/deployment.go index 4f6e883ba..048558f2a 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta1/deployment.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta1/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/apps/v1beta1/expansion_generated.go index 4f3813a94..8f8d08434 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta1/scale.go b/vendor/k8s.io/client-go/listers/apps/v1beta1/scale.go index 85bf3a6f4..ef8a2630e 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta1/scale.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta1/scale.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta1/statefulset.go b/vendor/k8s.io/client-go/listers/apps/v1beta1/statefulset.go index a967e8492..277beb3e4 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta1/statefulset.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta1/statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta2/BUILD b/vendor/k8s.io/client-go/listers/apps/v1beta2/BUILD deleted file mode 100644 index 50aefcab1..000000000 --- a/vendor/k8s.io/client-go/listers/apps/v1beta2/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "controllerrevision.go", - "daemonset.go", - "daemonset_expansion.go", - "deployment.go", - "deployment_expansion.go", - "expansion_generated.go", - "replicaset.go", - "replicaset_expansion.go", - "scale.go", - "statefulset.go", - "statefulset_expansion.go", - ], - importpath = "k8s.io/client-go/listers/apps/v1beta2", - deps = [ - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta2/controllerrevision.go b/vendor/k8s.io/client-go/listers/apps/v1beta2/controllerrevision.go index 3d5274dc3..904b59b24 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta2/controllerrevision.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta2/controllerrevision.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta2/daemonset.go b/vendor/k8s.io/client-go/listers/apps/v1beta2/daemonset.go index 0ea4dc83f..8a40d2c86 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta2/daemonset.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta2/daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta2/deployment.go b/vendor/k8s.io/client-go/listers/apps/v1beta2/deployment.go index 8855bb20c..32beaf25c 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta2/deployment.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta2/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta2/expansion_generated.go b/vendor/k8s.io/client-go/listers/apps/v1beta2/expansion_generated.go index 48cbedb8f..d468f38e7 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta2/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta2/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta2/replicaset.go b/vendor/k8s.io/client-go/listers/apps/v1beta2/replicaset.go index 0fd8dbaa4..18c2136a2 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta2/replicaset.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta2/replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta2/scale.go b/vendor/k8s.io/client-go/listers/apps/v1beta2/scale.go index f53e42ce8..d89329864 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta2/scale.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta2/scale.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/apps/v1beta2/statefulset.go b/vendor/k8s.io/client-go/listers/apps/v1beta2/statefulset.go index 2e095ace4..544bff458 100644 --- a/vendor/k8s.io/client-go/listers/apps/v1beta2/statefulset.go +++ b/vendor/k8s.io/client-go/listers/apps/v1beta2/statefulset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authentication/v1/BUILD b/vendor/k8s.io/client-go/listers/authentication/v1/BUILD deleted file mode 100644 index 18c90f1d3..000000000 --- a/vendor/k8s.io/client-go/listers/authentication/v1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "tokenreview.go", - ], - importpath = "k8s.io/client-go/listers/authentication/v1", - deps = [ - "//vendor/k8s.io/api/authentication/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/authentication/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/authentication/v1/expansion_generated.go index 77b284d8d..a8d097f40 100644 --- a/vendor/k8s.io/client-go/listers/authentication/v1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/authentication/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authentication/v1/tokenreview.go b/vendor/k8s.io/client-go/listers/authentication/v1/tokenreview.go index 5f2c6c3e6..5bb907c0c 100644 --- a/vendor/k8s.io/client-go/listers/authentication/v1/tokenreview.go +++ b/vendor/k8s.io/client-go/listers/authentication/v1/tokenreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authentication/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/authentication/v1beta1/BUILD deleted file mode 100644 index 45a7b02eb..000000000 --- a/vendor/k8s.io/client-go/listers/authentication/v1beta1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "tokenreview.go", - ], - importpath = "k8s.io/client-go/listers/authentication/v1beta1", - deps = [ - "//vendor/k8s.io/api/authentication/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/authentication/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/authentication/v1beta1/expansion_generated.go index 3b2b18860..82192059d 100644 --- a/vendor/k8s.io/client-go/listers/authentication/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/authentication/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authentication/v1beta1/tokenreview.go b/vendor/k8s.io/client-go/listers/authentication/v1beta1/tokenreview.go index 9db014e9b..148bcae78 100644 --- a/vendor/k8s.io/client-go/listers/authentication/v1beta1/tokenreview.go +++ b/vendor/k8s.io/client-go/listers/authentication/v1beta1/tokenreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authorization/v1/BUILD b/vendor/k8s.io/client-go/listers/authorization/v1/BUILD deleted file mode 100644 index dbea6dcc2..000000000 --- a/vendor/k8s.io/client-go/listers/authorization/v1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "localsubjectaccessreview.go", - "selfsubjectaccessreview.go", - "selfsubjectrulesreview.go", - "subjectaccessreview.go", - ], - importpath = "k8s.io/client-go/listers/authorization/v1", - deps = [ - "//vendor/k8s.io/api/authorization/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/authorization/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/authorization/v1/expansion_generated.go index 9a0f2e212..af91939fb 100644 --- a/vendor/k8s.io/client-go/listers/authorization/v1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/authorization/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authorization/v1/localsubjectaccessreview.go b/vendor/k8s.io/client-go/listers/authorization/v1/localsubjectaccessreview.go index 99055b348..e064c94c1 100644 --- a/vendor/k8s.io/client-go/listers/authorization/v1/localsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/listers/authorization/v1/localsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authorization/v1/selfsubjectaccessreview.go b/vendor/k8s.io/client-go/listers/authorization/v1/selfsubjectaccessreview.go index 627e4dd74..f89bc1dde 100644 --- a/vendor/k8s.io/client-go/listers/authorization/v1/selfsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/listers/authorization/v1/selfsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authorization/v1/selfsubjectrulesreview.go b/vendor/k8s.io/client-go/listers/authorization/v1/selfsubjectrulesreview.go index 6b2f06352..c65b5f84d 100644 --- a/vendor/k8s.io/client-go/listers/authorization/v1/selfsubjectrulesreview.go +++ b/vendor/k8s.io/client-go/listers/authorization/v1/selfsubjectrulesreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authorization/v1/subjectaccessreview.go b/vendor/k8s.io/client-go/listers/authorization/v1/subjectaccessreview.go index ca7b47b46..0d6c29b39 100644 --- a/vendor/k8s.io/client-go/listers/authorization/v1/subjectaccessreview.go +++ b/vendor/k8s.io/client-go/listers/authorization/v1/subjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authorization/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/authorization/v1beta1/BUILD deleted file mode 100644 index 665642706..000000000 --- a/vendor/k8s.io/client-go/listers/authorization/v1beta1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "localsubjectaccessreview.go", - "selfsubjectaccessreview.go", - "selfsubjectrulesreview.go", - "subjectaccessreview.go", - ], - importpath = "k8s.io/client-go/listers/authorization/v1beta1", - deps = [ - "//vendor/k8s.io/api/authorization/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/authorization/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/authorization/v1beta1/expansion_generated.go index d140d6563..24b06185e 100644 --- a/vendor/k8s.io/client-go/listers/authorization/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/authorization/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authorization/v1beta1/localsubjectaccessreview.go b/vendor/k8s.io/client-go/listers/authorization/v1beta1/localsubjectaccessreview.go index 534e39aa9..4eb8158a3 100644 --- a/vendor/k8s.io/client-go/listers/authorization/v1beta1/localsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/listers/authorization/v1beta1/localsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authorization/v1beta1/selfsubjectaccessreview.go b/vendor/k8s.io/client-go/listers/authorization/v1beta1/selfsubjectaccessreview.go index c2e82dbb9..4736ccdd5 100644 --- a/vendor/k8s.io/client-go/listers/authorization/v1beta1/selfsubjectaccessreview.go +++ b/vendor/k8s.io/client-go/listers/authorization/v1beta1/selfsubjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authorization/v1beta1/selfsubjectrulesreview.go b/vendor/k8s.io/client-go/listers/authorization/v1beta1/selfsubjectrulesreview.go index 5ce83f217..4e47abc3a 100644 --- a/vendor/k8s.io/client-go/listers/authorization/v1beta1/selfsubjectrulesreview.go +++ b/vendor/k8s.io/client-go/listers/authorization/v1beta1/selfsubjectrulesreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/authorization/v1beta1/subjectaccessreview.go b/vendor/k8s.io/client-go/listers/authorization/v1beta1/subjectaccessreview.go index b1853fc3c..5782b4f23 100644 --- a/vendor/k8s.io/client-go/listers/authorization/v1beta1/subjectaccessreview.go +++ b/vendor/k8s.io/client-go/listers/authorization/v1beta1/subjectaccessreview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v1/BUILD b/vendor/k8s.io/client-go/listers/autoscaling/v1/BUILD deleted file mode 100644 index 8c5bfd95d..000000000 --- a/vendor/k8s.io/client-go/listers/autoscaling/v1/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "horizontalpodautoscaler.go", - ], - importpath = "k8s.io/client-go/listers/autoscaling/v1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/autoscaling/v1/expansion_generated.go index a20ab75da..05253c770 100644 --- a/vendor/k8s.io/client-go/listers/autoscaling/v1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/autoscaling/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/listers/autoscaling/v1/horizontalpodautoscaler.go index 27ade7ddb..6d563ca98 100644 --- a/vendor/k8s.io/client-go/listers/autoscaling/v1/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/listers/autoscaling/v1/horizontalpodautoscaler.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/BUILD b/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/BUILD deleted file mode 100644 index 78aca5847..000000000 --- a/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "horizontalpodautoscaler.go", - ], - importpath = "k8s.io/client-go/listers/autoscaling/v2beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/autoscaling/v2beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/expansion_generated.go index c026b65d5..8d46a4b6e 100644 --- a/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/horizontalpodautoscaler.go b/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/horizontalpodautoscaler.go index 4c29df910..08d13803b 100644 --- a/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/horizontalpodautoscaler.go +++ b/vendor/k8s.io/client-go/listers/autoscaling/v2beta1/horizontalpodautoscaler.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/batch/v1/BUILD b/vendor/k8s.io/client-go/listers/batch/v1/BUILD deleted file mode 100644 index c695b9856..000000000 --- a/vendor/k8s.io/client-go/listers/batch/v1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "job.go", - "job_expansion.go", - ], - importpath = "k8s.io/client-go/listers/batch/v1", - deps = [ - "//vendor/k8s.io/api/batch/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/batch/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/batch/v1/expansion_generated.go index 63091e84a..c43caf240 100644 --- a/vendor/k8s.io/client-go/listers/batch/v1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/batch/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/batch/v1/job.go b/vendor/k8s.io/client-go/listers/batch/v1/job.go index e29e0271c..909b6f88f 100644 --- a/vendor/k8s.io/client-go/listers/batch/v1/job.go +++ b/vendor/k8s.io/client-go/listers/batch/v1/job.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/batch/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/batch/v1beta1/BUILD deleted file mode 100644 index 0ae1a2eda..000000000 --- a/vendor/k8s.io/client-go/listers/batch/v1beta1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "cronjob.go", - "expansion_generated.go", - ], - importpath = "k8s.io/client-go/listers/batch/v1beta1", - deps = [ - "//vendor/k8s.io/api/batch/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/batch/v1beta1/cronjob.go b/vendor/k8s.io/client-go/listers/batch/v1beta1/cronjob.go index 93f197986..521378ebf 100644 --- a/vendor/k8s.io/client-go/listers/batch/v1beta1/cronjob.go +++ b/vendor/k8s.io/client-go/listers/batch/v1beta1/cronjob.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/batch/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/batch/v1beta1/expansion_generated.go index 1d6cc198a..be2742ef6 100644 --- a/vendor/k8s.io/client-go/listers/batch/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/batch/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/batch/v2alpha1/BUILD b/vendor/k8s.io/client-go/listers/batch/v2alpha1/BUILD deleted file mode 100644 index 92220512e..000000000 --- a/vendor/k8s.io/client-go/listers/batch/v2alpha1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "cronjob.go", - "expansion_generated.go", - ], - importpath = "k8s.io/client-go/listers/batch/v2alpha1", - deps = [ - "//vendor/k8s.io/api/batch/v2alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/batch/v2alpha1/cronjob.go b/vendor/k8s.io/client-go/listers/batch/v2alpha1/cronjob.go index 6af5f1457..2623f1959 100644 --- a/vendor/k8s.io/client-go/listers/batch/v2alpha1/cronjob.go +++ b/vendor/k8s.io/client-go/listers/batch/v2alpha1/cronjob.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/batch/v2alpha1/expansion_generated.go b/vendor/k8s.io/client-go/listers/batch/v2alpha1/expansion_generated.go index 11f6c3471..a30c7a619 100644 --- a/vendor/k8s.io/client-go/listers/batch/v2alpha1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/batch/v2alpha1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/certificates/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/certificates/v1beta1/BUILD deleted file mode 100644 index b7ca4270c..000000000 --- a/vendor/k8s.io/client-go/listers/certificates/v1beta1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "certificatesigningrequest.go", - "expansion_generated.go", - ], - importpath = "k8s.io/client-go/listers/certificates/v1beta1", - deps = [ - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/certificates/v1beta1/certificatesigningrequest.go b/vendor/k8s.io/client-go/listers/certificates/v1beta1/certificatesigningrequest.go index a122c3660..47c282984 100644 --- a/vendor/k8s.io/client-go/listers/certificates/v1beta1/certificatesigningrequest.go +++ b/vendor/k8s.io/client-go/listers/certificates/v1beta1/certificatesigningrequest.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/certificates/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/certificates/v1beta1/expansion_generated.go index 6815de7ad..68f993cd6 100644 --- a/vendor/k8s.io/client-go/listers/certificates/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/certificates/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/BUILD b/vendor/k8s.io/client-go/listers/core/v1/BUILD deleted file mode 100644 index 313cdc299..000000000 --- a/vendor/k8s.io/client-go/listers/core/v1/BUILD +++ /dev/null @@ -1,52 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "componentstatus.go", - "configmap.go", - "endpoints.go", - "event.go", - "expansion_generated.go", - "limitrange.go", - "namespace.go", - "node.go", - "node_expansion.go", - "persistentvolume.go", - "persistentvolumeclaim.go", - "pod.go", - "podtemplate.go", - "replicationcontroller.go", - "replicationcontroller_expansion.go", - "resourcequota.go", - "secret.go", - "service.go", - "service_expansion.go", - "serviceaccount.go", - ], - importpath = "k8s.io/client-go/listers/core/v1", - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/core/v1/componentstatus.go b/vendor/k8s.io/client-go/listers/core/v1/componentstatus.go index 82fbedac2..23d070810 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/componentstatus.go +++ b/vendor/k8s.io/client-go/listers/core/v1/componentstatus.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/configmap.go b/vendor/k8s.io/client-go/listers/core/v1/configmap.go index fc927ab2c..55d7cd4d3 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/configmap.go +++ b/vendor/k8s.io/client-go/listers/core/v1/configmap.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/endpoints.go b/vendor/k8s.io/client-go/listers/core/v1/endpoints.go index 7799562d7..ac2fdfc57 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/endpoints.go +++ b/vendor/k8s.io/client-go/listers/core/v1/endpoints.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/event.go b/vendor/k8s.io/client-go/listers/core/v1/event.go index 738e333db..a9d2db01a 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/event.go +++ b/vendor/k8s.io/client-go/listers/core/v1/event.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/core/v1/expansion_generated.go index b8b985ce0..fac0221b8 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/core/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/limitrange.go b/vendor/k8s.io/client-go/listers/core/v1/limitrange.go index 4ee02634d..c773c433e 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/limitrange.go +++ b/vendor/k8s.io/client-go/listers/core/v1/limitrange.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/namespace.go b/vendor/k8s.io/client-go/listers/core/v1/namespace.go index b819d741e..6a17d0457 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/namespace.go +++ b/vendor/k8s.io/client-go/listers/core/v1/namespace.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/node.go b/vendor/k8s.io/client-go/listers/core/v1/node.go index 21a8a0675..b568ebe47 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/node.go +++ b/vendor/k8s.io/client-go/listers/core/v1/node.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/persistentvolume.go b/vendor/k8s.io/client-go/listers/core/v1/persistentvolume.go index a88dbd0c0..1d7c6ca76 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/persistentvolume.go +++ b/vendor/k8s.io/client-go/listers/core/v1/persistentvolume.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/persistentvolumeclaim.go b/vendor/k8s.io/client-go/listers/core/v1/persistentvolumeclaim.go index 8c3d5f566..501a38c43 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/persistentvolumeclaim.go +++ b/vendor/k8s.io/client-go/listers/core/v1/persistentvolumeclaim.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/pod.go b/vendor/k8s.io/client-go/listers/core/v1/pod.go index d3ce8ab32..442f8c55f 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/pod.go +++ b/vendor/k8s.io/client-go/listers/core/v1/pod.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/podtemplate.go b/vendor/k8s.io/client-go/listers/core/v1/podtemplate.go index 91c2a4661..9a17f820c 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/podtemplate.go +++ b/vendor/k8s.io/client-go/listers/core/v1/podtemplate.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/replicationcontroller.go b/vendor/k8s.io/client-go/listers/core/v1/replicationcontroller.go index ee00a465c..8b17aa2c4 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/replicationcontroller.go +++ b/vendor/k8s.io/client-go/listers/core/v1/replicationcontroller.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/resourcequota.go b/vendor/k8s.io/client-go/listers/core/v1/resourcequota.go index fd3119d45..f5b7030cc 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/resourcequota.go +++ b/vendor/k8s.io/client-go/listers/core/v1/resourcequota.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/secret.go b/vendor/k8s.io/client-go/listers/core/v1/secret.go index f8c2b11e1..e9ef24934 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/secret.go +++ b/vendor/k8s.io/client-go/listers/core/v1/secret.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/service.go b/vendor/k8s.io/client-go/listers/core/v1/service.go index d872540b3..3b5941acb 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/service.go +++ b/vendor/k8s.io/client-go/listers/core/v1/service.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/core/v1/serviceaccount.go b/vendor/k8s.io/client-go/listers/core/v1/serviceaccount.go index 9973af66b..8b94cf594 100644 --- a/vendor/k8s.io/client-go/listers/core/v1/serviceaccount.go +++ b/vendor/k8s.io/client-go/listers/core/v1/serviceaccount.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/events/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/events/v1beta1/BUILD deleted file mode 100644 index f4ea35d4a..000000000 --- a/vendor/k8s.io/client-go/listers/events/v1beta1/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "event.go", - "expansion_generated.go", - ], - importpath = "k8s.io/client-go/listers/events/v1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/events/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/events/v1beta1/event.go b/vendor/k8s.io/client-go/listers/events/v1beta1/event.go index c52afd091..4a5bc3997 100644 --- a/vendor/k8s.io/client-go/listers/events/v1beta1/event.go +++ b/vendor/k8s.io/client-go/listers/events/v1beta1/event.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/events/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/events/v1beta1/expansion_generated.go index 9971dd5dd..d311691d9 100644 --- a/vendor/k8s.io/client-go/listers/events/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/events/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/extensions/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/extensions/v1beta1/BUILD deleted file mode 100644 index 49b895c3e..000000000 --- a/vendor/k8s.io/client-go/listers/extensions/v1beta1/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "daemonset.go", - "daemonset_expansion.go", - "deployment.go", - "deployment_expansion.go", - "expansion_generated.go", - "ingress.go", - "podsecuritypolicy.go", - "replicaset.go", - "replicaset_expansion.go", - "scale.go", - ], - importpath = "k8s.io/client-go/listers/extensions/v1beta1", - deps = [ - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["daemonset_expansion_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/extensions/v1beta1/daemonset.go b/vendor/k8s.io/client-go/listers/extensions/v1beta1/daemonset.go index b63c32b97..a7bb6657a 100644 --- a/vendor/k8s.io/client-go/listers/extensions/v1beta1/daemonset.go +++ b/vendor/k8s.io/client-go/listers/extensions/v1beta1/daemonset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/extensions/v1beta1/deployment.go b/vendor/k8s.io/client-go/listers/extensions/v1beta1/deployment.go index ea5168fef..13e307189 100644 --- a/vendor/k8s.io/client-go/listers/extensions/v1beta1/deployment.go +++ b/vendor/k8s.io/client-go/listers/extensions/v1beta1/deployment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/extensions/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/extensions/v1beta1/expansion_generated.go index 87c3cbe3b..b5ee8a492 100644 --- a/vendor/k8s.io/client-go/listers/extensions/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/extensions/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/extensions/v1beta1/ingress.go b/vendor/k8s.io/client-go/listers/extensions/v1beta1/ingress.go index 1f9e34d17..1bc33ede2 100644 --- a/vendor/k8s.io/client-go/listers/extensions/v1beta1/ingress.go +++ b/vendor/k8s.io/client-go/listers/extensions/v1beta1/ingress.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/extensions/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/listers/extensions/v1beta1/podsecuritypolicy.go index fadd212f1..1298e87ba 100644 --- a/vendor/k8s.io/client-go/listers/extensions/v1beta1/podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/listers/extensions/v1beta1/podsecuritypolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/extensions/v1beta1/replicaset.go b/vendor/k8s.io/client-go/listers/extensions/v1beta1/replicaset.go index 930db4480..d3e741a86 100644 --- a/vendor/k8s.io/client-go/listers/extensions/v1beta1/replicaset.go +++ b/vendor/k8s.io/client-go/listers/extensions/v1beta1/replicaset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/extensions/v1beta1/scale.go b/vendor/k8s.io/client-go/listers/extensions/v1beta1/scale.go index 67d45e328..527d4be42 100644 --- a/vendor/k8s.io/client-go/listers/extensions/v1beta1/scale.go +++ b/vendor/k8s.io/client-go/listers/extensions/v1beta1/scale.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/imagepolicy/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/imagepolicy/v1alpha1/BUILD deleted file mode 100644 index da825e6a5..000000000 --- a/vendor/k8s.io/client-go/listers/imagepolicy/v1alpha1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "imagereview.go", - ], - importpath = "k8s.io/client-go/listers/imagepolicy/v1alpha1", - deps = [ - "//vendor/k8s.io/api/imagepolicy/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/imagepolicy/v1alpha1/expansion_generated.go b/vendor/k8s.io/client-go/listers/imagepolicy/v1alpha1/expansion_generated.go index 1529fcf3f..9cb13f792 100644 --- a/vendor/k8s.io/client-go/listers/imagepolicy/v1alpha1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/imagepolicy/v1alpha1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/imagepolicy/v1alpha1/imagereview.go b/vendor/k8s.io/client-go/listers/imagepolicy/v1alpha1/imagereview.go index cdb046cf9..722e456e7 100644 --- a/vendor/k8s.io/client-go/listers/imagepolicy/v1alpha1/imagereview.go +++ b/vendor/k8s.io/client-go/listers/imagepolicy/v1alpha1/imagereview.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/networking/v1/BUILD b/vendor/k8s.io/client-go/listers/networking/v1/BUILD deleted file mode 100644 index 64dc638ba..000000000 --- a/vendor/k8s.io/client-go/listers/networking/v1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "networkpolicy.go", - ], - importpath = "k8s.io/client-go/listers/networking/v1", - deps = [ - "//vendor/k8s.io/api/networking/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/networking/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/networking/v1/expansion_generated.go index 458a1d249..e03a52385 100644 --- a/vendor/k8s.io/client-go/listers/networking/v1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/networking/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/networking/v1/networkpolicy.go b/vendor/k8s.io/client-go/listers/networking/v1/networkpolicy.go index b70adedf1..e5d997747 100644 --- a/vendor/k8s.io/client-go/listers/networking/v1/networkpolicy.go +++ b/vendor/k8s.io/client-go/listers/networking/v1/networkpolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/policy/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/policy/v1beta1/BUILD deleted file mode 100644 index 2c5f33df4..000000000 --- a/vendor/k8s.io/client-go/listers/policy/v1beta1/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "eviction.go", - "expansion_generated.go", - "poddisruptionbudget.go", - "poddisruptionbudget_expansion.go", - "podsecuritypolicy.go", - ], - importpath = "k8s.io/client-go/listers/policy/v1beta1", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/policy/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/policy/v1beta1/eviction.go b/vendor/k8s.io/client-go/listers/policy/v1beta1/eviction.go index 29c454e2a..6e27f5fdc 100644 --- a/vendor/k8s.io/client-go/listers/policy/v1beta1/eviction.go +++ b/vendor/k8s.io/client-go/listers/policy/v1beta1/eviction.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/policy/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/policy/v1beta1/expansion_generated.go index 3e63c2c9c..9a005f20b 100644 --- a/vendor/k8s.io/client-go/listers/policy/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/policy/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/policy/v1beta1/poddisruptionbudget.go b/vendor/k8s.io/client-go/listers/policy/v1beta1/poddisruptionbudget.go index 7304f36b2..b1f83ee16 100644 --- a/vendor/k8s.io/client-go/listers/policy/v1beta1/poddisruptionbudget.go +++ b/vendor/k8s.io/client-go/listers/policy/v1beta1/poddisruptionbudget.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/policy/v1beta1/podsecuritypolicy.go b/vendor/k8s.io/client-go/listers/policy/v1beta1/podsecuritypolicy.go index d80f5c56e..e943d3a05 100644 --- a/vendor/k8s.io/client-go/listers/policy/v1beta1/podsecuritypolicy.go +++ b/vendor/k8s.io/client-go/listers/policy/v1beta1/podsecuritypolicy.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1/BUILD b/vendor/k8s.io/client-go/listers/rbac/v1/BUILD deleted file mode 100644 index 9facdc04d..000000000 --- a/vendor/k8s.io/client-go/listers/rbac/v1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "expansion_generated.go", - "role.go", - "rolebinding.go", - ], - importpath = "k8s.io/client-go/listers/rbac/v1", - deps = [ - "//vendor/k8s.io/api/rbac/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/rbac/v1/clusterrole.go b/vendor/k8s.io/client-go/listers/rbac/v1/clusterrole.go index eb1d87006..a612dbeab 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1/clusterrole.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1/clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1/clusterrolebinding.go b/vendor/k8s.io/client-go/listers/rbac/v1/clusterrolebinding.go index a22d6025e..2c5958ff9 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1/clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/rbac/v1/expansion_generated.go index 967ebdd84..0eb2a6d11 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1/role.go b/vendor/k8s.io/client-go/listers/rbac/v1/role.go index b4649c2c3..9a9d98773 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1/role.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1/role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1/rolebinding.go b/vendor/k8s.io/client-go/listers/rbac/v1/rolebinding.go index 8dc0968bb..85a69315a 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1/rolebinding.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1/rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/BUILD deleted file mode 100644 index 917c535fc..000000000 --- a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "expansion_generated.go", - "role.go", - "rolebinding.go", - ], - importpath = "k8s.io/client-go/listers/rbac/v1alpha1", - deps = [ - "//vendor/k8s.io/api/rbac/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/clusterrole.go b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/clusterrole.go index 302ca29d8..f8c50f65b 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/clusterrole.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/clusterrolebinding.go b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/clusterrolebinding.go index 91ba54c23..5769ed0e6 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/expansion_generated.go b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/expansion_generated.go index 737ba6637..2d4ad1756 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/role.go b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/role.go index cf874f56c..c337b589b 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/role.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/rolebinding.go b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/rolebinding.go index 5e76ab42f..4e517f4d6 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1alpha1/rolebinding.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1alpha1/rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/rbac/v1beta1/BUILD deleted file mode 100644 index bde3d52e8..000000000 --- a/vendor/k8s.io/client-go/listers/rbac/v1beta1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "clusterrole.go", - "clusterrolebinding.go", - "expansion_generated.go", - "role.go", - "rolebinding.go", - ], - importpath = "k8s.io/client-go/listers/rbac/v1beta1", - deps = [ - "//vendor/k8s.io/api/rbac/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/rbac/v1beta1/clusterrole.go b/vendor/k8s.io/client-go/listers/rbac/v1beta1/clusterrole.go index be7f2df6a..01356f4b2 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1beta1/clusterrole.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1beta1/clusterrole.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1beta1/clusterrolebinding.go b/vendor/k8s.io/client-go/listers/rbac/v1beta1/clusterrolebinding.go index 09d65be76..6d3f14338 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1beta1/clusterrolebinding.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1beta1/clusterrolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/rbac/v1beta1/expansion_generated.go index 8da573661..51f674bd0 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1beta1/role.go b/vendor/k8s.io/client-go/listers/rbac/v1beta1/role.go index e12039dbf..c946c43a7 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1beta1/role.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1beta1/role.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/rbac/v1beta1/rolebinding.go b/vendor/k8s.io/client-go/listers/rbac/v1beta1/rolebinding.go index 10cb23cd3..0eec45bde 100644 --- a/vendor/k8s.io/client-go/listers/rbac/v1beta1/rolebinding.go +++ b/vendor/k8s.io/client-go/listers/rbac/v1beta1/rolebinding.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD deleted file mode 100644 index cf60e8132..000000000 --- a/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "priorityclass.go", - ], - importpath = "k8s.io/client-go/listers/scheduling/v1alpha1", - deps = [ - "//vendor/k8s.io/api/scheduling/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/expansion_generated.go b/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/expansion_generated.go index 00b662888..bde8b6206 100644 --- a/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/priorityclass.go b/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/priorityclass.go index fb7f6007c..a3059c94d 100644 --- a/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/priorityclass.go +++ b/vendor/k8s.io/client-go/listers/scheduling/v1alpha1/priorityclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/scheduling/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/scheduling/v1beta1/expansion_generated.go new file mode 100644 index 000000000..b806e8cf8 --- /dev/null +++ b/vendor/k8s.io/client-go/listers/scheduling/v1beta1/expansion_generated.go @@ -0,0 +1,23 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1beta1 + +// PriorityClassListerExpansion allows custom methods to be added to +// PriorityClassLister. +type PriorityClassListerExpansion interface{} diff --git a/vendor/k8s.io/client-go/listers/scheduling/v1beta1/priorityclass.go b/vendor/k8s.io/client-go/listers/scheduling/v1beta1/priorityclass.go new file mode 100644 index 000000000..9d0606392 --- /dev/null +++ b/vendor/k8s.io/client-go/listers/scheduling/v1beta1/priorityclass.go @@ -0,0 +1,65 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1beta1 + +import ( + v1beta1 "k8s.io/api/scheduling/v1beta1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// PriorityClassLister helps list PriorityClasses. +type PriorityClassLister interface { + // List lists all PriorityClasses in the indexer. + List(selector labels.Selector) (ret []*v1beta1.PriorityClass, err error) + // Get retrieves the PriorityClass from the index for a given name. + Get(name string) (*v1beta1.PriorityClass, error) + PriorityClassListerExpansion +} + +// priorityClassLister implements the PriorityClassLister interface. +type priorityClassLister struct { + indexer cache.Indexer +} + +// NewPriorityClassLister returns a new PriorityClassLister. +func NewPriorityClassLister(indexer cache.Indexer) PriorityClassLister { + return &priorityClassLister{indexer: indexer} +} + +// List lists all PriorityClasses in the indexer. +func (s *priorityClassLister) List(selector labels.Selector) (ret []*v1beta1.PriorityClass, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1beta1.PriorityClass)) + }) + return ret, err +} + +// Get retrieves the PriorityClass from the index for a given name. +func (s *priorityClassLister) Get(name string) (*v1beta1.PriorityClass, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1beta1.Resource("priorityclass"), name) + } + return obj.(*v1beta1.PriorityClass), nil +} diff --git a/vendor/k8s.io/client-go/listers/settings/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/settings/v1alpha1/BUILD deleted file mode 100644 index 9979b5e3c..000000000 --- a/vendor/k8s.io/client-go/listers/settings/v1alpha1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "podpreset.go", - ], - importpath = "k8s.io/client-go/listers/settings/v1alpha1", - deps = [ - "//vendor/k8s.io/api/settings/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/settings/v1alpha1/expansion_generated.go b/vendor/k8s.io/client-go/listers/settings/v1alpha1/expansion_generated.go index 72558897b..fba210343 100644 --- a/vendor/k8s.io/client-go/listers/settings/v1alpha1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/settings/v1alpha1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/settings/v1alpha1/podpreset.go b/vendor/k8s.io/client-go/listers/settings/v1alpha1/podpreset.go index d30036962..c862e7d7d 100644 --- a/vendor/k8s.io/client-go/listers/settings/v1alpha1/podpreset.go +++ b/vendor/k8s.io/client-go/listers/settings/v1alpha1/podpreset.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/storage/v1/BUILD b/vendor/k8s.io/client-go/listers/storage/v1/BUILD deleted file mode 100644 index b90f06bb7..000000000 --- a/vendor/k8s.io/client-go/listers/storage/v1/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "storageclass.go", - ], - importpath = "k8s.io/client-go/listers/storage/v1", - deps = [ - "//vendor/k8s.io/api/storage/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/storage/v1/expansion_generated.go b/vendor/k8s.io/client-go/listers/storage/v1/expansion_generated.go index 49e290f4c..d93247064 100644 --- a/vendor/k8s.io/client-go/listers/storage/v1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/storage/v1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/storage/v1/storageclass.go b/vendor/k8s.io/client-go/listers/storage/v1/storageclass.go index 5b20f6ab5..13e8536b4 100644 --- a/vendor/k8s.io/client-go/listers/storage/v1/storageclass.go +++ b/vendor/k8s.io/client-go/listers/storage/v1/storageclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/storage/v1alpha1/BUILD b/vendor/k8s.io/client-go/listers/storage/v1alpha1/BUILD deleted file mode 100644 index 50592d670..000000000 --- a/vendor/k8s.io/client-go/listers/storage/v1alpha1/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "volumeattachment.go", - ], - importpath = "k8s.io/client-go/listers/storage/v1alpha1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/storage/v1alpha1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/listers/storage/v1alpha1/expansion_generated.go b/vendor/k8s.io/client-go/listers/storage/v1alpha1/expansion_generated.go index 2fc6add1d..7ca765622 100644 --- a/vendor/k8s.io/client-go/listers/storage/v1alpha1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/storage/v1alpha1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/storage/v1alpha1/volumeattachment.go b/vendor/k8s.io/client-go/listers/storage/v1alpha1/volumeattachment.go index f8d1bdb2d..7871f55e4 100644 --- a/vendor/k8s.io/client-go/listers/storage/v1alpha1/volumeattachment.go +++ b/vendor/k8s.io/client-go/listers/storage/v1alpha1/volumeattachment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/storage/v1beta1/BUILD b/vendor/k8s.io/client-go/listers/storage/v1beta1/BUILD deleted file mode 100644 index 49d992e47..000000000 --- a/vendor/k8s.io/client-go/listers/storage/v1beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "expansion_generated.go", - "storageclass.go", - "volumeattachment.go", - ], - importpath = "k8s.io/client-go/listers/storage/v1beta1", - deps = [ - "//vendor/k8s.io/api/storage/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/listers/storage/v1beta1/expansion_generated.go b/vendor/k8s.io/client-go/listers/storage/v1beta1/expansion_generated.go index 8c2dc9055..21d95620c 100644 --- a/vendor/k8s.io/client-go/listers/storage/v1beta1/expansion_generated.go +++ b/vendor/k8s.io/client-go/listers/storage/v1beta1/expansion_generated.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/storage/v1beta1/storageclass.go b/vendor/k8s.io/client-go/listers/storage/v1beta1/storageclass.go index 45afe0e77..07bc97b32 100644 --- a/vendor/k8s.io/client-go/listers/storage/v1beta1/storageclass.go +++ b/vendor/k8s.io/client-go/listers/storage/v1beta1/storageclass.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/listers/storage/v1beta1/volumeattachment.go b/vendor/k8s.io/client-go/listers/storage/v1beta1/volumeattachment.go index c9cc3984e..7193441b0 100644 --- a/vendor/k8s.io/client-go/listers/storage/v1beta1/volumeattachment.go +++ b/vendor/k8s.io/client-go/listers/storage/v1beta1/volumeattachment.go @@ -1,5 +1,5 @@ /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD deleted file mode 100644 index 64cdd678d..000000000 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/client-go/pkg/apis/clientauthentication", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication/install:all-srcs", - "//staging/src/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/install/BUILD b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/install/BUILD deleted file mode 100644 index de371ab22..000000000 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/install/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["install.go"], - importpath = "k8s.io/client-go/pkg/apis/clientauthentication/install", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/install/install.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/install/install.go index 40093e97f..1b7b5f949 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/install/install.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/install/install.go @@ -19,25 +19,15 @@ limitations under the License. package install import ( - "k8s.io/apimachinery/pkg/apimachinery/announced" - "k8s.io/apimachinery/pkg/apimachinery/registered" "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/pkg/apis/clientauthentication" "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1" ) // Install registers the API group and adds types to a scheme -func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { - if err := announced.NewGroupMetaFactory( - &announced.GroupMetaFactoryArgs{ - GroupName: clientauthentication.GroupName, - VersionPreferenceOrder: []string{v1alpha1.SchemeGroupVersion.Version}, - AddInternalObjectsToScheme: clientauthentication.AddToScheme, - }, - announced.VersionToSchemeFunc{ - v1alpha1.SchemeGroupVersion.Version: v1alpha1.AddToScheme, - }, - ).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil { - panic(err) - } +func Install(scheme *runtime.Scheme) { + utilruntime.Must(clientauthentication.AddToScheme(scheme)) + utilruntime.Must(v1alpha1.AddToScheme(scheme)) + utilruntime.Must(scheme.SetVersionPriority(v1alpha1.SchemeGroupVersion)) } diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/types.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/types.go index 5c05825f6..6fb53cecf 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/types.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/types.go @@ -57,7 +57,14 @@ type ExecCredentialStatus struct { // +optional ExpirationTimestamp *metav1.Time // Token is a bearer token used by the client for request authentication. + // +optional Token string + // PEM-encoded client TLS certificate. + // +optional + ClientCertificateData string + // PEM-encoded client TLS private key. + // +optional + ClientKeyData string } // Response defines metadata about a failed request, including HTTP status code and diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD deleted file mode 100644 index 1a3bc15f6..000000000 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.conversion.go", - "zz_generated.deepcopy.go", - "zz_generated.defaults.go", - ], - importpath = "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/types.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/types.go index 8920d3187..921f3a2b9 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/types.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/types.go @@ -52,12 +52,20 @@ type ExecCredentialSpec struct { } // ExecCredentialStatus holds credentials for the transport to use. +// +// Token and ClientKeyData are sensitive fields. This data should only be +// transmitted in-memory between client and exec plugin process. Exec plugin +// itself should at least be protected via file permissions. type ExecCredentialStatus struct { // ExpirationTimestamp indicates a time when the provided credentials expire. // +optional ExpirationTimestamp *metav1.Time `json:"expirationTimestamp,omitempty"` // Token is a bearer token used by the client for request authentication. Token string `json:"token,omitempty"` + // PEM-encoded client TLS certificates (including intermediates, if any). + ClientCertificateData string `json:"clientCertificateData,omitempty"` + // PEM-encoded private key for the above certificate. + ClientKeyData string `json:"clientKeyData,omitempty"` } // Response defines metadata about a failed request, including HTTP status code and diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go index bf28baef2..9921c7ee5 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -99,6 +99,8 @@ func Convert_clientauthentication_ExecCredentialSpec_To_v1alpha1_ExecCredentialS func autoConvert_v1alpha1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus(in *ExecCredentialStatus, out *clientauthentication.ExecCredentialStatus, s conversion.Scope) error { out.ExpirationTimestamp = (*v1.Time)(unsafe.Pointer(in.ExpirationTimestamp)) out.Token = in.Token + out.ClientCertificateData = in.ClientCertificateData + out.ClientKeyData = in.ClientKeyData return nil } @@ -110,6 +112,8 @@ func Convert_v1alpha1_ExecCredentialStatus_To_clientauthentication_ExecCredentia func autoConvert_clientauthentication_ExecCredentialStatus_To_v1alpha1_ExecCredentialStatus(in *clientauthentication.ExecCredentialStatus, out *ExecCredentialStatus, s conversion.Scope) error { out.ExpirationTimestamp = (*v1.Time)(unsafe.Pointer(in.ExpirationTimestamp)) out.Token = in.Token + out.ClientCertificateData = in.ClientCertificateData + out.ClientKeyData = in.ClientKeyData return nil } diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go index c6dbbce4d..f062b8f06 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.defaults.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.defaults.go index 2bd0078a3..dd621a3ac 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.defaults.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.defaults.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/conversion.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/conversion.go new file mode 100644 index 000000000..f543806ac --- /dev/null +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/conversion.go @@ -0,0 +1,26 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + conversion "k8s.io/apimachinery/pkg/conversion" + clientauthentication "k8s.io/client-go/pkg/apis/clientauthentication" +) + +func Convert_clientauthentication_ExecCredentialSpec_To_v1beta1_ExecCredentialSpec(in *clientauthentication.ExecCredentialSpec, out *ExecCredentialSpec, s conversion.Scope) error { + return nil +} diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/doc.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/doc.go new file mode 100644 index 000000000..fbcd9b7fe --- /dev/null +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/doc.go @@ -0,0 +1,23 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// +k8s:deepcopy-gen=package +// +k8s:conversion-gen=k8s.io/client-go/pkg/apis/clientauthentication +// +k8s:openapi-gen=true +// +k8s:defaulter-gen=TypeMeta + +// +groupName=client.authentication.k8s.io +package v1beta1 // import "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/register.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/register.go new file mode 100644 index 000000000..0bb92f16a --- /dev/null +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/register.go @@ -0,0 +1,55 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// GroupName is the group name use in this package +const GroupName = "client.authentication.k8s.io" + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + SchemeBuilder runtime.SchemeBuilder + localSchemeBuilder = &SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +func init() { + // We only register manually written functions here. The registration of the + // generated functions takes place in the generated files. The separation + // makes the code compile even when the generated files are missing. + localSchemeBuilder.Register(addKnownTypes) +} + +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &ExecCredential{}, + ) + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/types.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/types.go new file mode 100644 index 000000000..d6e267452 --- /dev/null +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/types.go @@ -0,0 +1,59 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ExecCredentials is used by exec-based plugins to communicate credentials to +// HTTP transports. +type ExecCredential struct { + metav1.TypeMeta `json:",inline"` + + // Spec holds information passed to the plugin by the transport. This contains + // request and runtime specific information, such as if the session is interactive. + Spec ExecCredentialSpec `json:"spec,omitempty"` + + // Status is filled in by the plugin and holds the credentials that the transport + // should use to contact the API. + // +optional + Status *ExecCredentialStatus `json:"status,omitempty"` +} + +// ExecCredenitalSpec holds request and runtime specific information provided by +// the transport. +type ExecCredentialSpec struct{} + +// ExecCredentialStatus holds credentials for the transport to use. +// +// Token and ClientKeyData are sensitive fields. This data should only be +// transmitted in-memory between client and exec plugin process. Exec plugin +// itself should at least be protected via file permissions. +type ExecCredentialStatus struct { + // ExpirationTimestamp indicates a time when the provided credentials expire. + // +optional + ExpirationTimestamp *metav1.Time `json:"expirationTimestamp,omitempty"` + // Token is a bearer token used by the client for request authentication. + Token string `json:"token,omitempty"` + // PEM-encoded client TLS certificates (including intermediates, if any). + ClientCertificateData string `json:"clientCertificateData,omitempty"` + // PEM-encoded private key for the above certificate. + ClientKeyData string `json:"clientKeyData,omitempty"` +} diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.conversion.go new file mode 100644 index 000000000..80e9b3159 --- /dev/null +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.conversion.go @@ -0,0 +1,114 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by conversion-gen. DO NOT EDIT. + +package v1beta1 + +import ( + unsafe "unsafe" + + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + conversion "k8s.io/apimachinery/pkg/conversion" + runtime "k8s.io/apimachinery/pkg/runtime" + clientauthentication "k8s.io/client-go/pkg/apis/clientauthentication" +) + +func init() { + localSchemeBuilder.Register(RegisterConversions) +} + +// RegisterConversions adds conversion functions to the given scheme. +// Public to allow building arbitrary schemes. +func RegisterConversions(scheme *runtime.Scheme) error { + return scheme.AddGeneratedConversionFuncs( + Convert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential, + Convert_clientauthentication_ExecCredential_To_v1beta1_ExecCredential, + Convert_v1beta1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec, + Convert_clientauthentication_ExecCredentialSpec_To_v1beta1_ExecCredentialSpec, + Convert_v1beta1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus, + Convert_clientauthentication_ExecCredentialStatus_To_v1beta1_ExecCredentialStatus, + ) +} + +func autoConvert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential(in *ExecCredential, out *clientauthentication.ExecCredential, s conversion.Scope) error { + if err := Convert_v1beta1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + out.Status = (*clientauthentication.ExecCredentialStatus)(unsafe.Pointer(in.Status)) + return nil +} + +// Convert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential is an autogenerated conversion function. +func Convert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential(in *ExecCredential, out *clientauthentication.ExecCredential, s conversion.Scope) error { + return autoConvert_v1beta1_ExecCredential_To_clientauthentication_ExecCredential(in, out, s) +} + +func autoConvert_clientauthentication_ExecCredential_To_v1beta1_ExecCredential(in *clientauthentication.ExecCredential, out *ExecCredential, s conversion.Scope) error { + if err := Convert_clientauthentication_ExecCredentialSpec_To_v1beta1_ExecCredentialSpec(&in.Spec, &out.Spec, s); err != nil { + return err + } + out.Status = (*ExecCredentialStatus)(unsafe.Pointer(in.Status)) + return nil +} + +// Convert_clientauthentication_ExecCredential_To_v1beta1_ExecCredential is an autogenerated conversion function. +func Convert_clientauthentication_ExecCredential_To_v1beta1_ExecCredential(in *clientauthentication.ExecCredential, out *ExecCredential, s conversion.Scope) error { + return autoConvert_clientauthentication_ExecCredential_To_v1beta1_ExecCredential(in, out, s) +} + +func autoConvert_v1beta1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec(in *ExecCredentialSpec, out *clientauthentication.ExecCredentialSpec, s conversion.Scope) error { + return nil +} + +// Convert_v1beta1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec is an autogenerated conversion function. +func Convert_v1beta1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec(in *ExecCredentialSpec, out *clientauthentication.ExecCredentialSpec, s conversion.Scope) error { + return autoConvert_v1beta1_ExecCredentialSpec_To_clientauthentication_ExecCredentialSpec(in, out, s) +} + +func autoConvert_clientauthentication_ExecCredentialSpec_To_v1beta1_ExecCredentialSpec(in *clientauthentication.ExecCredentialSpec, out *ExecCredentialSpec, s conversion.Scope) error { + // WARNING: in.Response requires manual conversion: does not exist in peer-type + // WARNING: in.Interactive requires manual conversion: does not exist in peer-type + return nil +} + +func autoConvert_v1beta1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus(in *ExecCredentialStatus, out *clientauthentication.ExecCredentialStatus, s conversion.Scope) error { + out.ExpirationTimestamp = (*v1.Time)(unsafe.Pointer(in.ExpirationTimestamp)) + out.Token = in.Token + out.ClientCertificateData = in.ClientCertificateData + out.ClientKeyData = in.ClientKeyData + return nil +} + +// Convert_v1beta1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus is an autogenerated conversion function. +func Convert_v1beta1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus(in *ExecCredentialStatus, out *clientauthentication.ExecCredentialStatus, s conversion.Scope) error { + return autoConvert_v1beta1_ExecCredentialStatus_To_clientauthentication_ExecCredentialStatus(in, out, s) +} + +func autoConvert_clientauthentication_ExecCredentialStatus_To_v1beta1_ExecCredentialStatus(in *clientauthentication.ExecCredentialStatus, out *ExecCredentialStatus, s conversion.Scope) error { + out.ExpirationTimestamp = (*v1.Time)(unsafe.Pointer(in.ExpirationTimestamp)) + out.Token = in.Token + out.ClientCertificateData = in.ClientCertificateData + out.ClientKeyData = in.ClientKeyData + return nil +} + +// Convert_clientauthentication_ExecCredentialStatus_To_v1beta1_ExecCredentialStatus is an autogenerated conversion function. +func Convert_clientauthentication_ExecCredentialStatus_To_v1beta1_ExecCredentialStatus(in *clientauthentication.ExecCredentialStatus, out *ExecCredentialStatus, s conversion.Scope) error { + return autoConvert_clientauthentication_ExecCredentialStatus_To_v1beta1_ExecCredentialStatus(in, out, s) +} diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.deepcopy.go new file mode 100644 index 000000000..656fea4d8 --- /dev/null +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.deepcopy.go @@ -0,0 +1,100 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1beta1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExecCredential) DeepCopyInto(out *ExecCredential) { + *out = *in + out.TypeMeta = in.TypeMeta + out.Spec = in.Spec + if in.Status != nil { + in, out := &in.Status, &out.Status + if *in == nil { + *out = nil + } else { + *out = new(ExecCredentialStatus) + (*in).DeepCopyInto(*out) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExecCredential. +func (in *ExecCredential) DeepCopy() *ExecCredential { + if in == nil { + return nil + } + out := new(ExecCredential) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ExecCredential) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExecCredentialSpec) DeepCopyInto(out *ExecCredentialSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExecCredentialSpec. +func (in *ExecCredentialSpec) DeepCopy() *ExecCredentialSpec { + if in == nil { + return nil + } + out := new(ExecCredentialSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExecCredentialStatus) DeepCopyInto(out *ExecCredentialStatus) { + *out = *in + if in.ExpirationTimestamp != nil { + in, out := &in.ExpirationTimestamp, &out.ExpirationTimestamp + if *in == nil { + *out = nil + } else { + *out = (*in).DeepCopy() + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExecCredentialStatus. +func (in *ExecCredentialStatus) DeepCopy() *ExecCredentialStatus { + if in == nil { + return nil + } + out := new(ExecCredentialStatus) + in.DeepCopyInto(out) + return out +} diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.defaults.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.defaults.go new file mode 100644 index 000000000..73e63fc11 --- /dev/null +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.defaults.go @@ -0,0 +1,32 @@ +// +build !ignore_autogenerated + +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by defaulter-gen. DO NOT EDIT. + +package v1beta1 + +import ( + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// RegisterDefaults adds defaulters functions to the given scheme. +// Public to allow building arbitrary schemes. +// All generated defaulters are covering - they call all nested defaulters. +func RegisterDefaults(scheme *runtime.Scheme) error { + return nil +} diff --git a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go index f8b15d848..008c3c7df 100644 --- a/vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go +++ b/vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/pkg/version/BUILD b/vendor/k8s.io/client-go/pkg/version/BUILD deleted file mode 100644 index ee19d8cde..000000000 --- a/vendor/k8s.io/client-go/pkg/version/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "base.go", - "doc.go", - "version.go", - ], - importpath = "k8s.io/client-go/pkg/version", - deps = ["//vendor/k8s.io/apimachinery/pkg/version:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/pkg/version/base.go b/vendor/k8s.io/client-go/pkg/version/base.go index 7ab0ed3a7..9b4c79f89 100644 --- a/vendor/k8s.io/client-go/pkg/version/base.go +++ b/vendor/k8s.io/client-go/pkg/version/base.go @@ -43,7 +43,7 @@ var ( gitMinor string = "" // minor version, numeric possibly followed by "+" // semantic version, derived by build scripts (see - // https://github.com/kubernetes/kubernetes/blob/master/docs/design/versioning.md + // https://git.k8s.io/community/contributors/design-proposals/release/versioning.md // for a detailed discussion of this field) // // TODO: This field is still called "gitVersion" for legacy diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/BUILD deleted file mode 100644 index 367e897fd..000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["plugins.go"], - importpath = "k8s.io/client-go/plugin/pkg/client/auth", - deps = [ - "//vendor/k8s.io/client-go/plugin/pkg/client/auth/azure:go_default_library", - "//vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp:go_default_library", - "//vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc:go_default_library", - "//vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/azure:all-srcs", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/exec:all-srcs", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/gcp:all-srcs", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/oidc:all-srcs", - "//staging/src/k8s.io/client-go/plugin/pkg/client/auth/openstack:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/BUILD deleted file mode 100644 index 682776db5..000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["azure_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["azure.go"], - importpath = "k8s.io/client-go/plugin/pkg/client/auth/azure", - deps = [ - "//vendor/github.com/Azure/go-autorest/autorest:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/adal:go_default_library", - "//vendor/github.com/Azure/go-autorest/autorest/azure:go_default_library", - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/README.md b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/README.md index 0b5e62bd4..e4ba791ea 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/README.md +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/README.md @@ -1,15 +1,14 @@ # Azure Active Directory plugin for client authentication -This plugin provides an integration with Azure Active Directory device flow. If no tokens are present in the kubectl configuration, it will prompt a device code which can be used to login in a browser. After login it will automatically fetch the tokens and stored them in the kubectl configuration. In addition it will refresh and update the tokens in configuration when expired. - +This plugin provides an integration with Azure Active Directory device flow. If no tokens are present in the kubectl configuration, it will prompt a device code which can be used to login in a browser. After login it will automatically fetch the tokens and store them in the kubectl configuration. In addition it will refresh and update the tokens in the configuration when expired. ## Usage -1. Create an Azure Active Directory *Web App / API* application for `apiserver` following these [instructions](https://docs.microsoft.com/en-us/azure/active-directory/active-directory-app-registration) +1. Create an Azure Active Directory *Web App / API* application for `apiserver` following these [instructions](https://docs.microsoft.com/en-us/azure/active-directory/active-directory-app-registration). The callback URL does not matter (just cannot be empty). -2. Create a second Azure Active Directory native application for `kubectl` +2. Create a second Azure Active Directory native application for `kubectl`. The callback URL does not matter (just cannot be empty). -3. On `kubectl` application's configuration page in Azure portal grant permissions to `apiserver` application by clicking on *Required Permissions*, click the *Add* button and search for the apiserver application created in step 1. Select "Access apiserver" under the *DELEGATED PERMISSIONS*. Once added click the *Grant Permissions* button to apply the changes +3. On `kubectl` application's configuration page in Azure portal grant permissions to `apiserver` application by clicking on *Required Permissions*, click the *Add* button and search for the apiserver application created in step 1. Select "Access apiserver" under the *DELEGATED PERMISSIONS*. Once added click the *Grant Permissions* button to apply the changes. 4. Configure the `apiserver` to use the Azure Active Directory as an OIDC provider with following options @@ -21,8 +20,9 @@ This plugin provides an integration with Azure Active Directory device flow. If * Replace the `APISERVER_APPLICATION_ID` with the application ID of `apiserver` application * Replace `TENANT_ID` with your tenant ID. +   * For a list of alternative username claims that are supported by the OIDC issuer check the JSON response at `https://sts.windows.net/TENANT_ID/.well-known/openid-configuration`. -5. Configure the `kubectl` to use the `azure` authentication provider +5. Configure `kubectl` to use the `azure` authentication provider ``` kubectl config set-credentials "USER_NAME" --auth-provider=azure \ @@ -35,7 +35,8 @@ This plugin provides an integration with Azure Active Directory device flow. If * Supported environments: `AzurePublicCloud`, `AzureUSGovernmentCloud`, `AzureChinaCloud`, `AzureGermanCloud` * Replace `USER_NAME` and `TENANT_ID` with your user name and tenant ID * Replace `APPLICATION_ID` with the application ID of your`kubectl` application ID - * Replace `APISERVER_APPLICATION_ID` with the application ID of your `apiserver` application ID + * Replace `APISERVER_APPLICATION_ID` with the application ID of your `apiserver` application ID + * Be sure to also (create and) select a context that uses above user 6. The access token is acquired when first `kubectl` command is executed @@ -45,4 +46,5 @@ This plugin provides an integration with Azure Active Directory device flow. If To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code DEC7D48GA to authenticate. ``` - * After signing in a web browser, the token is stored in the configuration, and it will be reused when executing next commands. + * After signing in a web browser, the token is stored in the configuration, and it will be reused when executing further commands. + * The resulting username in Kubernetes depends on your [configuration of the `--oidc-username-claim` and `--oidc-username-prefix` flags on the API server](https://kubernetes.io/docs/admin/authentication/#configuring-the-api-server). If you are using any authorization method you need to give permissions to that user, e.g. by binding the user to a role in the case of RBAC. diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go index e14dc8d9d..60304b0f3 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/azure/azure.go @@ -297,7 +297,7 @@ func (ts *azureTokenSource) refreshToken(token *azureToken) (*azureToken, error) } return &azureToken{ - token: spt.Token, + token: spt.Token(), clientID: token.clientID, tenantID: token.tenantID, apiserverID: token.apiserverID, diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD deleted file mode 100644 index 38cf9bdc2..000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["exec.go"], - importpath = "k8s.io/client-go/plugin/pkg/client/auth/exec", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/crypto/ssh/terminal:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["exec_test.go"], - data = glob(["testdata/**"]), - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/client-go/pkg/apis/clientauthentication:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go index dfd434d0c..2d05ac622 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go @@ -18,11 +18,15 @@ package exec import ( "bytes" + "context" + "crypto/tls" "fmt" "io" + "net" "net/http" "os" "os/exec" + "reflect" "sync" "time" @@ -34,7 +38,10 @@ import ( "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/client-go/pkg/apis/clientauthentication" "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1" + "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1" "k8s.io/client-go/tools/clientcmd/api" + "k8s.io/client-go/transport" + "k8s.io/client-go/util/connrotation" ) const execInfoEnv = "KUBERNETES_EXEC_INFO" @@ -45,6 +52,7 @@ var codecs = serializer.NewCodecFactory(scheme) func init() { v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) v1alpha1.AddToScheme(scheme) + v1beta1.AddToScheme(scheme) clientauthentication.AddToScheme(scheme) } @@ -55,6 +63,7 @@ var ( // The list of API versions we accept. apiVersions = map[string]schema.GroupVersion{ v1alpha1.SchemeGroupVersion.String(): v1alpha1.SchemeGroupVersion, + v1beta1.SchemeGroupVersion.String(): v1beta1.SchemeGroupVersion, } ) @@ -147,14 +156,55 @@ type Authenticator struct { // The mutex also guards calling the plugin. Since the plugin could be // interactive we want to make sure it's only called once. mu sync.Mutex - cachedToken string + cachedCreds *credentials exp time.Time + + onRotate func() } -// WrapTransport instruments an existing http.RoundTripper with credentials returned -// by the plugin. -func (a *Authenticator) WrapTransport(rt http.RoundTripper) http.RoundTripper { - return &roundTripper{a, rt} +type credentials struct { + token string + cert *tls.Certificate +} + +// UpdateTransportConfig updates the transport.Config to use credentials +// returned by the plugin. +func (a *Authenticator) UpdateTransportConfig(c *transport.Config) error { + wt := c.WrapTransport + c.WrapTransport = func(rt http.RoundTripper) http.RoundTripper { + if wt != nil { + rt = wt(rt) + } + return &roundTripper{a, rt} + } + + getCert := c.TLS.GetCert + c.TLS.GetCert = func() (*tls.Certificate, error) { + // If previous GetCert is present and returns a valid non-nil + // certificate, use that. Otherwise use cert from exec plugin. + if getCert != nil { + cert, err := getCert() + if err != nil { + return nil, err + } + if cert != nil { + return cert, nil + } + } + return a.cert() + } + + var dial func(ctx context.Context, network, addr string) (net.Conn, error) + if c.Dial != nil { + dial = c.Dial + } else { + dial = (&net.Dialer{Timeout: 30 * time.Second, KeepAlive: 30 * time.Second}).DialContext + } + d := connrotation.NewDialer(dial) + a.onRotate = d.CloseAll + c.Dial = d.DialContext + + return nil } type roundTripper struct { @@ -169,11 +219,13 @@ func (r *roundTripper) RoundTrip(req *http.Request) (*http.Response, error) { return r.base.RoundTrip(req) } - token, err := r.a.token() + creds, err := r.a.getCreds() if err != nil { - return nil, fmt.Errorf("getting token: %v", err) + return nil, fmt.Errorf("getting credentials: %v", err) + } + if creds.token != "" { + req.Header.Set("Authorization", "Bearer "+creds.token) } - req.Header.Set("Authorization", "Bearer "+token) res, err := r.base.RoundTrip(req) if err != nil { @@ -184,47 +236,60 @@ func (r *roundTripper) RoundTrip(req *http.Request) (*http.Response, error) { Header: res.Header, Code: int32(res.StatusCode), } - if err := r.a.refresh(token, resp); err != nil { - glog.Errorf("refreshing token: %v", err) + if err := r.a.maybeRefreshCreds(creds, resp); err != nil { + glog.Errorf("refreshing credentials: %v", err) } } return res, nil } -func (a *Authenticator) tokenExpired() bool { +func (a *Authenticator) credsExpired() bool { if a.exp.IsZero() { return false } return a.now().After(a.exp) } -func (a *Authenticator) token() (string, error) { - a.mu.Lock() - defer a.mu.Unlock() - if a.cachedToken != "" && !a.tokenExpired() { - return a.cachedToken, nil +func (a *Authenticator) cert() (*tls.Certificate, error) { + creds, err := a.getCreds() + if err != nil { + return nil, err } - - return a.getToken(nil) + return creds.cert, nil } -// refresh executes the plugin to force a rotation of the token. -func (a *Authenticator) refresh(token string, r *clientauthentication.Response) error { +func (a *Authenticator) getCreds() (*credentials, error) { + a.mu.Lock() + defer a.mu.Unlock() + if a.cachedCreds != nil && !a.credsExpired() { + return a.cachedCreds, nil + } + + if err := a.refreshCredsLocked(nil); err != nil { + return nil, err + } + return a.cachedCreds, nil +} + +// maybeRefreshCreds executes the plugin to force a rotation of the +// credentials, unless they were rotated already. +func (a *Authenticator) maybeRefreshCreds(creds *credentials, r *clientauthentication.Response) error { a.mu.Lock() defer a.mu.Unlock() - if token != a.cachedToken { - // Token already rotated. + // Since we're not making a new pointer to a.cachedCreds in getCreds, no + // need to do deep comparison. + if creds != a.cachedCreds { + // Credentials already rotated. return nil } - _, err := a.getToken(r) - return err + return a.refreshCredsLocked(r) } -// getToken executes the plugin and reads the credentials from stdout. It must be -// called while holding the Authenticator's mutex. -func (a *Authenticator) getToken(r *clientauthentication.Response) (string, error) { +// refreshCredsLocked executes the plugin and reads the credentials from +// stdout. It must be called while holding the Authenticator's mutex. +func (a *Authenticator) refreshCredsLocked(r *clientauthentication.Response) error { cred := &clientauthentication.ExecCredential{ Spec: clientauthentication.ExecCredentialSpec{ Response: r, @@ -232,13 +297,18 @@ func (a *Authenticator) getToken(r *clientauthentication.Response) (string, erro }, } - data, err := runtime.Encode(codecs.LegacyCodec(a.group), cred) - if err != nil { - return "", fmt.Errorf("encode ExecCredentials: %v", err) - } - env := append(a.environ(), a.env...) - env = append(env, fmt.Sprintf("%s=%s", execInfoEnv, data)) + if a.group == v1alpha1.SchemeGroupVersion { + // Input spec disabled for beta due to lack of use. Possibly re-enable this later if + // someone wants it back. + // + // See: https://github.com/kubernetes/kubernetes/issues/61796 + data, err := runtime.Encode(codecs.LegacyCodec(a.group), cred) + if err != nil { + return fmt.Errorf("encode ExecCredentials: %v", err) + } + env = append(env, fmt.Sprintf("%s=%s", execInfoEnv, data)) + } stdout := &bytes.Buffer{} cmd := exec.Command(a.cmd, a.args...) @@ -250,23 +320,26 @@ func (a *Authenticator) getToken(r *clientauthentication.Response) (string, erro } if err := cmd.Run(); err != nil { - return "", fmt.Errorf("exec: %v", err) + return fmt.Errorf("exec: %v", err) } _, gvk, err := codecs.UniversalDecoder(a.group).Decode(stdout.Bytes(), nil, cred) if err != nil { - return "", fmt.Errorf("decode stdout: %v", err) + return fmt.Errorf("decoding stdout: %v", err) } if gvk.Group != a.group.Group || gvk.Version != a.group.Version { - return "", fmt.Errorf("exec plugin is configured to use API version %s, plugin returned version %s", + return fmt.Errorf("exec plugin is configured to use API version %s, plugin returned version %s", a.group, schema.GroupVersion{Group: gvk.Group, Version: gvk.Version}) } if cred.Status == nil { - return "", fmt.Errorf("exec plugin didn't return a status field") + return fmt.Errorf("exec plugin didn't return a status field") } - if cred.Status.Token == "" { - return "", fmt.Errorf("exec plugin didn't return a token") + if cred.Status.Token == "" && cred.Status.ClientCertificateData == "" && cred.Status.ClientKeyData == "" { + return fmt.Errorf("exec plugin didn't return a token or cert/key pair") + } + if (cred.Status.ClientCertificateData == "") != (cred.Status.ClientKeyData == "") { + return fmt.Errorf("exec plugin returned only certificate or key, not both") } if cred.Status.ExpirationTimestamp != nil { @@ -274,7 +347,24 @@ func (a *Authenticator) getToken(r *clientauthentication.Response) (string, erro } else { a.exp = time.Time{} } - a.cachedToken = cred.Status.Token - return a.cachedToken, nil + newCreds := &credentials{ + token: cred.Status.Token, + } + if cred.Status.ClientKeyData != "" && cred.Status.ClientCertificateData != "" { + cert, err := tls.X509KeyPair([]byte(cred.Status.ClientCertificateData), []byte(cred.Status.ClientKeyData)) + if err != nil { + return fmt.Errorf("failed parsing client key/certificate: %v", err) + } + newCreds.cert = &cert + } + + oldCreds := a.cachedCreds + a.cachedCreds = newCreds + // Only close all connections when TLS cert rotates. Token rotation doesn't + // need the extra noise. + if a.onRotate != nil && oldCreds != nil && !reflect.DeepEqual(oldCreds.cert, a.cachedCreds.cert) { + a.onRotate() + } + return nil } diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec_test.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec_test.go index 28137eb84..e3398e821 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec_test.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec_test.go @@ -18,19 +18,88 @@ package exec import ( "bytes" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/tls" + "crypto/x509" + "crypto/x509/pkix" "encoding/json" + "encoding/pem" "fmt" "io/ioutil" + "math/big" "net/http" "net/http/httptest" + "reflect" "strings" "testing" "time" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/pkg/apis/clientauthentication" "k8s.io/client-go/tools/clientcmd/api" + "k8s.io/client-go/transport" ) +var ( + certData = []byte(`-----BEGIN CERTIFICATE----- +MIIC6jCCAdSgAwIBAgIBCzALBgkqhkiG9w0BAQswIzEhMB8GA1UEAwwYMTAuMTMu +MTI5LjEwNkAxNDIxMzU5MDU4MB4XDTE1MDExNTIyMDEzMVoXDTE2MDExNTIyMDEz +MlowGzEZMBcGA1UEAxMQb3BlbnNoaWZ0LWNsaWVudDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKtdhz0+uCLXw5cSYns9rU/XifFSpb/x24WDdrm72S/v +b9BPYsAStiP148buylr1SOuNi8sTAZmlVDDIpIVwMLff+o2rKYDicn9fjbrTxTOj +lI4pHJBH+JU3AJ0tbajupioh70jwFS0oYpwtneg2zcnE2Z4l6mhrj2okrc5Q1/X2 +I2HChtIU4JYTisObtin10QKJX01CLfYXJLa8upWzKZ4/GOcHG+eAV3jXWoXidtjb +1Usw70amoTZ6mIVCkiu1QwCoa8+ycojGfZhvqMsAp1536ZcCul+Na+AbCv4zKS7F +kQQaImVrXdUiFansIoofGlw/JNuoKK6ssVpS5Ic3pgcCAwEAAaM1MDMwDgYDVR0P +AQH/BAQDAgCgMBMGA1UdJQQMMAoGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwCwYJ +KoZIhvcNAQELA4IBAQCKLREH7bXtXtZ+8vI6cjD7W3QikiArGqbl36bAhhWsJLp/ +p/ndKz39iFNaiZ3GlwIURWOOKx3y3GA0x9m8FR+Llthf0EQ8sUjnwaknWs0Y6DQ3 +jjPFZOpV3KPCFrdMJ3++E3MgwFC/Ih/N2ebFX9EcV9Vcc6oVWMdwT0fsrhu683rq +6GSR/3iVX1G/pmOiuaR0fNUaCyCfYrnI4zHBDgSfnlm3vIvN2lrsR/DQBakNL8DJ +HBgKxMGeUPoneBv+c8DMXIL0EhaFXRlBv9QW45/GiAIOuyFJ0i6hCtGZpJjq4OpQ +BRjCI+izPzFTjsxD4aORE+WOkyWFCGPWKfNejfw0 +-----END CERTIFICATE-----`) + keyData = []byte(`-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAq12HPT64ItfDlxJiez2tT9eJ8VKlv/HbhYN2ubvZL+9v0E9i +wBK2I/Xjxu7KWvVI642LyxMBmaVUMMikhXAwt9/6jaspgOJyf1+NutPFM6OUjikc +kEf4lTcAnS1tqO6mKiHvSPAVLShinC2d6DbNycTZniXqaGuPaiStzlDX9fYjYcKG +0hTglhOKw5u2KfXRAolfTUIt9hcktry6lbMpnj8Y5wcb54BXeNdaheJ22NvVSzDv +RqahNnqYhUKSK7VDAKhrz7JyiMZ9mG+oywCnXnfplwK6X41r4BsK/jMpLsWRBBoi +ZWtd1SIVqewiih8aXD8k26gorqyxWlLkhzemBwIDAQABAoIBAD2XYRs3JrGHQUpU +FkdbVKZkvrSY0vAZOqBTLuH0zUv4UATb8487anGkWBjRDLQCgxH+jucPTrztekQK +aW94clo0S3aNtV4YhbSYIHWs1a0It0UdK6ID7CmdWkAj6s0T8W8lQT7C46mWYVLm +5mFnCTHi6aB42jZrqmEpC7sivWwuU0xqj3Ml8kkxQCGmyc9JjmCB4OrFFC8NNt6M +ObvQkUI6Z3nO4phTbpxkE1/9dT0MmPIF7GhHVzJMS+EyyRYUDllZ0wvVSOM3qZT0 +JMUaBerkNwm9foKJ1+dv2nMKZZbJajv7suUDCfU44mVeaEO+4kmTKSGCGjjTBGkr +7L1ySDECgYEA5ElIMhpdBzIivCuBIH8LlUeuzd93pqssO1G2Xg0jHtfM4tz7fyeI +cr90dc8gpli24dkSxzLeg3Tn3wIj/Bu64m2TpZPZEIlukYvgdgArmRIPQVxerYey +OkrfTNkxU1HXsYjLCdGcGXs5lmb+K/kuTcFxaMOs7jZi7La+jEONwf8CgYEAwCs/ +rUOOA0klDsWWisbivOiNPII79c9McZCNBqncCBfMUoiGe8uWDEO4TFHN60vFuVk9 +8PkwpCfvaBUX+ajvbafIfHxsnfk1M04WLGCeqQ/ym5Q4sQoQOcC1b1y9qc/xEWfg +nIUuia0ukYRpl7qQa3tNg+BNFyjypW8zukUAC/kCgYB1/Kojuxx5q5/oQVPrx73k +2bevD+B3c+DYh9MJqSCNwFtUpYIWpggPxoQan4LwdsmO0PKzocb/ilyNFj4i/vII +NToqSc/WjDFpaDIKyuu9oWfhECye45NqLWhb/6VOuu4QA/Nsj7luMhIBehnEAHW+ +GkzTKM8oD1PxpEG3nPKXYQKBgQC6AuMPRt3XBl1NkCrpSBy/uObFlFaP2Enpf39S +3OZ0Gv0XQrnSaL1kP8TMcz68rMrGX8DaWYsgytstR4W+jyy7WvZwsUu+GjTJ5aMG +77uEcEBpIi9CBzivfn7hPccE8ZgqPf+n4i6q66yxBJflW5xhvafJqDtW2LcPNbW/ +bvzdmQKBgExALRUXpq+5dbmkdXBHtvXdRDZ6rVmrnjy4nI5bPw+1GqQqk6uAR6B/ +F6NmLCQOO4PDG/cuatNHIr2FrwTmGdEL6ObLUGWn9Oer9gJhHVqqsY5I4sEPo4XX +stR0Yiw0buV6DL/moUO0HIM9Bjh96HJp+LxiIS6UCdIhMPp5HoQa +-----END RSA PRIVATE KEY-----`) + validCert *tls.Certificate +) + +func init() { + cert, err := tls.X509KeyPair(certData, keyData) + if err != nil { + panic(err) + } + validCert = &cert +} + func TestCacheKey(t *testing.T) { c1 := &api.ExecConfig{ Command: "foo-bar", @@ -93,7 +162,7 @@ func compJSON(t *testing.T, got, want []byte) { } } -func TestGetToken(t *testing.T) { +func TestRefreshCreds(t *testing.T) { tests := []struct { name string config api.ExecConfig @@ -101,7 +170,7 @@ func TestGetToken(t *testing.T) { interactive bool response *clientauthentication.Response wantInput string - wantToken string + wantCreds credentials wantExpiry time.Time wantErr bool }{ @@ -122,7 +191,7 @@ func TestGetToken(t *testing.T) { "token": "foo-bar" } }`, - wantToken: "foo-bar", + wantCreds: credentials{token: "foo-bar"}, }, { name: "interactive", @@ -144,7 +213,7 @@ func TestGetToken(t *testing.T) { "token": "foo-bar" } }`, - wantToken: "foo-bar", + wantCreds: credentials{token: "foo-bar"}, }, { name: "response", @@ -178,7 +247,7 @@ func TestGetToken(t *testing.T) { "token": "foo-bar" } }`, - wantToken: "foo-bar", + wantCreds: credentials{token: "foo-bar"}, }, { name: "expiry", @@ -199,7 +268,7 @@ func TestGetToken(t *testing.T) { } }`, wantExpiry: time.Date(2006, 01, 02, 15, 04, 05, 0, time.UTC), - wantToken: "foo-bar", + wantCreds: credentials{token: "foo-bar"}, }, { name: "no-group-version", @@ -236,7 +305,7 @@ func TestGetToken(t *testing.T) { wantErr: true, }, { - name: "no-token", + name: "no-creds", config: api.ExecConfig{ APIVersion: "client.authentication.k8s.io/v1alpha1", }, @@ -252,6 +321,131 @@ func TestGetToken(t *testing.T) { }`, wantErr: true, }, + { + name: "TLS credentials", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": {} + }`, + output: fmt.Sprintf(`{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "clientKeyData": %q, + "clientCertificateData": %q + } + }`, keyData, certData), + wantCreds: credentials{cert: validCert}, + }, + { + name: "bad TLS credentials", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": {} + }`, + output: `{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "clientKeyData": "foo", + "clientCertificateData": "bar" + } + }`, + wantErr: true, + }, + { + name: "cert but no key", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1alpha1", + }, + wantInput: `{ + "kind":"ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1alpha1", + "spec": {} + }`, + output: fmt.Sprintf(`{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1alpha1", + "status": { + "clientCertificateData": %q + } + }`, certData), + wantErr: true, + }, + { + name: "beta-basic-request", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1beta1", + }, + output: `{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1beta1", + "status": { + "token": "foo-bar" + } + }`, + wantCreds: credentials{token: "foo-bar"}, + }, + { + name: "beta-expiry", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1beta1", + }, + output: `{ + "kind": "ExecCredential", + "apiVersion": "client.authentication.k8s.io/v1beta1", + "status": { + "token": "foo-bar", + "expirationTimestamp": "2006-01-02T15:04:05Z" + } + }`, + wantExpiry: time.Date(2006, 01, 02, 15, 04, 05, 0, time.UTC), + wantCreds: credentials{token: "foo-bar"}, + }, + { + name: "beta-no-group-version", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1beta1", + }, + output: `{ + "kind": "ExecCredential", + "status": { + "token": "foo-bar" + } + }`, + wantErr: true, + }, + { + name: "beta-no-status", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1beta1", + }, + output: `{ + "kind": "ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1beta1" + }`, + wantErr: true, + }, + { + name: "beta-no-token", + config: api.ExecConfig{ + APIVersion: "client.authentication.k8s.io/v1beta1", + }, + output: `{ + "kind": "ExecCredential", + "apiVersion":"client.authentication.k8s.io/v1beta1", + "status": {} + }`, + wantErr: true, + }, } for _, test := range tests { @@ -274,8 +468,7 @@ func TestGetToken(t *testing.T) { a.interactive = test.interactive a.environ = func() []string { return nil } - token, err := a.getToken(test.response) - if err != nil { + if err := a.refreshCredsLocked(test.response); err != nil { if !test.wantErr { t.Errorf("get token %v", err) } @@ -285,14 +478,21 @@ func TestGetToken(t *testing.T) { t.Fatal("expected error getting token") } - if token != test.wantToken { - t.Errorf("expected token %q got %q", test.wantToken, token) + if !reflect.DeepEqual(a.cachedCreds, &test.wantCreds) { + t.Errorf("expected credentials %+v got %+v", &test.wantCreds, a.cachedCreds) } if !a.exp.Equal(test.wantExpiry) { t.Errorf("expected expiry %v got %v", test.wantExpiry, a.exp) } + if test.wantInput == "" { + if got := strings.TrimSpace(stderr.String()); got != "" { + t.Errorf("expected no input parameters, got %q", got) + } + return + } + compJSON(t, stderr.Bytes(), []byte(test.wantInput)) }) } @@ -342,8 +542,12 @@ func TestRoundTripper(t *testing.T) { a.now = now a.stderr = ioutil.Discard + tc := &transport.Config{} + if err := a.UpdateTransportConfig(tc); err != nil { + t.Fatal(err) + } client := http.Client{ - Transport: a.WrapTransport(http.DefaultTransport), + Transport: tc.WrapTransport(http.DefaultTransport), } get := func(t *testing.T, statusCode int) { @@ -411,3 +615,134 @@ func TestRoundTripper(t *testing.T) { // Old token is expired, should refresh automatically without hitting a 401. get(t, http.StatusOK) } + +func TestTLSCredentials(t *testing.T) { + now := time.Now() + + certPool := x509.NewCertPool() + cert, key := genClientCert(t) + if !certPool.AppendCertsFromPEM(cert) { + t.Fatal("failed to add client cert to CertPool") + } + + server := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "ok") + })) + server.TLS = &tls.Config{ + ClientAuth: tls.RequireAndVerifyClientCert, + ClientCAs: certPool, + } + server.StartTLS() + defer server.Close() + + a, err := newAuthenticator(newCache(), &api.ExecConfig{ + Command: "./testdata/test-plugin.sh", + APIVersion: "client.authentication.k8s.io/v1alpha1", + }) + if err != nil { + t.Fatal(err) + } + var output *clientauthentication.ExecCredential + a.environ = func() []string { + data, err := runtime.Encode(codecs.LegacyCodec(a.group), output) + if err != nil { + t.Fatal(err) + } + return []string{"TEST_OUTPUT=" + string(data)} + } + a.now = func() time.Time { return now } + a.stderr = ioutil.Discard + + // We're not interested in server's cert, this test is about client cert. + tc := &transport.Config{TLS: transport.TLSConfig{Insecure: true}} + if err := a.UpdateTransportConfig(tc); err != nil { + t.Fatal(err) + } + + get := func(t *testing.T, desc string, wantErr bool) { + t.Run(desc, func(t *testing.T) { + tlsCfg, err := transport.TLSConfigFor(tc) + if err != nil { + t.Fatal("TLSConfigFor:", err) + } + client := http.Client{ + Transport: &http.Transport{TLSClientConfig: tlsCfg}, + } + resp, err := client.Get(server.URL) + switch { + case err != nil && !wantErr: + t.Errorf("got client.Get error: %q, want nil", err) + case err == nil && wantErr: + t.Error("got nil client.Get error, want non-nil") + } + if err == nil { + resp.Body.Close() + } + }) + } + + output = &clientauthentication.ExecCredential{ + Status: &clientauthentication.ExecCredentialStatus{ + ClientCertificateData: string(cert), + ClientKeyData: string(key), + ExpirationTimestamp: &v1.Time{now.Add(time.Hour)}, + }, + } + get(t, "valid TLS cert", false) + + // Advance time to force re-exec. + nCert, nKey := genClientCert(t) + now = now.Add(time.Hour * 2) + output = &clientauthentication.ExecCredential{ + Status: &clientauthentication.ExecCredentialStatus{ + ClientCertificateData: string(nCert), + ClientKeyData: string(nKey), + ExpirationTimestamp: &v1.Time{now.Add(time.Hour)}, + }, + } + get(t, "untrusted TLS cert", true) + + now = now.Add(time.Hour * 2) + output = &clientauthentication.ExecCredential{ + Status: &clientauthentication.ExecCredentialStatus{ + ClientCertificateData: string(cert), + ClientKeyData: string(key), + ExpirationTimestamp: &v1.Time{now.Add(time.Hour)}, + }, + } + get(t, "valid TLS cert again", false) +} + +// genClientCert generates an x509 certificate for testing. Certificate and key +// are returned in PEM encoding. +func genClientCert(t *testing.T) ([]byte, []byte) { + key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) + if err != nil { + t.Fatal(err) + } + keyRaw, err := x509.MarshalECPrivateKey(key) + if err != nil { + t.Fatal(err) + } + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) + serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) + if err != nil { + t.Fatal(err) + } + cert := &x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{Organization: []string{"Acme Co"}}, + NotBefore: time.Now(), + NotAfter: time.Now().Add(24 * time.Hour), + + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth}, + BasicConstraintsValid: true, + } + certRaw, err := x509.CreateCertificate(rand.Reader, cert, cert, key.Public(), key) + if err != nil { + t.Fatal(err) + } + return pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: certRaw}), + pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: keyRaw}) +} diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/testdata/test-plugin.sh b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/testdata/test-plugin.sh index 6b9bb100c..aa7daad5f 100755 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/testdata/test-plugin.sh +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/testdata/test-plugin.sh @@ -1,4 +1,4 @@ -#!/bin/sh -e +#!/bin/bash -e # Copyright 2018 The Kubernetes Authors. # diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/BUILD deleted file mode 100644 index e57e896ae..000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/BUILD +++ /dev/null @@ -1,43 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["gcp_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/golang.org/x/oauth2:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["gcp.go"], - importpath = "k8s.io/client-go/plugin/pkg/client/auth/gcp", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/net/context:go_default_library", - "//vendor/golang.org/x/oauth2:go_default_library", - "//vendor/golang.org/x/oauth2/google:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/util/jsonpath:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go index 3a4f86777..193d0c727 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/gcp/gcp.go @@ -18,6 +18,7 @@ package gcp import ( "bytes" + "context" "encoding/json" "fmt" "net/http" @@ -27,7 +28,6 @@ import ( "time" "github.com/golang/glog" - "golang.org/x/net/context" "golang.org/x/oauth2" "golang.org/x/oauth2/google" "k8s.io/apimachinery/pkg/util/net" diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/BUILD deleted file mode 100644 index ee76fac0d..000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["oidc_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["oidc.go"], - importpath = "k8s.io/client-go/plugin/pkg/client/auth/oidc", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/oauth2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/OWNERS b/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/OWNERS index d2210cb89..e0f3c6ca9 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/OWNERS +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/OWNERS @@ -2,3 +2,4 @@ approvers: - ericchiang reviewers: - ericchiang +- rithujohn191 diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/oidc.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/oidc.go index 1fe52c524..9c3ea0ab8 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/oidc.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/oidc/oidc.go @@ -279,7 +279,7 @@ func (p *oidcAuthProvider) idToken() (string, error) { // Persist new config and if successful, update the in memory config. if err = p.persister.Persist(newCfg); err != nil { - return "", fmt.Errorf("could not perist new tokens: %v", err) + return "", fmt.Errorf("could not persist new tokens: %v", err) } p.cfg = newCfg diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/BUILD b/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/BUILD deleted file mode 100644 index 750ffd6f5..000000000 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["openstack_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["openstack.go"], - importpath = "k8s.io/client-go/plugin/pkg/client/auth/openstack", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/gophercloud/gophercloud/openstack:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack.go index 490eff128..e6d7f0493 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack.go @@ -23,6 +23,7 @@ import ( "time" "github.com/golang/glog" + "github.com/gophercloud/gophercloud" "github.com/gophercloud/gophercloud/openstack" "k8s.io/apimachinery/pkg/util/net" @@ -42,8 +43,7 @@ const DefaultTTLDuration = 10 * time.Minute // the environment variables to determine the client identity, and generates a // token which will be inserted into the request header later. type openstackAuthProvider struct { - ttl time.Duration - + ttl time.Duration tokenGetter TokenGetter } @@ -52,13 +52,23 @@ type TokenGetter interface { Token() (string, error) } -type tokenGetter struct{} +type tokenGetter struct { + authOpt *gophercloud.AuthOptions +} // Token creates a token by authenticate with keystone. -func (*tokenGetter) Token() (string, error) { - options, err := openstack.AuthOptionsFromEnv() - if err != nil { - return "", fmt.Errorf("failed to read openstack env vars: %s", err) +func (t *tokenGetter) Token() (string, error) { + var options gophercloud.AuthOptions + var err error + if t.authOpt == nil { + // reads the config from the environment + glog.V(4).Info("reading openstack config from the environment variables") + options, err = openstack.AuthOptionsFromEnv() + if err != nil { + return "", fmt.Errorf("failed to read openstack env vars: %s", err) + } + } else { + options = *t.authOpt } client, err := openstack.AuthenticatedClient(options) if err != nil { @@ -85,7 +95,7 @@ func (c *cachedGetter) Token() (string, error) { var err error // no token or exceeds the TTL - if c.token == "" || time.Now().Sub(c.born) > c.ttl { + if c.token == "" || time.Since(c.born) > c.ttl { c.token, err = c.tokenGetter.Token() if err != nil { return "", fmt.Errorf("failed to get token: %s", err) @@ -126,10 +136,11 @@ func (t *tokenRoundTripper) WrappedRoundTripper() http.RoundTripper { return t.R // newOpenstackAuthProvider creates an auth provider which works with openstack // environment. -func newOpenstackAuthProvider(clusterAddress string, config map[string]string, persister restclient.AuthProviderConfigPersister) (restclient.AuthProvider, error) { +func newOpenstackAuthProvider(_ string, config map[string]string, persister restclient.AuthProviderConfigPersister) (restclient.AuthProvider, error) { var ttlDuration time.Duration var err error + glog.Warningf("WARNING: in-tree openstack auth plugin is now deprecated. please use the \"client-keystone-auth\" kubectl/client-go credential plugin instead") ttl, found := config["ttl"] if !found { ttlDuration = DefaultTTLDuration @@ -145,11 +156,27 @@ func newOpenstackAuthProvider(clusterAddress string, config map[string]string, p } } - // TODO: read/persist client configuration(OS_XXX env vars) in config + authOpt := gophercloud.AuthOptions{ + IdentityEndpoint: config["identityEndpoint"], + Username: config["username"], + Password: config["password"], + DomainName: config["name"], + TenantID: config["tenantId"], + TenantName: config["tenantName"], + } + + getter := tokenGetter{} + // not empty + if (authOpt != gophercloud.AuthOptions{}) { + if len(authOpt.IdentityEndpoint) == 0 { + return nil, fmt.Errorf("empty %q in the config for openstack auth provider", "identityEndpoint") + } + getter.authOpt = &authOpt + } return &openstackAuthProvider{ ttl: ttlDuration, - tokenGetter: &tokenGetter{}, + tokenGetter: &getter, }, nil } diff --git a/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack_test.go b/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack_test.go index 411bec70f..24d55b9fc 100644 --- a/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack_test.go +++ b/vendor/k8s.io/client-go/plugin/pkg/client/auth/openstack/openstack_test.go @@ -114,3 +114,60 @@ func TestOpenstackAuthProvider(t *testing.T) { } } + +type fakePersister struct{} + +func (i *fakePersister) Persist(map[string]string) error { + return nil +} + +func TestNewOpenstackAuthProvider(t *testing.T) { + tests := []struct { + name string + config map[string]string + expectError bool + }{ + { + name: "normal config without openstack configurations", + config: map[string]string{ + "ttl": "1s", + "foo": "bar", + }, + }, + { + name: "openstack auth provider: missing identityEndpoint", + config: map[string]string{ + "ttl": "1s", + "foo": "bar", + "username": "xyz", + "password": "123", + "tenantName": "admin", + }, + expectError: true, + }, + { + name: "openstack auth provider", + config: map[string]string{ + "ttl": "1s", + "foo": "bar", + "identityEndpoint": "http://controller:35357/v3", + "username": "xyz", + "password": "123", + "tenantName": "admin", + }, + }, + } + + for _, test := range tests { + _, err := newOpenstackAuthProvider("test", test.config, &fakePersister{}) + if err != nil { + if !test.expectError { + t.Errorf("unexpected error: %v", err) + } + } else { + if test.expectError { + t.Error("expect error, but nil") + } + } + } +} diff --git a/vendor/k8s.io/client-go/rest/BUILD b/vendor/k8s.io/client-go/rest/BUILD deleted file mode 100644 index 0cb24bcff..000000000 --- a/vendor/k8s.io/client-go/rest/BUILD +++ /dev/null @@ -1,99 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "client_test.go", - "config_test.go", - "plugin_test.go", - "request_test.go", - "url_utils_test.go", - "urlbackoff_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - "//vendor/k8s.io/client-go/util/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "client.go", - "config.go", - "plugin.go", - "request.go", - "transport.go", - "url_utils.go", - "urlbackoff.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/client-go/rest", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/net/http2:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/pkg/version:go_default_library", - "//vendor/k8s.io/client-go/plugin/pkg/client/auth/exec:go_default_library", - "//vendor/k8s.io/client-go/rest/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//vendor/k8s.io/client-go/tools/metrics:go_default_library", - "//vendor/k8s.io/client-go/transport:go_default_library", - "//vendor/k8s.io/client-go/util/cert:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/rest/fake:all-srcs", - "//staging/src/k8s.io/client-go/rest/watch:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/rest/config.go b/vendor/k8s.io/client-go/rest/config.go index 72a78bc0a..7934a0196 100644 --- a/vendor/k8s.io/client-go/rest/config.go +++ b/vendor/k8s.io/client-go/rest/config.go @@ -17,6 +17,7 @@ limitations under the License. package rest import ( + "context" "fmt" "io/ioutil" "net" @@ -29,7 +30,6 @@ import ( "github.com/golang/glog" - "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -111,7 +111,7 @@ type Config struct { Timeout time.Duration // Dial specifies the dial function for creating unencrypted TCP connections. - Dial func(network, addr string) (net.Conn, error) + Dial func(ctx context.Context, network, address string) (net.Conn, error) // Version forces a specific version to be used (if registered) // Do we need this? @@ -316,12 +316,12 @@ func InClusterConfig() (*Config, error) { return nil, fmt.Errorf("unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined") } - token, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/" + v1.ServiceAccountTokenKey) + token, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/token") if err != nil { return nil, err } tlsClientConfig := TLSClientConfig{} - rootCAFile := "/var/run/secrets/kubernetes.io/serviceaccount/" + v1.ServiceAccountRootCAKey + rootCAFile := "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" if _, err := certutil.NewPool(rootCAFile); err != nil { glog.Errorf("Expected to load root CA config from %s, but got err: %v", rootCAFile, err) } else { diff --git a/vendor/k8s.io/client-go/rest/config_test.go b/vendor/k8s.io/client-go/rest/config_test.go index a9495d792..347864285 100644 --- a/vendor/k8s.io/client-go/rest/config_test.go +++ b/vendor/k8s.io/client-go/rest/config_test.go @@ -17,6 +17,8 @@ limitations under the License. package rest import ( + "context" + "errors" "io" "net" "net/http" @@ -25,8 +27,6 @@ import ( "strings" "testing" - fuzz "github.com/google/gofuzz" - "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -35,8 +35,7 @@ import ( clientcmdapi "k8s.io/client-go/tools/clientcmd/api" "k8s.io/client-go/util/flowcontrol" - "errors" - + fuzz "github.com/google/gofuzz" "github.com/stretchr/testify/assert" ) @@ -208,7 +207,7 @@ func (n *fakeNegotiatedSerializer) DecoderToVersion(serializer runtime.Decoder, return &fakeCodec{} } -var fakeDialFunc = func(network, addr string) (net.Conn, error) { +var fakeDialFunc = func(ctx context.Context, network, addr string) (net.Conn, error) { return nil, fakeDialerError } var fakeDialerError = errors.New("fakedialer") @@ -253,7 +252,7 @@ func TestAnonymousConfig(t *testing.T) { r.Config = map[string]string{} }, // Dial does not require fuzzer - func(r *func(network, addr string) (net.Conn, error), f fuzz.Continue) {}, + func(r *func(ctx context.Context, network, addr string) (net.Conn, error), f fuzz.Continue) {}, ) for i := 0; i < 20; i++ { original := &Config{} @@ -284,10 +283,10 @@ func TestAnonymousConfig(t *testing.T) { expected.WrapTransport = nil } if actual.Dial != nil { - _, actualError := actual.Dial("", "") - _, expectedError := actual.Dial("", "") + _, actualError := actual.Dial(context.Background(), "", "") + _, expectedError := expected.Dial(context.Background(), "", "") if !reflect.DeepEqual(expectedError, actualError) { - t.Fatalf("CopyConfig dropped the Dial field") + t.Fatalf("CopyConfig dropped the Dial field") } } else { actual.Dial = nil @@ -329,7 +328,7 @@ func TestCopyConfig(t *testing.T) { func(r *AuthProviderConfigPersister, f fuzz.Continue) { *r = fakeAuthProviderConfigPersister{} }, - func(r *func(network, addr string) (net.Conn, error), f fuzz.Continue) { + func(r *func(ctx context.Context, network, addr string) (net.Conn, error), f fuzz.Continue) { *r = fakeDialFunc }, ) @@ -351,8 +350,8 @@ func TestCopyConfig(t *testing.T) { expected.WrapTransport = nil } if actual.Dial != nil { - _, actualError := actual.Dial("", "") - _, expectedError := actual.Dial("", "") + _, actualError := actual.Dial(context.Background(), "", "") + _, expectedError := expected.Dial(context.Background(), "", "") if !reflect.DeepEqual(expectedError, actualError) { t.Fatalf("CopyConfig dropped the Dial field") } @@ -361,7 +360,7 @@ func TestCopyConfig(t *testing.T) { expected.Dial = nil if actual.AuthConfigPersister != nil { actualError := actual.AuthConfigPersister.Persist(nil) - expectedError := actual.AuthConfigPersister.Persist(nil) + expectedError := expected.AuthConfigPersister.Persist(nil) if !reflect.DeepEqual(expectedError, actualError) { t.Fatalf("CopyConfig dropped the Dial field") } diff --git a/vendor/k8s.io/client-go/rest/fake/BUILD b/vendor/k8s.io/client-go/rest/fake/BUILD deleted file mode 100644 index e511b207a..000000000 --- a/vendor/k8s.io/client-go/rest/fake/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["fake.go"], - importpath = "k8s.io/client-go/rest/fake", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/rest/request.go b/vendor/k8s.io/client-go/rest/request.go index 6ca9e0197..09ffd76dd 100644 --- a/vendor/k8s.io/client-go/rest/request.go +++ b/vendor/k8s.io/client-go/rest/request.go @@ -317,10 +317,14 @@ func (r *Request) Param(paramName, s string) *Request { // VersionedParams will not write query parameters that have omitempty set and are empty. If a // parameter has already been set it is appended to (Params and VersionedParams are additive). func (r *Request) VersionedParams(obj runtime.Object, codec runtime.ParameterCodec) *Request { + return r.SpecificallyVersionedParams(obj, codec, *r.content.GroupVersion) +} + +func (r *Request) SpecificallyVersionedParams(obj runtime.Object, codec runtime.ParameterCodec, version schema.GroupVersion) *Request { if r.err != nil { return r } - params, err := codec.EncodeParameters(obj, *r.content.GroupVersion) + params, err := codec.EncodeParameters(obj, version) if err != nil { r.err = err return r @@ -353,8 +357,8 @@ func (r *Request) SetHeader(key string, values ...string) *Request { return r } -// Timeout makes the request use the given duration as a timeout. Sets the "timeout" -// parameter. +// Timeout makes the request use the given duration as an overall timeout for the +// request. Additionally, if set passes the value as "timeout" parameter in URL. func (r *Request) Timeout(d time.Duration) *Request { if r.err != nil { return r @@ -485,6 +489,19 @@ func (r *Request) tryThrottle() { // Watch attempts to begin watching the requested location. // Returns a watch.Interface, or an error. func (r *Request) Watch() (watch.Interface, error) { + return r.WatchWithSpecificDecoders( + func(body io.ReadCloser) streaming.Decoder { + framer := r.serializers.Framer.NewFrameReader(body) + return streaming.NewDecoder(framer, r.serializers.StreamingSerializer) + }, + r.serializers.Decoder, + ) +} + +// WatchWithSpecificDecoders attempts to begin watching the requested location with a *different* decoder. +// Turns out that you want one "standard" decoder for the watch event and one "personal" decoder for the content +// Returns a watch.Interface, or an error. +func (r *Request) WatchWithSpecificDecoders(wrapperDecoderFn func(io.ReadCloser) streaming.Decoder, embeddedDecoder runtime.Decoder) (watch.Interface, error) { // We specifically don't want to rate limit watches, so we // don't use r.throttle here. if r.err != nil { @@ -532,9 +549,8 @@ func (r *Request) Watch() (watch.Interface, error) { } return nil, fmt.Errorf("for request '%+v', got status: %v", url, resp.StatusCode) } - framer := r.serializers.Framer.NewFrameReader(resp.Body) - decoder := streaming.NewDecoder(framer, r.serializers.StreamingSerializer) - return watch.NewStreamWatcher(restclientwatch.NewDecoder(decoder, r.serializers.Decoder)), nil + wrapperDecoder := wrapperDecoderFn(resp.Body) + return watch.NewStreamWatcher(restclientwatch.NewDecoder(wrapperDecoder, embeddedDecoder)), nil } // updateURLMetrics is a convenience function for pushing metrics. @@ -640,7 +656,6 @@ func (r *Request) request(fn func(*http.Request, *http.Response)) error { } // Right now we make about ten retry attempts if we get a Retry-After response. - // TODO: Change to a timeout based approach. maxRetries := 10 retries := 0 for { @@ -649,6 +664,14 @@ func (r *Request) request(fn func(*http.Request, *http.Response)) error { if err != nil { return err } + if r.timeout > 0 { + if r.ctx == nil { + r.ctx = context.Background() + } + var cancelFn context.CancelFunc + r.ctx, cancelFn = context.WithTimeout(r.ctx, r.timeout) + defer cancelFn() + } if r.ctx != nil { req = req.WithContext(r.ctx) } diff --git a/vendor/k8s.io/client-go/rest/request_test.go b/vendor/k8s.io/client-go/rest/request_test.go index fac690255..f75ee86cb 100755 --- a/vendor/k8s.io/client-go/rest/request_test.go +++ b/vendor/k8s.io/client-go/rest/request_test.go @@ -1522,7 +1522,7 @@ func TestBody(t *testing.T) { f.Close() defer os.Remove(f.Name()) - var nilObject *v1.DeleteOptions + var nilObject *metav1.DeleteOptions typedObject := interface{}(nilObject) c := testRESTClient(t, nil) tests := []struct { diff --git a/vendor/k8s.io/client-go/rest/transport.go b/vendor/k8s.io/client-go/rest/transport.go index b6a067632..25c1801b6 100644 --- a/vendor/k8s.io/client-go/rest/transport.go +++ b/vendor/k8s.io/client-go/rest/transport.go @@ -18,6 +18,7 @@ package rest import ( "crypto/tls" + "errors" "net/http" "k8s.io/client-go/plugin/pkg/client/auth/exec" @@ -59,39 +60,10 @@ func HTTPWrappersForConfig(config *Config, rt http.RoundTripper) (http.RoundTrip // TransportConfig converts a client config to an appropriate transport config. func (c *Config) TransportConfig() (*transport.Config, error) { - wt := c.WrapTransport - if c.ExecProvider != nil { - provider, err := exec.GetAuthenticator(c.ExecProvider) - if err != nil { - return nil, err - } - if wt != nil { - previousWT := wt - wt = func(rt http.RoundTripper) http.RoundTripper { - return provider.WrapTransport(previousWT(rt)) - } - } else { - wt = provider.WrapTransport - } - } - if c.AuthProvider != nil { - provider, err := GetAuthProvider(c.Host, c.AuthProvider, c.AuthConfigPersister) - if err != nil { - return nil, err - } - if wt != nil { - previousWT := wt - wt = func(rt http.RoundTripper) http.RoundTripper { - return provider.WrapTransport(previousWT(rt)) - } - } else { - wt = provider.WrapTransport - } - } - return &transport.Config{ + conf := &transport.Config{ UserAgent: c.UserAgent, Transport: c.Transport, - WrapTransport: wt, + WrapTransport: c.WrapTransport, TLS: transport.TLSConfig{ Insecure: c.Insecure, ServerName: c.ServerName, @@ -111,5 +83,34 @@ func (c *Config) TransportConfig() (*transport.Config, error) { Extra: c.Impersonate.Extra, }, Dial: c.Dial, - }, nil + } + + if c.ExecProvider != nil && c.AuthProvider != nil { + return nil, errors.New("execProvider and authProvider cannot be used in combination") + } + + if c.ExecProvider != nil { + provider, err := exec.GetAuthenticator(c.ExecProvider) + if err != nil { + return nil, err + } + if err := provider.UpdateTransportConfig(conf); err != nil { + return nil, err + } + } + if c.AuthProvider != nil { + provider, err := GetAuthProvider(c.Host, c.AuthProvider, c.AuthConfigPersister) + if err != nil { + return nil, err + } + wt := conf.WrapTransport + if wt != nil { + conf.WrapTransport = func(rt http.RoundTripper) http.RoundTripper { + return provider.WrapTransport(wt(rt)) + } + } else { + conf.WrapTransport = provider.WrapTransport + } + } + return conf, nil } diff --git a/vendor/k8s.io/client-go/rest/watch/BUILD b/vendor/k8s.io/client-go/rest/watch/BUILD deleted file mode 100644 index 30dfadd1f..000000000 --- a/vendor/k8s.io/client-go/rest/watch/BUILD +++ /dev/null @@ -1,56 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "decoder.go", - "encoder.go", - ], - importpath = "k8s.io/client-go/rest/watch", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = [ - "decoder_test.go", - "encoder_test.go", - ], - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest/watch:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/rest/zz_generated.deepcopy.go b/vendor/k8s.io/client-go/rest/zz_generated.deepcopy.go index 67568bf0b..c1ab45f33 100644 --- a/vendor/k8s.io/client-go/rest/zz_generated.deepcopy.go +++ b/vendor/k8s.io/client-go/rest/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/restmapper/category_expansion.go b/vendor/k8s.io/client-go/restmapper/category_expansion.go new file mode 100644 index 000000000..1620bbcf8 --- /dev/null +++ b/vendor/k8s.io/client-go/restmapper/category_expansion.go @@ -0,0 +1,119 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package restmapper + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/discovery" +) + +// CategoryExpander maps category strings to GroupResouces. +// Categories are classification or 'tag' of a group of resources. +type CategoryExpander interface { + Expand(category string) ([]schema.GroupResource, bool) +} + +// SimpleCategoryExpander implements CategoryExpander interface +// using a static mapping of categories to GroupResource mapping. +type SimpleCategoryExpander struct { + Expansions map[string][]schema.GroupResource +} + +// Expand fulfills CategoryExpander +func (e SimpleCategoryExpander) Expand(category string) ([]schema.GroupResource, bool) { + ret, ok := e.Expansions[category] + return ret, ok +} + +// discoveryCategoryExpander struct lets a REST Client wrapper (discoveryClient) to retrieve list of APIResourceList, +// and then convert to fallbackExpander +type discoveryCategoryExpander struct { + discoveryClient discovery.DiscoveryInterface +} + +// NewDiscoveryCategoryExpander returns a category expander that makes use of the "categories" fields from +// the API, found through the discovery client. In case of any error or no category found (which likely +// means we're at a cluster prior to categories support, fallback to the expander provided. +func NewDiscoveryCategoryExpander(client discovery.DiscoveryInterface) CategoryExpander { + if client == nil { + panic("Please provide discovery client to shortcut expander") + } + return discoveryCategoryExpander{discoveryClient: client} +} + +// Expand fulfills CategoryExpander +func (e discoveryCategoryExpander) Expand(category string) ([]schema.GroupResource, bool) { + // Get all supported resources for groups and versions from server, if no resource found, fallback anyway. + apiResourceLists, _ := e.discoveryClient.ServerResources() + if len(apiResourceLists) == 0 { + return nil, false + } + + discoveredExpansions := map[string][]schema.GroupResource{} + for _, apiResourceList := range apiResourceLists { + gv, err := schema.ParseGroupVersion(apiResourceList.GroupVersion) + if err != nil { + continue + } + // Collect GroupVersions by categories + for _, apiResource := range apiResourceList.APIResources { + if categories := apiResource.Categories; len(categories) > 0 { + for _, category := range categories { + groupResource := schema.GroupResource{ + Group: gv.Group, + Resource: apiResource.Name, + } + discoveredExpansions[category] = append(discoveredExpansions[category], groupResource) + } + } + } + } + + ret, ok := discoveredExpansions[category] + return ret, ok +} + +// UnionCategoryExpander implements CategoryExpander interface. +// It maps given category string to union of expansions returned by all the CategoryExpanders in the list. +type UnionCategoryExpander []CategoryExpander + +// Expand fulfills CategoryExpander +func (u UnionCategoryExpander) Expand(category string) ([]schema.GroupResource, bool) { + ret := []schema.GroupResource{} + ok := false + + // Expand the category for each CategoryExpander in the list and merge/combine the results. + for _, expansion := range u { + curr, currOk := expansion.Expand(category) + + for _, currGR := range curr { + found := false + for _, existing := range ret { + if existing == currGR { + found = true + break + } + } + if !found { + ret = append(ret, currGR) + } + } + ok = ok || currOk + } + + return ret, ok +} diff --git a/vendor/k8s.io/client-go/restmapper/category_expansion_test.go b/vendor/k8s.io/client-go/restmapper/category_expansion_test.go new file mode 100644 index 000000000..8537a6b49 --- /dev/null +++ b/vendor/k8s.io/client-go/restmapper/category_expansion_test.go @@ -0,0 +1,145 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package restmapper + +import ( + "reflect" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +func TestCategoryExpansion(t *testing.T) { + tests := []struct { + name string + arg string + + expected []schema.GroupResource + expectedOk bool + }{ + { + name: "no-replacement", + arg: "service", + expected: nil, + }, + { + name: "all-replacement", + arg: "all", + expected: []schema.GroupResource{ + {Resource: "one"}, + {Resource: "two"}, + {Resource: "three", Group: "alpha"}, + {Resource: "four", Group: "bravo"}, + }, + expectedOk: true, + }, + } + + for _, test := range tests { + simpleCategoryExpander := SimpleCategoryExpander{ + Expansions: map[string][]schema.GroupResource{ + "all": { + {Group: "", Resource: "one"}, + {Group: "", Resource: "two"}, + {Group: "alpha", Resource: "three"}, + {Group: "bravo", Resource: "four"}, + }, + }, + } + + actual, actualOk := simpleCategoryExpander.Expand(test.arg) + if e, a := test.expected, actual; !reflect.DeepEqual(e, a) { + t.Errorf("%s: expected %s, got %s", test.name, e, a) + } + if e, a := test.expectedOk, actualOk; e != a { + t.Errorf("%s: expected %v, got %v", test.name, e, a) + } + } +} + +func TestDiscoveryCategoryExpander(t *testing.T) { + tests := []struct { + category string + serverResponse []*metav1.APIResourceList + expected []schema.GroupResource + }{ + { + category: "all", + serverResponse: []*metav1.APIResourceList{ + { + GroupVersion: "batch/v1", + APIResources: []metav1.APIResource{ + { + Name: "jobs", + ShortNames: []string{"jz"}, + Categories: []string{"all"}, + }, + }, + }, + }, + expected: []schema.GroupResource{ + { + Group: "batch", + Resource: "jobs", + }, + }, + }, + { + category: "all", + serverResponse: []*metav1.APIResourceList{ + { + GroupVersion: "batch/v1", + APIResources: []metav1.APIResource{ + { + Name: "jobs", + ShortNames: []string{"jz"}, + }, + }, + }, + }, + }, + { + category: "targaryens", + serverResponse: []*metav1.APIResourceList{ + { + GroupVersion: "batch/v1", + APIResources: []metav1.APIResource{ + { + Name: "jobs", + ShortNames: []string{"jz"}, + Categories: []string{"all"}, + }, + }, + }, + }, + }, + } + + dc := &fakeDiscoveryClient{} + for _, test := range tests { + dc.serverResourcesHandler = func() ([]*metav1.APIResourceList, error) { + return test.serverResponse, nil + } + expander := NewDiscoveryCategoryExpander(dc) + expanded, _ := expander.Expand(test.category) + if !reflect.DeepEqual(expanded, test.expected) { + t.Errorf("expected %v, got %v", test.expected, expanded) + } + } + +} diff --git a/vendor/k8s.io/client-go/discovery/restmapper.go b/vendor/k8s.io/client-go/restmapper/discovery.go similarity index 92% rename from vendor/k8s.io/client-go/discovery/restmapper.go rename to vendor/k8s.io/client-go/restmapper/discovery.go index df5ab0358..58887cd89 100644 --- a/vendor/k8s.io/client-go/discovery/restmapper.go +++ b/vendor/k8s.io/client-go/restmapper/discovery.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package discovery +package restmapper import ( "fmt" @@ -24,6 +24,7 @@ import ( "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/discovery" "github.com/golang/glog" ) @@ -37,9 +38,9 @@ type APIGroupResources struct { VersionedResources map[string][]metav1.APIResource } -// NewRESTMapper returns a PriorityRESTMapper based on the discovered +// NewDiscoveryRESTMapper returns a PriorityRESTMapper based on the discovered // groups and resources passed in. -func NewRESTMapper(groupResources []*APIGroupResources, versionInterfaces meta.VersionInterfacesFunc) meta.RESTMapper { +func NewDiscoveryRESTMapper(groupResources []*APIGroupResources) meta.RESTMapper { unionMapper := meta.MultiRESTMapper{} var groupPriority []string @@ -90,7 +91,7 @@ func NewRESTMapper(groupResources []*APIGroupResources, versionInterfaces meta.V } gv := schema.GroupVersion{Group: group.Group.Name, Version: discoveryVersion.Version} - versionMapper := meta.NewDefaultRESTMapper([]schema.GroupVersion{gv}, versionInterfaces) + versionMapper := meta.NewDefaultRESTMapper([]schema.GroupVersion{gv}) for _, resource := range resources { scope := meta.RESTScopeNamespace @@ -141,10 +142,13 @@ func NewRESTMapper(groupResources []*APIGroupResources, versionInterfaces meta.V // GetAPIGroupResources uses the provided discovery client to gather // discovery information and populate a slice of APIGroupResources. -func GetAPIGroupResources(cl DiscoveryInterface) ([]*APIGroupResources, error) { +func GetAPIGroupResources(cl discovery.DiscoveryInterface) ([]*APIGroupResources, error) { apiGroups, err := cl.ServerGroups() if err != nil { - return nil, err + if apiGroups == nil || len(apiGroups.Groups) == 0 { + return nil, err + } + // TODO track the errors and update callers to handle partial errors. } var result []*APIGroupResources for _, group := range apiGroups.Groups { @@ -157,7 +161,9 @@ func GetAPIGroupResources(cl DiscoveryInterface) ([]*APIGroupResources, error) { if err != nil { // continue as best we can // TODO track the errors and update callers to handle partial errors. - continue + if resources == nil || len(resources.APIResources) == 0 { + continue + } } groupResources.VersionedResources[version.Version] = resources.APIResources } @@ -170,19 +176,17 @@ func GetAPIGroupResources(cl DiscoveryInterface) ([]*APIGroupResources, error) { // initialization of the RESTMapper until the first mapping is // requested. type DeferredDiscoveryRESTMapper struct { - initMu sync.Mutex - delegate meta.RESTMapper - cl CachedDiscoveryInterface - versionInterface meta.VersionInterfacesFunc + initMu sync.Mutex + delegate meta.RESTMapper + cl discovery.CachedDiscoveryInterface } // NewDeferredDiscoveryRESTMapper returns a // DeferredDiscoveryRESTMapper that will lazily query the provided // client for discovery information to do REST mappings. -func NewDeferredDiscoveryRESTMapper(cl CachedDiscoveryInterface, versionInterface meta.VersionInterfacesFunc) *DeferredDiscoveryRESTMapper { +func NewDeferredDiscoveryRESTMapper(cl discovery.CachedDiscoveryInterface) *DeferredDiscoveryRESTMapper { return &DeferredDiscoveryRESTMapper{ - cl: cl, - versionInterface: versionInterface, + cl: cl, } } @@ -199,7 +203,7 @@ func (d *DeferredDiscoveryRESTMapper) getDelegate() (meta.RESTMapper, error) { return nil, err } - d.delegate = NewRESTMapper(groupResources, d.versionInterface) + d.delegate = NewDiscoveryRESTMapper(groupResources) return d.delegate, err } diff --git a/vendor/k8s.io/client-go/discovery/restmapper_test.go b/vendor/k8s.io/client-go/restmapper/discovery_test.go similarity index 98% rename from vendor/k8s.io/client-go/discovery/restmapper_test.go rename to vendor/k8s.io/client-go/restmapper/discovery_test.go index 69ee7e686..1b8e7c4f0 100644 --- a/vendor/k8s.io/client-go/discovery/restmapper_test.go +++ b/vendor/k8s.io/client-go/restmapper/discovery_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package discovery_test +package restmapper import ( "reflect" @@ -94,7 +94,7 @@ func TestRESTMapper(t *testing.T) { }, } - restMapper := NewRESTMapper(resources, nil) + restMapper := NewDiscoveryRESTMapper(resources) kindTCs := []struct { input schema.GroupVersionResource @@ -243,7 +243,7 @@ func TestDeferredDiscoveryRESTMapper_CacheMiss(t *testing.T) { assert := assert.New(t) cdc := fakeCachedDiscoveryInterface{fresh: false} - m := NewDeferredDiscoveryRESTMapper(&cdc, nil) + m := NewDeferredDiscoveryRESTMapper(&cdc) assert.False(cdc.fresh, "should NOT be fresh after instantiation") assert.Zero(cdc.invalidateCalls, "should not have called Invalidate()") diff --git a/vendor/k8s.io/client-go/restmapper/shortcut.go b/vendor/k8s.io/client-go/restmapper/shortcut.go new file mode 100644 index 000000000..d9f4be0b6 --- /dev/null +++ b/vendor/k8s.io/client-go/restmapper/shortcut.go @@ -0,0 +1,172 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package restmapper + +import ( + "strings" + + "github.com/golang/glog" + + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/discovery" +) + +// shortcutExpander is a RESTMapper that can be used for Kubernetes resources. It expands the resource first, then invokes the wrapped +type shortcutExpander struct { + RESTMapper meta.RESTMapper + + discoveryClient discovery.DiscoveryInterface +} + +var _ meta.RESTMapper = &shortcutExpander{} + +// NewShortcutExpander wraps a restmapper in a layer that expands shortcuts found via discovery +func NewShortcutExpander(delegate meta.RESTMapper, client discovery.DiscoveryInterface) meta.RESTMapper { + return shortcutExpander{RESTMapper: delegate, discoveryClient: client} +} + +// KindFor fulfills meta.RESTMapper +func (e shortcutExpander) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) { + return e.RESTMapper.KindFor(e.expandResourceShortcut(resource)) +} + +// KindsFor fulfills meta.RESTMapper +func (e shortcutExpander) KindsFor(resource schema.GroupVersionResource) ([]schema.GroupVersionKind, error) { + return e.RESTMapper.KindsFor(e.expandResourceShortcut(resource)) +} + +// ResourcesFor fulfills meta.RESTMapper +func (e shortcutExpander) ResourcesFor(resource schema.GroupVersionResource) ([]schema.GroupVersionResource, error) { + return e.RESTMapper.ResourcesFor(e.expandResourceShortcut(resource)) +} + +// ResourceFor fulfills meta.RESTMapper +func (e shortcutExpander) ResourceFor(resource schema.GroupVersionResource) (schema.GroupVersionResource, error) { + return e.RESTMapper.ResourceFor(e.expandResourceShortcut(resource)) +} + +// ResourceSingularizer fulfills meta.RESTMapper +func (e shortcutExpander) ResourceSingularizer(resource string) (string, error) { + return e.RESTMapper.ResourceSingularizer(e.expandResourceShortcut(schema.GroupVersionResource{Resource: resource}).Resource) +} + +// RESTMapping fulfills meta.RESTMapper +func (e shortcutExpander) RESTMapping(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error) { + return e.RESTMapper.RESTMapping(gk, versions...) +} + +// RESTMappings fulfills meta.RESTMapper +func (e shortcutExpander) RESTMappings(gk schema.GroupKind, versions ...string) ([]*meta.RESTMapping, error) { + return e.RESTMapper.RESTMappings(gk, versions...) +} + +// getShortcutMappings returns a set of tuples which holds short names for resources. +// First the list of potential resources will be taken from the API server. +// Next we will append the hardcoded list of resources - to be backward compatible with old servers. +// NOTE that the list is ordered by group priority. +func (e shortcutExpander) getShortcutMappings() ([]*metav1.APIResourceList, []resourceShortcuts, error) { + res := []resourceShortcuts{} + // get server resources + // This can return an error *and* the results it was able to find. We don't need to fail on the error. + apiResList, err := e.discoveryClient.ServerResources() + if err != nil { + glog.V(1).Infof("Error loading discovery information: %v", err) + } + for _, apiResources := range apiResList { + gv, err := schema.ParseGroupVersion(apiResources.GroupVersion) + if err != nil { + glog.V(1).Infof("Unable to parse groupversion = %s due to = %s", apiResources.GroupVersion, err.Error()) + continue + } + for _, apiRes := range apiResources.APIResources { + for _, shortName := range apiRes.ShortNames { + rs := resourceShortcuts{ + ShortForm: schema.GroupResource{Group: gv.Group, Resource: shortName}, + LongForm: schema.GroupResource{Group: gv.Group, Resource: apiRes.Name}, + } + res = append(res, rs) + } + } + } + + return apiResList, res, nil +} + +// expandResourceShortcut will return the expanded version of resource +// (something that a pkg/api/meta.RESTMapper can understand), if it is +// indeed a shortcut. If no match has been found, we will match on group prefixing. +// Lastly we will return resource unmodified. +func (e shortcutExpander) expandResourceShortcut(resource schema.GroupVersionResource) schema.GroupVersionResource { + // get the shortcut mappings and return on first match. + if allResources, shortcutResources, err := e.getShortcutMappings(); err == nil { + // avoid expanding if there's an exact match to a full resource name + for _, apiResources := range allResources { + gv, err := schema.ParseGroupVersion(apiResources.GroupVersion) + if err != nil { + continue + } + if len(resource.Group) != 0 && resource.Group != gv.Group { + continue + } + for _, apiRes := range apiResources.APIResources { + if resource.Resource == apiRes.Name { + return resource + } + if resource.Resource == apiRes.SingularName { + return resource + } + } + } + + for _, item := range shortcutResources { + if len(resource.Group) != 0 && resource.Group != item.ShortForm.Group { + continue + } + if resource.Resource == item.ShortForm.Resource { + resource.Resource = item.LongForm.Resource + resource.Group = item.LongForm.Group + return resource + } + } + + // we didn't find exact match so match on group prefixing. This allows autoscal to match autoscaling + if len(resource.Group) == 0 { + return resource + } + for _, item := range shortcutResources { + if !strings.HasPrefix(item.ShortForm.Group, resource.Group) { + continue + } + if resource.Resource == item.ShortForm.Resource { + resource.Resource = item.LongForm.Resource + resource.Group = item.LongForm.Group + return resource + } + } + } + + return resource +} + +// ResourceShortcuts represents a structure that holds the information how to +// transition from resource's shortcut to its full name. +type resourceShortcuts struct { + ShortForm schema.GroupResource + LongForm schema.GroupResource +} diff --git a/vendor/k8s.io/client-go/restmapper/shortcut_test.go b/vendor/k8s.io/client-go/restmapper/shortcut_test.go new file mode 100644 index 000000000..dbc288fad --- /dev/null +++ b/vendor/k8s.io/client-go/restmapper/shortcut_test.go @@ -0,0 +1,289 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package restmapper + +import ( + "testing" + + "github.com/googleapis/gnostic/OpenAPIv2" + + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/version" + "k8s.io/client-go/discovery" + restclient "k8s.io/client-go/rest" + "k8s.io/client-go/rest/fake" +) + +func TestReplaceAliases(t *testing.T) { + tests := []struct { + name string + arg string + expected schema.GroupVersionResource + srvRes []*metav1.APIResourceList + }{ + { + name: "storageclasses-no-replacement", + arg: "storageclasses", + expected: schema.GroupVersionResource{Resource: "storageclasses"}, + srvRes: []*metav1.APIResourceList{}, + }, + { + name: "hpa-priority", + arg: "hpa", + expected: schema.GroupVersionResource{Resource: "superhorizontalpodautoscalers", Group: "autoscaling"}, + srvRes: []*metav1.APIResourceList{ + { + GroupVersion: "autoscaling/v1", + APIResources: []metav1.APIResource{ + { + Name: "superhorizontalpodautoscalers", + ShortNames: []string{"hpa"}, + }, + }, + }, + { + GroupVersion: "autoscaling/v1", + APIResources: []metav1.APIResource{ + { + Name: "horizontalpodautoscalers", + ShortNames: []string{"hpa"}, + }, + }, + }, + }, + }, + { + name: "resource-override", + arg: "dpl", + expected: schema.GroupVersionResource{Resource: "deployments", Group: "foo"}, + srvRes: []*metav1.APIResourceList{ + { + GroupVersion: "foo/v1", + APIResources: []metav1.APIResource{ + { + Name: "deployments", + ShortNames: []string{"dpl"}, + }, + }, + }, + { + GroupVersion: "extension/v1beta1", + APIResources: []metav1.APIResource{ + { + Name: "deployments", + ShortNames: []string{"deploy"}, + }, + }, + }, + }, + }, + { + name: "resource-match-preferred", + arg: "pods", + expected: schema.GroupVersionResource{Resource: "pods", Group: ""}, + srvRes: []*metav1.APIResourceList{ + { + GroupVersion: "v1", + APIResources: []metav1.APIResource{{Name: "pods", SingularName: "pod"}}, + }, + { + GroupVersion: "acme.com/v1", + APIResources: []metav1.APIResource{{Name: "poddlers", ShortNames: []string{"pods", "pod"}}}, + }, + }, + }, + { + name: "resource-match-singular-preferred", + arg: "pod", + expected: schema.GroupVersionResource{Resource: "pod", Group: ""}, + srvRes: []*metav1.APIResourceList{ + { + GroupVersion: "v1", + APIResources: []metav1.APIResource{{Name: "pods", SingularName: "pod"}}, + }, + { + GroupVersion: "acme.com/v1", + APIResources: []metav1.APIResource{{Name: "poddlers", ShortNames: []string{"pods", "pod"}}}, + }, + }, + }, + } + + for _, test := range tests { + ds := &fakeDiscoveryClient{} + ds.serverResourcesHandler = func() ([]*metav1.APIResourceList, error) { + return test.srvRes, nil + } + mapper := NewShortcutExpander(&fakeRESTMapper{}, ds).(shortcutExpander) + + actual := mapper.expandResourceShortcut(schema.GroupVersionResource{Resource: test.arg}) + if actual != test.expected { + t.Errorf("%s: unexpected argument: expected %s, got %s", test.name, test.expected, actual) + } + } +} + +func TestKindFor(t *testing.T) { + tests := []struct { + in schema.GroupVersionResource + expected schema.GroupVersionResource + srvRes []*metav1.APIResourceList + }{ + { + in: schema.GroupVersionResource{Group: "storage.k8s.io", Version: "", Resource: "sc"}, + expected: schema.GroupVersionResource{Group: "storage.k8s.io", Version: "", Resource: "storageclasses"}, + srvRes: []*metav1.APIResourceList{ + { + GroupVersion: "storage.k8s.io/v1", + APIResources: []metav1.APIResource{ + { + Name: "storageclasses", + ShortNames: []string{"sc"}, + }, + }, + }, + }, + }, + { + in: schema.GroupVersionResource{Group: "", Version: "", Resource: "sc"}, + expected: schema.GroupVersionResource{Group: "storage.k8s.io", Version: "", Resource: "storageclasses"}, + srvRes: []*metav1.APIResourceList{ + { + GroupVersion: "storage.k8s.io/v1", + APIResources: []metav1.APIResource{ + { + Name: "storageclasses", + ShortNames: []string{"sc"}, + }, + }, + }, + }, + }, + } + + for i, test := range tests { + ds := &fakeDiscoveryClient{} + ds.serverResourcesHandler = func() ([]*metav1.APIResourceList, error) { + return test.srvRes, nil + } + + delegate := &fakeRESTMapper{} + mapper := NewShortcutExpander(delegate, ds) + + mapper.KindFor(test.in) + if delegate.kindForInput != test.expected { + t.Errorf("%d: unexpected data returned %#v, expected %#v", i, delegate.kindForInput, test.expected) + } + } +} + +type fakeRESTMapper struct { + kindForInput schema.GroupVersionResource +} + +func (f *fakeRESTMapper) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) { + f.kindForInput = resource + return schema.GroupVersionKind{}, nil +} + +func (f *fakeRESTMapper) KindsFor(resource schema.GroupVersionResource) ([]schema.GroupVersionKind, error) { + return nil, nil +} + +func (f *fakeRESTMapper) ResourceFor(input schema.GroupVersionResource) (schema.GroupVersionResource, error) { + return schema.GroupVersionResource{}, nil +} + +func (f *fakeRESTMapper) ResourcesFor(input schema.GroupVersionResource) ([]schema.GroupVersionResource, error) { + return nil, nil +} + +func (f *fakeRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error) { + return nil, nil +} + +func (f *fakeRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string) ([]*meta.RESTMapping, error) { + return nil, nil +} + +func (f *fakeRESTMapper) ResourceSingularizer(resource string) (singular string, err error) { + return "", nil +} + +type fakeDiscoveryClient struct { + serverResourcesHandler func() ([]*metav1.APIResourceList, error) +} + +var _ discovery.DiscoveryInterface = &fakeDiscoveryClient{} + +func (c *fakeDiscoveryClient) RESTClient() restclient.Interface { + return &fake.RESTClient{} +} + +func (c *fakeDiscoveryClient) ServerGroups() (*metav1.APIGroupList, error) { + return &metav1.APIGroupList{ + Groups: []metav1.APIGroup{ + { + Name: "a", + Versions: []metav1.GroupVersionForDiscovery{ + { + GroupVersion: "a/v1", + Version: "v1", + }, + }, + PreferredVersion: metav1.GroupVersionForDiscovery{ + GroupVersion: "a/v1", + Version: "v1", + }, + }, + }, + }, nil +} + +func (c *fakeDiscoveryClient) ServerResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error) { + if groupVersion == "a/v1" { + return &metav1.APIResourceList{APIResources: []metav1.APIResource{{Name: "widgets", Kind: "Widget"}}}, nil + } + + return nil, errors.NewNotFound(schema.GroupResource{}, "") +} + +func (c *fakeDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) { + if c.serverResourcesHandler != nil { + return c.serverResourcesHandler() + } + return []*metav1.APIResourceList{}, nil +} + +func (c *fakeDiscoveryClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) { + return nil, nil +} + +func (c *fakeDiscoveryClient) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) { + return nil, nil +} + +func (c *fakeDiscoveryClient) ServerVersion() (*version.Info, error) { + return &version.Info{}, nil +} + +func (c *fakeDiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) { + return &openapi_v2.Document{}, nil +} diff --git a/vendor/k8s.io/client-go/scale/BUILD b/vendor/k8s.io/client-go/scale/BUILD deleted file mode 100644 index b82984243..000000000 --- a/vendor/k8s.io/client-go/scale/BUILD +++ /dev/null @@ -1,76 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = [ - "client.go", - "doc.go", - "interfaces.go", - "util.go", - ], - importpath = "k8s.io/client-go/scale", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/dynamic:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme/appsint:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme/appsv1beta1:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme/appsv1beta2:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme/autoscalingv1:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme/extensionsint:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "client_test.go", - "roundtrip_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/client-go/discovery:go_default_library", - "//vendor/k8s.io/client-go/discovery/fake:go_default_library", - "//vendor/k8s.io/client-go/dynamic:go_default_library", - "//vendor/k8s.io/client-go/rest/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/scale/fake:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/client.go b/vendor/k8s.io/client-go/scale/client.go index 782aca394..3a3e8fc9e 100644 --- a/vendor/k8s.io/client-go/scale/client.go +++ b/vendor/k8s.io/client-go/scale/client.go @@ -20,7 +20,6 @@ import ( "fmt" autoscaling "k8s.io/api/autoscaling/v1" - "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" @@ -41,7 +40,7 @@ type restInterfaceProvider func(*restclient.Config) (restclient.Interface, error // It behaves somewhat similarly to the dynamic ClientPool, // but is more specifically scoped to Scale. type scaleClient struct { - mapper meta.RESTMapper + mapper PreferredResourceMapper apiPathResolverFunc dynamic.APIPathResolverFunc scaleKindResolver ScaleKindResolver @@ -51,7 +50,7 @@ type scaleClient struct { // NewForConfig creates a new ScalesGetter which resolves kinds // to resources using the given RESTMapper, and API paths using // the given dynamic.APIPathResolverFunc. -func NewForConfig(cfg *restclient.Config, mapper meta.RESTMapper, resolver dynamic.APIPathResolverFunc, scaleKindResolver ScaleKindResolver) (ScalesGetter, error) { +func NewForConfig(cfg *restclient.Config, mapper PreferredResourceMapper, resolver dynamic.APIPathResolverFunc, scaleKindResolver ScaleKindResolver) (ScalesGetter, error) { // so that the RESTClientFor doesn't complain cfg.GroupVersion = &schema.GroupVersion{} @@ -72,7 +71,7 @@ func NewForConfig(cfg *restclient.Config, mapper meta.RESTMapper, resolver dynam // New creates a new ScalesGetter using the given client to make requests. // The GroupVersion on the client is ignored. -func New(baseClient restclient.Interface, mapper meta.RESTMapper, resolver dynamic.APIPathResolverFunc, scaleKindResolver ScaleKindResolver) ScalesGetter { +func New(baseClient restclient.Interface, mapper PreferredResourceMapper, resolver dynamic.APIPathResolverFunc, scaleKindResolver ScaleKindResolver) ScalesGetter { return &scaleClient{ mapper: mapper, @@ -138,7 +137,7 @@ func (c *namespacedScaleClient) Get(resource schema.GroupResource, name string) SubResource("scale"). Do() if err := result.Error(); err != nil { - return nil, fmt.Errorf("could not fetch the scale for %s %s: %v", resource.String(), name, err) + return nil, err } scaleBytes, err := result.Raw() @@ -196,7 +195,10 @@ func (c *namespacedScaleClient) Update(resource schema.GroupResource, scale *aut Body(scaleUpdateBytes). Do() if err := result.Error(); err != nil { - return nil, fmt.Errorf("could not update the scale for %s %s: %v", resource.String(), scale.Name, err) + // propagate "raw" error from the API + // this allows callers to interpret underlying Reason field + // for example: errors.IsConflict(err) + return nil, err } scaleBytes, err := result.Raw() diff --git a/vendor/k8s.io/client-go/scale/client_test.go b/vendor/k8s.io/client-go/scale/client_test.go index 6301320f3..a3a8c037d 100644 --- a/vendor/k8s.io/client-go/scale/client_test.go +++ b/vendor/k8s.io/client-go/scale/client_test.go @@ -29,7 +29,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/client-go/discovery" fakedisco "k8s.io/client-go/discovery/fake" "k8s.io/client-go/dynamic" fakerest "k8s.io/client-go/rest/fake" @@ -40,7 +39,7 @@ import ( autoscalingv1 "k8s.io/api/autoscaling/v1" corev1 "k8s.io/api/core/v1" extv1beta1 "k8s.io/api/extensions/v1beta1" - apimeta "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/client-go/restmapper" coretesting "k8s.io/client-go/testing" ) @@ -97,11 +96,11 @@ func fakeScaleClient(t *testing.T) (ScalesGetter, []schema.GroupResource) { }, } - restMapperRes, err := discovery.GetAPIGroupResources(fakeDiscoveryClient) + restMapperRes, err := restmapper.GetAPIGroupResources(fakeDiscoveryClient) if err != nil { t.Fatalf("unexpected error while constructing resource list from fake discovery client: %v", err) } - restMapper := discovery.NewRESTMapper(restMapperRes, apimeta.InterfacesForUnstructured) + restMapper := restmapper.NewDiscoveryRESTMapper(restMapperRes) autoscalingScale := &autoscalingv1.Scale{ TypeMeta: metav1.TypeMeta{ diff --git a/vendor/k8s.io/client-go/scale/fake/BUILD b/vendor/k8s.io/client-go/scale/fake/BUILD deleted file mode 100644 index 8c9374305..000000000 --- a/vendor/k8s.io/client-go/scale/fake/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["client.go"], - importpath = "k8s.io/client-go/scale/fake", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/scale:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/BUILD b/vendor/k8s.io/client-go/scale/scheme/BUILD deleted file mode 100644 index 74bd976a1..000000000 --- a/vendor/k8s.io/client-go/scale/scheme/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/client-go/scale/scheme", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/appsint:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/appsv1beta1:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/appsv1beta2:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/autoscalingv1:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/extensionsint:all-srcs", - "//staging/src/k8s.io/client-go/scale/scheme/extensionsv1beta1:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/appsint/BUILD b/vendor/k8s.io/client-go/scale/scheme/appsint/BUILD deleted file mode 100644 index 2fef63f0e..000000000 --- a/vendor/k8s.io/client-go/scale/scheme/appsint/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importpath = "k8s.io/client-go/scale/scheme/appsint", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/appsv1beta1/BUILD b/vendor/k8s.io/client-go/scale/scheme/appsv1beta1/BUILD deleted file mode 100644 index 05530e300..000000000 --- a/vendor/k8s.io/client-go/scale/scheme/appsv1beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - ], - importpath = "k8s.io/client-go/scale/scheme/appsv1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/apps/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/appsv1beta1/zz_generated.conversion.go b/vendor/k8s.io/client-go/scale/scheme/appsv1beta1/zz_generated.conversion.go index bd42e7add..00734d437 100644 --- a/vendor/k8s.io/client-go/scale/scheme/appsv1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/client-go/scale/scheme/appsv1beta1/zz_generated.conversion.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/scale/scheme/appsv1beta2/BUILD b/vendor/k8s.io/client-go/scale/scheme/appsv1beta2/BUILD deleted file mode 100644 index 7e52bc060..000000000 --- a/vendor/k8s.io/client-go/scale/scheme/appsv1beta2/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - ], - importpath = "k8s.io/client-go/scale/scheme/appsv1beta2", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/apps/v1beta2:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/appsv1beta2/zz_generated.conversion.go b/vendor/k8s.io/client-go/scale/scheme/appsv1beta2/zz_generated.conversion.go index d6afedb0d..44f28aa1a 100644 --- a/vendor/k8s.io/client-go/scale/scheme/appsv1beta2/zz_generated.conversion.go +++ b/vendor/k8s.io/client-go/scale/scheme/appsv1beta2/zz_generated.conversion.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/scale/scheme/autoscalingv1/BUILD b/vendor/k8s.io/client-go/scale/scheme/autoscalingv1/BUILD deleted file mode 100644 index 646a6fdf8..000000000 --- a/vendor/k8s.io/client-go/scale/scheme/autoscalingv1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - ], - importpath = "k8s.io/client-go/scale/scheme/autoscalingv1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/autoscaling/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/autoscalingv1/zz_generated.conversion.go b/vendor/k8s.io/client-go/scale/scheme/autoscalingv1/zz_generated.conversion.go index 2a7a45a47..474c80350 100644 --- a/vendor/k8s.io/client-go/scale/scheme/autoscalingv1/zz_generated.conversion.go +++ b/vendor/k8s.io/client-go/scale/scheme/autoscalingv1/zz_generated.conversion.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/scale/scheme/extensionsint/BUILD b/vendor/k8s.io/client-go/scale/scheme/extensionsint/BUILD deleted file mode 100644 index 6174a88b1..000000000 --- a/vendor/k8s.io/client-go/scale/scheme/extensionsint/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "register.go", - ], - importpath = "k8s.io/client-go/scale/scheme/extensionsint", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1/BUILD b/vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1/BUILD deleted file mode 100644 index 4c992c7d1..000000000 --- a/vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "zz_generated.conversion.go", - ], - importpath = "k8s.io/client-go/scale/scheme/extensionsv1beta1", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/api/extensions/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/scale/scheme:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1/zz_generated.conversion.go b/vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1/zz_generated.conversion.go index 6d0ed7a29..26ed5754e 100644 --- a/vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/client-go/scale/scheme/extensionsv1beta1/zz_generated.conversion.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/scale/scheme/zz_generated.deepcopy.go b/vendor/k8s.io/client-go/scale/scheme/zz_generated.deepcopy.go index d34399667..7fe882f03 100644 --- a/vendor/k8s.io/client-go/scale/scheme/zz_generated.deepcopy.go +++ b/vendor/k8s.io/client-go/scale/scheme/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/scale/util.go b/vendor/k8s.io/client-go/scale/util.go index 46b5c4d1e..1c04b4551 100644 --- a/vendor/k8s.io/client-go/scale/util.go +++ b/vendor/k8s.io/client-go/scale/util.go @@ -21,6 +21,7 @@ import ( "strings" "sync" + "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" @@ -34,6 +35,15 @@ import ( scaleext "k8s.io/client-go/scale/scheme/extensionsv1beta1" ) +// PreferredResourceMapper determines the preferred version of a resource to scale +type PreferredResourceMapper interface { + // ResourceFor takes a partial resource and returns the preferred resource. + ResourceFor(resource schema.GroupVersionResource) (preferredResource schema.GroupVersionResource, err error) +} + +// Ensure a RESTMapper satisfies the PreferredResourceMapper interface +var _ PreferredResourceMapper = meta.RESTMapper(nil) + // ScaleKindResolver knows about the relationship between // resources and the GroupVersionKind of their scale subresources. type ScaleKindResolver interface { diff --git a/vendor/k8s.io/client-go/testing/BUILD b/vendor/k8s.io/client-go/testing/BUILD deleted file mode 100644 index dd8d13397..000000000 --- a/vendor/k8s.io/client-go/testing/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = [ - "actions.go", - "fake.go", - "fixture.go", - ], - importpath = "k8s.io/client-go/testing", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/version:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/pkg/version:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = [ - "fixture_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/stretchr/testify/assert:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/testing/actions.go b/vendor/k8s.io/client-go/testing/actions.go index 6f1c3a896..b99f231c8 100644 --- a/vendor/k8s.io/client-go/testing/actions.go +++ b/vendor/k8s.io/client-go/testing/actions.go @@ -58,6 +58,16 @@ func NewGetSubresourceAction(resource schema.GroupVersionResource, namespace, su return action } +func NewRootGetSubresourceAction(resource schema.GroupVersionResource, subresource, name string) GetActionImpl { + action := GetActionImpl{} + action.Verb = "get" + action.Resource = resource + action.Subresource = subresource + action.Name = name + + return action +} + func NewRootListAction(resource schema.GroupVersionResource, kind schema.GroupVersionKind, opts interface{}) ListActionImpl { action := ListActionImpl{} action.Verb = "list" @@ -81,20 +91,6 @@ func NewListAction(resource schema.GroupVersionResource, kind schema.GroupVersio return action } -func NewListSubresourceAction(resource schema.GroupVersionResource, name, subresource string, kind schema.GroupVersionKind, namespace string, opts interface{}) ListActionImpl { - action := ListActionImpl{} - action.Verb = "list" - action.Resource = resource - action.Subresource = subresource - action.Kind = kind - action.Namespace = namespace - action.Name = name - labelSelector, fieldSelector, _ := ExtractFromListOptions(opts) - action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector} - - return action -} - func NewRootCreateAction(resource schema.GroupVersionResource, object runtime.Object) CreateActionImpl { action := CreateActionImpl{} action.Verb = "create" @@ -114,12 +110,23 @@ func NewCreateAction(resource schema.GroupVersionResource, namespace string, obj return action } -func NewCreateSubresourceAction(resource schema.GroupVersionResource, name, subresource string, namespace string, object runtime.Object) CreateActionImpl { +func NewRootCreateSubresourceAction(resource schema.GroupVersionResource, name, subresource string, object runtime.Object) CreateActionImpl { action := CreateActionImpl{} action.Verb = "create" action.Resource = resource action.Subresource = subresource + action.Name = name + action.Object = object + + return action +} + +func NewCreateSubresourceAction(resource schema.GroupVersionResource, name, subresource, namespace string, object runtime.Object) CreateActionImpl { + action := CreateActionImpl{} + action.Verb = "create" + action.Resource = resource action.Namespace = namespace + action.Subresource = subresource action.Name = name action.Object = object @@ -218,6 +225,16 @@ func NewRootDeleteAction(resource schema.GroupVersionResource, name string) Dele return action } +func NewRootDeleteSubresourceAction(resource schema.GroupVersionResource, subresource string, name string) DeleteActionImpl { + action := DeleteActionImpl{} + action.Verb = "delete" + action.Resource = resource + action.Subresource = subresource + action.Name = name + + return action +} + func NewDeleteAction(resource schema.GroupVersionResource, namespace, name string) DeleteActionImpl { action := DeleteActionImpl{} action.Verb = "delete" @@ -228,6 +245,17 @@ func NewDeleteAction(resource schema.GroupVersionResource, namespace, name strin return action } +func NewDeleteSubresourceAction(resource schema.GroupVersionResource, subresource, namespace, name string) DeleteActionImpl { + action := DeleteActionImpl{} + action.Verb = "delete" + action.Resource = resource + action.Subresource = subresource + action.Namespace = namespace + action.Name = name + + return action +} + func NewRootDeleteCollectionAction(resource schema.GroupVersionResource, opts interface{}) DeleteCollectionActionImpl { action := DeleteCollectionActionImpl{} action.Verb = "delete-collection" @@ -324,6 +352,10 @@ type Action interface { GetResource() schema.GroupVersionResource GetSubresource() string Matches(verb, resource string) bool + + // DeepCopy is used to copy an action to avoid any risk of accidental mutation. Most people never need to call this + // because the invocation logic deep copies before calls to storage and reactors. + DeepCopy() Action } type GenericAction interface { @@ -404,6 +436,10 @@ func (a ActionImpl) Matches(verb, resource string) bool { return strings.ToLower(verb) == strings.ToLower(a.Verb) && strings.ToLower(resource) == strings.ToLower(a.Resource.Resource) } +func (a ActionImpl) DeepCopy() Action { + ret := a + return ret +} type GenericActionImpl struct { ActionImpl @@ -414,6 +450,14 @@ func (a GenericActionImpl) GetValue() interface{} { return a.Value } +func (a GenericActionImpl) DeepCopy() Action { + return GenericActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + // TODO this is wrong, but no worse than before + Value: a.Value, + } +} + type GetActionImpl struct { ActionImpl Name string @@ -423,6 +467,13 @@ func (a GetActionImpl) GetName() string { return a.Name } +func (a GetActionImpl) DeepCopy() Action { + return GetActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + } +} + type ListActionImpl struct { ActionImpl Kind schema.GroupVersionKind @@ -438,6 +489,18 @@ func (a ListActionImpl) GetListRestrictions() ListRestrictions { return a.ListRestrictions } +func (a ListActionImpl) DeepCopy() Action { + return ListActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Kind: a.Kind, + Name: a.Name, + ListRestrictions: ListRestrictions{ + Labels: a.ListRestrictions.Labels.DeepCopySelector(), + Fields: a.ListRestrictions.Fields.DeepCopySelector(), + }, + } +} + type CreateActionImpl struct { ActionImpl Name string @@ -448,6 +511,14 @@ func (a CreateActionImpl) GetObject() runtime.Object { return a.Object } +func (a CreateActionImpl) DeepCopy() Action { + return CreateActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + Object: a.Object.DeepCopyObject(), + } +} + type UpdateActionImpl struct { ActionImpl Object runtime.Object @@ -457,6 +528,13 @@ func (a UpdateActionImpl) GetObject() runtime.Object { return a.Object } +func (a UpdateActionImpl) DeepCopy() Action { + return UpdateActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Object: a.Object.DeepCopyObject(), + } +} + type PatchActionImpl struct { ActionImpl Name string @@ -471,6 +549,16 @@ func (a PatchActionImpl) GetPatch() []byte { return a.Patch } +func (a PatchActionImpl) DeepCopy() Action { + patch := make([]byte, len(a.Patch)) + copy(patch, a.Patch) + return PatchActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + Patch: patch, + } +} + type DeleteActionImpl struct { ActionImpl Name string @@ -480,6 +568,13 @@ func (a DeleteActionImpl) GetName() string { return a.Name } +func (a DeleteActionImpl) DeepCopy() Action { + return DeleteActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + } +} + type DeleteCollectionActionImpl struct { ActionImpl ListRestrictions ListRestrictions @@ -489,6 +584,16 @@ func (a DeleteCollectionActionImpl) GetListRestrictions() ListRestrictions { return a.ListRestrictions } +func (a DeleteCollectionActionImpl) DeepCopy() Action { + return DeleteCollectionActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + ListRestrictions: ListRestrictions{ + Labels: a.ListRestrictions.Labels.DeepCopySelector(), + Fields: a.ListRestrictions.Fields.DeepCopySelector(), + }, + } +} + type WatchActionImpl struct { ActionImpl WatchRestrictions WatchRestrictions @@ -498,6 +603,17 @@ func (a WatchActionImpl) GetWatchRestrictions() WatchRestrictions { return a.WatchRestrictions } +func (a WatchActionImpl) DeepCopy() Action { + return WatchActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + WatchRestrictions: WatchRestrictions{ + Labels: a.WatchRestrictions.Labels.DeepCopySelector(), + Fields: a.WatchRestrictions.Fields.DeepCopySelector(), + ResourceVersion: a.WatchRestrictions.ResourceVersion, + }, + } +} + type ProxyGetActionImpl struct { ActionImpl Scheme string @@ -526,3 +642,18 @@ func (a ProxyGetActionImpl) GetPath() string { func (a ProxyGetActionImpl) GetParams() map[string]string { return a.Params } + +func (a ProxyGetActionImpl) DeepCopy() Action { + params := map[string]string{} + for k, v := range a.Params { + params[k] = v + } + return ProxyGetActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Scheme: a.Scheme, + Name: a.Name, + Port: a.Port, + Path: a.Path, + Params: params, + } +} diff --git a/vendor/k8s.io/client-go/testing/fake.go b/vendor/k8s.io/client-go/testing/fake.go index da47b23b9..8b3f31eaf 100644 --- a/vendor/k8s.io/client-go/testing/fake.go +++ b/vendor/k8s.io/client-go/testing/fake.go @@ -22,10 +22,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/version" "k8s.io/apimachinery/pkg/watch" - kubeversion "k8s.io/client-go/pkg/version" restclient "k8s.io/client-go/rest" ) @@ -134,13 +131,13 @@ func (c *Fake) Invokes(action Action, defaultReturnObj runtime.Object) (runtime. c.Lock() defer c.Unlock() - c.actions = append(c.actions, action) + c.actions = append(c.actions, action.DeepCopy()) for _, reactor := range c.ReactionChain { if !reactor.Handles(action) { continue } - handled, ret, err := reactor.React(action) + handled, ret, err := reactor.React(action.DeepCopy()) if !handled { continue } @@ -157,13 +154,13 @@ func (c *Fake) InvokesWatch(action Action) (watch.Interface, error) { c.Lock() defer c.Unlock() - c.actions = append(c.actions, action) + c.actions = append(c.actions, action.DeepCopy()) for _, reactor := range c.WatchReactionChain { if !reactor.Handles(action) { continue } - handled, ret, err := reactor.React(action) + handled, ret, err := reactor.React(action.DeepCopy()) if !handled { continue } @@ -180,13 +177,13 @@ func (c *Fake) InvokesProxy(action Action) restclient.ResponseWrapper { c.Lock() defer c.Unlock() - c.actions = append(c.actions, action) + c.actions = append(c.actions, action.DeepCopy()) for _, reactor := range c.ProxyReactionChain { if !reactor.Handles(action) { continue } - handled, ret, err := reactor.React(action) + handled, ret, err := reactor.React(action.DeepCopy()) if !handled || err != nil { continue } @@ -214,46 +211,3 @@ func (c *Fake) Actions() []Action { copy(fa, c.actions) return fa } - -// TODO: this probably should be moved to somewhere else. -type FakeDiscovery struct { - *Fake -} - -func (c *FakeDiscovery) ServerResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error) { - action := ActionImpl{ - Verb: "get", - Resource: schema.GroupVersionResource{Resource: "resource"}, - } - c.Invokes(action, nil) - for _, rl := range c.Resources { - if rl.GroupVersion == groupVersion { - return rl, nil - } - } - - return nil, fmt.Errorf("GroupVersion %q not found", groupVersion) -} - -func (c *FakeDiscovery) ServerResources() ([]*metav1.APIResourceList, error) { - action := ActionImpl{ - Verb: "get", - Resource: schema.GroupVersionResource{Resource: "resource"}, - } - c.Invokes(action, nil) - return c.Resources, nil -} - -func (c *FakeDiscovery) ServerGroups() (*metav1.APIGroupList, error) { - return nil, nil -} - -func (c *FakeDiscovery) ServerVersion() (*version.Info, error) { - action := ActionImpl{} - action.Verb = "get" - action.Resource = schema.GroupVersionResource{Resource: "version"} - - c.Invokes(action, nil) - versionInfo := kubeversion.Get() - return &versionInfo, nil -} diff --git a/vendor/k8s.io/client-go/testing/fixture.go b/vendor/k8s.io/client-go/testing/fixture.go index ba8ee508f..00c4c49fc 100644 --- a/vendor/k8s.io/client-go/testing/fixture.go +++ b/vendor/k8s.io/client-go/testing/fixture.go @@ -25,15 +25,12 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/json" + "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/watch" restclient "k8s.io/client-go/rest" ) -// FakeWatchBufferSize is the max num of watch event can be buffered in the -// watch channel. Note that when watch event overflows or exceed this buffer -// size, manipulations via fake client may be blocked. -const FakeWatchBufferSize = 128 - // ObjectTracker keeps track of objects. It is intended to be used to // fake calls to a server by returning objects based on their kind, // namespace and name. @@ -77,7 +74,6 @@ func ObjectReaction(tracker ObjectTracker) ReactionFunc { return func(action Action) (bool, runtime.Object, error) { ns := action.GetNamespace() gvr := action.GetResource() - // Here and below we need to switch on implementation types, // not on interfaces, as some interfaces are identical // (e.g. UpdateAction and CreateAction), so if we use them, @@ -130,6 +126,34 @@ func ObjectReaction(tracker ObjectTracker) ReactionFunc { } return true, nil, nil + case PatchActionImpl: + obj, err := tracker.Get(gvr, ns, action.GetName()) + if err != nil { + // object is not registered + return false, nil, err + } + + old, err := json.Marshal(obj) + if err != nil { + return true, nil, err + } + // Only supports strategic merge patch + // TODO: Add support for other Patch types + mergedByte, err := strategicpatch.StrategicMergePatch(old, action.GetPatch(), obj) + if err != nil { + return true, nil, err + } + + if err = json.Unmarshal(mergedByte, obj); err != nil { + return true, nil, err + } + + if err = tracker.Update(gvr, obj, ns); err != nil { + return true, nil, err + } + + return true, obj, nil + default: return false, nil, fmt.Errorf("no reaction implemented for %s", action) } @@ -142,12 +166,11 @@ type tracker struct { lock sync.RWMutex objects map[schema.GroupVersionResource][]runtime.Object // The value type of watchers is a map of which the key is either a namespace or - // all/non namespace aka "" and its value is list of fake watchers. Each of - // fake watcher holds a buffered channel of size "FakeWatchBufferSize" which - // is default to 128. Manipulations on resources will broadcast the notification - // events into the watchers' channel and note that too many unhandled event may - // potentially block the tracker. - watchers map[schema.GroupVersionResource]map[string][]*watch.FakeWatcher + // all/non namespace aka "" and its value is list of fake watchers. + // Manipulations on resources will broadcast the notification events into the + // watchers' channel. Note that too many unhandled events (currently 100, + // see apimachinery/pkg/watch.DefaultChanSize) will cause a panic. + watchers map[schema.GroupVersionResource]map[string][]*watch.RaceFreeFakeWatcher } var _ ObjectTracker = &tracker{} @@ -159,7 +182,7 @@ func NewObjectTracker(scheme ObjectScheme, decoder runtime.Decoder) ObjectTracke scheme: scheme, decoder: decoder, objects: make(map[schema.GroupVersionResource][]runtime.Object), - watchers: make(map[schema.GroupVersionResource]map[string][]*watch.FakeWatcher), + watchers: make(map[schema.GroupVersionResource]map[string][]*watch.RaceFreeFakeWatcher), } } @@ -206,10 +229,10 @@ func (t *tracker) Watch(gvr schema.GroupVersionResource, ns string) (watch.Inter t.lock.Lock() defer t.lock.Unlock() - fakewatcher := watch.NewFakeWithChanSize(FakeWatchBufferSize, true) + fakewatcher := watch.NewRaceFreeFake() if _, exists := t.watchers[gvr]; !exists { - t.watchers[gvr] = make(map[string][]*watch.FakeWatcher) + t.watchers[gvr] = make(map[string][]*watch.RaceFreeFakeWatcher) } t.watchers[gvr][ns] = append(t.watchers[gvr][ns], fakewatcher) return fakewatcher, nil @@ -293,8 +316,8 @@ func (t *tracker) Update(gvr schema.GroupVersionResource, obj runtime.Object, ns return t.add(gvr, obj, ns, true) } -func (t *tracker) getWatches(gvr schema.GroupVersionResource, ns string) []*watch.FakeWatcher { - watches := []*watch.FakeWatcher{} +func (t *tracker) getWatches(gvr schema.GroupVersionResource, ns string) []*watch.RaceFreeFakeWatcher { + watches := []*watch.RaceFreeFakeWatcher{} if t.watchers[gvr] != nil { if w := t.watchers[gvr][ns]; w != nil { watches = append(watches, w...) diff --git a/vendor/k8s.io/client-go/testing/fixture_test.go b/vendor/k8s.io/client-go/testing/fixture_test.go index 967e0aefa..405fe1a7e 100644 --- a/vendor/k8s.io/client-go/testing/fixture_test.go +++ b/vendor/k8s.io/client-go/testing/fixture_test.go @@ -63,6 +63,9 @@ func TestWatchCallNonNamespace(t *testing.T) { codecs := serializer.NewCodecFactory(scheme) o := NewObjectTracker(scheme, codecs.UniversalDecoder()) watch, err := o.Watch(testResource, ns) + if err != nil { + t.Fatalf("test resource watch failed in %s: %v ", ns, err) + } go func() { err := o.Create(testResource, testObj, ns) if err != nil { @@ -85,7 +88,13 @@ func TestWatchCallAllNamespace(t *testing.T) { codecs := serializer.NewCodecFactory(scheme) o := NewObjectTracker(scheme, codecs.UniversalDecoder()) w, err := o.Watch(testResource, "test_namespace") + if err != nil { + t.Fatalf("test resource watch failed in test_namespace: %v", err) + } wAll, err := o.Watch(testResource, "") + if err != nil { + t.Fatalf("test resource watch failed in all namespaces: %v", err) + } go func() { err := o.Create(testResource, testObj, ns) assert.NoError(t, err, "test resource creation failed") @@ -161,6 +170,9 @@ func TestWatchCallMultipleInvocation(t *testing.T) { for idx, watchNamespace := range watchNamespaces { i := idx w, err := o.Watch(testResource, watchNamespace) + if err != nil { + t.Fatalf("test resource watch failed in %s: %v", watchNamespace, err) + } go func() { assert.NoError(t, err, "watch invocation failed") for _, c := range cases { @@ -190,3 +202,34 @@ func TestWatchCallMultipleInvocation(t *testing.T) { } wg.Wait() } + +func TestWatchAddAfterStop(t *testing.T) { + testResource := schema.GroupVersionResource{Group: "", Version: "test_version", Resource: "test_kind"} + testObj := getArbitraryResource(testResource, "test_name", "test_namespace") + accessor, err := meta.Accessor(testObj) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + ns := accessor.GetNamespace() + scheme := runtime.NewScheme() + codecs := serializer.NewCodecFactory(scheme) + o := NewObjectTracker(scheme, codecs.UniversalDecoder()) + watch, err := o.Watch(testResource, ns) + if err != nil { + t.Errorf("watch creation failed: %v", err) + } + + // When the watch is stopped it should ignore later events without panicking. + defer func() { + if r := recover(); r != nil { + t.Errorf("Watch panicked when it should have ignored create after stop: %v", r) + } + }() + + watch.Stop() + err = o.Create(testResource, testObj, ns) + if err != nil { + t.Errorf("test resource creation failed: %v", err) + } +} diff --git a/vendor/k8s.io/client-go/third_party/forked/golang/template/BUILD b/vendor/k8s.io/client-go/third_party/forked/golang/template/BUILD deleted file mode 100644 index cebdf7b63..000000000 --- a/vendor/k8s.io/client-go/third_party/forked/golang/template/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "exec.go", - "funcs.go", - ], - importpath = "k8s.io/client-go/third_party/forked/golang/template", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/auth/BUILD b/vendor/k8s.io/client-go/tools/auth/BUILD deleted file mode 100644 index 5c7718a77..000000000 --- a/vendor/k8s.io/client-go/tools/auth/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["clientauth.go"], - importpath = "k8s.io/client-go/tools/auth", - deps = ["//vendor/k8s.io/client-go/rest:go_default_library"], -) - -go_test( - name = "go_default_xtest", - srcs = ["clientauth_test.go"], - deps = ["//vendor/k8s.io/client-go/tools/auth:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/bootstrap/token/api/OWNERS b/vendor/k8s.io/client-go/tools/bootstrap/token/OWNERS similarity index 100% rename from vendor/k8s.io/client-go/tools/bootstrap/token/api/OWNERS rename to vendor/k8s.io/client-go/tools/bootstrap/token/OWNERS diff --git a/vendor/k8s.io/client-go/tools/bootstrap/token/api/BUILD b/vendor/k8s.io/client-go/tools/bootstrap/token/api/BUILD deleted file mode 100644 index 7416adc01..000000000 --- a/vendor/k8s.io/client-go/tools/bootstrap/token/api/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "types.go", - ], - importpath = "k8s.io/client-go/tools/bootstrap/token/api", - visibility = ["//visibility:public"], - deps = ["//vendor/k8s.io/api/core/v1:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/tools/bootstrap/token/api/doc.go b/vendor/k8s.io/client-go/tools/bootstrap/token/api/doc.go index b9910c35a..249e0a059 100644 --- a/vendor/k8s.io/client-go/tools/bootstrap/token/api/doc.go +++ b/vendor/k8s.io/client-go/tools/bootstrap/token/api/doc.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package api (pkg/bootstrap/token/api) contains constants and types needed for +// Package api (k8s.io/client-go/tools/bootstrap/token/api) contains constants and types needed for // bootstrap tokens as maintained by the BootstrapSigner and TokenCleaner -// controllers (in pkg/controller/bootstrap) +// controllers (in k8s.io/kubernetes/pkg/controller/bootstrap) package api // import "k8s.io/client-go/tools/bootstrap/token/api" diff --git a/vendor/k8s.io/client-go/tools/bootstrap/token/api/types.go b/vendor/k8s.io/client-go/tools/bootstrap/token/api/types.go index c30814c0e..3bea78b17 100644 --- a/vendor/k8s.io/client-go/tools/bootstrap/token/api/types.go +++ b/vendor/k8s.io/client-go/tools/bootstrap/token/api/types.go @@ -86,14 +86,26 @@ const ( // authenticate as. The full username given is "system:bootstrap:". BootstrapUserPrefix = "system:bootstrap:" - // BootstrapGroupPattern is the valid regex pattern that all groups - // assigned to a bootstrap token by BootstrapTokenExtraGroupsKey must match. - // See also ValidateBootstrapGroupName(). - BootstrapGroupPattern = "system:bootstrappers:[a-z0-9:-]{0,255}[a-z0-9]" - // BootstrapDefaultGroup is the default group for bootstrapping bearer // tokens (in addition to any groups from BootstrapTokenExtraGroupsKey). BootstrapDefaultGroup = "system:bootstrappers" + + // BootstrapGroupPattern is the valid regex pattern that all groups + // assigned to a bootstrap token by BootstrapTokenExtraGroupsKey must match. + // See also util.ValidateBootstrapGroupName() + BootstrapGroupPattern = `\Asystem:bootstrappers:[a-z0-9:-]{0,255}[a-z0-9]\z` + + // BootstrapTokenPattern defines the {id}.{secret} regular expression pattern + BootstrapTokenPattern = `\A([a-z0-9]{6})\.([a-z0-9]{16})\z` + + // BootstrapTokenIDPattern defines token's id regular expression pattern + BootstrapTokenIDPattern = `\A([a-z0-9]{6})\z` + + // BootstrapTokenIDBytes defines the number of bytes used for the Bootstrap Token's ID field + BootstrapTokenIDBytes = 6 + + // BootstrapTokenSecretBytes defines the number of bytes used the Bootstrap Token's Secret field + BootstrapTokenSecretBytes = 16 ) // KnownTokenUsages specifies the known functions a token will get. diff --git a/vendor/k8s.io/client-go/tools/bootstrap/token/util/BUILD b/vendor/k8s.io/client-go/tools/bootstrap/token/util/BUILD deleted file mode 100644 index 1d4d10e99..000000000 --- a/vendor/k8s.io/client-go/tools/bootstrap/token/util/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["helpers.go"], - importpath = "k8s.io/client-go/tools/bootstrap/token/util", - visibility = ["//visibility:public"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/client-go/tools/bootstrap/token/api:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["helpers_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers.go b/vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers.go index d28fd28f2..bb1fbeb65 100644 --- a/vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers.go +++ b/vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers.go @@ -17,20 +17,101 @@ limitations under the License. package util import ( + "bufio" + "crypto/rand" "fmt" - "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/client-go/tools/bootstrap/token/api" "regexp" "strings" + + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/client-go/tools/bootstrap/token/api" ) -var bootstrapGroupRegexp = regexp.MustCompile(`\A` + api.BootstrapGroupPattern + `\z`) +// validBootstrapTokenChars defines the characters a bootstrap token can consist of +const validBootstrapTokenChars = "0123456789abcdefghijklmnopqrstuvwxyz" + +var ( + // BootstrapTokenRegexp is a compiled regular expression of TokenRegexpString + BootstrapTokenRegexp = regexp.MustCompile(api.BootstrapTokenPattern) + // BootstrapTokenIDRegexp is a compiled regular expression of TokenIDRegexpString + BootstrapTokenIDRegexp = regexp.MustCompile(api.BootstrapTokenIDPattern) + // BootstrapGroupRegexp is a compiled regular expression of BootstrapGroupPattern + BootstrapGroupRegexp = regexp.MustCompile(api.BootstrapGroupPattern) +) + +// GenerateBootstrapToken generates a new, random Bootstrap Token. +func GenerateBootstrapToken() (string, error) { + tokenID, err := randBytes(api.BootstrapTokenIDBytes) + if err != nil { + return "", err + } + + tokenSecret, err := randBytes(api.BootstrapTokenSecretBytes) + if err != nil { + return "", err + } + + return TokenFromIDAndSecret(tokenID, tokenSecret), nil +} + +// randBytes returns a random string consisting of the characters in +// validBootstrapTokenChars, with the length customized by the parameter +func randBytes(length int) (string, error) { + // len("0123456789abcdefghijklmnopqrstuvwxyz") = 36 which doesn't evenly divide + // the possible values of a byte: 256 mod 36 = 4. Discard any random bytes we + // read that are >= 252 so the bytes we evenly divide the character set. + const maxByteValue = 252 + + var ( + b byte + err error + token = make([]byte, length) + ) + + reader := bufio.NewReaderSize(rand.Reader, length*2) + for i := range token { + for { + if b, err = reader.ReadByte(); err != nil { + return "", err + } + if b < maxByteValue { + break + } + } + + token[i] = validBootstrapTokenChars[int(b)%len(validBootstrapTokenChars)] + } + + return string(token), nil +} + +// TokenFromIDAndSecret returns the full token which is of the form "{id}.{secret}" +func TokenFromIDAndSecret(id, secret string) string { + return fmt.Sprintf("%s.%s", id, secret) +} + +// IsValidBootstrapToken returns whether the given string is valid as a Bootstrap Token and +// in other words satisfies the BootstrapTokenRegexp +func IsValidBootstrapToken(token string) bool { + return BootstrapTokenRegexp.MatchString(token) +} + +// IsValidBootstrapTokenID returns whether the given string is valid as a Bootstrap Token ID and +// in other words satisfies the BootstrapTokenIDRegexp +func IsValidBootstrapTokenID(tokenID string) bool { + return BootstrapTokenIDRegexp.MatchString(tokenID) +} + +// BootstrapTokenSecretName returns the expected name for the Secret storing the +// Bootstrap Token in the Kubernetes API. +func BootstrapTokenSecretName(tokenID string) string { + return fmt.Sprintf("%s%s", api.BootstrapTokenSecretPrefix, tokenID) +} // ValidateBootstrapGroupName checks if the provided group name is a valid // bootstrap group name. Returns nil if valid or a validation error if invalid. -// TODO(mattmoyer): this validation should migrate out to client-go (see https://github.com/kubernetes/client-go/issues/114) func ValidateBootstrapGroupName(name string) error { - if bootstrapGroupRegexp.Match([]byte(name)) { + if BootstrapGroupRegexp.Match([]byte(name)) { return nil } return fmt.Errorf("bootstrap group %q is invalid (must match %s)", name, api.BootstrapGroupPattern) @@ -46,7 +127,7 @@ func ValidateUsages(usages []string) error { } } if len(invalidUsages) > 0 { - return fmt.Errorf("invalide bootstrap token usage string: %s, valid usage options: %s", strings.Join(invalidUsages.List(), ","), strings.Join(api.KnownTokenUsages, ",")) + return fmt.Errorf("invalid bootstrap token usage string: %s, valid usage options: %s", strings.Join(invalidUsages.List(), ","), strings.Join(api.KnownTokenUsages, ",")) } return nil } diff --git a/vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers_test.go b/vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers_test.go index 915bf7540..a1fe6092f 100644 --- a/vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers_test.go +++ b/vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers_test.go @@ -21,6 +21,143 @@ import ( "testing" ) +func TestGenerateBootstrapToken(t *testing.T) { + token, err := GenerateBootstrapToken() + if err != nil { + t.Fatalf("GenerateBootstrapToken returned an unexpected error: %+v", err) + } + if !IsValidBootstrapToken(token) { + t.Errorf("GenerateBootstrapToken didn't generate a valid token: %q", token) + } +} + +func TestRandBytes(t *testing.T) { + var randTest = []int{ + 0, + 1, + 2, + 3, + 100, + } + + for _, rt := range randTest { + actual, err := randBytes(rt) + if err != nil { + t.Errorf("failed randBytes: %v", err) + } + if len(actual) != rt { + t.Errorf("failed randBytes:\n\texpected: %d\n\t actual: %d\n", rt, len(actual)) + } + } +} + +func TestTokenFromIDAndSecret(t *testing.T) { + var tests = []struct { + id string + secret string + expected string + }{ + {"foo", "bar", "foo.bar"}, // should use default + {"abcdef", "abcdef0123456789", "abcdef.abcdef0123456789"}, + {"h", "b", "h.b"}, + } + for _, rt := range tests { + actual := TokenFromIDAndSecret(rt.id, rt.secret) + if actual != rt.expected { + t.Errorf( + "failed TokenFromIDAndSecret:\n\texpected: %s\n\t actual: %s", + rt.expected, + actual, + ) + } + } +} + +func TestIsValidBootstrapToken(t *testing.T) { + var tests = []struct { + token string + expected bool + }{ + {token: "", expected: false}, + {token: ".", expected: false}, + {token: "1234567890123456789012", expected: false}, // invalid parcel size + {token: "12345.1234567890123456", expected: false}, // invalid parcel size + {token: ".1234567890123456", expected: false}, // invalid parcel size + {token: "123456.", expected: false}, // invalid parcel size + {token: "123456:1234567890.123456", expected: false}, // invalid separation + {token: "abcdef:1234567890123456", expected: false}, // invalid separation + {token: "Abcdef.1234567890123456", expected: false}, // invalid token id + {token: "123456.AABBCCDDEEFFGGHH", expected: false}, // invalid token secret + {token: "123456.AABBCCD-EEFFGGHH", expected: false}, // invalid character + {token: "abc*ef.1234567890123456", expected: false}, // invalid character + {token: "abcdef.1234567890123456", expected: true}, + {token: "123456.aabbccddeeffgghh", expected: true}, + {token: "ABCDEF.abcdef0123456789", expected: false}, + {token: "abcdef.abcdef0123456789", expected: true}, + {token: "123456.1234560123456789", expected: true}, + } + for _, rt := range tests { + actual := IsValidBootstrapToken(rt.token) + if actual != rt.expected { + t.Errorf( + "failed IsValidBootstrapToken for the token %q\n\texpected: %t\n\t actual: %t", + rt.token, + rt.expected, + actual, + ) + } + } +} + +func TestIsValidBootstrapTokenID(t *testing.T) { + var tests = []struct { + tokenID string + expected bool + }{ + {tokenID: "", expected: false}, + {tokenID: "1234567890123456789012", expected: false}, + {tokenID: "12345", expected: false}, + {tokenID: "Abcdef", expected: false}, + {tokenID: "ABCDEF", expected: false}, + {tokenID: "abcdef.", expected: false}, + {tokenID: "abcdef", expected: true}, + {tokenID: "123456", expected: true}, + } + for _, rt := range tests { + actual := IsValidBootstrapTokenID(rt.tokenID) + if actual != rt.expected { + t.Errorf( + "failed IsValidBootstrapTokenID for the token %q\n\texpected: %t\n\t actual: %t", + rt.tokenID, + rt.expected, + actual, + ) + } + } +} + +func TestBootstrapTokenSecretName(t *testing.T) { + var tests = []struct { + tokenID string + expected string + }{ + {"foo", "bootstrap-token-foo"}, + {"bar", "bootstrap-token-bar"}, + {"", "bootstrap-token-"}, + {"abcdef", "bootstrap-token-abcdef"}, + } + for _, rt := range tests { + actual := BootstrapTokenSecretName(rt.tokenID) + if actual != rt.expected { + t.Errorf( + "failed BootstrapTokenSecretName:\n\texpected: %s\n\t actual: %s", + rt.expected, + actual, + ) + } + } +} + func TestValidateBootstrapGroupName(t *testing.T) { tests := []struct { name string diff --git a/vendor/k8s.io/client-go/tools/cache/BUILD b/vendor/k8s.io/client-go/tools/cache/BUILD deleted file mode 100644 index 524354e87..000000000 --- a/vendor/k8s.io/client-go/tools/cache/BUILD +++ /dev/null @@ -1,103 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "controller_test.go", - "delta_fifo_test.go", - "expiration_cache_test.go", - "fifo_test.go", - "heap_test.go", - "index_test.go", - "mutation_detector_test.go", - "processor_listener_test.go", - "reflector_test.go", - "shared_informer_test.go", - "store_test.go", - "undelta_store_test.go", - ], - embed = [":go_default_library"], - race = "off", - deps = [ - "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/tools/cache/testing:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "controller.go", - "delta_fifo.go", - "doc.go", - "expiration_cache.go", - "expiration_cache_fakes.go", - "fake_custom_store.go", - "fifo.go", - "heap.go", - "index.go", - "listers.go", - "listwatch.go", - "mutation_cache.go", - "mutation_detector.go", - "reflector.go", - "reflector_metrics.go", - "shared_informer.go", - "store.go", - "thread_safe_store.go", - "undelta_store.go", - ], - importpath = "k8s.io/client-go/tools/cache", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/golang.org/x/net/context:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/cache:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/pager:go_default_library", - "//vendor/k8s.io/client-go/util/buffer:go_default_library", - "//vendor/k8s.io/client-go/util/retry:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/tools/cache/testing:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/cache/listwatch.go b/vendor/k8s.io/client-go/tools/cache/listwatch.go index 06657a3b0..8bf41f517 100644 --- a/vendor/k8s.io/client-go/tools/cache/listwatch.go +++ b/vendor/k8s.io/client-go/tools/cache/listwatch.go @@ -17,10 +17,9 @@ limitations under the License. package cache import ( + "context" "time" - "golang.org/x/net/context" - "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" diff --git a/vendor/k8s.io/client-go/tools/cache/mutation_detector.go b/vendor/k8s.io/client-go/tools/cache/mutation_detector.go index 8e6338a1b..e2aa44848 100644 --- a/vendor/k8s.io/client-go/tools/cache/mutation_detector.go +++ b/vendor/k8s.io/client-go/tools/cache/mutation_detector.go @@ -24,6 +24,8 @@ import ( "sync" "time" + "github.com/golang/glog" + "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/diff" ) @@ -43,6 +45,7 @@ func NewCacheMutationDetector(name string) CacheMutationDetector { if !mutationDetectionEnabled { return dummyMutationDetector{} } + glog.Warningln("Mutation detector is enabled, this will result in memory leakage.") return &defaultCacheMutationDetector{name: name, period: 1 * time.Second} } diff --git a/vendor/k8s.io/client-go/tools/cache/testing/BUILD b/vendor/k8s.io/client-go/tools/cache/testing/BUILD deleted file mode 100644 index d1658af4d..000000000 --- a/vendor/k8s.io/client-go/tools/cache/testing/BUILD +++ /dev/null @@ -1,45 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["fake_controller_source_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = ["fake_controller_source.go"], - importpath = "k8s.io/client-go/tools/cache/testing", - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/clientcmd/BUILD b/vendor/k8s.io/client-go/tools/clientcmd/BUILD deleted file mode 100644 index c46c76d5d..000000000 --- a/vendor/k8s.io/client-go/tools/clientcmd/BUILD +++ /dev/null @@ -1,78 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "client_config_test.go", - "loader_test.go", - "merged_client_builder_test.go", - "overrides_test.go", - "validation_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/github.com/ghodss/yaml:go_default_library", - "//vendor/github.com/imdario/mergo:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api/latest:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "auth_loaders.go", - "client_config.go", - "config.go", - "doc.go", - "flag.go", - "helpers.go", - "loader.go", - "merged_client_builder.go", - "overrides.go", - "validation.go", - ], - importpath = "k8s.io/client-go/tools/clientcmd", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/howeyc/gopass:go_default_library", - "//vendor/github.com/imdario/mergo:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/auth:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api/latest:go_default_library", - "//vendor/k8s.io/client-go/util/homedir:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/tools/clientcmd/api:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/BUILD b/vendor/k8s.io/client-go/tools/clientcmd/api/BUILD deleted file mode 100644 index b2fd13824..000000000 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "helpers_test.go", - "types_test.go", - ], - embed = [":go_default_library"], - deps = ["//vendor/github.com/ghodss/yaml:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "helpers.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/client-go/tools/clientcmd/api", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/latest:all-srcs", - "//staging/src/k8s.io/client-go/tools/clientcmd/api/v1:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/latest/BUILD b/vendor/k8s.io/client-go/tools/clientcmd/api/latest/BUILD deleted file mode 100644 index 308319e22..000000000 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/latest/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["latest.go"], - importpath = "k8s.io/client-go/tools/clientcmd/api/latest", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api/v1:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/v1/BUILD b/vendor/k8s.io/client-go/tools/clientcmd/api/v1/BUILD deleted file mode 100644 index 2b9daaf08..000000000 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/v1/BUILD +++ /dev/null @@ -1,37 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "conversion.go", - "doc.go", - "register.go", - "types.go", - "zz_generated.deepcopy.go", - ], - importpath = "k8s.io/client-go/tools/clientcmd/api/v1", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/client-go/tools/clientcmd/api:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/v1/conversion.go b/vendor/k8s.io/client-go/tools/clientcmd/api/v1/conversion.go index b47bfbca2..2d7142e6e 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/v1/conversion.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/api/v1/conversion.go @@ -17,6 +17,7 @@ limitations under the License. package v1 import ( + "fmt" "sort" "k8s.io/apimachinery/pkg/conversion" @@ -105,7 +106,11 @@ func addConversionFuncs(scheme *runtime.Scheme) error { if err := s.Convert(&curr.Cluster, newCluster, 0); err != nil { return err } - (*out)[curr.Name] = newCluster + if (*out)[curr.Name] == nil { + (*out)[curr.Name] = newCluster + } else { + return fmt.Errorf("error converting *[]NamedCluster into *map[string]*api.Cluster: duplicate name \"%v\" in list: %v", curr.Name, *in) + } } return nil @@ -136,7 +141,11 @@ func addConversionFuncs(scheme *runtime.Scheme) error { if err := s.Convert(&curr.AuthInfo, newAuthInfo, 0); err != nil { return err } - (*out)[curr.Name] = newAuthInfo + if (*out)[curr.Name] == nil { + (*out)[curr.Name] = newAuthInfo + } else { + return fmt.Errorf("error converting *[]NamedAuthInfo into *map[string]*api.AuthInfo: duplicate name \"%v\" in list: %v", curr.Name, *in) + } } return nil @@ -167,7 +176,11 @@ func addConversionFuncs(scheme *runtime.Scheme) error { if err := s.Convert(&curr.Context, newContext, 0); err != nil { return err } - (*out)[curr.Name] = newContext + if (*out)[curr.Name] == nil { + (*out)[curr.Name] = newContext + } else { + return fmt.Errorf("error converting *[]NamedContext into *map[string]*api.Context: duplicate name \"%v\" in list: %v", curr.Name, *in) + } } return nil @@ -198,7 +211,11 @@ func addConversionFuncs(scheme *runtime.Scheme) error { if err := s.Convert(&curr.Extension, &newExtension, 0); err != nil { return err } - (*out)[curr.Name] = newExtension + if (*out)[curr.Name] == nil { + (*out)[curr.Name] = newExtension + } else { + return fmt.Errorf("error converting *[]NamedExtension into *map[string]runtime.Object: duplicate name \"%v\" in list: %v", curr.Name, *in) + } } return nil diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/v1/zz_generated.deepcopy.go b/vendor/k8s.io/client-go/tools/clientcmd/api/v1/zz_generated.deepcopy.go index 83d05b7c6..bb0f3523f 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/api/v1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/tools/clientcmd/api/zz_generated.deepcopy.go b/vendor/k8s.io/client-go/tools/clientcmd/api/zz_generated.deepcopy.go index 085c088ee..b90aa8d74 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/api/zz_generated.deepcopy.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/api/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2018 The Kubernetes Authors. +Copyright The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go b/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go index 12331f6e6..1d3c11d8f 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go @@ -23,7 +23,8 @@ import ( "io/ioutil" "os" - "github.com/howeyc/gopass" + "golang.org/x/crypto/ssh/terminal" + clientauth "k8s.io/client-go/tools/auth" ) @@ -89,8 +90,12 @@ func promptForString(field string, r io.Reader, show bool) (result string, err e _, err = fmt.Fscan(r, &result) } else { var data []byte - data, err = gopass.GetPasswdMasked() - result = string(data) + if terminal.IsTerminal(int(os.Stdin.Fd())) { + data, err = terminal.ReadPassword(int(os.Stdin.Fd())) + result = string(data) + } else { + return "", fmt.Errorf("error reading input for %s", field) + } } return result, err } diff --git a/vendor/k8s.io/client-go/tools/clientcmd/client_config.go b/vendor/k8s.io/client-go/tools/clientcmd/client_config.go index c202e6b25..66331a7ad 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/client_config.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/client_config.go @@ -27,7 +27,6 @@ import ( "github.com/golang/glog" "github.com/imdario/mergo" - "k8s.io/api/core/v1" restclient "k8s.io/client-go/rest" clientauth "k8s.io/client-go/tools/auth" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" @@ -100,6 +99,26 @@ func NewInteractiveClientConfig(config clientcmdapi.Config, contextName string, return &DirectClientConfig{config, contextName, overrides, fallbackReader, configAccess, promptedCredentials{}} } +// NewClientConfigFromBytes takes your kubeconfig and gives you back a ClientConfig +func NewClientConfigFromBytes(configBytes []byte) (ClientConfig, error) { + config, err := Load(configBytes) + if err != nil { + return nil, err + } + + return &DirectClientConfig{*config, "", &ConfigOverrides{}, nil, nil, promptedCredentials{}}, nil +} + +// RESTConfigFromKubeConfig is a convenience method to give back a restconfig from your kubeconfig bytes. +// For programmatic access, this is what you want 80% of the time +func RESTConfigFromKubeConfig(configBytes []byte) (*restclient.Config, error) { + clientConfig, err := NewClientConfigFromBytes(configBytes) + if err != nil { + return nil, err + } + return clientConfig.ClientConfig() +} + func (config *DirectClientConfig) RawConfig() (clientcmdapi.Config, error) { return config.config, nil } @@ -318,7 +337,7 @@ func (config *DirectClientConfig) Namespace() (string, bool, error) { } if len(configContext.Namespace) == 0 { - return v1.NamespaceDefault, false, nil + return "default", false, nil } return configContext.Namespace, false, nil diff --git a/vendor/k8s.io/client-go/tools/clientcmd/config.go b/vendor/k8s.io/client-go/tools/clientcmd/config.go index 16ccdaf20..7092c5b10 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/config.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/config.go @@ -68,7 +68,9 @@ func (o *PathOptions) GetEnvVarFiles() []string { return []string{} } - return filepath.SplitList(envVarValue) + fileList := filepath.SplitList(envVarValue) + // prevent the same path load multiple times + return deduplicate(fileList) } func (o *PathOptions) GetLoadingPrecedence() []string { diff --git a/vendor/k8s.io/client-go/tools/clientcmd/loader.go b/vendor/k8s.io/client-go/tools/clientcmd/loader.go index 95e7b1540..3442475e2 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/loader.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/loader.go @@ -139,7 +139,9 @@ func NewDefaultClientConfigLoadingRules() *ClientConfigLoadingRules { envVarFiles := os.Getenv(RecommendedConfigPathEnvVar) if len(envVarFiles) != 0 { - chain = append(chain, filepath.SplitList(envVarFiles)...) + fileList := filepath.SplitList(envVarFiles) + // prevent the same path load multiple times + chain = append(chain, deduplicate(fileList)...) } else { chain = append(chain, RecommendedHomeFile) @@ -615,3 +617,17 @@ func MakeRelative(path, base string) (string, error) { } return path, nil } + +// deduplicate removes any duplicated values and returns a new slice, keeping the order unchanged +func deduplicate(s []string) []string { + encountered := map[string]bool{} + ret := make([]string, 0) + for i := range s { + if encountered[s[i]] { + continue + } + encountered[s[i]] = true + ret = append(ret, s[i]) + } + return ret +} diff --git a/vendor/k8s.io/client-go/tools/clientcmd/loader_test.go b/vendor/k8s.io/client-go/tools/clientcmd/loader_test.go index c2dbd019d..86eccac45 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/loader_test.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/loader_test.go @@ -201,6 +201,174 @@ func TestLoadingEmptyMaps(t *testing.T) { } } +func TestDuplicateClusterName(t *testing.T) { + configFile, _ := ioutil.TempFile("", "") + defer os.Remove(configFile.Name()) + + err := ioutil.WriteFile(configFile.Name(), []byte(` +kind: Config +apiVersion: v1 +clusters: +- cluster: + api-version: v1 + server: https://kubernetes.default.svc:443 + certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + name: kubeconfig-cluster +- cluster: + api-version: v2 + server: https://test.example.server:443 + certificate-authority: /var/run/secrets/test.example.io/serviceaccount/ca.crt + name: kubeconfig-cluster +contexts: +- context: + cluster: kubeconfig-cluster + namespace: default + user: kubeconfig-user + name: kubeconfig-context +current-context: kubeconfig-context +users: +- name: kubeconfig-user + user: + tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token +`), os.FileMode(0755)) + + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + _, err = LoadFromFile(configFile.Name()) + if err == nil || !strings.Contains(err.Error(), + "error converting *[]NamedCluster into *map[string]*api.Cluster: duplicate name \"kubeconfig-cluster\" in list") { + t.Error("Expected error in loading duplicate cluster name, got none") + } +} + +func TestDuplicateContextName(t *testing.T) { + configFile, _ := ioutil.TempFile("", "") + defer os.Remove(configFile.Name()) + + err := ioutil.WriteFile(configFile.Name(), []byte(` +kind: Config +apiVersion: v1 +clusters: +- cluster: + api-version: v1 + server: https://kubernetes.default.svc:443 + certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + name: kubeconfig-cluster +contexts: +- context: + cluster: kubeconfig-cluster + namespace: default + user: kubeconfig-user + name: kubeconfig-context +- context: + cluster: test-example-cluster + namespace: test-example + user: test-example-user + name: kubeconfig-context +current-context: kubeconfig-context +users: +- name: kubeconfig-user + user: + tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token +`), os.FileMode(0755)) + + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + _, err = LoadFromFile(configFile.Name()) + if err == nil || !strings.Contains(err.Error(), + "error converting *[]NamedContext into *map[string]*api.Context: duplicate name \"kubeconfig-context\" in list") { + t.Error("Expected error in loading duplicate context name, got none") + } +} + +func TestDuplicateUserName(t *testing.T) { + configFile, _ := ioutil.TempFile("", "") + defer os.Remove(configFile.Name()) + + err := ioutil.WriteFile(configFile.Name(), []byte(` +kind: Config +apiVersion: v1 +clusters: +- cluster: + api-version: v1 + server: https://kubernetes.default.svc:443 + certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + name: kubeconfig-cluster +contexts: +- context: + cluster: kubeconfig-cluster + namespace: default + user: kubeconfig-user + name: kubeconfig-context +current-context: kubeconfig-context +users: +- name: kubeconfig-user + user: + tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token +- name: kubeconfig-user + user: + tokenFile: /var/run/secrets/test.example.com/serviceaccount/token +`), os.FileMode(0755)) + + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + _, err = LoadFromFile(configFile.Name()) + if err == nil || !strings.Contains(err.Error(), + "error converting *[]NamedAuthInfo into *map[string]*api.AuthInfo: duplicate name \"kubeconfig-user\" in list") { + t.Error("Expected error in loading duplicate user name, got none") + } +} + +func TestDuplicateExtensionName(t *testing.T) { + configFile, _ := ioutil.TempFile("", "") + defer os.Remove(configFile.Name()) + + err := ioutil.WriteFile(configFile.Name(), []byte(` +kind: Config +apiVersion: v1 +clusters: +- cluster: + api-version: v1 + server: https://kubernetes.default.svc:443 + certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + name: kubeconfig-cluster +contexts: +- context: + cluster: kubeconfig-cluster + namespace: default + user: kubeconfig-user + name: kubeconfig-context +current-context: kubeconfig-context +users: +- name: kubeconfig-user + user: + tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token +extensions: +- extension: + bytes: test + name: test-extension +- extension: + bytes: some-example + name: test-extension +`), os.FileMode(0755)) + + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + _, err = LoadFromFile(configFile.Name()) + if err == nil || !strings.Contains(err.Error(), + "error converting *[]NamedExtension into *map[string]runtime.Object: duplicate name \"test-extension\" in list") { + t.Error("Expected error in loading duplicate extension name, got none") + } +} + func TestResolveRelativePaths(t *testing.T) { pathResolutionConfig1 := clientcmdapi.Config{ AuthInfos: map[string]*clientcmdapi.AuthInfo{ @@ -592,3 +760,30 @@ func Example_mergingEverythingNoConflicts() { // user: // token: red-token } + +func TestDeduplicate(t *testing.T) { + testCases := []struct { + src []string + expect []string + }{ + { + src: []string{"a", "b", "c", "d", "e", "f"}, + expect: []string{"a", "b", "c", "d", "e", "f"}, + }, + { + src: []string{"a", "b", "c", "b", "e", "f"}, + expect: []string{"a", "b", "c", "e", "f"}, + }, + { + src: []string{"a", "a", "b", "b", "c", "b"}, + expect: []string{"a", "b", "c"}, + }, + } + + for _, testCase := range testCases { + get := deduplicate(testCase.src) + if !reflect.DeepEqual(get, testCase.expect) { + t.Errorf("expect: %v, get: %v", testCase.expect, get) + } + } +} diff --git a/vendor/k8s.io/client-go/tools/clientcmd/merged_client_builder.go b/vendor/k8s.io/client-go/tools/clientcmd/merged_client_builder.go index 3f02111bd..05038133b 100644 --- a/vendor/k8s.io/client-go/tools/clientcmd/merged_client_builder.go +++ b/vendor/k8s.io/client-go/tools/clientcmd/merged_client_builder.go @@ -22,7 +22,6 @@ import ( "github.com/golang/glog" - "k8s.io/api/core/v1" restclient "k8s.io/client-go/rest" clientcmdapi "k8s.io/client-go/tools/clientcmd/api" ) @@ -145,7 +144,7 @@ func (config *DeferredLoadingClientConfig) Namespace() (string, bool, error) { if len(ns) > 0 { // if we got a non-default namespace from the kubeconfig, use it - if ns != v1.NamespaceDefault { + if ns != "default" { return ns, false, nil } diff --git a/vendor/k8s.io/client-go/tools/leaderelection/BUILD b/vendor/k8s.io/client-go/tools/leaderelection/BUILD deleted file mode 100644 index 22e020d8c..000000000 --- a/vendor/k8s.io/client-go/tools/leaderelection/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["leaderelection.go"], - importpath = "k8s.io/client-go/tools/leaderelection", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/tools/leaderelection/resourcelock:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["leaderelection_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake:go_default_library", - "//vendor/k8s.io/client-go/testing:go_default_library", - "//vendor/k8s.io/client-go/tools/leaderelection/resourcelock:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/tools/leaderelection/resourcelock:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/leaderelection/leaderelection.go b/vendor/k8s.io/client-go/tools/leaderelection/leaderelection.go index e41b420c9..aed55574a 100644 --- a/vendor/k8s.io/client-go/tools/leaderelection/leaderelection.go +++ b/vendor/k8s.io/client-go/tools/leaderelection/leaderelection.go @@ -74,6 +74,16 @@ func NewLeaderElector(lec LeaderElectionConfig) (*LeaderElector, error) { if lec.RenewDeadline <= time.Duration(JitterFactor*float64(lec.RetryPeriod)) { return nil, fmt.Errorf("renewDeadline must be greater than retryPeriod*JitterFactor") } + if lec.LeaseDuration < 1 { + return nil, fmt.Errorf("leaseDuration must be greater than zero") + } + if lec.RenewDeadline < 1 { + return nil, fmt.Errorf("renewDeadline must be greater than zero") + } + if lec.RetryPeriod < 1 { + return nil, fmt.Errorf("retryPeriod must be greater than zero") + } + if lec.Lock == nil { return nil, fmt.Errorf("Lock must not be nil.") } diff --git a/vendor/k8s.io/client-go/tools/leaderelection/resourcelock/BUILD b/vendor/k8s.io/client-go/tools/leaderelection/resourcelock/BUILD deleted file mode 100644 index 8a9f8104f..000000000 --- a/vendor/k8s.io/client-go/tools/leaderelection/resourcelock/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = [ - "configmaplock.go", - "endpointslock.go", - "interface.go", - ], - importpath = "k8s.io/client-go/tools/leaderelection/resourcelock", - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//vendor/k8s.io/client-go/tools/record:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/metrics/BUILD b/vendor/k8s.io/client-go/tools/metrics/BUILD deleted file mode 100644 index 7b06e0f96..000000000 --- a/vendor/k8s.io/client-go/tools/metrics/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["metrics.go"], - importpath = "k8s.io/client-go/tools/metrics", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/pager/BUILD b/vendor/k8s.io/client-go/tools/pager/BUILD deleted file mode 100644 index 4d07429af..000000000 --- a/vendor/k8s.io/client-go/tools/pager/BUILD +++ /dev/null @@ -1,49 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["pager.go"], - importpath = "k8s.io/client-go/tools/pager", - deps = [ - "//vendor/golang.org/x/net/context:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["pager_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/golang.org/x/net/context:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) diff --git a/vendor/k8s.io/client-go/tools/pager/pager.go b/vendor/k8s.io/client-go/tools/pager/pager.go index 2e0874e0e..74ea3586a 100644 --- a/vendor/k8s.io/client-go/tools/pager/pager.go +++ b/vendor/k8s.io/client-go/tools/pager/pager.go @@ -17,10 +17,9 @@ limitations under the License. package pager import ( + "context" "fmt" - "golang.org/x/net/context" - "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" diff --git a/vendor/k8s.io/client-go/tools/pager/pager_test.go b/vendor/k8s.io/client-go/tools/pager/pager_test.go index b905fc1fb..ae517cab2 100644 --- a/vendor/k8s.io/client-go/tools/pager/pager_test.go +++ b/vendor/k8s.io/client-go/tools/pager/pager_test.go @@ -17,11 +17,11 @@ limitations under the License. package pager import ( + "context" "fmt" "reflect" "testing" - "golang.org/x/net/context" "k8s.io/apimachinery/pkg/api/errors" metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/vendor/k8s.io/client-go/tools/portforward/BUILD b/vendor/k8s.io/client-go/tools/portforward/BUILD deleted file mode 100644 index e2fb01e73..000000000 --- a/vendor/k8s.io/client-go/tools/portforward/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["portforward_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "portforward.go", - ], - importpath = "k8s.io/client-go/tools/portforward", - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/record/BUILD b/vendor/k8s.io/client-go/tools/record/BUILD deleted file mode 100644 index 0799afe7e..000000000 --- a/vendor/k8s.io/client-go/tools/record/BUILD +++ /dev/null @@ -1,68 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "event_test.go", - "events_cache_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/reference:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "event.go", - "events_cache.go", - "fake.go", - ], - importpath = "k8s.io/client-go/tools/record", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/github.com/golang/groupcache/lru:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/tools/reference:go_default_library", - "//vendor/k8s.io/client-go/util/flowcontrol:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/record/event.go b/vendor/k8s.io/client-go/tools/record/event.go index b5ec44650..168dfa80c 100644 --- a/vendor/k8s.io/client-go/tools/record/event.go +++ b/vendor/k8s.io/client-go/tools/record/event.go @@ -72,6 +72,9 @@ type EventRecorder interface { // PastEventf is just like Eventf, but with an option to specify the event's 'timestamp' field. PastEventf(object runtime.Object, timestamp metav1.Time, eventtype, reason, messageFmt string, args ...interface{}) + + // AnnotatedEventf is just like eventf, but with annotations attached + AnnotatedEventf(object runtime.Object, annotations map[string]string, eventtype, reason, messageFmt string, args ...interface{}) } // EventBroadcaster knows how to receive events and send them to any EventSink, watcher, or log. @@ -225,11 +228,7 @@ func (eventBroadcaster *eventBroadcasterImpl) StartEventWatcher(eventHandler fun watcher := eventBroadcaster.Watch() go func() { defer utilruntime.HandleCrash() - for { - watchEvent, open := <-watcher.ResultChan() - if !open { - return - } + for watchEvent := range watcher.ResultChan() { event, ok := watchEvent.Object.(*v1.Event) if !ok { // This is all local, so there's no reason this should @@ -254,7 +253,7 @@ type recorderImpl struct { clock clock.Clock } -func (recorder *recorderImpl) generateEvent(object runtime.Object, timestamp metav1.Time, eventtype, reason, message string) { +func (recorder *recorderImpl) generateEvent(object runtime.Object, annotations map[string]string, timestamp metav1.Time, eventtype, reason, message string) { ref, err := ref.GetReference(recorder.scheme, object) if err != nil { glog.Errorf("Could not construct reference to: '%#v' due to: '%v'. Will not report event: '%v' '%v' '%v'", object, err, eventtype, reason, message) @@ -266,7 +265,7 @@ func (recorder *recorderImpl) generateEvent(object runtime.Object, timestamp met return } - event := recorder.makeEvent(ref, eventtype, reason, message) + event := recorder.makeEvent(ref, annotations, eventtype, reason, message) event.Source = recorder.source go func() { @@ -285,7 +284,7 @@ func validateEventType(eventtype string) bool { } func (recorder *recorderImpl) Event(object runtime.Object, eventtype, reason, message string) { - recorder.generateEvent(object, metav1.Now(), eventtype, reason, message) + recorder.generateEvent(object, nil, metav1.Now(), eventtype, reason, message) } func (recorder *recorderImpl) Eventf(object runtime.Object, eventtype, reason, messageFmt string, args ...interface{}) { @@ -293,10 +292,14 @@ func (recorder *recorderImpl) Eventf(object runtime.Object, eventtype, reason, m } func (recorder *recorderImpl) PastEventf(object runtime.Object, timestamp metav1.Time, eventtype, reason, messageFmt string, args ...interface{}) { - recorder.generateEvent(object, timestamp, eventtype, reason, fmt.Sprintf(messageFmt, args...)) + recorder.generateEvent(object, nil, timestamp, eventtype, reason, fmt.Sprintf(messageFmt, args...)) } -func (recorder *recorderImpl) makeEvent(ref *v1.ObjectReference, eventtype, reason, message string) *v1.Event { +func (recorder *recorderImpl) AnnotatedEventf(object runtime.Object, annotations map[string]string, eventtype, reason, messageFmt string, args ...interface{}) { + recorder.generateEvent(object, annotations, metav1.Now(), eventtype, reason, fmt.Sprintf(messageFmt, args...)) +} + +func (recorder *recorderImpl) makeEvent(ref *v1.ObjectReference, annotations map[string]string, eventtype, reason, message string) *v1.Event { t := metav1.Time{Time: recorder.clock.Now()} namespace := ref.Namespace if namespace == "" { @@ -304,8 +307,9 @@ func (recorder *recorderImpl) makeEvent(ref *v1.ObjectReference, eventtype, reas } return &v1.Event{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("%v.%x", ref.Name, t.UnixNano()), - Namespace: namespace, + Name: fmt.Sprintf("%v.%x", ref.Name, t.UnixNano()), + Namespace: namespace, + Annotations: annotations, }, InvolvedObject: *ref, Reason: reason, diff --git a/vendor/k8s.io/client-go/tools/record/fake.go b/vendor/k8s.io/client-go/tools/record/fake.go index c0e8eedbb..6e031daaf 100644 --- a/vendor/k8s.io/client-go/tools/record/fake.go +++ b/vendor/k8s.io/client-go/tools/record/fake.go @@ -45,6 +45,10 @@ func (f *FakeRecorder) Eventf(object runtime.Object, eventtype, reason, messageF func (f *FakeRecorder) PastEventf(object runtime.Object, timestamp metav1.Time, eventtype, reason, messageFmt string, args ...interface{}) { } +func (f *FakeRecorder) AnnotatedEventf(object runtime.Object, annotations map[string]string, eventtype, reason, messageFmt string, args ...interface{}) { + f.Eventf(object, eventtype, reason, messageFmt, args) +} + // NewFakeRecorder creates new fake event recorder with event channel with // buffer of given size. func NewFakeRecorder(bufferSize int) *FakeRecorder { diff --git a/vendor/k8s.io/client-go/tools/reference/BUILD b/vendor/k8s.io/client-go/tools/reference/BUILD deleted file mode 100644 index 47da958ab..000000000 --- a/vendor/k8s.io/client-go/tools/reference/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["ref.go"], - importpath = "k8s.io/client-go/tools/reference", - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/tools/reference/ref.go b/vendor/k8s.io/client-go/tools/reference/ref.go index 58b60fd5d..573d948a9 100644 --- a/vendor/k8s.io/client-go/tools/reference/ref.go +++ b/vendor/k8s.io/client-go/tools/reference/ref.go @@ -86,10 +86,14 @@ func GetReference(scheme *runtime.Scheme, obj runtime.Object) (*v1.ObjectReferen } // example paths: ///* parts := strings.Split(selfLinkUrl.Path, "/") - if len(parts) < 3 { + if len(parts) < 4 { return nil, fmt.Errorf("unexpected self link format: '%v'; got version '%v'", selfLink, version) } - version = parts[2] + if parts[1] == "api" { + version = parts[2] + } else { + version = parts[2] + "/" + parts[3] + } } // only has list metadata diff --git a/vendor/k8s.io/client-go/tools/reference/ref_test.go b/vendor/k8s.io/client-go/tools/reference/ref_test.go new file mode 100644 index 000000000..b0cf06a97 --- /dev/null +++ b/vendor/k8s.io/client-go/tools/reference/ref_test.go @@ -0,0 +1,72 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package reference + +import ( + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +type TestRuntimeObj struct { + metav1.TypeMeta + metav1.ObjectMeta +} + +func (o *TestRuntimeObj) DeepCopyObject() runtime.Object { + panic("die") +} + +func TestGetReferenceRefVersion(t *testing.T) { + tests := []struct { + name string + input *TestRuntimeObj + expectedRefVersion string + }{ + { + name: "api from selflink", + input: &TestRuntimeObj{ + ObjectMeta: metav1.ObjectMeta{SelfLink: "/api/v1/namespaces"}, + }, + expectedRefVersion: "v1", + }, + { + name: "foo.group/v3 from selflink", + input: &TestRuntimeObj{ + ObjectMeta: metav1.ObjectMeta{SelfLink: "/apis/foo.group/v3/namespaces"}, + }, + expectedRefVersion: "foo.group/v3", + }, + } + + scheme := runtime.NewScheme() + scheme.AddKnownTypes(schema.GroupVersion{Group: "this", Version: "is ignored"}, &TestRuntimeObj{}) + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + ref, err := GetReference(scheme, test.input) + if err != nil { + t.Fatal(err) + } + if test.expectedRefVersion != ref.APIVersion { + t.Errorf("expected %q, got %q", test.expectedRefVersion, ref.APIVersion) + } + }) + } +} diff --git a/vendor/k8s.io/client-go/tools/remotecommand/BUILD b/vendor/k8s.io/client-go/tools/remotecommand/BUILD deleted file mode 100644 index b30c122c3..000000000 --- a/vendor/k8s.io/client-go/tools/remotecommand/BUILD +++ /dev/null @@ -1,60 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "v2_test.go", - "v4_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "errorstream.go", - "remotecommand.go", - "resize.go", - "v1.go", - "v2.go", - "v3.go", - "v4.go", - ], - importpath = "k8s.io/client-go/tools/remotecommand", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/core/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/remotecommand:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - "//vendor/k8s.io/client-go/transport/spdy:go_default_library", - "//vendor/k8s.io/client-go/util/exec:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/transport/BUILD b/vendor/k8s.io/client-go/transport/BUILD deleted file mode 100644 index 71494544a..000000000 --- a/vendor/k8s.io/client-go/transport/BUILD +++ /dev/null @@ -1,48 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "cache_test.go", - "round_trippers_test.go", - "transport_test.go", - ], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "cache.go", - "config.go", - "round_trippers.go", - "transport.go", - ], - importpath = "k8s.io/client-go/transport", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/net:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/transport/spdy:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/transport/cache.go b/vendor/k8s.io/client-go/transport/cache.go index 7c40848c7..7cffe2a5f 100644 --- a/vendor/k8s.io/client-go/transport/cache.go +++ b/vendor/k8s.io/client-go/transport/cache.go @@ -43,7 +43,9 @@ type tlsCacheKey struct { caData string certData string keyData string + getCert string serverName string + dial string } func (t tlsCacheKey) String() string { @@ -51,7 +53,7 @@ func (t tlsCacheKey) String() string { if len(t.keyData) > 0 { keyText = "" } - return fmt.Sprintf("insecure:%v, caData:%#v, certData:%#v, keyData:%s, serverName:%s", t.insecure, t.caData, t.certData, keyText, t.serverName) + return fmt.Sprintf("insecure:%v, caData:%#v, certData:%#v, keyData:%s, getCert: %s, serverName:%s, dial:%s", t.insecure, t.caData, t.certData, keyText, t.getCert, t.serverName, t.dial) } func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) { @@ -75,7 +77,7 @@ func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) { return nil, err } // The options didn't require a custom TLS config - if tlsConfig == nil { + if tlsConfig == nil && config.Dial == nil { return http.DefaultTransport, nil } @@ -84,7 +86,7 @@ func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) { dial = (&net.Dialer{ Timeout: 30 * time.Second, KeepAlive: 30 * time.Second, - }).Dial + }).DialContext } // Cache a single transport for these options c.transports[key] = utilnet.SetTransportDefaults(&http.Transport{ @@ -92,7 +94,7 @@ func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) { TLSHandshakeTimeout: 10 * time.Second, TLSClientConfig: tlsConfig, MaxIdleConnsPerHost: idleConnsPerHost, - Dial: dial, + DialContext: dial, }) return c.transports[key], nil } @@ -108,6 +110,8 @@ func tlsConfigKey(c *Config) (tlsCacheKey, error) { caData: string(c.TLS.CAData), certData: string(c.TLS.CertData), keyData: string(c.TLS.KeyData), + getCert: fmt.Sprintf("%p", c.TLS.GetCert), serverName: c.TLS.ServerName, + dial: fmt.Sprintf("%p", c.Dial), }, nil } diff --git a/vendor/k8s.io/client-go/transport/cache_test.go b/vendor/k8s.io/client-go/transport/cache_test.go index 81f428de0..9b740cdec 100644 --- a/vendor/k8s.io/client-go/transport/cache_test.go +++ b/vendor/k8s.io/client-go/transport/cache_test.go @@ -17,6 +17,9 @@ limitations under the License. package transport import ( + "context" + "crypto/tls" + "net" "net/http" "testing" ) @@ -51,8 +54,12 @@ func TestTLSConfigKey(t *testing.T) { } // Make sure config fields that affect the tls config affect the cache key + dialer := net.Dialer{} + getCert := func() (*tls.Certificate, error) { return nil, nil } uniqueConfigurations := map[string]*Config{ "no tls": {}, + "dialer": {Dial: dialer.DialContext}, + "dialer2": {Dial: func(ctx context.Context, network, address string) (net.Conn, error) { return nil, nil }}, "insecure": {TLS: TLSConfig{Insecure: true}}, "cadata 1": {TLS: TLSConfig{CAData: []byte{1}}}, "cadata 2": {TLS: TLSConfig{CAData: []byte{2}}}, @@ -101,14 +108,27 @@ func TestTLSConfigKey(t *testing.T) { KeyData: []byte{1}, }, }, + "getCert1": { + TLS: TLSConfig{ + KeyData: []byte{1}, + GetCert: getCert, + }, + }, + "getCert2": { + TLS: TLSConfig{ + KeyData: []byte{1}, + GetCert: func() (*tls.Certificate, error) { return nil, nil }, + }, + }, + "getCert1, key 2": { + TLS: TLSConfig{ + KeyData: []byte{2}, + GetCert: getCert, + }, + }, } for nameA, valueA := range uniqueConfigurations { for nameB, valueB := range uniqueConfigurations { - // Don't compare to ourselves - if nameA == nameB { - continue - } - keyA, err := tlsConfigKey(valueA) if err != nil { t.Errorf("Unexpected error for %q: %v", nameA, err) @@ -119,6 +139,15 @@ func TestTLSConfigKey(t *testing.T) { t.Errorf("Unexpected error for %q: %v", nameB, err) continue } + + // Make sure we get the same key on the same config + if nameA == nameB { + if keyA != keyB { + t.Errorf("Expected identical cache keys for %q and %q, got:\n\t%s\n\t%s", nameA, nameB, keyA, keyB) + } + continue + } + if keyA == keyB { t.Errorf("Expected unique cache keys for %q and %q, got:\n\t%s\n\t%s", nameA, nameB, keyA, keyB) continue diff --git a/vendor/k8s.io/client-go/transport/config.go b/vendor/k8s.io/client-go/transport/config.go index af347dafe..4081c23e7 100644 --- a/vendor/k8s.io/client-go/transport/config.go +++ b/vendor/k8s.io/client-go/transport/config.go @@ -17,6 +17,8 @@ limitations under the License. package transport import ( + "context" + "crypto/tls" "net" "net/http" ) @@ -53,7 +55,7 @@ type Config struct { WrapTransport func(rt http.RoundTripper) http.RoundTripper // Dial specifies the dial function for creating unencrypted TCP connections. - Dial func(network, addr string) (net.Conn, error) + Dial func(ctx context.Context, network, address string) (net.Conn, error) } // ImpersonationConfig has all the available impersonation options @@ -83,7 +85,12 @@ func (c *Config) HasTokenAuth() bool { // HasCertAuth returns whether the configuration has certificate authentication or not. func (c *Config) HasCertAuth() bool { - return len(c.TLS.CertData) != 0 || len(c.TLS.CertFile) != 0 + return (len(c.TLS.CertData) != 0 || len(c.TLS.CertFile) != 0) && (len(c.TLS.KeyData) != 0 || len(c.TLS.KeyFile) != 0) +} + +// HasCertCallbacks returns whether the configuration has certificate callback or not. +func (c *Config) HasCertCallback() bool { + return c.TLS.GetCert != nil } // TLSConfig holds the information needed to set up a TLS transport. @@ -98,4 +105,6 @@ type TLSConfig struct { CAData []byte // Bytes of the PEM-encoded server trusted root certificates. Supercedes CAFile. CertData []byte // Bytes of the PEM-encoded client certificate. Supercedes CertFile. KeyData []byte // Bytes of the PEM-encoded client key. Supercedes KeyFile. + + GetCert func() (*tls.Certificate, error) // Callback that returns a TLS client certificate. CertData, CertFile, KeyData and KeyFile supercede this field. } diff --git a/vendor/k8s.io/client-go/transport/round_trippers.go b/vendor/k8s.io/client-go/transport/round_trippers.go index c728b1877..459a93760 100644 --- a/vendor/k8s.io/client-go/transport/round_trippers.go +++ b/vendor/k8s.io/client-go/transport/round_trippers.go @@ -335,7 +335,7 @@ func (r *requestInfo) toCurl() string { } } - return fmt.Sprintf("curl -k -v -X%s %s %s", r.RequestVerb, headers, r.RequestURL) + return fmt.Sprintf("curl -k -v -X%s %s '%s'", r.RequestVerb, headers, r.RequestURL) } // debuggingRoundTripper will display information about the requests passing diff --git a/vendor/k8s.io/client-go/transport/spdy/BUILD b/vendor/k8s.io/client-go/transport/spdy/BUILD deleted file mode 100644 index bf90084b6..000000000 --- a/vendor/k8s.io/client-go/transport/spdy/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["spdy.go"], - importpath = "k8s.io/client-go/transport/spdy", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/util/httpstream:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy:go_default_library", - "//vendor/k8s.io/client-go/rest:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/transport/transport.go b/vendor/k8s.io/client-go/transport/transport.go index 15be0a3e6..c19739fdf 100644 --- a/vendor/k8s.io/client-go/transport/transport.go +++ b/vendor/k8s.io/client-go/transport/transport.go @@ -28,7 +28,7 @@ import ( // or transport level security defined by the provided Config. func New(config *Config) (http.RoundTripper, error) { // Set transport level security - if config.Transport != nil && (config.HasCA() || config.HasCertAuth() || config.TLS.Insecure) { + if config.Transport != nil && (config.HasCA() || config.HasCertAuth() || config.HasCertCallback() || config.TLS.Insecure) { return nil, fmt.Errorf("using a custom transport with TLS certificate options or the insecure flag is not allowed") } @@ -52,7 +52,7 @@ func New(config *Config) (http.RoundTripper, error) { // TLSConfigFor returns a tls.Config that will provide the transport level security defined // by the provided Config. Will return nil if no transport level security is requested. func TLSConfigFor(c *Config) (*tls.Config, error) { - if !(c.HasCA() || c.HasCertAuth() || c.TLS.Insecure) { + if !(c.HasCA() || c.HasCertAuth() || c.HasCertCallback() || c.TLS.Insecure || len(c.TLS.ServerName) > 0) { return nil, nil } if c.HasCA() && c.TLS.Insecure { @@ -75,12 +75,40 @@ func TLSConfigFor(c *Config) (*tls.Config, error) { tlsConfig.RootCAs = rootCertPool(c.TLS.CAData) } + var staticCert *tls.Certificate if c.HasCertAuth() { + // If key/cert were provided, verify them before setting up + // tlsConfig.GetClientCertificate. cert, err := tls.X509KeyPair(c.TLS.CertData, c.TLS.KeyData) if err != nil { return nil, err } - tlsConfig.Certificates = []tls.Certificate{cert} + staticCert = &cert + } + + if c.HasCertAuth() || c.HasCertCallback() { + tlsConfig.GetClientCertificate = func(*tls.CertificateRequestInfo) (*tls.Certificate, error) { + // Note: static key/cert data always take precedence over cert + // callback. + if staticCert != nil { + return staticCert, nil + } + if c.HasCertCallback() { + cert, err := c.TLS.GetCert() + if err != nil { + return nil, err + } + // GetCert may return empty value, meaning no cert. + if cert != nil { + return cert, nil + } + } + + // Both c.TLS.CertData/KeyData were unset and GetCert didn't return + // anything. Return an empty tls.Certificate, no client cert will + // be sent to the server. + return &tls.Certificate{}, nil + } } return tlsConfig, nil diff --git a/vendor/k8s.io/client-go/transport/transport_test.go b/vendor/k8s.io/client-go/transport/transport_test.go index 4d2d78f86..2e9896a08 100644 --- a/vendor/k8s.io/client-go/transport/transport_test.go +++ b/vendor/k8s.io/client-go/transport/transport_test.go @@ -17,6 +17,8 @@ limitations under the License. package transport import ( + "crypto/tls" + "errors" "net/http" "testing" ) @@ -94,6 +96,8 @@ func TestNew(t *testing.T) { Config *Config Err bool TLS bool + TLSCert bool + TLSErr bool Default bool }{ "default transport": { @@ -101,6 +105,13 @@ func TestNew(t *testing.T) { Config: &Config{}, }, + "server name": { + TLS: true, + Config: &Config{TLS: TLSConfig{ + ServerName: "foo", + }}, + }, + "ca transport": { TLS: true, Config: &Config{ @@ -128,7 +139,8 @@ func TestNew(t *testing.T) { }, "cert transport": { - TLS: true, + TLS: true, + TLSCert: true, Config: &Config{ TLS: TLSConfig{ CAData: []byte(rootCACert), @@ -158,7 +170,8 @@ func TestNew(t *testing.T) { }, }, "key data overriding bad file cert transport": { - TLS: true, + TLS: true, + TLSCert: true, Config: &Config{ TLS: TLSConfig{ CAData: []byte(rootCACert), @@ -168,37 +181,108 @@ func TestNew(t *testing.T) { }, }, }, + "callback cert and key": { + TLS: true, + TLSCert: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + GetCert: func() (*tls.Certificate, error) { + crt, err := tls.X509KeyPair([]byte(certData), []byte(keyData)) + return &crt, err + }, + }, + }, + }, + "cert callback error": { + TLS: true, + TLSCert: true, + TLSErr: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + GetCert: func() (*tls.Certificate, error) { + return nil, errors.New("GetCert failure") + }, + }, + }, + }, + "cert data overrides empty callback result": { + TLS: true, + TLSCert: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + GetCert: func() (*tls.Certificate, error) { + return nil, nil + }, + CertData: []byte(certData), + KeyData: []byte(keyData), + }, + }, + }, + "callback returns nothing": { + TLS: true, + TLSCert: true, + Config: &Config{ + TLS: TLSConfig{ + CAData: []byte(rootCACert), + GetCert: func() (*tls.Certificate, error) { + return nil, nil + }, + }, + }, + }, } for k, testCase := range testCases { - transport, err := New(testCase.Config) - switch { - case testCase.Err && err == nil: - t.Errorf("%s: unexpected non-error", k) - continue - case !testCase.Err && err != nil: - t.Errorf("%s: unexpected error: %v", k, err) - continue - } + t.Run(k, func(t *testing.T) { + rt, err := New(testCase.Config) + switch { + case testCase.Err && err == nil: + t.Fatal("unexpected non-error") + case !testCase.Err && err != nil: + t.Fatalf("unexpected error: %v", err) + } + if testCase.Err { + return + } - switch { - case testCase.Default && transport != http.DefaultTransport: - t.Errorf("%s: expected the default transport, got %#v", k, transport) - continue - case !testCase.Default && transport == http.DefaultTransport: - t.Errorf("%s: expected non-default transport, got %#v", k, transport) - continue - } + switch { + case testCase.Default && rt != http.DefaultTransport: + t.Fatalf("got %#v, expected the default transport", rt) + case !testCase.Default && rt == http.DefaultTransport: + t.Fatalf("got %#v, expected non-default transport", rt) + } - // We only know how to check TLSConfig on http.Transports - if transport, ok := transport.(*http.Transport); ok { + // We only know how to check TLSConfig on http.Transports + transport := rt.(*http.Transport) switch { case testCase.TLS && transport.TLSClientConfig == nil: - t.Errorf("%s: expected TLSClientConfig, got %#v", k, transport) - continue + t.Fatalf("got %#v, expected TLSClientConfig", transport) case !testCase.TLS && transport.TLSClientConfig != nil: - t.Errorf("%s: expected no TLSClientConfig, got %#v", k, transport) - continue + t.Fatalf("got %#v, expected no TLSClientConfig", transport) } - } + if !testCase.TLS { + return + } + + switch { + case testCase.TLSCert && transport.TLSClientConfig.GetClientCertificate == nil: + t.Fatalf("got %#v, expected TLSClientConfig.GetClientCertificate", transport.TLSClientConfig) + case !testCase.TLSCert && transport.TLSClientConfig.GetClientCertificate != nil: + t.Fatalf("got %#v, expected no TLSClientConfig.GetClientCertificate", transport.TLSClientConfig) + } + if !testCase.TLSCert { + return + } + + _, err = transport.TLSClientConfig.GetClientCertificate(nil) + switch { + case testCase.TLSErr && err == nil: + t.Error("got nil error from GetClientCertificate, expected non-nil") + case !testCase.TLSErr && err != nil: + t.Errorf("got error from GetClientCertificate: %q, expected nil", err) + } + }) } } diff --git a/vendor/k8s.io/client-go/util/buffer/BUILD b/vendor/k8s.io/client-go/util/buffer/BUILD deleted file mode 100644 index d3b2652ce..000000000 --- a/vendor/k8s.io/client-go/util/buffer/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") - -go_library( - name = "go_default_library", - srcs = ["ring_growing.go"], - importpath = "k8s.io/client-go/util/buffer", - visibility = ["//visibility:public"], -) - -go_test( - name = "go_default_test", - srcs = ["ring_growing_test.go"], - embed = [":go_default_library"], - deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/util/buffer/ring_growing_test.go b/vendor/k8s.io/client-go/util/buffer/ring_growing_test.go index 231b836c0..31a4c079d 100644 --- a/vendor/k8s.io/client-go/util/buffer/ring_growing_test.go +++ b/vendor/k8s.io/client-go/util/buffer/ring_growing_test.go @@ -39,7 +39,7 @@ func TestGrowth(t *testing.T) { } assert.Equalf(t, x, read, "expected to have read %d items: %d", x, read) assert.Zerof(t, g.readable, "expected readable to be zero: %d", g.readable) - assert.Equalf(t, g.n, 16, "expected N to be 16: %d", g.n) + assert.Equalf(t, 16, g.n, "expected N to be 16: %d", g.n) } func TestEmpty(t *testing.T) { diff --git a/vendor/k8s.io/client-go/util/cert/BUILD b/vendor/k8s.io/client-go/util/cert/BUILD deleted file mode 100644 index 799979d46..000000000 --- a/vendor/k8s.io/client-go/util/cert/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "csr_test.go", - "pem_test.go", - ], - data = glob(["testdata/**"]), - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "cert.go", - "csr.go", - "io.go", - "pem.go", - ], - data = [ - "testdata/dontUseThisKey.pem", - ], - importpath = "k8s.io/client-go/util/cert", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/util/cert/triple:all-srcs", - ], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/cert/io.go b/vendor/k8s.io/client-go/util/cert/io.go index a41f8054a..a57bf09d5 100644 --- a/vendor/k8s.io/client-go/util/cert/io.go +++ b/vendor/k8s.io/client-go/util/cert/io.go @@ -17,7 +17,11 @@ limitations under the License. package cert import ( + "crypto" + "crypto/ecdsa" + "crypto/rsa" "crypto/x509" + "encoding/pem" "fmt" "io/ioutil" "os" @@ -84,7 +88,8 @@ func WriteKey(keyPath string, data []byte) error { // can't find one, it will generate a new key and store it there. func LoadOrGenerateKeyFile(keyPath string) (data []byte, wasGenerated bool, err error) { loadedData, err := ioutil.ReadFile(keyPath) - if err == nil { + // Call verifyKeyData to ensure the file wasn't empty/corrupt. + if err == nil && verifyKeyData(loadedData) { return loadedData, false, err } if !os.IsNotExist(err) { @@ -101,6 +106,27 @@ func LoadOrGenerateKeyFile(keyPath string) (data []byte, wasGenerated bool, err return generatedData, true, nil } +// MarshalPrivateKeyToPEM converts a known private key type of RSA or ECDSA to +// a PEM encoded block or returns an error. +func MarshalPrivateKeyToPEM(privateKey crypto.PrivateKey) ([]byte, error) { + switch t := privateKey.(type) { + case *ecdsa.PrivateKey: + derBytes, err := x509.MarshalECPrivateKey(t) + if err != nil { + return nil, err + } + privateKeyPemBlock := &pem.Block{ + Type: ECPrivateKeyBlockType, + Bytes: derBytes, + } + return pem.EncodeToMemory(privateKeyPemBlock), nil + case *rsa.PrivateKey: + return EncodePrivateKeyPEM(t), nil + default: + return nil, fmt.Errorf("private key is not a recognized type: %T", privateKey) + } +} + // NewPool returns an x509.CertPool containing the certificates in the given PEM-encoded file. // Returns an error if the file could not be read, a certificate could not be parsed, or if the file does not contain any certificates func NewPool(filename string) (*x509.CertPool, error) { @@ -156,3 +182,12 @@ func PublicKeysFromFile(file string) ([]interface{}, error) { } return keys, nil } + +// verifyKeyData returns true if the provided data appears to be a valid private key. +func verifyKeyData(data []byte) bool { + if len(data) == 0 { + return false + } + _, err := ParsePrivateKeyPEM(data) + return err == nil +} diff --git a/vendor/k8s.io/client-go/util/cert/triple/BUILD b/vendor/k8s.io/client-go/util/cert/triple/BUILD deleted file mode 100644 index 6399d0e95..000000000 --- a/vendor/k8s.io/client-go/util/cert/triple/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["triple.go"], - importpath = "k8s.io/client-go/util/cert/triple", - deps = ["//vendor/k8s.io/client-go/util/cert:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/certificate/BUILD b/vendor/k8s.io/client-go/util/certificate/BUILD deleted file mode 100644 index dfc5c3933..000000000 --- a/vendor/k8s.io/client-go/util/certificate/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -licenses(["notice"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "certificate_manager_test.go", - "certificate_store_test.go", - ], - embed = [":go_default_library"], - tags = ["automanaged"], - deps = [ - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/util/cert:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "certificate_manager.go", - "certificate_store.go", - ], - importpath = "k8s.io/client-go/util/certificate", - tags = ["automanaged"], - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/util/cert:go_default_library", - "//vendor/k8s.io/client-go/util/certificate/csr:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//staging/src/k8s.io/client-go/util/certificate/csr:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/client-go/util/certificate/certificate_store.go b/vendor/k8s.io/client-go/util/certificate/certificate_store.go index 42a40dcdf..f54bd6586 100644 --- a/vendor/k8s.io/client-go/util/certificate/certificate_store.go +++ b/vendor/k8s.io/client-go/util/certificate/certificate_store.go @@ -46,6 +46,15 @@ type fileStore struct { keyFile string } +// FileStore is a store that provides certificate retrieval as well as +// the path on disk of the current PEM. +type FileStore interface { + Store + // CurrentPath returns the path on disk of the current certificate/key + // pair encoded as PEM files. + CurrentPath() string +} + // NewFileStore returns a concrete implementation of a Store that is based on // storing the cert/key pairs in a single file per pair on disk in the // designated directory. When starting up it will look for the currently @@ -64,7 +73,7 @@ func NewFileStore( certDirectory string, keyDirectory string, certFile string, - keyFile string) (Store, error) { + keyFile string) (FileStore, error) { s := fileStore{ pairNamePrefix: pairNamePrefix, @@ -79,6 +88,11 @@ func NewFileStore( return &s, nil } +// CurrentPath returns the path to the current version of these certificates. +func (s *fileStore) CurrentPath() string { + return filepath.Join(s.certDirectory, s.filename(currentPair)) +} + // recover checks if there is a certificate rotation that was interrupted while // progress, and if so, attempts to recover to a good state. func (s *fileStore) recover() error { diff --git a/vendor/k8s.io/client-go/util/certificate/csr/BUILD b/vendor/k8s.io/client-go/util/certificate/csr/BUILD deleted file mode 100644 index c1bcd9578..000000000 --- a/vendor/k8s.io/client-go/util/certificate/csr/BUILD +++ /dev/null @@ -1,53 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["csr.go"], - importpath = "k8s.io/client-go/util/certificate/csr", - deps = [ - "//vendor/github.com/golang/glog:go_default_library", - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/fields:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/tools/cache:go_default_library", - "//vendor/k8s.io/client-go/util/cert:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) - -go_test( - name = "go_default_test", - srcs = ["csr_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/api/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", - "//vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1:go_default_library", - "//vendor/k8s.io/client-go/util/cert:go_default_library", - ], -) diff --git a/vendor/k8s.io/client-go/util/connrotation/connrotation.go b/vendor/k8s.io/client-go/util/connrotation/connrotation.go new file mode 100644 index 000000000..235a9e019 --- /dev/null +++ b/vendor/k8s.io/client-go/util/connrotation/connrotation.go @@ -0,0 +1,105 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package connrotation implements a connection dialer that tracks and can close +// all created connections. +// +// This is used for credential rotation of long-lived connections, when there's +// no way to re-authenticate on a live connection. +package connrotation + +import ( + "context" + "net" + "sync" +) + +// DialFunc is a shorthand for signature of net.DialContext. +type DialFunc func(ctx context.Context, network, address string) (net.Conn, error) + +// Dialer opens connections through Dial and tracks them. +type Dialer struct { + dial DialFunc + + mu sync.Mutex + conns map[*closableConn]struct{} +} + +// NewDialer creates a new Dialer instance. +// +// If dial is not nil, it will be used to create new underlying connections. +// Otherwise net.DialContext is used. +func NewDialer(dial DialFunc) *Dialer { + return &Dialer{ + dial: dial, + conns: make(map[*closableConn]struct{}), + } +} + +// CloseAll forcibly closes all tracked connections. +// +// Note: new connections may get created before CloseAll returns. +func (d *Dialer) CloseAll() { + d.mu.Lock() + conns := d.conns + d.conns = make(map[*closableConn]struct{}) + d.mu.Unlock() + + for conn := range conns { + conn.Close() + } +} + +// Dial creates a new tracked connection. +func (d *Dialer) Dial(network, address string) (net.Conn, error) { + return d.DialContext(context.Background(), network, address) +} + +// DialContext creates a new tracked connection. +func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { + conn, err := d.dial(ctx, network, address) + if err != nil { + return nil, err + } + + closable := &closableConn{Conn: conn} + + // Start tracking the connection + d.mu.Lock() + d.conns[closable] = struct{}{} + d.mu.Unlock() + + // When the connection is closed, remove it from the map. This will + // be no-op if the connection isn't in the map, e.g. if CloseAll() + // is called. + closable.onClose = func() { + d.mu.Lock() + delete(d.conns, closable) + d.mu.Unlock() + } + + return closable, nil +} + +type closableConn struct { + onClose func() + net.Conn +} + +func (c *closableConn) Close() error { + go c.onClose() + return c.Conn.Close() +} diff --git a/vendor/k8s.io/client-go/util/connrotation/connrotation_test.go b/vendor/k8s.io/client-go/util/connrotation/connrotation_test.go new file mode 100644 index 000000000..a618f2961 --- /dev/null +++ b/vendor/k8s.io/client-go/util/connrotation/connrotation_test.go @@ -0,0 +1,61 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package connrotation + +import ( + "context" + "net" + "testing" + "time" +) + +func TestCloseAll(t *testing.T) { + closed := make(chan struct{}) + dialFn := func(ctx context.Context, network, address string) (net.Conn, error) { + return closeOnlyConn{onClose: func() { closed <- struct{}{} }}, nil + } + dialer := NewDialer(dialFn) + + const numConns = 10 + + // Outer loop to ensure Dialer is re-usable after CloseAll. + for i := 0; i < 5; i++ { + for j := 0; j < numConns; j++ { + if _, err := dialer.Dial("", ""); err != nil { + t.Fatal(err) + } + } + dialer.CloseAll() + for j := 0; j < numConns; j++ { + select { + case <-closed: + case <-time.After(time.Second): + t.Fatalf("iteration %d: 1s after CloseAll only %d/%d connections closed", i, j, numConns) + } + } + } +} + +type closeOnlyConn struct { + net.Conn + onClose func() +} + +func (c closeOnlyConn) Close() error { + go c.onClose() + return nil +} diff --git a/vendor/k8s.io/client-go/util/exec/BUILD b/vendor/k8s.io/client-go/util/exec/BUILD deleted file mode 100644 index 57b58e5cc..000000000 --- a/vendor/k8s.io/client-go/util/exec/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["exec.go"], - importpath = "k8s.io/client-go/util/exec", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/flowcontrol/BUILD b/vendor/k8s.io/client-go/util/flowcontrol/BUILD deleted file mode 100644 index 819bb7ef3..000000000 --- a/vendor/k8s.io/client-go/util/flowcontrol/BUILD +++ /dev/null @@ -1,44 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "backoff_test.go", - "throttle_test.go", - ], - embed = [":go_default_library"], - deps = ["//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "backoff.go", - "throttle.go", - ], - importpath = "k8s.io/client-go/util/flowcontrol", - deps = [ - "//vendor/golang.org/x/time/rate:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/client-go/util/integer:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/homedir/BUILD b/vendor/k8s.io/client-go/util/homedir/BUILD deleted file mode 100644 index 21a1952cf..000000000 --- a/vendor/k8s.io/client-go/util/homedir/BUILD +++ /dev/null @@ -1,25 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) - -go_library( - name = "go_default_library", - srcs = ["homedir.go"], - importpath = "k8s.io/client-go/util/homedir", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/integer/BUILD b/vendor/k8s.io/client-go/util/integer/BUILD deleted file mode 100644 index 8a2105e46..000000000 --- a/vendor/k8s.io/client-go/util/integer/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["integer_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = ["integer.go"], - importpath = "k8s.io/client-go/util/integer", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/jsonpath/BUILD b/vendor/k8s.io/client-go/util/jsonpath/BUILD deleted file mode 100644 index ab43accd6..000000000 --- a/vendor/k8s.io/client-go/util/jsonpath/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "jsonpath_test.go", - "parser_test.go", - ], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "jsonpath.go", - "node.go", - "parser.go", - ], - importpath = "k8s.io/client-go/util/jsonpath", - deps = ["//vendor/k8s.io/client-go/third_party/forked/golang/template:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/retry/BUILD b/vendor/k8s.io/client-go/util/retry/BUILD deleted file mode 100644 index d74581310..000000000 --- a/vendor/k8s.io/client-go/util/retry/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["util.go"], - importpath = "k8s.io/client-go/util/retry", - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -go_test( - name = "go_default_test", - srcs = ["util_test.go"], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/testing/BUILD b/vendor/k8s.io/client-go/util/testing/BUILD deleted file mode 100644 index 726a30f92..000000000 --- a/vendor/k8s.io/client-go/util/testing/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = ["fake_handler_test.go"], - embed = [":go_default_library"], -) - -go_library( - name = "go_default_library", - srcs = [ - "fake_handler.go", - "tmpdir.go", - ], - importpath = "k8s.io/client-go/util/testing", -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/workqueue/BUILD b/vendor/k8s.io/client-go/util/workqueue/BUILD deleted file mode 100644 index 7fb9fba48..000000000 --- a/vendor/k8s.io/client-go/util/workqueue/BUILD +++ /dev/null @@ -1,59 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_test( - name = "go_default_test", - srcs = [ - "default_rate_limiters_test.go", - "delaying_queue_test.go", - "rate_limitting_queue_test.go", - ], - embed = [":go_default_library"], - deps = [ - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", - ], -) - -go_library( - name = "go_default_library", - srcs = [ - "default_rate_limiters.go", - "delaying_queue.go", - "doc.go", - "metrics.go", - "parallelizer.go", - "queue.go", - "rate_limitting_queue.go", - ], - importpath = "k8s.io/client-go/util/workqueue", - deps = [ - "//vendor/golang.org/x/time/rate:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/clock:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", - ], -) - -go_test( - name = "go_default_xtest", - srcs = ["queue_test.go"], - deps = ["//vendor/k8s.io/client-go/util/workqueue:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/vendor/k8s.io/client-go/util/workqueue/delaying_queue.go b/vendor/k8s.io/client-go/util/workqueue/delaying_queue.go index c62ed32ef..a37177425 100644 --- a/vendor/k8s.io/client-go/util/workqueue/delaying_queue.go +++ b/vendor/k8s.io/client-go/util/workqueue/delaying_queue.go @@ -45,7 +45,7 @@ func newDelayingQueue(clock clock.Clock, name string) DelayingInterface { ret := &delayingType{ Interface: NewNamed(name), clock: clock, - heartbeat: clock.Tick(maxWait), + heartbeat: clock.NewTicker(maxWait), stopCh: make(chan struct{}), waitingForAddCh: make(chan *waitFor, 1000), metrics: newRetryMetrics(name), @@ -67,10 +67,7 @@ type delayingType struct { stopCh chan struct{} // heartbeat ensures we wait no more than maxWait before firing - // - // TODO: replace with Ticker (and add to clock) so this can be cleaned up. - // clock.Tick will leak. - heartbeat <-chan time.Time + heartbeat clock.Ticker // waitingForAddCh is a buffered channel that feeds waitingForAdd waitingForAddCh chan *waitFor @@ -138,6 +135,7 @@ func (pq waitForPriorityQueue) Peek() interface{} { func (q *delayingType) ShutDown() { q.Interface.ShutDown() close(q.stopCh) + q.heartbeat.Stop() } // AddAfter adds the given item to the work queue after the given delay @@ -209,7 +207,7 @@ func (q *delayingType) waitingLoop() { case <-q.stopCh: return - case <-q.heartbeat: + case <-q.heartbeat.C(): // continue the loop, which will add ready items case <-nextReadyAt: diff --git a/vendor/k8s.io/client-go/util/workqueue/rate_limitting_queue_test.go b/vendor/k8s.io/client-go/util/workqueue/rate_limitting_queue_test.go index 32d7fc906..3fbe07d0d 100644 --- a/vendor/k8s.io/client-go/util/workqueue/rate_limitting_queue_test.go +++ b/vendor/k8s.io/client-go/util/workqueue/rate_limitting_queue_test.go @@ -30,7 +30,7 @@ func TestRateLimitingQueue(t *testing.T) { delayingQueue := &delayingType{ Interface: New(), clock: fakeClock, - heartbeat: fakeClock.Tick(maxWait), + heartbeat: fakeClock.NewTicker(maxWait), stopCh: make(chan struct{}), waitingForAddCh: make(chan *waitFor, 1000), metrics: newRetryMetrics(""),