Browse code

Update k8s and calico to fix CVE-2019-1002101

Change-Id: Ia4c29fe216159ea60d4f3f2990c87638b73e1389
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/7194
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Anish Swaminathan <anishs@vmware.com>

ashwin-h authored on 2019/05/21 18:34:36
Showing 9 changed files
... ...
@@ -1,19 +1,19 @@
1 1
 Summary:        Calico networking for CNI
2 2
 Name:           calico-cni
3
-Version:        1.11.2
4
-Release:        3%{?dist}
3
+Version:        3.6.1
4
+Release:        1%{?dist}
5 5
 License:        ASL 2.0
6 6
 URL:            https://github.com/projectcalico/cni-plugin
7 7
 Source0:        %{name}-%{version}.tar.gz
8
-%define sha1 calico-cni=c12ce655eb5b1cd42c3976d6bf4ac3ebcbc4dc86
8
+%define sha1 calico-cni=e60d82f07543229e1249fe377840ff0b3a019f8f
9 9
 Source1:        %{name}-vendor-cache-%{version}.tar.gz
10
-%define sha1 calico-cni-vendor-cache=7c64de41b90cc74231090441ff359936689737df
10
+%define sha1 calico-cni-vendor-cache=9be4dba31d2ca0a9154a5b8a6f722b1f19c8abd1
11 11
 Group:          Development/Tools
12 12
 Vendor:         VMware, Inc.
13 13
 Distribution:   Photon
14 14
 BuildRequires:  git
15 15
 BuildRequires:  glide
16
-BuildRequires:  go = 1.9.7
16
+BuildRequires:  go >= 1.11.9
17 17
 Requires:       cni
18 18
 %define debug_package %{nil}
19 19
 
... ...
@@ -39,8 +39,8 @@ mkdir -p ~/.glide
39 39
 tar -C ~/.glide -xf %{SOURCE1}
40 40
 glide install --strip-vendor
41 41
 mkdir -p dist
42
-CGO_ENABLED=0 go build -v -i -o dist/calico -ldflags "-X main.VERSION= -s -w" calico.go
43
-CGO_ENABLED=0 go build -v -i -o dist/calico-ipam -ldflags "-X main.VERSION= -s -w" ipam/calico-ipam.go
42
+CGO_ENABLED=0 go build -v -i -o dist/calico -ldflags "-X main.VERSION= -s -w" cmd/calico/calico.go
43
+CGO_ENABLED=0 go build -v -i -o dist/calico-ipam -ldflags "-X main.VERSION= -s -w" cmd/calico-ipam/calico-ipam.go
44 44
 
45 45
 %install
46 46
 cd ../build/src/github.com/projectcalico/cni-plugin
... ...
@@ -59,6 +59,8 @@ install -vpm 0755 -t %{buildroot}/usr/share/calico-cni/k8s/ k8s-install/scripts/
59 59
 /usr/share/calico-cni/k8s/calico.conf.default
60 60
 
61 61
 %changelog
62
+*   Wed May 08 2019 Ashwin H <ashwinh@vmware.com> 3.6.1-1
63
+-   Update to 3.6.1
62 64
 *   Mon Jan 21 2019 Bo Gan <ganb@vmware.com> 1.11.2-3
63 65
 -   Build using go 1.9.7
64 66
 *   Mon Sep 24 2018 Tapas Kundu <tkundu@vmware.com> 1.11.2-2
... ...
@@ -1,61 +1,54 @@
1 1
 Summary:        Calico node and documentation for project calico.
2 2
 Name:           calico
3
-Version:        2.6.7
4
-Release:        4%{?dist}
3
+Version:        3.6.1
4
+Release:        1%{?dist}
5 5
 License:        Apache-2.0
6 6
 URL:            https://github.com/projectcalico/calico
7 7
 Source0:        %{name}-%{version}.tar.gz
8
-%define sha1 calico=d74b2103f84ed470322b5f33b75cf552db93d830
9
-Source1:         go-27704.patch
10
-Source2:         go-27842.patch
8
+%define sha1 calico=43310c3ae20b7806ae030d11ae99c135a35badac
11 9
 Group:          Development/Tools
12 10
 Vendor:         VMware, Inc.
13 11
 Distribution:   Photon
14 12
 BuildRequires:  git
15 13
 BuildRequires:  glide
16
-BuildRequires:  go = 1.9.7
14
+BuildRequires:  go >= 1.11
17 15
 BuildRequires:  make
18 16
 
19 17
 %description
20 18
 Calico node is a container that bundles together various components reqiured for networking containers using project calico. This includes key components such as felix agent for programming routes and ACLs, BIRD routing daemon, and confd datastore monitor engine.
21 19
 
22 20
 %prep
23
-%setup
21
+%setup -n node-%{version}
24 22
 
25 23
 %build
26 24
 mkdir -p /root/.glide
27
-mkdir -p ${GOPATH}/src/github.com/projectcalico/calico
28
-cp -r * ${GOPATH}/src/github.com/projectcalico/calico/.
29
-pushd ${GOPATH}/src/github.com/projectcalico/calico
30
-cd calico_node
25
+mkdir -p ${GOPATH}/src/github.com/projectcalico/node
26
+cp -r * ${GOPATH}/src/github.com/projectcalico/node
27
+pushd ${GOPATH}/src/github.com/projectcalico/node
31 28
 glide install --strip-vendor
32
-pushd vendor/golang.org/x/net
33
-patch -p1 < %{SOURCE1}
34
-patch -p1 < %{SOURCE2}
35
-popd
36 29
 mkdir -p dist
37 30
 mkdir -p .go-pkg-cache
38
-make CALICO_GIT_VER=%{version} allocate-ipip-addr
39
-make CALICO_GIT_VER=%{version} startup
31
+GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -v -i -o dist/calico-node cmd/calico-node/main.go
32
+popd
40 33
 
41 34
 %install
42
-pushd ${GOPATH}/src/github.com/projectcalico/calico
35
+pushd ${GOPATH}/src/github.com/projectcalico
43 36
 install -vdm 755 %{buildroot}%{_bindir}
44
-install calico_node/dist/allocate-ipip-addr %{buildroot}%{_bindir}/
45
-install calico_node/dist/startup %{buildroot}%{_bindir}/
37
+install node/dist/calico-node %{buildroot}%{_bindir}/
46 38
 install -vdm 0755 %{buildroot}/usr/share/calico/docker/fs
47
-cp -r calico_node/filesystem/etc %{buildroot}/usr/share/calico/docker/fs/
48
-cp -r calico_node/filesystem/sbin %{buildroot}/usr/share/calico/docker/fs/
39
+cp -r node/filesystem/etc %{buildroot}/usr/share/calico/docker/fs/
40
+cp -r node/filesystem/sbin %{buildroot}/usr/share/calico/docker/fs/
49 41
 sed -i 's/. startup.env/source \/startup.env/g' %{buildroot}/usr/share/calico/docker/fs/etc/rc.local
50 42
 sed -i 's/. startup.env/source \/startup.env/g' %{buildroot}/usr/share/calico/docker/fs/sbin/start_runit
51 43
 
52 44
 %files
53 45
 %defattr(-,root,root)
54
-%{_bindir}/allocate-ipip-addr
55
-%{_bindir}/startup
46
+%{_bindir}/calico-node
56 47
 /usr/share/calico/docker/fs/*
57 48
 
58 49
 %changelog
50
+*   Wed May 08 2019 Ashwin H <ashwinh@vmware.com> 3.6.1-1
51
+-   Update to 3.6.1
59 52
 *   Mon Jan 28 2019 Bo Gan <ganb@vmware.com> 2.6.7-4
60 53
 -   Fix CVE-2018-17846 and CVE-2018-17143
61 54
 *   Mon Jan 21 2019 Bo Gan <ganb@vmware.com> 2.6.7-3
... ...
@@ -1,11 +1,11 @@
1 1
 Summary:        Container Network Interface (CNI) plugins
2 2
 Name:           cni
3
-Version:        0.6.0
3
+Version:        0.7.5
4 4
 Release:        1%{?dist}
5 5
 License:        ASL 2.0
6 6
 URL:            https://github.com/containernetworking/cni
7 7
 Source0:        https://github.com/containernetworking/cni/archive/%{name}-v%{version}.tar.gz
8
-%define sha1 cni=f273e53c6d019d5cc9dfb75b48e619aa52abcce7
8
+%define sha1 cni=e980fff2a3e6446b70c3e0beb22ca53853259d4d
9 9
 Group:          Development/Tools
10 10
 Vendor:         VMware, Inc.
11 11
 Distribution:   Photon
... ...
@@ -37,6 +37,8 @@ make -k check |& tee %{_specdir}/%{name}-check-log || %{nocheck}
37 37
 %{_default_cni_plugins_dir}/*
38 38
 
39 39
 %changelog
40
+*   Tue Apr 02 2019 Ashwin H <ashwinh@vmware.com> 0.7.5-1
41
+-   Update cni to v0.7.5
40 42
 *   Tue Dec 05 2017 Vinay Kulkarni <kulkarniv@vmware.com> 0.6.0-1
41 43
 -   cni v0.6.0.
42 44
 *   Fri Apr 7 2017 Alexey Makhalov <amakhalov@vmware.com> 0.5.1-1
43 45
new file mode 100644
... ...
@@ -0,0 +1,116 @@
0
+%global goroot          /usr/lib/golang
1
+%global gopath          %{_datadir}/gocode
2
+%ifarch aarch64
3
+%global gohostarch      arm64
4
+%else
5
+%global gohostarch      amd64
6
+%endif
7
+%define debug_package %{nil}
8
+%define __strip /bin/true
9
+
10
+# rpmbuild magic to keep from having meta dependency on libc.so.6
11
+#%define _use_internal_dependency_generator 0
12
+#%define __find_requires %{nil}
13
+
14
+Summary:        Go
15
+Name:           go
16
+Version:        1.11.9
17
+Release:        1%{?dist}
18
+License:        BSD
19
+URL:            https://golang.org
20
+Group:          System Environment/Security
21
+Vendor:         VMware, Inc.
22
+Distribution:   Photon
23
+Source0:        https://dl.google.com/go/%{name}%{version}.src.tar.gz
24
+%define sha1    go=3790ca6533cce6933eafd34b2a74a7025e3caba7
25
+Requires:       glibc
26
+%define ExtraBuildRequires go
27
+
28
+%description
29
+Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
30
+
31
+%prep
32
+%setup -qn %{name}
33
+
34
+%build
35
+export GOHOSTOS=linux
36
+export GOHOSTARCH=%{gohostarch}
37
+export GOROOT_BOOTSTRAP=%{goroot}
38
+
39
+export GOROOT="`pwd`"
40
+export GOPATH=%{gopath}
41
+export GOROOT_FINAL=%{_bindir}/go
42
+rm -f  %{gopath}/src/runtime/*.c
43
+pushd src
44
+./make.bash --no-clean
45
+popd
46
+
47
+%install
48
+rm -rf %{buildroot}
49
+
50
+mkdir -p %{buildroot}%{_bindir}
51
+mkdir -p %{buildroot}%{goroot}
52
+
53
+cp -R api bin doc favicon.ico lib pkg robots.txt src misc VERSION %{buildroot}%{goroot}
54
+
55
+# remove the unnecessary zoneinfo file (Go will always use the system one first)
56
+rm -rfv %{buildroot}%{goroot}/lib/time
57
+
58
+# remove the doc Makefile
59
+rm -rfv %{buildroot}%{goroot}/doc/Makefile
60
+
61
+# put binaries to bindir, linked to the arch we're building,
62
+# leave the arch independent pieces in %{goroot}
63
+mkdir -p %{buildroot}%{goroot}/bin/linux_%{gohostarch}
64
+ln -sfv ../go %{buildroot}%{goroot}/bin/linux_%{gohostarch}/go
65
+ln -sfv ../gofmt %{buildroot}%{goroot}/bin/linux_%{gohostarch}/gofmt
66
+ln -sfv %{goroot}/bin/gofmt %{buildroot}%{_bindir}/gofmt
67
+ln -sfv %{goroot}/bin/go %{buildroot}%{_bindir}/go
68
+
69
+# ensure these exist and are owned
70
+mkdir -p %{buildroot}%{gopath}/src/github.com/
71
+mkdir -p %{buildroot}%{gopath}/src/bitbucket.org/
72
+mkdir -p %{buildroot}%{gopath}/src/code.google.com/
73
+mkdir -p %{buildroot}%{gopath}/src/code.google.com/p/
74
+
75
+install -vdm755 %{buildroot}/etc/profile.d
76
+cat >> %{buildroot}/etc/profile.d/go-exports.sh <<- "EOF"
77
+export GOROOT=%{goroot}
78
+export GOPATH=%{_datadir}/gocode
79
+export GOHOSTOS=linux
80
+export GOHOSTARCH=%{gohostarch}
81
+export GOOS=linux
82
+EOF
83
+#chown -R root:root %{buildroot}/etc/profile.d/go-exports.sh
84
+
85
+
86
+#%{_fixperms} %{buildroot}/*
87
+
88
+%post -p /sbin/ldconfig
89
+
90
+%postun
91
+/sbin/ldconfig
92
+if [ $1 -eq 0 ]; then
93
+  #This is uninstall
94
+  rm /etc/profile.d/go-exports.sh
95
+  rm -rf /opt/%{name}
96
+  exit 0
97
+fi
98
+
99
+%clean
100
+rm -rf %{buildroot}/*
101
+
102
+%files
103
+%defattr(-,root,root)
104
+%exclude %{goroot}/src/*.rc
105
+%exclude %{goroot}/include/plan9
106
+/etc/profile.d/go-exports.sh
107
+%{goroot}/*
108
+%{gopath}/src
109
+%exclude %{goroot}/src/pkg/debug/dwarf/testdata
110
+%exclude %{goroot}/src/pkg/debug/elf/testdata
111
+%{_bindir}/*
112
+
113
+%changelog
114
+*   Wed Apr 24 2019 <ashwinh@vmware.com> 1.11.9-1
115
+-   Initial build for 1.11.9
0 116
deleted file mode 100644
... ...
@@ -1,10754 +0,0 @@
1
-From f8d5684a26a77a20e4e77aff73ca9c96ac063ed4 Mon Sep 17 00:00:00 2001
2
-From: DheerajSShetty <dheerajs@vmware.com>
3
-Date: Tue, 16 Oct 2018 15:49:44 -0700
4
-Subject: [PATCH]  VKE patch for k8s 1.11.3 (350444)
5
-
6
- api/swagger-spec/apps_v1alpha1.json                |   21 +
7
- api/swagger-spec/apps_v1beta1.json                 |   21 +
8
- api/swagger-spec/apps_v1beta2.json                 |   21 +
9
- api/swagger-spec/batch_v1.json                     |   21 +
10
- api/swagger-spec/batch_v1beta1.json                |   21 +
11
- api/swagger-spec/batch_v2alpha1.json               |   21 +
12
- api/swagger-spec/extensions_v1beta1.json           |   21 +
13
- api/swagger-spec/settings.k8s.io_v1alpha1.json     |   21 +
14
- api/swagger-spec/v1.json                           |   25 +
15
- cmd/kube-controller-manager/app/BUILD              |    1 +
16
- cmd/kube-controller-manager/app/plugins.go         |    4 +
17
- cmd/kubelet/app/BUILD                              |    1 +
18
- cmd/kubelet/app/plugins.go                         |    2 +
19
- pkg/apis/core/types.go                             |   14 +
20
- pkg/apis/core/validation/validation.go             |   25 +
21
- pkg/apis/policy/types.go                           |    1 +
22
- pkg/cloudprovider/providers/BUILD                  |    2 +
23
- pkg/cloudprovider/providers/cascade/BUILD          |   56 +
24
- pkg/cloudprovider/providers/cascade/OWNERS         |    3 +
25
- pkg/cloudprovider/providers/cascade/apitypes.go    |  230 ++
26
- pkg/cloudprovider/providers/cascade/auth.go        |  145 ++
27
- pkg/cloudprovider/providers/cascade/cascade.go     |  215 ++
28
- .../providers/cascade/cascade_disks.go             |  228 ++
29
- .../providers/cascade/cascade_instances.go         |  132 +
30
- .../providers/cascade/cascade_instances_test.go    |   44 +
31
- .../providers/cascade/cascade_loadbalancer.go      |  285 +++
32
- pkg/cloudprovider/providers/cascade/client.go      |  399 +++
33
- pkg/cloudprovider/providers/cascade/oidcclient.go  |  297 +++
34
- pkg/cloudprovider/providers/cascade/restclient.go  |  262 ++
35
- pkg/cloudprovider/providers/cascade/tests_owed     |    5 +
36
- pkg/cloudprovider/providers/cascade/utils.go       |   29 +
37
- pkg/cloudprovider/providers/providers.go           |    1 +
38
- pkg/kubeapiserver/authorizer/config.go             |    8 +-
39
- pkg/kubeapiserver/authorizer/modes/modes.go        |    3 +-
40
- pkg/kubeapiserver/options/plugins.go               |    3 +
41
- pkg/printers/internalversion/describe.go           |   11 +
42
- pkg/security/podsecuritypolicy/util/util.go        |    3 +
43
- pkg/volume/cascade_disk/BUILD                      |   43 +
44
- pkg/volume/cascade_disk/OWNERS                     |    2 +
45
- pkg/volume/cascade_disk/attacher.go                |  264 ++
46
- pkg/volume/cascade_disk/cascade_disk.go            |  390 +++
47
- pkg/volume/cascade_disk/cascade_util.go            |  162 ++
48
- .../storage/persistentvolume/label/admission.go    |   54 +
49
- plugin/pkg/admission/vke/BUILD                     |   61 +
50
- plugin/pkg/admission/vke/admission.go              |  624 +++++
51
- plugin/pkg/admission/vke/admission_test.go         |  960 +++++++
52
- plugin/pkg/auth/authorizer/vke/BUILD               |   40 +
53
- plugin/pkg/auth/authorizer/vke/OWNERS              |    2 +
54
- plugin/pkg/auth/authorizer/vke/vke_authorizer.go   |  125 +
55
- .../pkg/auth/authorizer/vke/vke_authorizer_test.go |  230 ++
56
- staging/src/k8s.io/api/core/v1/generated.pb.go     | 2686 +++++++++++---------
57
- staging/src/k8s.io/api/core/v1/types.go            |   24 +-
58
- 52 files changed, 7054 insertions(+), 1215 deletions(-)
59
-
60
-diff --git a/api/swagger-spec/apps_v1alpha1.json b/api/swagger-spec/apps_v1alpha1.json
61
-index 6f54662..0ce6f3f 100644
62
-+++ b/api/swagger-spec/apps_v1alpha1.json
63
-@@ -1459,6 +1459,10 @@
64
-      "photonPersistentDisk": {
65
-       "$ref": "v1.PhotonPersistentDiskVolumeSource",
66
-       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
67
-+     },
68
-+     "vkeDisk": {
69
-+      "$ref": "v1.CascadeDiskVolumeSource",
70
-+      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
71
-      }
72
-     }
73
-    },
74
-@@ -2109,6 +2113,23 @@
75
-      }
76
-     }
77
-    },
78
-+   "v1.CascadeDiskVolumeSource": {
79
-+    "id": "v1.CascadeDiskVolumeSource",
80
-+    "description": "Represents a Cascade persistent disk resource.",
81
-+    "required": [
82
-+     "diskID"
83
-+    ],
84
-+    "properties": {
85
-+     "diskID": {
86
-+      "type": "string",
87
-+      "description": "ID that identifies Cascade persistent disk"
88
-+     },
89
-+     "fsType": {
90
-+      "type": "string",
91
-+      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
92
-+     }
93
-+    }
94
-+   },
95
-    "v1.Container": {
96
-     "id": "v1.Container",
97
-     "description": "A single application container that you want to run within a pod.",
98
-diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json
99
-index eaacb45..dfe9400 100644
100
-+++ b/api/swagger-spec/apps_v1beta1.json
101
-@@ -4490,6 +4490,10 @@
102
-       "$ref": "v1.PhotonPersistentDiskVolumeSource",
103
-       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
104
-      },
105
-+     "vkeDisk": {
106
-+      "$ref": "v1.CascadeDiskVolumeSource",
107
-+      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
108
-+     },
109
-      "projected": {
110
-       "$ref": "v1.ProjectedVolumeSource",
111
-       "description": "Items for all in one resources secrets, configmaps, and downward API"
112
-@@ -5221,6 +5225,23 @@
113
-      }
114
-     }
115
-    },
116
-+   "v1.CascadeDiskVolumeSource": {
117
-+    "id": "v1.CascadeDiskVolumeSource",
118
-+    "description": "Represents a Cascade persistent disk resource.",
119
-+    "required": [
120
-+     "diskID"
121
-+    ],
122
-+    "properties": {
123
-+     "diskID": {
124
-+      "type": "string",
125
-+      "description": "ID that identifies Cascade persistent disk"
126
-+     },
127
-+     "fsType": {
128
-+      "type": "string",
129
-+      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
130
-+     }
131
-+    }
132
-+   },
133
-    "v1.ProjectedVolumeSource": {
134
-     "id": "v1.ProjectedVolumeSource",
135
-     "description": "Represents a projected volume source",
136
-diff --git a/api/swagger-spec/apps_v1beta2.json b/api/swagger-spec/apps_v1beta2.json
137
-index d6bc46e..1c60717 100644
138
-+++ b/api/swagger-spec/apps_v1beta2.json
139
-@@ -6856,6 +6856,10 @@
140
-       "$ref": "v1.PhotonPersistentDiskVolumeSource",
141
-       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
142
-      },
143
-+     "vkeDisk": {
144
-+      "$ref": "v1.CascadeDiskVolumeSource",
145
-+      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
146
-+     },
147
-      "projected": {
148
-       "$ref": "v1.ProjectedVolumeSource",
149
-       "description": "Items for all in one resources secrets, configmaps, and downward API"
150
-@@ -7587,6 +7591,23 @@
151
-      }
152
-     }
153
-    },
154
-+   "v1.CascadeDiskVolumeSource": {
155
-+    "id": "v1.CascadeDiskVolumeSource",
156
-+    "description": "Represents a Cascade persistent disk resource.",
157
-+    "required": [
158
-+     "diskID"
159
-+    ],
160
-+    "properties": {
161
-+     "diskID": {
162
-+      "type": "string",
163
-+      "description": "ID that identifies Cascade persistent disk"
164
-+     },
165
-+     "fsType": {
166
-+      "type": "string",
167
-+      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
168
-+     }
169
-+    }
170
-+   },
171
-    "v1.ProjectedVolumeSource": {
172
-     "id": "v1.ProjectedVolumeSource",
173
-     "description": "Represents a projected volume source",
174
-diff --git a/api/swagger-spec/batch_v1.json b/api/swagger-spec/batch_v1.json
175
-index 3f4abc9..2ed4018 100644
176
-+++ b/api/swagger-spec/batch_v1.json
177
-@@ -1830,6 +1830,10 @@
178
-       "$ref": "v1.PhotonPersistentDiskVolumeSource",
179
-       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
180
-      },
181
-+     "vkeDisk": {
182
-+      "$ref": "v1.CascadeDiskVolumeSource",
183
-+      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
184
-+     },
185
-      "projected": {
186
-       "$ref": "v1.ProjectedVolumeSource",
187
-       "description": "Items for all in one resources secrets, configmaps, and downward API"
188
-@@ -2561,6 +2565,23 @@
189
-      }
190
-     }
191
-    },
192
-+   "v1.CascadeDiskVolumeSource": {
193
-+    "id": "v1.CascadeDiskVolumeSource",
194
-+    "description": "Represents a Cascade persistent disk resource.",
195
-+    "required": [
196
-+     "diskID"
197
-+    ],
198
-+    "properties": {
199
-+     "diskID": {
200
-+      "type": "string",
201
-+      "description": "ID that identifies Cascade persistent disk"
202
-+     },
203
-+     "fsType": {
204
-+      "type": "string",
205
-+      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
206
-+     }
207
-+    }
208
-+   },
209
-    "v1.ProjectedVolumeSource": {
210
-     "id": "v1.ProjectedVolumeSource",
211
-     "description": "Represents a projected volume source",
212
-diff --git a/api/swagger-spec/batch_v1beta1.json b/api/swagger-spec/batch_v1beta1.json
213
-index 58fa752..74fcd28 100644
214
-+++ b/api/swagger-spec/batch_v1beta1.json
215
-@@ -1885,6 +1885,10 @@
216
-       "$ref": "v1.PhotonPersistentDiskVolumeSource",
217
-       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
218
-      },
219
-+     "vkeDisk": {
220
-+      "$ref": "v1.CascadeDiskVolumeSource",
221
-+      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
222
-+     },
223
-      "projected": {
224
-       "$ref": "v1.ProjectedVolumeSource",
225
-       "description": "Items for all in one resources secrets, configmaps, and downward API"
226
-@@ -2616,6 +2620,23 @@
227
-      }
228
-     }
229
-    },
230
-+   "v1.CascadeDiskVolumeSource": {
231
-+    "id": "v1.CascadeDiskVolumeSource",
232
-+    "description": "Represents a Cascade persistent disk resource.",
233
-+    "required": [
234
-+     "diskID"
235
-+    ],
236
-+    "properties": {
237
-+     "diskID": {
238
-+      "type": "string",
239
-+      "description": "ID that identifies Cascade persistent disk"
240
-+     },
241
-+     "fsType": {
242
-+      "type": "string",
243
-+      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
244
-+     }
245
-+    }
246
-+   },
247
-    "v1.ProjectedVolumeSource": {
248
-     "id": "v1.ProjectedVolumeSource",
249
-     "description": "Represents a projected volume source",
250
-diff --git a/api/swagger-spec/batch_v2alpha1.json b/api/swagger-spec/batch_v2alpha1.json
251
-index 050235b..3484e13 100644
252
-+++ b/api/swagger-spec/batch_v2alpha1.json
253
-@@ -1900,6 +1900,10 @@
254
-      "storageos": {
255
-       "$ref": "v1.StorageOSVolumeSource",
256
-       "description": "StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes."
257
-+     },
258
-+     "vkeDisk": {
259
-+      "$ref": "v1.CascadeDiskVolumeSource",
260
-+      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
261
-      }
262
-     }
263
-    },
264
-@@ -2834,6 +2838,23 @@
265
-      }
266
-     }
267
-    },
268
-+   "v1.CascadeDiskVolumeSource": {
269
-+    "id": "v1.CascadeDiskVolumeSource",
270
-+    "description": "Represents a Cascade persistent disk resource.",
271
-+    "required": [
272
-+     "diskID"
273
-+    ],
274
-+    "properties": {
275
-+     "diskID": {
276
-+      "type": "string",
277
-+      "description": "ID that identifies Cascade persistent disk"
278
-+     },
279
-+     "fsType": {
280
-+      "type": "string",
281
-+      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
282
-+     }
283
-+    }
284
-+   },
285
-    "v1.Container": {
286
-     "id": "v1.Container",
287
-     "description": "A single application container that you want to run within a pod.",
288
-diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json
289
-index 07c832d..26d2578 100644
290
-+++ b/api/swagger-spec/extensions_v1beta1.json
291
-@@ -7513,6 +7513,10 @@
292
-      "storageos": {
293
-       "$ref": "v1.StorageOSVolumeSource",
294
-       "description": "StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes."
295
-+     },
296
-+     "vkeDisk": {
297
-+      "$ref": "v1.CascadeDiskVolumeSource",
298
-+      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
299
-      }
300
-     }
301
-    },
302
-@@ -8229,6 +8233,23 @@
303
-      }
304
-     }
305
-    },
306
-+   "v1.CascadeDiskVolumeSource": {
307
-+    "id": "v1.CascadeDiskVolumeSource",
308
-+    "description": "Represents a Cascade persistent disk resource.",
309
-+    "required": [
310
-+     "diskID"
311
-+    ],
312
-+    "properties": {
313
-+     "diskID": {
314
-+      "type": "string",
315
-+      "description": "ID that identifies Cascade persistent disk"
316
-+     },
317
-+     "fsType": {
318
-+      "type": "string",
319
-+      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
320
-+     }
321
-+    }
322
-+   },
323
-    "v1.ProjectedVolumeSource": {
324
-     "id": "v1.ProjectedVolumeSource",
325
-     "description": "Represents a projected volume source",
326
-diff --git a/api/swagger-spec/settings.k8s.io_v1alpha1.json b/api/swagger-spec/settings.k8s.io_v1alpha1.json
327
-index 8c9e275..90c0e0b 100644
328
-+++ b/api/swagger-spec/settings.k8s.io_v1alpha1.json
329
-@@ -1676,6 +1676,10 @@
330
-      "storageos": {
331
-       "$ref": "v1.StorageOSVolumeSource",
332
-       "description": "StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes."
333
-+     },
334
-+     "vkeDisk": {
335
-+      "$ref": "v1.CascadeDiskVolumeSource",
336
-+      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
337
-      }
338
-     }
339
-    },
340
-@@ -2354,6 +2358,23 @@
341
-      }
342
-     }
343
-    },
344
-+   "v1.CascadeDiskVolumeSource": {
345
-+    "id": "v1.CascadeDiskVolumeSource",
346
-+    "description": "Represents a Cascade persistent disk resource.",
347
-+    "required": [
348
-+     "diskID"
349
-+    ],
350
-+    "properties": {
351
-+     "diskID": {
352
-+      "type": "string",
353
-+      "description": "ID that identifies Cascade persistent disk"
354
-+     },
355
-+     "fsType": {
356
-+      "type": "string",
357
-+      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
358
-+     }
359
-+    }
360
-+   },
361
-    "v1.ProjectedVolumeSource": {
362
-     "id": "v1.ProjectedVolumeSource",
363
-     "description": "Represents a projected volume source",
364
-diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json
365
-index 7cfc2e9..b36450e 100644
366
-+++ b/api/swagger-spec/v1.json
367
-@@ -19360,6 +19360,10 @@
368
-       "$ref": "v1.PhotonPersistentDiskVolumeSource",
369
-       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
370
-      },
371
-+     "vkeDisk": {
372
-+      "$ref": "v1.CascadeDiskVolumeSource",
373
-+      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
374
-+     },
375
-      "portworxVolume": {
376
-       "$ref": "v1.PortworxVolumeSource",
377
-       "description": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine"
378
-@@ -19929,6 +19933,23 @@
379
-      }
380
-     }
381
-    },
382
-+   "v1.CascadeDiskVolumeSource": {
383
-+    "id": "v1.CascadeDiskVolumeSource",
384
-+    "description": "Represents a Cascade persistent disk resource.",
385
-+    "required": [
386
-+     "diskID"
387
-+    ],
388
-+    "properties": {
389
-+     "diskID": {
390
-+      "type": "string",
391
-+      "description": "ID that identifies Cascade persistent disk"
392
-+     },
393
-+     "fsType": {
394
-+      "type": "string",
395
-+      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
396
-+     }
397
-+    }
398
-+   },
399
-    "v1.PortworxVolumeSource": {
400
-     "id": "v1.PortworxVolumeSource",
401
-     "description": "PortworxVolumeSource represents a Portworx volume resource.",
402
-@@ -20488,6 +20509,10 @@
403
-      "storageos": {
404
-       "$ref": "v1.StorageOSVolumeSource",
405
-       "description": "StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes."
406
-+     },
407
-+     "vkeDisk": {
408
-+      "$ref": "v1.CascadeDiskVolumeSource",
409
-+      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
410
-      }
411
-     }
412
-    },
413
-diff --git a/cmd/kube-controller-manager/app/BUILD b/cmd/kube-controller-manager/app/BUILD
414
-index 64c82a7..0a9bd71 100644
415
-+++ b/cmd/kube-controller-manager/app/BUILD
416
-@@ -86,6 +86,7 @@ go_library(
417
-         "//pkg/volume/aws_ebs:go_default_library",
418
-         "//pkg/volume/azure_dd:go_default_library",
419
-         "//pkg/volume/azure_file:go_default_library",
420
-+        "//pkg/volume/cascade_disk:go_default_library",
421
-         "//pkg/volume/cinder:go_default_library",
422
-         "//pkg/volume/csi:go_default_library",
423
-         "//pkg/volume/fc:go_default_library",
424
-diff --git a/cmd/kube-controller-manager/app/plugins.go b/cmd/kube-controller-manager/app/plugins.go
425
-index 42034d5..e729785 100644
426
-+++ b/cmd/kube-controller-manager/app/plugins.go
427
-@@ -34,6 +34,7 @@ import (
428
- 	"k8s.io/kubernetes/pkg/volume/aws_ebs"
429
- 	"k8s.io/kubernetes/pkg/volume/azure_dd"
430
- 	"k8s.io/kubernetes/pkg/volume/azure_file"
431
-+	"k8s.io/kubernetes/pkg/volume/cascade_disk"
432
- 	"k8s.io/kubernetes/pkg/volume/cinder"
433
- 	"k8s.io/kubernetes/pkg/volume/csi"
434
- 	"k8s.io/kubernetes/pkg/volume/fc"
435
-@@ -77,6 +78,7 @@ func ProbeAttachableVolumePlugins() []volume.VolumePlugin {
436
- 	allPlugins = append(allPlugins, fc.ProbeVolumePlugins()...)
437
- 	allPlugins = append(allPlugins, iscsi.ProbeVolumePlugins()...)
438
- 	allPlugins = append(allPlugins, rbd.ProbeVolumePlugins()...)
439
-+	allPlugins = append(allPlugins, cascade_disk.ProbeVolumePlugins()...)
440
- 	if utilfeature.DefaultFeatureGate.Enabled(features.CSIPersistentVolume) {
441
- 		allPlugins = append(allPlugins, csi.ProbeVolumePlugins()...)
442
- 	}
443
-@@ -107,6 +109,7 @@ func ProbeExpandableVolumePlugins(config componentconfig.VolumeConfiguration) []
444
- 	allPlugins = append(allPlugins, scaleio.ProbeVolumePlugins()...)
445
- 	allPlugins = append(allPlugins, storageos.ProbeVolumePlugins()...)
446
- 	allPlugins = append(allPlugins, fc.ProbeVolumePlugins()...)
447
-+	allPlugins = append(allPlugins, cascade_disk.ProbeVolumePlugins()...)
448
- 	return allPlugins
449
- }
450
- 
451
-@@ -163,6 +166,7 @@ func ProbeControllerVolumePlugins(cloud cloudprovider.Interface, config componen
452
- 	allPlugins = append(allPlugins, vsphere_volume.ProbeVolumePlugins()...)
453
- 	allPlugins = append(allPlugins, azure_dd.ProbeVolumePlugins()...)
454
- 	allPlugins = append(allPlugins, photon_pd.ProbeVolumePlugins()...)
455
-+	allPlugins = append(allPlugins, cascade_disk.ProbeVolumePlugins()...)
456
- 
457
- 	return allPlugins
458
- }
459
-diff --git a/cmd/kubelet/app/BUILD b/cmd/kubelet/app/BUILD
460
-index b2f3efb..278970c 100644
461
-+++ b/cmd/kubelet/app/BUILD
462
-@@ -119,6 +119,7 @@ go_library(
463
-         "//pkg/volume/aws_ebs:go_default_library",
464
-         "//pkg/volume/azure_dd:go_default_library",
465
-         "//pkg/volume/azure_file:go_default_library",
466
-+        "//pkg/volume/cascade_disk:go_default_library",
467
-         "//pkg/volume/cephfs:go_default_library",
468
-         "//pkg/volume/cinder:go_default_library",
469
-         "//pkg/volume/configmap:go_default_library",
470
-diff --git a/cmd/kubelet/app/plugins.go b/cmd/kubelet/app/plugins.go
471
-index 22700b0..540e501 100644
472
-+++ b/cmd/kubelet/app/plugins.go
473
-@@ -32,6 +32,7 @@ import (
474
- 	"k8s.io/kubernetes/pkg/volume/aws_ebs"
475
- 	"k8s.io/kubernetes/pkg/volume/azure_dd"
476
- 	"k8s.io/kubernetes/pkg/volume/azure_file"
477
-+	"k8s.io/kubernetes/pkg/volume/cascade_disk"
478
- 	"k8s.io/kubernetes/pkg/volume/cephfs"
479
- 	"k8s.io/kubernetes/pkg/volume/cinder"
480
- 	"k8s.io/kubernetes/pkg/volume/configmap"
481
-@@ -100,6 +101,7 @@ func ProbeVolumePlugins() []volume.VolumePlugin {
482
- 	allPlugins = append(allPlugins, scaleio.ProbeVolumePlugins()...)
483
- 	allPlugins = append(allPlugins, local.ProbeVolumePlugins()...)
484
- 	allPlugins = append(allPlugins, storageos.ProbeVolumePlugins()...)
485
-+	allPlugins = append(allPlugins, cascade_disk.ProbeVolumePlugins()...)
486
- 	if utilfeature.DefaultFeatureGate.Enabled(features.CSIPersistentVolume) {
487
- 		allPlugins = append(allPlugins, csi.ProbeVolumePlugins()...)
488
- 	}
489
-diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go
490
-index 1669edc..60ba08e 100644
491
-+++ b/pkg/apis/core/types.go
492
-@@ -152,6 +152,8 @@ type VolumeSource struct {
493
- 	// StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod
494
- 	// +optional
495
- 	StorageOS *StorageOSVolumeSource
496
-+	// CascadeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine
497
-+	CascadeDisk *CascadeDiskVolumeSource
498
- }
499
- 
500
- // Similar to VolumeSource but meant for the administrator who creates PVs.
501
-@@ -230,6 +232,8 @@ type PersistentVolumeSource struct {
502
- 	// CSI (Container Storage Interface) represents storage that handled by an external CSI driver (Beta feature).
503
- 	// +optional
504
- 	CSI *CSIPersistentVolumeSource
505
-+	// CascadeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine
506
-+	CascadeDisk *CascadeDiskVolumeSource
507
- }
508
- 
509
- type PersistentVolumeClaimVolumeSource struct {
510
-@@ -1372,6 +1376,16 @@ type StorageOSPersistentVolumeSource struct {
511
- 	SecretRef *ObjectReference
512
- }
513
- 
514
-+// Represents a Cascade persistent disk resource.
515
-+type CascadeDiskVolumeSource struct {
516
-+	// ID that identifies Cascade persistent disk
517
-+	DiskID string
518
-+	// Filesystem type to mount.
519
-+	// Must be a filesystem type supported by the host operating system.
520
-+	// Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
521
-+	FSType string
522
-+}
523
-+
524
- // Adapts a ConfigMap into a volume.
525
- //
526
- // The contents of the target ConfigMap's Data field will be presented in a
527
-diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go
528
-index 7050c60..cf15bb7 100644
529
-+++ b/pkg/apis/core/validation/validation.go
530
-@@ -638,6 +638,14 @@ func validateVolumeSource(source *core.VolumeSource, fldPath *field.Path, volNam
531
- 			allErrs = append(allErrs, validateScaleIOVolumeSource(source.ScaleIO, fldPath.Child("scaleIO"))...)
532
- 		}
533
- 	}
534
-+	if source.CascadeDisk != nil {
535
-+		if numVolumes > 0 {
536
-+			allErrs = append(allErrs, field.Forbidden(fldPath.Child("cascadeDisk"), "may not specify more than 1 volume type"))
537
-+		} else {
538
-+			numVolumes++
539
-+			allErrs = append(allErrs, validateCascadeDiskVolumeSource(source.CascadeDisk, fldPath.Child("cascadeDisk"))...)
540
-+		}
541
-+	}
542
- 
543
- 	if numVolumes == 0 {
544
- 		allErrs = append(allErrs, field.Required(fldPath, "must specify a volume type"))
545
-@@ -1491,6 +1499,14 @@ func validateCSIPersistentVolumeSource(csi *core.CSIPersistentVolumeSource, fldP
546
- 	return allErrs
547
- }
548
- 
549
-+func validateCascadeDiskVolumeSource(cd *core.CascadeDiskVolumeSource, fldPath *field.Path) field.ErrorList {
550
-+	allErrs := field.ErrorList{}
551
-+	if len(cd.DiskID) == 0 {
552
-+		allErrs = append(allErrs, field.Required(fldPath.Child("diskID"), ""))
553
-+	}
554
-+	return allErrs
555
-+}
556
-+
557
- // ValidatePersistentVolumeName checks that a name is appropriate for a
558
- // PersistentVolumeName object.
559
- var ValidatePersistentVolumeName = NameIsDNSSubdomain
560
-@@ -1725,6 +1741,15 @@ func ValidatePersistentVolume(pv *core.PersistentVolume) field.ErrorList {
561
- 		}
562
- 	}
563
- 
564
-+	if pv.Spec.CascadeDisk != nil {
565
-+		if numVolumes > 0 {
566
-+			allErrs = append(allErrs, field.Forbidden(specPath.Child("cascadeDisk"), "may not specify more than 1 volume type"))
567
-+		} else {
568
-+			numVolumes++
569
-+			allErrs = append(allErrs, validateCascadeDiskVolumeSource(pv.Spec.CascadeDisk, specPath.Child("cascadeDisk"))...)
570
-+		}
571
-+	}
572
-+
573
- 	if numVolumes == 0 {
574
- 		allErrs = append(allErrs, field.Required(specPath, "must specify a volume type"))
575
- 	}
576
-diff --git a/pkg/apis/policy/types.go b/pkg/apis/policy/types.go
577
-index 298fcd0..174d0fc 100644
578
-+++ b/pkg/apis/policy/types.go
579
-@@ -290,6 +290,7 @@ var (
580
- 	PortworxVolume        FSType = "portworxVolume"
581
- 	ScaleIO               FSType = "scaleIO"
582
- 	CSI                   FSType = "csi"
583
-+	CascadeDisk           FSType = "cascadeDisk"
584
- 	All                   FSType = "*"
585
- )
586
- 
587
-diff --git a/pkg/cloudprovider/providers/BUILD b/pkg/cloudprovider/providers/BUILD
588
-index aeccfa1..4313576 100644
589
-+++ b/pkg/cloudprovider/providers/BUILD
590
-@@ -12,6 +12,7 @@ go_library(
591
-     deps = [
592
-         "//pkg/cloudprovider/providers/aws:go_default_library",
593
-         "//pkg/cloudprovider/providers/azure:go_default_library",
594
-+        "//pkg/cloudprovider/providers/cascade:go_default_library",
595
-         "//pkg/cloudprovider/providers/cloudstack:go_default_library",
596
-         "//pkg/cloudprovider/providers/gce:go_default_library",
597
-         "//pkg/cloudprovider/providers/openstack:go_default_library",
598
-@@ -34,6 +35,7 @@ filegroup(
599
-         ":package-srcs",
600
-         "//pkg/cloudprovider/providers/aws:all-srcs",
601
-         "//pkg/cloudprovider/providers/azure:all-srcs",
602
-+        "//pkg/cloudprovider/providers/cascade:all-srcs",
603
-         "//pkg/cloudprovider/providers/cloudstack:all-srcs",
604
-         "//pkg/cloudprovider/providers/fake:all-srcs",
605
-         "//pkg/cloudprovider/providers/gce:all-srcs",
606
-diff --git a/pkg/cloudprovider/providers/cascade/BUILD b/pkg/cloudprovider/providers/cascade/BUILD
607
-new file mode 100644
608
-index 0000000..4089166
609
-+++ b/pkg/cloudprovider/providers/cascade/BUILD
610
-@@ -0,0 +1,56 @@
611
-+package(default_visibility = ["//visibility:public"])
612
-+
613
-+load(
614
-+    "@io_bazel_rules_go//go:def.bzl",
615
-+    "go_library",
616
-+)
617
-+
618
-+go_library(
619
-+    name = "go_default_library",
620
-+    srcs = [
621
-+        "apitypes.go",
622
-+        "auth.go",
623
-+        "cascade.go",
624
-+        "cascade_disks.go",
625
-+        "cascade_instances.go",
626
-+        "cascade_loadbalancer.go",
627
-+        "client.go",
628
-+        "oidcclient.go",
629
-+        "restclient.go",
630
-+        "utils.go"
631
-+        ],
632
-+    deps = [
633
-+        "//pkg/api/v1/helper:go_default_library",
634
-+        "//pkg/cloudprovider:go_default_library",
635
-+        "//pkg/controller:go_default_library",
636
-+        "//vendor/github.com/golang/glog:go_default_library",
637
-+        "//vendor/gopkg.in/gcfg.v1:go_default_library",
638
-+        "//vendor/k8s.io/api/core/v1:go_default_library",
639
-+        "//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
640
-+    ],
641
-+)
642
-+
643
-+go_test(
644
-+    name = "go_default_test",
645
-+    srcs = [
646
-+        "cascade_instances_test.go",
647
-+    ],
648
-+    embed = [":go_default_library"],
649
-+    deps = [
650
-+        "//vendor/k8s.io/api/core/v1:go_default_library",
651
-+        "//vendor/github.com/stretchr/testify/assert:go_default_library",
652
-+    ],
653
-+)
654
-+
655
-+filegroup(
656
-+    name = "package-srcs",
657
-+    srcs = glob(["**"]),
658
-+    tags = ["automanaged"],
659
-+    visibility = ["//visibility:private"],
660
-+)
661
-+
662
-+filegroup(
663
-+    name = "all-srcs",
664
-+    srcs = [":package-srcs"],
665
-+    tags = ["automanaged"],
666
-+)
667
-diff --git a/pkg/cloudprovider/providers/cascade/OWNERS b/pkg/cloudprovider/providers/cascade/OWNERS
668
-new file mode 100644
669
-index 0000000..70efc9d
670
-+++ b/pkg/cloudprovider/providers/cascade/OWNERS
671
-@@ -0,0 +1,3 @@
672
-+maintainers:
673
-+- ashokc
674
-+- ysheng
675
-diff --git a/pkg/cloudprovider/providers/cascade/apitypes.go b/pkg/cloudprovider/providers/cascade/apitypes.go
676
-new file mode 100644
677
-index 0000000..d437394
678
-+++ b/pkg/cloudprovider/providers/cascade/apitypes.go
679
-@@ -0,0 +1,230 @@
680
-+package cascade
681
-+
682
-+import "fmt"
683
-+
684
-+const (
685
-+	NotFoundError     = 1408
686
-+	VMNotFoundError   = 2006
687
-+	DiskNotFoundError = 3011
688
-+	DiskInUseError    = 3012
689
-+
690
-+	DiskStateAttached = "ATTACHED"
691
-+)
692
-+
693
-+// Represents APIError returned by the API in case of an error.
694
-+type APIError struct {
695
-+	Code           *string           `json:"code"`
696
-+	Data           map[string]string `json:"data"`
697
-+	ErrorCode      int32             `json:"errorCode,omitempty"`
698
-+	Message        *string           `json:"message"`
699
-+	HttpStatusCode int               `json:"-"` // Not part of API contract
700
-+}
701
-+
702
-+// Implement Go error interface for ApiError.
703
-+func (e APIError) Error() string {
704
-+	return fmt.Sprintf(
705
-+		"Cascade: { HTTP status: '%d', code: '%s', message: '%s', data: '%v', errorcode: '%d' }",
706
-+		e.HttpStatusCode, StringVal(e.Code), StringVal(e.Message), e.Data, e.ErrorCode)
707
-+}
708
-+
709
-+// Used to represent a generic HTTP error, i.e. an unexpected HTTP 500.
710
-+type HttpError struct {
711
-+	StatusCode int
712
-+	Message    string
713
-+}
714
-+
715
-+// Implementation of error interface for HttpError.
716
-+func (e HttpError) Error() string {
717
-+	return fmt.Sprintf("Cascade: HTTP %d: %v", e.StatusCode, e.Message)
718
-+}
719
-+
720
-+// Represents a task which gets returned for long running API calls.
721
-+type Task struct {
722
-+	EndTime            int64       `json:"endTime,omitempty"`
723
-+	Entity             *Entity     `json:"entity,omitempty"`
724
-+	ID                 *string     `json:"id"`
725
-+	Operation          string      `json:"operation,omitempty"`
726
-+	QueuedTime         *int64      `json:"queuedTime"`
727
-+	ResourceProperties interface{} `json:"resourceProperties,omitempty"`
728
-+	SelfLink           string      `json:"selfLink,omitempty"`
729
-+	StartedTime        *int64      `json:"startedTime"`
730
-+	State              *string     `json:"state"`
731
-+	Steps              []*Step     `json:"steps"`
732
-+}
733
-+
734
-+// Represents the entity associated with the task.
735
-+type Entity struct {
736
-+	ID   *string `json:"id"`
737
-+	Kind *string `json:"kind"`
738
-+}
739
-+
740
-+// Represents a task that has entered into an error state. Task errors can be caught and type-checked against with the
741
-+// usual Go idiom.
742
-+type TaskError struct {
743
-+	ID   string `json:"id"`
744
-+	Step Step   `json:"step,omitempty"`
745
-+}
746
-+
747
-+// Implement Go error interface for TaskError.
748
-+func (e TaskError) Error() string {
749
-+	return fmt.Sprintf("Cascade: Task '%s' is in error state: {@step==%s}", e.ID, GetStep(e.Step))
750
-+}
751
-+
752
-+// An error representing a timeout while waiting for a task to complete.
753
-+type TaskTimeoutError struct {
754
-+	ID string
755
-+}
756
-+
757
-+// Implement Go error interface for TaskTimeoutError.
758
-+func (e TaskTimeoutError) Error() string {
759
-+	return fmt.Sprintf("Cascade: Timed out waiting for task '%s'. "+
760
-+		"Task may not be in error state, examine task for full details.", e.ID)
761
-+}
762
-+
763
-+// Represents a step in a task.
764
-+type Step struct {
765
-+	EndTime     int64             `json:"endTime,omitempty"`
766
-+	Errors      []*APIError       `json:"errors"`
767
-+	Operation   string            `json:"operation,omitempty"`
768
-+	Options     map[string]string `json:"options,omitempty"`
769
-+	QueuedTime  *int64            `json:"queuedTime"`
770
-+	Sequence    int32             `json:"sequence,omitempty"`
771
-+	StartedTime *int64            `json:"startedTime"`
772
-+	State       *string           `json:"state"`
773
-+	Warnings    []*APIError       `json:"warnings"`
774
-+}
775
-+
776
-+// Implement Go error interface for Step.
777
-+func GetStep(s Step) string {
778
-+	return fmt.Sprintf("{\"operation\"=>\"%s\",\"state\"=>\"%s}", s.Operation, StringVal(s.State))
779
-+}
780
-+
781
-+// Represents the VM response returned by the API.
782
-+type VM struct {
783
-+	AttachedDisks          []*AttachedDisk  `json:"attachedDisks"`
784
-+	Cost                   []*QuotaLineItem `json:"cost"`
785
-+	Flavor                 *string          `json:"flavor"`
786
-+	FloatingIP             string           `json:"floatingIp,omitempty"`
787
-+	HighAvailableVMGroupID string           `json:"highAvailableVMGroupID,omitempty"`
788
-+	ID                     *string          `json:"id"`
789
-+	Kind                   string           `json:"kind"`
790
-+	Name                   *string          `json:"name"`
791
-+	SelfLink               string           `json:"selfLink,omitempty"`
792
-+	SourceImageID          string           `json:"sourceImageId,omitempty"`
793
-+	State                  *string          `json:"state"`
794
-+	Subnets                []string         `json:"subnets"`
795
-+	Tags                   []string         `json:"tags"`
796
-+}
797
-+
798
-+// Represents the listVMs response returned by the API.
799
-+type VMList struct {
800
-+	Items            []*VM  `json:"items"`
801
-+	NextPageLink     string `json:"nextPageLink,omitempty"`
802
-+	PreviousPageLink string `json:"previousPageLink,omitempty"`
803
-+}
804
-+
805
-+// Represents multiple VMs returned by the API.
806
-+type VMs struct {
807
-+	Items []VM `json:"items"`
808
-+}
809
-+
810
-+// Represents the disks attached to the VMs.
811
-+type AttachedDisk struct {
812
-+	BootDisk   *bool   `json:"bootDisk"`
813
-+	CapacityGb *int32  `json:"capacityGb"`
814
-+	Flavor     *string `json:"flavor"`
815
-+	ID         *string `json:"id"`
816
-+	Kind       *string `json:"kind"`
817
-+	Name       *string `json:"name"`
818
-+	State      *string `json:"state"`
819
-+}
820
-+
821
-+// Represents an attach disk operation request.
822
-+type VMDiskOperation struct {
823
-+	Arguments map[string]string `json:"arguments,omitempty"`
824
-+	DiskID    *string           `json:"diskId"`
825
-+}
826
-+
827
-+// Represents the quota line items for the VM.
828
-+type QuotaLineItem struct {
829
-+	Key   *string  `json:"key"`
830
-+	Unit  *string  `json:"unit"`
831
-+	Value *float64 `json:"value"`
832
-+}
833
-+
834
-+// Represents a persistent disk
835
-+type PersistentDisk struct {
836
-+	CapacityGB  int32            `json:"capacityGb,omitempty"`
837
-+	Cost        []*QuotaLineItem `json:"cost"`
838
-+	Datastore   string           `json:"datastore,omitempty"`
839
-+	Flavor      *string          `json:"flavor"`
840
-+	ID          *string          `json:"id"`
841
-+	Kind        string           `json:"kind"`
842
-+	Name        *string          `json:"name"`
843
-+	SelfLink    string           `json:"selfLink,omitempty"`
844
-+	State       *string          `json:"state"`
845
-+	Tags        []string         `json:"tags"`
846
-+	VM          string           `json:"vm"`
847
-+	MountDevice string           `json:"mountDevice,omitempty"`
848
-+	Zone        *string          `json:"zone"`
849
-+}
850
-+
851
-+// Represents the spec for creating a disk.
852
-+type DiskCreateSpec struct {
853
-+	Affinities []*LocalitySpec `json:"affinities"`
854
-+	CapacityGB *int32          `json:"capacityGb"`
855
-+	Flavor     *string         `json:"flavor"`
856
-+	Kind       *string         `json:"kind"`
857
-+	Name       *string         `json:"name"`
858
-+	Tags       []string        `json:"tags"`
859
-+	Zone       *string         `json:"zone"`
860
-+	Encrypted  *bool           `json:"encrypted"`
861
-+}
862
-+
863
-+// Represents the spec for specifying affinity for a disk with another entity.
864
-+type LocalitySpec struct {
865
-+	ID   *string `json:"id"`
866
-+	Kind *string `json:"kind"`
867
-+}
868
-+
869
-+// Represens the LoadBalancer response returned by the API.
870
-+type LoadBalancer struct {
871
-+	Endpoint *string `json:"endpoint"`
872
-+}
873
-+
874
-+// Represents the spec for creating a LoadBalancer.
875
-+type LoadBalancerCreateSpec struct {
876
-+	HealthCheck *LoadBalancerHealthCheck `json:"healthCheck"`
877
-+	Name        *string                  `json:"name"`
878
-+	PortMaps    []*LoadBalancerPortMap   `json:"portMaps"`
879
-+	Type        *string                  `json:"type"`
880
-+	SubDomain   *string                  `json:"subDomain"`
881
-+}
882
-+
883
-+// Represents the health check spec for a load balancer.
884
-+type LoadBalancerHealthCheck struct {
885
-+	HealthyThreshold  int64   `json:"healthyThreshold,omitempty"`
886
-+	IntervalInSeconds int64   `json:"intervalInSeconds,omitempty"`
887
-+	Path              *string `json:"path,omitempty"`
888
-+	Port              *int64  `json:"port"`
889
-+	Protocol          *string `json:"protocol"`
890
-+}
891
-+
892
-+// Represents a port mapping spec for a load balancer.
893
-+type LoadBalancerPortMap struct {
894
-+	AllowedCidrs         []*string `json:"allowedCidrs"`
895
-+	InstancePort         *int64    `json:"instancePort"`
896
-+	InstanceProtocol     *string   `json:"instanceProtocol"`
897
-+	LoadBalancerPort     *int64    `json:"loadBalancerPort"`
898
-+	LoadBalancerProtocol *string   `json:"loadBalancerProtocol"`
899
-+}
900
-+
901
-+// Represents a VM to be registered with or deregistered from the load balancer.
902
-+type LoadBalancerVM struct {
903
-+	ID *string `json:"id"`
904
-+}
905
-+
906
-+// Represents a list of VMs to be registered with or deregistered from the load balancer.
907
-+type LoadBalancerVMUpdate struct {
908
-+	VMIds []*LoadBalancerVM `json:"vmIds"`
909
-+}
910
-diff --git a/pkg/cloudprovider/providers/cascade/auth.go b/pkg/cloudprovider/providers/cascade/auth.go
911
-new file mode 100644
912
-index 0000000..fc92377
913
-+++ b/pkg/cloudprovider/providers/cascade/auth.go
914
-@@ -0,0 +1,145 @@
915
-+package cascade
916
-+
917
-+import (
918
-+	"fmt"
919
-+	"strings"
920
-+	"github.com/golang/glog"
921
-+	"os/exec"
922
-+)
923
-+
924
-+const (
925
-+	tScope = "openid offline_access rs_admin_server at_groups rs_vmdir"
926
-+
927
-+	afdCli                     = "/opt/vmware/bin/vmafd-cli"
928
-+	afdCliMachineAccountCmd    = "get-machine-account-info"
929
-+	afdCliPasswordPrefix       = "Password: "
930
-+	afdCliSeparator            = "\n"
931
-+)
932
-+
933
-+// AuthConfig contains configuration information for the authentication client.
934
-+type AuthConfig struct {
935
-+	tenantName string
936
-+	authEndpoint string
937
-+	machineAccountName string
938
-+}
939
-+
940
-+// AuthClient defines functions related to authentication.
941
-+type AuthClient struct {
942
-+	cfg *AuthConfig
943
-+}
944
-+
945
-+// NewAuthClient creates a new authentication client
946
-+func NewAuthClient(cascadeCfg *CascadeConfig) (*AuthClient, error) {
947
-+	return &AuthClient{
948
-+		cfg: &AuthConfig{
949
-+			tenantName: cascadeCfg.Global.TenantName,
950
-+			authEndpoint: cascadeCfg.Global.AuthEndpoint,
951
-+			machineAccountName: fmt.Sprintf("%s@%s", cascadeCfg.Global.DNSName, cascadeCfg.Global.DomainName),
952
-+		},
953
-+	}, nil
954
-+}
955
-+
956
-+func (c *AuthClient) GetTokensByMachineAccount() (*TokenOptions, error) {
957
-+	// Use the VMAFD CLI to get the machine account password
958
-+	cmd := exec.Command(afdCli, afdCliMachineAccountCmd)
959
-+	output, err := cmd.Output()
960
-+	if err != nil {
961
-+		glog.Errorf("Cascade Cloud Provider: Failed to get machine account credentials. Cannot create Client.")
962
-+		return nil, fmt.Errorf("Failed to get machine account credentials, err: %v", err)
963
-+	}
964
-+
965
-+	password, err := parseMachineAccountInfo(output)
966
-+	if err != nil {
967
-+		glog.Errorf("Cascade Cloud Provider: Failed to parse machine account credentials. Cannot create Client.")
968
-+		return nil, fmt.Errorf("Failed to parse machine account credentials, err: %v", err)
969
-+	}
970
-+
971
-+	return c.GetTokensByCredentials(c.cfg.machineAccountName, password)
972
-+}
973
-+
974
-+// GetTokensByPassword gets tokens using username and password
975
-+func (c *AuthClient) GetTokensByCredentials(username, password string) (*TokenOptions, error) {
976
-+	// Parse tenant part from username
977
-+	parts := strings.Split(username, "@")
978
-+	if len(parts) != 2 {
979
-+		return nil, fmt.Errorf("Invalid full user name '%s': expected user@tenant", username)
980
-+	}
981
-+	tenant := parts[1]
982
-+
983
-+	oidcClient, err := buildOIDCClient(c.cfg.authEndpoint)
984
-+	if err != nil {
985
-+		return nil, err
986
-+	}
987
-+
988
-+	tokenResponse, err := oidcClient.GetTokenByPasswordGrant(tenant, username, password)
989
-+	if err != nil {
990
-+		return nil, err
991
-+	}
992
-+
993
-+	return toTokenOptions(tokenResponse), nil
994
-+}
995
-+
996
-+// GetTokensByRefreshToken gets tokens using refresh token
997
-+func (c *AuthClient) GetTokensByRefreshToken(refreshtoken string) (*TokenOptions, error) {
998
-+	oidcClient, err := buildOIDCClient(c.cfg.authEndpoint)
999
-+	if err != nil {
1000
-+		return nil, err
1001
-+	}
1002
-+
1003
-+	tokenResponse, err := oidcClient.GetTokenByRefreshTokenGrant(c.cfg.tenantName, refreshtoken)
1004
-+	if err != nil {
1005
-+		return nil, err
1006
-+	}
1007
-+
1008
-+	return toTokenOptions(tokenResponse), nil
1009
-+}
1010
-+
1011
-+func buildOIDCClient(authEndpoint string) (*OIDCClient, error) {
1012
-+	options := &OIDCClientOptions{
1013
-+		IgnoreCertificate: false,
1014
-+		RootCAs:           nil,
1015
-+		TokenScope:        tScope,
1016
-+	}
1017
-+
1018
-+	return NewOIDCClient(authEndpoint, options, nil), nil
1019
-+}
1020
-+
1021
-+func toTokenOptions(response *OIDCTokenResponse) *TokenOptions {
1022
-+	return &TokenOptions{
1023
-+		AccessToken:  response.AccessToken,
1024
-+		ExpiresIn:    response.ExpiresIn,
1025
-+		RefreshToken: response.RefreshToken,
1026
-+		IDToken:      response.IDToken,
1027
-+		TokenType:    response.TokenType,
1028
-+	}
1029
-+}
1030
-+
1031
-+// parseMachineAccountInfo parses the machine account password from the machine-account-info output which looks like
1032
-+// this:
1033
-+//MachineAccount: photon-8rwdscr1.lw-testdom.com
1034
-+//Password: FT`])}]d/3\EPwRpz9k1
1035
-+func parseMachineAccountInfo(output []byte) (string, error) {
1036
-+	if len(output) <= 0 {
1037
-+		return "", fmt.Errorf("account info is not specified")
1038
-+	}
1039
-+
1040
-+	strOut := string(output)
1041
-+	strOutLen := len(strOut)
1042
-+
1043
-+	pwdStart := strings.Index(strOut, afdCliPasswordPrefix)
1044
-+	if pwdStart < 0 {
1045
-+		return "", fmt.Errorf("account info is not in expected format")
1046
-+	}
1047
-+	pwdStart = pwdStart + len(afdCliPasswordPrefix)
1048
-+	if pwdStart >= strOutLen {
1049
-+		return "", fmt.Errorf("account info is not in expected format")
1050
-+	}
1051
-+	pwdEnd := strings.LastIndex(strOut, afdCliSeparator)
1052
-+	if pwdEnd < 0 || pwdEnd <= pwdStart || pwdEnd >= strOutLen {
1053
-+		return "", fmt.Errorf("account info is not in expected format")
1054
-+	}
1055
-+
1056
-+	pwd := strOut[pwdStart:pwdEnd]
1057
-+
1058
-+	return pwd, nil
1059
-+}
1060
-\ No newline at end of file
1061
-diff --git a/pkg/cloudprovider/providers/cascade/cascade.go b/pkg/cloudprovider/providers/cascade/cascade.go
1062
-new file mode 100644
1063
-index 0000000..06ada64
1064
-+++ b/pkg/cloudprovider/providers/cascade/cascade.go
1065
-@@ -0,0 +1,215 @@
1066
-+// The use of Cascade cloud provider requires the kubelet, kube-apiserver, and kube-controller-manager to be started
1067
-+// with config flag: '--cloud-provider=cascade --cloud-config=[path_to_config_file]'.
1068
-+package cascade
1069
-+
1070
-+import (
1071
-+	"context"
1072
-+	"errors"
1073
-+	"fmt"
1074
-+	"github.com/golang/glog"
1075
-+	"gopkg.in/gcfg.v1"
1076
-+	"io"
1077
-+	k8stypes "k8s.io/apimachinery/pkg/types"
1078
-+	"k8s.io/kubernetes/pkg/cloudprovider"
1079
-+	"k8s.io/kubernetes/pkg/controller"
1080
-+	"os"
1081
-+	"strings"
1082
-+)
1083
-+
1084
-+const (
1085
-+	ProviderName = "vke"
1086
-+	DiskSpecKind = "persistent-disk"
1087
-+	MasterPrefix = "master"
1088
-+)
1089
-+
1090
-+// CascadeCloud is an implementation of the cloud provider interface for Cascade Controller.
1091
-+type CascadeCloud struct {
1092
-+	cfg *CascadeConfig
1093
-+	// Authentication client to get token for Cascade API calls
1094
-+	authClient *AuthClient
1095
-+	// API Client to make Cascade API calls
1096
-+	apiClient *Client
1097
-+	// local $HOSTNAME
1098
-+	localHostname string
1099
-+	// hostname from K8S, could be overridden
1100
-+	localK8sHostname string
1101
-+}
1102
-+
1103
-+// CascadeCloud represents Cascade cloud provider's configuration.
1104
-+type CascadeConfig struct {
1105
-+	Global struct {
1106
-+		// the Cascade Controller endpoint
1107
-+		CloudTarget string `gcfg:"target"`
1108
-+		// Cascade Controller tenantName name
1109
-+		TenantName string `gcfg:"tenantName"`
1110
-+		// Cascade Controller cluster ID
1111
-+		ClusterID string `gcfg:"clusterID"`
1112
-+		// Authentication server endpoint for Cascade Controller
1113
-+		AuthEndpoint string `gcfg:"authEndpoint"`
1114
-+		// Lightwave domain name for the node
1115
-+		DomainName string `gcfg:"domainName"`
1116
-+		// DNS name of the node.
1117
-+		DNSName string `gcfg:"dnsName"`
1118
-+		// Region in which the cluster is in
1119
-+		Region string `gcfg:"region"`
1120
-+		// Availability zone in which the cluster is in
1121
-+		Zone string `gcfg:"zone"`
1122
-+		// IP address of the node.
1123
-+		IPAddress string `gcfg:"ipAddress"`
1124
-+	}
1125
-+}
1126
-+
1127
-+// Disks is interface for manipulation with Cascade Controller Persistent Disks.
1128
-+type Disks interface {
1129
-+	// AttachDisk attaches given disk to given node. Current node
1130
-+	// is used when nodeName is empty string.
1131
-+	AttachDisk(diskID string, nodeName k8stypes.NodeName) (string, error)
1132
-+
1133
-+	// DetachDisk detaches given disk to given node. Current node
1134
-+	// is used when nodeName is empty string.
1135
-+	DetachDisk(diskID string, nodeName k8stypes.NodeName) error
1136
-+
1137
-+	// DiskIsAttached checks if a disk is attached to the given node.
1138
-+	DiskIsAttached(diskID string, nodeName k8stypes.NodeName) (bool, error)
1139
-+
1140
-+	// DisksAreAttached is a batch function to check if a list of disks are attached
1141
-+	// to the node with the specified NodeName.
1142
-+	DisksAreAttached(diskID []string, nodeName k8stypes.NodeName) (map[string]bool, error)
1143
-+
1144
-+	// CreateDisk creates a new PD with given properties.
1145
-+	CreateDisk(volumeOptions *VolumeOptions) (diskID string, err error)
1146
-+
1147
-+	// DeleteDisk deletes PD.
1148
-+	DeleteDisk(diskID string) error
1149
-+
1150
-+	// Get labels to apply to volume on creation.
1151
-+	GetVolumeLabels(diskID string) (map[string]string, error)
1152
-+}
1153
-+
1154
-+// VolumeOptions specifies capacity, tags, name and flavorID for a volume.
1155
-+type VolumeOptions struct {
1156
-+	CapacityGB int
1157
-+	Tags       map[string]string
1158
-+	Name       string
1159
-+	Flavor     string
1160
-+	Encrypted  bool
1161
-+}
1162
-+
1163
-+func readConfig(config io.Reader) (*CascadeConfig, error) {
1164
-+	if config == nil {
1165
-+		err := fmt.Errorf("Cascade Cloud Provider: config file is missing. Please restart with " +
1166
-+			"--cloud-provider=cascade --cloud-config=[path_to_config_file]")
1167
-+		return nil, err
1168
-+	}
1169
-+
1170
-+	var cfg CascadeConfig
1171
-+	err := gcfg.ReadInto(&cfg, config)
1172
-+	return &cfg, err
1173
-+}
1174
-+
1175
-+func init() {
1176
-+	cloudprovider.RegisterCloudProvider(ProviderName, func(config io.Reader) (cloudprovider.Interface, error) {
1177
-+		cfg, err := readConfig(config)
1178
-+		if err != nil {
1179
-+			glog.Errorf("Cascade Cloud Provider: failed to read in cloud provider config file. Error[%v]", err)
1180
-+			return nil, err
1181
-+		}
1182
-+		return newCascadeCloud(cfg)
1183
-+	})
1184
-+}
1185
-+
1186
-+func newCascadeCloud(cfg *CascadeConfig) (*CascadeCloud, error) {
1187
-+	if len(cfg.Global.CloudTarget) == 0 {
1188
-+		return nil, fmt.Errorf("Cascade Controller endpoint was not specified.")
1189
-+	}
1190
-+
1191
-+	// Get local hostname
1192
-+	hostname, err := os.Hostname()
1193
-+	if err != nil {
1194
-+		glog.Errorf("Cascade Cloud Provider: get hostname failed. Error[%v]", err)
1195
-+		return nil, err
1196
-+	}
1197
-+
1198
-+	cc := CascadeCloud{
1199
-+		cfg:              cfg,
1200
-+		localHostname:    hostname,
1201
-+		localK8sHostname: "",
1202
-+	}
1203
-+
1204
-+	// Instantiate the auth and API clients only on the master nodes. Kubelets running on the workers don't need them as
1205
-+	// they are used primarily for making API calls to Cascade.
1206
-+	if strings.HasPrefix(hostname, MasterPrefix) {
1207
-+		if cc.authClient, err = NewAuthClient(cfg); err != nil {
1208
-+			return nil, err
1209
-+		}
1210
-+
1211
-+		if cc.apiClient, err = NewClient(cfg, cc.authClient); err != nil {
1212
-+			return nil, err
1213
-+		}
1214
-+	}
1215
-+
1216
-+	return &cc, nil
1217
-+}
1218
-+
1219
-+// Initialize passes a Kubernetes clientBuilder interface to the cloud provider
1220
-+func (cc *CascadeCloud) Initialize(clientBuilder controller.ControllerClientBuilder) {}
1221
-+
1222
-+// Instances returns an implementation of Instances for Cascade Controller.
1223
-+func (cc *CascadeCloud) Instances() (cloudprovider.Instances, bool) {
1224
-+	return cc, true
1225
-+}
1226
-+
1227
-+func (cc *CascadeCloud) Clusters() (cloudprovider.Clusters, bool) {
1228
-+	return nil, true
1229
-+}
1230
-+
1231
-+// ProviderName returns the cloud provider ID.
1232
-+func (cc *CascadeCloud) ProviderName() string {
1233
-+	return ProviderName
1234
-+}
1235
-+
1236
-+// LoadBalancer returns an implementation of LoadBalancer for Cascade Controller.
1237
-+func (cc *CascadeCloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) {
1238
-+	return cc, true
1239
-+}
1240
-+
1241
-+// Zones returns an implementation of Zones for Cascade Controller.
1242
-+func (cc *CascadeCloud) Zones() (cloudprovider.Zones, bool) {
1243
-+	return cc, true
1244
-+}
1245
-+
1246
-+func (cc *CascadeCloud) GetZone(ctx context.Context) (cloudprovider.Zone, error) {
1247
-+	return cloudprovider.Zone{
1248
-+		Region:        cc.cfg.Global.Region,
1249
-+		FailureDomain: cc.cfg.Global.Zone,
1250
-+	}, nil
1251
-+}
1252
-+
1253
-+// GetZoneByProviderID implements Zones.GetZoneByProviderID
1254
-+// This is particularly useful in external cloud providers where the kubelet
1255
-+// does not initialize node data.
1256
-+func (cc *CascadeCloud) GetZoneByProviderID(ctx context.Context, providerID string) (cloudprovider.Zone, error) {
1257
-+	return cloudprovider.Zone{}, errors.New("unimplemented")
1258
-+}
1259
-+
1260
-+// GetZoneByNodeName implements Zones.GetZoneByNodeName
1261
-+// This is particularly useful in external cloud providers where the kubelet
1262
-+// does not initialize node data.
1263
-+func (cc *CascadeCloud) GetZoneByNodeName(ctx context.Context, nodeName k8stypes.NodeName) (cloudprovider.Zone, error) {
1264
-+	return cloudprovider.Zone{}, errors.New("unimeplemented")
1265
-+}
1266
-+
1267
-+// Routes returns a false since the interface is not supported for Cascade controller.
1268
-+func (cc *CascadeCloud) Routes() (cloudprovider.Routes, bool) {
1269
-+	return nil, false
1270
-+}
1271
-+
1272
-+// ScrubDNS filters DNS settings for pods.
1273
-+func (cc *CascadeCloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []string) {
1274
-+	return nameservers, searches
1275
-+}
1276
-+
1277
-+// HasClusterID returns true if the cluster has a clusterID
1278
-+func (cc *CascadeCloud) HasClusterID() bool {
1279
-+	return true
1280
-+}
1281
-diff --git a/pkg/cloudprovider/providers/cascade/cascade_disks.go b/pkg/cloudprovider/providers/cascade/cascade_disks.go
1282
-new file mode 100644
1283
-index 0000000..a2e8ded
1284
-+++ b/pkg/cloudprovider/providers/cascade/cascade_disks.go
1285
-@@ -0,0 +1,228 @@
1286
-+package cascade
1287
-+
1288
-+import (
1289
-+	"context"
1290
-+	"github.com/golang/glog"
1291
-+	k8stypes "k8s.io/apimachinery/pkg/types"
1292
-+	"k8s.io/apimachinery/pkg/util/sets"
1293
-+	"k8s.io/kubernetes/pkg/kubelet/apis"
1294
-+	"k8s.io/kubernetes/pkg/volume"
1295
-+	volumeutil "k8s.io/kubernetes/pkg/volume/util"
1296
-+)
1297
-+
1298
-+// Attaches given virtual disk volume to the node running kubelet.
1299
-+func (cc *CascadeCloud) AttachDisk(diskID string, nodeName k8stypes.NodeName) (string, error) {
1300
-+	// Check if disk is already attached to that node.
1301
-+	attached, err := cc.DiskIsAttached(diskID, nodeName)
1302
-+	if err != nil {
1303
-+		glog.Errorf("Cascade Cloud Provider: cc.DiskIsAttached failed during AttachDisk. Error[%v]", err)
1304
-+		return "", err
1305
-+	}
1306
-+
1307
-+	// If not already attached, attach the disk.
1308
-+	if !attached {
1309
-+		operation := &VMDiskOperation{
1310
-+			DiskID: StringPtr(diskID),
1311
-+		}
1312
-+
1313
-+		vmID, err := cc.InstanceID(context.TODO(), nodeName)
1314
-+		if err != nil {
1315
-+			glog.Errorf("Cascade Cloud Provider: cc.InstanceID failed for AttachDisk. Error[%v]", err)
1316
-+			return "", err
1317
-+		}
1318
-+
1319
-+		task, err := cc.apiClient.AttachDisk(vmID, operation)
1320
-+		if err != nil {
1321
-+			glog.Errorf("Cascade Cloud Provider: Failed to attach disk with ID %s. Error[%v]", diskID, err)
1322
-+			return "", err
1323
-+		}
1324
-+
1325
-+		_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
1326
-+		if err != nil {
1327
-+			glog.Errorf("Cascade Cloud Provider: Failed to wait for task to attach disk with ID %s. Error[%v]",
1328
-+				diskID, err)
1329
-+			return "", err
1330
-+		}
1331
-+	}
1332
-+
1333
-+	// Get mount device of the attached disk.
1334
-+	disk, err := cc.apiClient.GetDisk(diskID)
1335
-+	if err != nil {
1336
-+		glog.Errorf("Cascade Cloud Provider: Failed to Get disk with diskID %s. Error[%v]", diskID, err)
1337
-+		return "", err
1338
-+	}
1339
-+
1340
-+	return disk.MountDevice, nil
1341
-+}
1342
-+
1343
-+// Detaches given virtual disk volume from the node running kubelet.
1344
-+func (cc *CascadeCloud) DetachDisk(diskID string, nodeName k8stypes.NodeName) error {
1345
-+	operation := &VMDiskOperation{
1346
-+		DiskID: StringPtr(diskID),
1347
-+	}
1348
-+
1349
-+	vmID, err := cc.InstanceID(context.TODO(), nodeName)
1350
-+	if err != nil {
1351
-+		glog.Errorf("Cascade Cloud Provider: cc.InstanceID failed for DetachDisk. Error[%v]", err)
1352
-+		return err
1353
-+	}
1354
-+
1355
-+	task, err := cc.apiClient.DetachDisk(vmID, operation)
1356
-+	if err != nil {
1357
-+		glog.Errorf("Cascade Cloud Provider: Failed to detach disk with pdID %s. Error[%v]", diskID, err)
1358
-+		return err
1359
-+	}
1360
-+
1361
-+	_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
1362
-+	if err != nil {
1363
-+		glog.Errorf("Cascade Cloud Provider: Failed to wait for task to detach disk with pdID %s. Error[%v]",
1364
-+			diskID, err)
1365
-+		return err
1366
-+	}
1367
-+
1368
-+	return nil
1369
-+}
1370
-+
1371
-+// DiskIsAttached returns if disk is attached to the VM using controllers supported by the plugin.
1372
-+func (cc *CascadeCloud) DiskIsAttached(diskID string, nodeName k8stypes.NodeName) (bool, error) {
1373
-+	vmID, err := cc.InstanceID(context.TODO(), nodeName)
1374
-+	if err != nil {
1375
-+		glog.Errorf("Cascade Cloud Provider: cc.InstanceID failed for DiskIsAttached. Error[%v]", err)
1376
-+		return false, err
1377
-+	}
1378
-+
1379
-+	_, err = cc.apiClient.GetVM(vmID)
1380
-+	if err != nil {
1381
-+		switch err.(type) {
1382
-+		case APIError:
1383
-+			if err.(APIError).ErrorCode == VMNotFoundError {
1384
-+				// If instance no longer exists, we will assume that the volume is not attached.
1385
-+				glog.Warningf("Cascade Cloud Provider: Instance %s does not exist. DiskIsAttached will assume"+
1386
-+					" disk %s is not attached to it.", nodeName, diskID)
1387
-+				return false, nil
1388
-+			}
1389
-+		}
1390
-+		return false, err
1391
-+	}
1392
-+
1393
-+	disk, err := cc.apiClient.GetDisk(diskID)
1394
-+	if err != nil {
1395
-+		glog.Errorf("Cascade Cloud Provider: Failed to Get disk with diskID %s. Error[%v]", diskID, err)
1396
-+		return false, err
1397
-+	}
1398
-+
1399
-+	if disk.VM == vmID && StringVal(disk.State) == DiskStateAttached {
1400
-+		return true, nil
1401
-+	}
1402
-+
1403
-+	return false, nil
1404
-+}
1405
-+
1406
-+// DisksAreAttached returns if disks are attached to the VM using controllers supported by the plugin.
1407
-+func (cc *CascadeCloud) DisksAreAttached(diskIDs []string, nodeName k8stypes.NodeName) (map[string]bool, error) {
1408
-+	attached := make(map[string]bool)
1409
-+	for _, diskID := range diskIDs {
1410
-+		attached[diskID] = false
1411
-+	}
1412
-+
1413
-+	vmID, err := cc.InstanceID(context.TODO(), nodeName)
1414
-+	if err != nil {
1415
-+		glog.Errorf("Cascade Cloud Provider: cc.InstanceID failed for DiskIsAttached. Error[%v]", err)
1416
-+		return attached, err
1417
-+	}
1418
-+
1419
-+	for _, diskID := range diskIDs {
1420
-+		disk, err := cc.apiClient.GetDisk(diskID)
1421
-+		if err != nil {
1422
-+			glog.Warningf("Cascade Cloud Provider: failed to get VMs for persistent disk %s, err [%v]",
1423
-+				diskID, err)
1424
-+		} else {
1425
-+			if disk.VM == vmID && StringVal(disk.State) == DiskStateAttached {
1426
-+				attached[diskID] = true
1427
-+			}
1428
-+		}
1429
-+	}
1430
-+
1431
-+	return attached, nil
1432
-+}
1433
-+
1434
-+// Create a volume of given size (in GB).
1435
-+func (cc *CascadeCloud) CreateDisk(volumeOptions *VolumeOptions) (diskID string, err error) {
1436
-+	// Get Zones for the cluster
1437
-+	zones, err := cc.apiClient.GetZones()
1438
-+	if err != nil {
1439
-+		glog.Errorf("Cascade Cloud Provider: Failed to Get zones for the cluster. Error[%v]", err)
1440
-+		return "", err
1441
-+	}
1442
-+
1443
-+	// Pick a zone to place the disk in.
1444
-+	zoneSet := sets.NewString()
1445
-+	for _, zone := range zones {
1446
-+		zoneSet.Insert(zone)
1447
-+	}
1448
-+	zone := volumeutil.ChooseZoneForVolume(zoneSet, volumeOptions.Name)
1449
-+
1450
-+	diskSpec := DiskCreateSpec{}
1451
-+	diskSpec.Name = StringPtr(volumeOptions.Name)
1452
-+	diskSpec.Flavor = StringPtr(volumeOptions.Flavor)
1453
-+	diskSpec.CapacityGB = Int32Ptr(int32(volumeOptions.CapacityGB))
1454
-+	diskSpec.Kind = StringPtr(DiskSpecKind)
1455
-+	diskSpec.Zone = StringPtr(zone)
1456
-+	diskSpec.Encrypted = BoolPtr(volumeOptions.Encrypted)
1457
-+
1458
-+	task, err := cc.apiClient.CreateDisk(&diskSpec)
1459
-+	if err != nil {
1460
-+		glog.Errorf("Cascade Cloud Provider: Failed to CreateDisk. Error[%v]", err)
1461
-+		return "", err
1462
-+	}
1463
-+
1464
-+	waitTask, err := cc.apiClient.WaitForTask(StringVal(task.ID))
1465
-+	if err != nil {
1466
-+		glog.Errorf("Cascade Cloud Provider: Failed to wait for task to CreateDisk. Error[%v]", err)
1467
-+		return "", err
1468
-+	}
1469
-+
1470
-+	return StringVal(waitTask.Entity.ID), nil
1471
-+}
1472
-+
1473
-+// Deletes a volume given volume name.
1474
-+func (cc *CascadeCloud) DeleteDisk(diskID string) error {
1475
-+	task, err := cc.apiClient.DeleteDisk(diskID)
1476
-+	if err != nil {
1477
-+		glog.Errorf("Cascade Cloud Provider: Failed to DeleteDisk. Error[%v]", err)
1478
-+		// If we get a DiskNotFound error, we assume that the disk is already deleted. So we don't return an error here.
1479
-+		switch err.(type) {
1480
-+		case APIError:
1481
-+			if err.(APIError).ErrorCode == DiskNotFoundError {
1482
-+				return nil
1483
-+			}
1484
-+			if err.(APIError).ErrorCode == DiskInUseError {
1485
-+				return volume.NewDeletedVolumeInUseError(err.Error())
1486
-+			}
1487
-+		}
1488
-+		return err
1489
-+	}
1490
-+
1491
-+	_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
1492
-+	if err != nil {
1493
-+		glog.Errorf("Cascade Cloud Provider: Failed to wait for task to DeleteDisk. Error[%v]", err)
1494
-+		return err
1495
-+	}
1496
-+
1497
-+	return nil
1498
-+}
1499
-+
1500
-+// Gets the zone and region for the volume.
1501
-+func (cc *CascadeCloud) GetVolumeLabels(diskID string) (map[string]string, error) {
1502
-+	disk, err := cc.apiClient.GetDisk(diskID)
1503
-+	if err != nil {
1504
-+		glog.Errorf("Cascade Cloud Provider: Failed to GetDisk for GetVolumeLabels. Error[%v]", err)
1505
-+		return nil, err
1506
-+	}
1507
-+
1508
-+	labels := make(map[string]string)
1509
-+	labels[apis.LabelZoneFailureDomain] = StringVal(disk.Zone)
1510
-+	labels[apis.LabelZoneRegion] = cc.cfg.Global.Region
1511
-+
1512
-+	return labels, nil
1513
-+}
1514
-diff --git a/pkg/cloudprovider/providers/cascade/cascade_instances.go b/pkg/cloudprovider/providers/cascade/cascade_instances.go
1515
-new file mode 100644
1516
-index 0000000..33acfc0
1517
-+++ b/pkg/cloudprovider/providers/cascade/cascade_instances.go
1518
-@@ -0,0 +1,132 @@
1519
-+package cascade
1520
-+
1521
-+import (
1522
-+	"context"
1523
-+	"errors"
1524
-+	"github.com/golang/glog"
1525
-+	"os"
1526
-+	"strings"
1527
-+
1528
-+	"k8s.io/api/core/v1"
1529
-+	k8stypes "k8s.io/apimachinery/pkg/types"
1530
-+	"k8s.io/kubernetes/pkg/cloudprovider"
1531
-+)
1532
-+
1533
-+// NodeAddresses is an implementation of Instances.NodeAddresses. In the future, private IP address, external IP, etc.
1534
-+// will be added based on need.
1535
-+func (cc *CascadeCloud) NodeAddresses(ctx context.Context, nodeName k8stypes.NodeName) ([]v1.NodeAddress, error) {
1536
-+	return []v1.NodeAddress{
1537
-+		{Type: v1.NodeInternalIP, Address: cc.cfg.Global.IPAddress},
1538
-+		{Type: v1.NodeInternalDNS, Address: cc.cfg.Global.DNSName},
1539
-+	}, nil
1540
-+}
1541
-+
1542
-+// NodeAddressesByProviderID returns the node addresses of an instances with the specified unique providerID
1543
-+// This method will not be called from the node that is requesting this ID. i.e. metadata service
1544
-+// and other local methods cannot be used here
1545
-+func (cc *CascadeCloud) NodeAddressesByProviderID(ctx context.Context, providerID string) ([]v1.NodeAddress, error) {
1546
-+	// Get the name of the VM using the ID and generate the DNS name based on the VM name.
1547
-+	vm, err := cc.apiClient.GetVM(providerID)
1548
-+	if err != nil {
1549
-+		return nil, err
1550
-+	}
1551
-+	// Get the DNS name for the master VM and replace the VM name portion with the requested VM name.
1552
-+	dnsNameParts := strings.SplitN(cc.cfg.Global.DNSName, ".", 2)
1553
-+	if len(dnsNameParts) != 2 {
1554
-+		return nil, errors.New("Cascade cloud provider: Invalid DNS name specified in the configuation. " +
1555
-+			"Cannot get NodeAddressByProviderID.")
1556
-+	}
1557
-+	dnsAddress := StringVal(vm.Name) + dnsNameParts[1]
1558
-+	addresses := []v1.NodeAddress{}
1559
-+	addresses = append(addresses, v1.NodeAddress{Type: v1.NodeInternalDNS, Address: dnsAddress})
1560
-+	return addresses, nil
1561
-+}
1562
-+
1563
-+func (cc *CascadeCloud) AddSSHKeyToAllInstances(ctx context.Context, user string, keyData []byte) error {
1564
-+	return errors.New("unimplemented")
1565
-+}
1566
-+
1567
-+// Current node name returns node name based on host name. For Cascade Kubernetes nodes, we will use host name as the
1568
-+// node name.
1569
-+func (cc *CascadeCloud) CurrentNodeName(ctx context.Context, hostname string) (k8stypes.NodeName, error) {
1570
-+	cc.localK8sHostname = hostname
1571
-+	return k8stypes.NodeName(hostname), nil
1572
-+}
1573
-+
1574
-+// ExternalID returns the cloud provider ID of the specified instance (deprecated).
1575
-+// Note: We call Cascade Controller here to check if the instance is alive or not. That check is used by Kubernetes
1576
-+// to proactively remove nodes that the cloud provider believes is no longer available. Even otherwise, Kubernetes
1577
-+// will remove those nodes eventually.
1578
-+
1579
-+func (cc *CascadeCloud) ExternalID(ctx context.Context, nodeName k8stypes.NodeName) (string, error) {
1580
-+	return getInstanceIDAndLivelinessFromNodeName(cc, nodeName)
1581
-+}
1582
-+
1583
-+// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running.
1584
-+// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager.
1585
-+func (cc *CascadeCloud) InstanceExistsByProviderID(ctx context.Context, providerID string) (bool, error) {
1586
-+	return false, errors.New("unimplemented")
1587
-+}
1588
-+
1589
-+// InstanceID returns the cloud provider ID of the specified instance.
1590
-+func (cc *CascadeCloud) InstanceID(ctx context.Context, nodeName k8stypes.NodeName) (string, error) {
1591
-+	return getInstanceIDFromNodeName(nodeName)
1592
-+}
1593
-+
1594
-+// This gets the Cascade VM ID from the Kubernetes node name.
1595
-+func getInstanceIDFromNodeName(nodeName k8stypes.NodeName) (string, error) {
1596
-+	// nodeName is of the format master-instance-id or worker-instance-id. To compute the instance ID, we need to just
1597
-+	// get the portion after master- or worker-. That is what we do below.
1598
-+	nodeParts := strings.SplitN(string(nodeName), "-", 2)
1599
-+	if len(nodeParts) != 2 {
1600
-+		return "", errors.New("Cascade cloud provider: Invalid node name. Cannot fetch instance ID.")
1601
-+	}
1602
-+	return nodeParts[1], nil
1603
-+}
1604
-+
1605
-+// This gets the Cascade VM ID and its liveliness from the Kubernetes node name.
1606
-+func getInstanceIDAndLivelinessFromNodeName(cc *CascadeCloud, nodeName k8stypes.NodeName) (string, error) {
1607
-+	instanceID, err := getInstanceIDFromNodeName(nodeName)
1608
-+	if err != nil {
1609
-+		return "", err
1610
-+	}
1611
-+	// Get local hostname. We need to do this check to make sure we call VKE controller only from master nodes
1612
-+	// because worker nodes cannot login to VKE controller.
1613
-+	hostname, err := os.Hostname()
1614
-+	if err != nil {
1615
-+		glog.Errorf("Cascade Cloud Provider: get hostname failed. Error[%v]", err)
1616
-+		return "", err
1617
-+	}
1618
-+	// Note: Kubelet running on the worker node do not need to call VKE.
1619
-+	if strings.HasPrefix(hostname, MasterPrefix) {
1620
-+		_, err := cc.apiClient.GetVM(instanceID)
1621
-+		if err != nil {
1622
-+			switch err.(type) {
1623
-+			case APIError:
1624
-+				if err.(APIError).ErrorCode == VMNotFoundError {
1625
-+					// If instance no longer exists, we will return instance not found error
1626
-+					glog.Warningf("Cascade Cloud Provider: VM %s does not exist", instanceID)
1627
-+					return "", cloudprovider.InstanceNotFound
1628
-+				}
1629
-+			}
1630
-+		}
1631
-+	}
1632
-+	return instanceID, nil
1633
-+}
1634
-+
1635
-+
1636
-+// InstanceTypeByProviderID returns the cloudprovider instance type of the node with the specified unique providerID
1637
-+// This method will not be called from the node that is requesting this ID. i.e. metadata service
1638
-+// and other local methods cannot be used here
1639
-+func (cc *CascadeCloud) InstanceTypeByProviderID(ctx context.Context, providerID string) (string, error) {
1640
-+	return "", errors.New("unimplemented")
1641
-+}
1642
-+
1643
-+func (cc *CascadeCloud) InstanceType(ctx context.Context, nodeName k8stypes.NodeName) (string, error) {
1644
-+	return "", nil
1645
-+}
1646
-+
1647
-+// InstanceShutdownByProviderID returns true if the instance is in safe state to detach volumes
1648
-+func (cc *CascadeCloud) InstanceShutdownByProviderID(ctx context.Context, providerID string) (bool, error) {
1649
-+	return false, cloudprovider.NotImplemented
1650
-+}
1651
-diff --git a/pkg/cloudprovider/providers/cascade/cascade_instances_test.go b/pkg/cloudprovider/providers/cascade/cascade_instances_test.go
1652
-new file mode 100644
1653
-index 0000000..8fb314d
1654
-+++ b/pkg/cloudprovider/providers/cascade/cascade_instances_test.go
1655
-@@ -0,0 +1,44 @@
1656
-+package cascade
1657
-+
1658
-+import (
1659
-+	"context"
1660
-+	"strings"
1661
-+	"testing"
1662
-+
1663
-+	"github.com/stretchr/testify/assert"
1664
-+	"k8s.io/api/core/v1"
1665
-+)
1666
-+
1667
-+const configFile = `
1668
-+[Global]
1669
-+target = target
1670
-+tenantName = tenant
1671
-+clusterID = cluster-id
1672
-+authEndpoint = auth-endpoint
1673
-+domainName = domain.test
1674
-+dnsName = node.domain.test
1675
-+region = region
1676
-+zone = zone
1677
-+ipAddress = 1.1.1.1
1678
-+`
1679
-+
1680
-+func getCascadeInstance() (*CascadeCloud, error) {
1681
-+	cfg, err := readConfig(strings.NewReader(configFile))
1682
-+	return &CascadeCloud{
1683
-+		cfg:              cfg,
1684
-+		localHostname:    "hostname",
1685
-+		localK8sHostname: "",
1686
-+	}, err
1687
-+}
1688
-+
1689
-+func TestNodeAddresses(t *testing.T) {
1690
-+	cc, err := getCascadeInstance()
1691
-+	assert.Nil(t, err)
1692
-+	expectedNodeAddresses := []v1.NodeAddress{
1693
-+		{Type: v1.NodeInternalIP, Address: "1.1.1.1"},
1694
-+		{Type: v1.NodeInternalDNS, Address: "node.domain.test"},
1695
-+	}
1696
-+	actualNodeAddresses, err := cc.NodeAddresses(context.TODO(), "node")
1697
-+	assert.Nil(t, err)
1698
-+	assert.Equal(t, expectedNodeAddresses, actualNodeAddresses)
1699
-+}
1700
-diff --git a/pkg/cloudprovider/providers/cascade/cascade_loadbalancer.go b/pkg/cloudprovider/providers/cascade/cascade_loadbalancer.go
1701
-new file mode 100644
1702
-index 0000000..6338072
1703
-+++ b/pkg/cloudprovider/providers/cascade/cascade_loadbalancer.go
1704
-@@ -0,0 +1,285 @@
1705
-+package cascade
1706
-+
1707
-+import (
1708
-+	"context"
1709
-+	"fmt"
1710
-+	"github.com/golang/glog"
1711
-+	"k8s.io/api/core/v1"
1712
-+	"k8s.io/apimachinery/pkg/types"
1713
-+	"k8s.io/kubernetes/pkg/api/v1/service"
1714
-+	"k8s.io/kubernetes/pkg/cloudprovider"
1715
-+)
1716
-+
1717
-+const TCP_PROTOCOL = "TCP"
1718
-+
1719
-+const HTTP_PROTOCOL = "HTTP"
1720
-+
1721
-+// EnsureLoadBalancer creates or updates a Cascade load balancer
1722
-+func (cc *CascadeCloud) EnsureLoadBalancer(ctx context.Context, clusterName string, k8sService *v1.Service, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) {
1723
-+	logger := newLoadBalancerLogger(clusterName, k8sService, "EnsureLoadBalancer")
1724
-+
1725
-+	loadBalancerName := cloudprovider.GetLoadBalancerName(k8sService)
1726
-+	logger.Infof("Load balancer name: %s", loadBalancerName)
1727
-+
1728
-+	// Sanity checks
1729
-+	if k8sService.Spec.SessionAffinity != v1.ServiceAffinityNone {
1730
-+		logger.Errorf("Unsupported load balancer session affinity: %+v", k8sService.Spec.SessionAffinity)
1731
-+		return nil, fmt.Errorf("Unsupported load balancer session affinity: %+v", k8sService.Spec.SessionAffinity)
1732
-+	}
1733
-+
1734
-+	if len(k8sService.Spec.Ports) == 0 {
1735
-+		logger.Errorf("No port mapping is specified")
1736
-+		return nil, fmt.Errorf("No port mapping is specified")
1737
-+	}
1738
-+
1739
-+	// Create load balancer port maps
1740
-+	portMaps := []*LoadBalancerPortMap{}
1741
-+	for _, port := range k8sService.Spec.Ports {
1742
-+		if port.Protocol != v1.ProtocolTCP {
1743
-+			logger.Warningf("Ignoring port that does not use TCP protocol: %+v", port)
1744
-+			continue
1745
-+		}
1746
-+
1747
-+		if port.NodePort == 0 {
1748
-+			logger.Warningf("Ignoring port without node port defined: %+v", port)
1749
-+			continue
1750
-+		}
1751
-+
1752
-+		// TODO: For now we only support SSL pass through. All port mappings are using TCP protocol.
1753
-+		//       Also note that we allow all external traffic to access the ports.
1754
-+		portMap := &LoadBalancerPortMap{
1755
-+			InstancePort:         Int64Ptr(int64(port.NodePort)),
1756
-+			InstanceProtocol:     StringPtr(TCP_PROTOCOL),
1757
-+			LoadBalancerPort:     Int64Ptr(int64(port.Port)),
1758
-+			LoadBalancerProtocol: StringPtr(TCP_PROTOCOL),
1759
-+		}
1760
-+		portMaps = append(portMaps, portMap)
1761
-+	}
1762
-+
1763
-+	// Create load balancer health check
1764
-+	healthCheck := &LoadBalancerHealthCheck{
1765
-+		HealthyThreshold:  5,
1766
-+		IntervalInSeconds: 10,
1767
-+	}
1768
-+	if healthCheckPath, healthCheckNodePort := service.GetServiceHealthCheckPathPort(k8sService); healthCheckPath != "" {
1769
-+		logger.Infof("HTTP health checks on: %s:%d", healthCheckPath, healthCheckNodePort)
1770
-+		healthCheck.Path = StringPtr(healthCheckPath)
1771
-+		healthCheck.Port = Int64Ptr(int64(healthCheckNodePort))
1772
-+		healthCheck.Protocol = StringPtr(HTTP_PROTOCOL)
1773
-+	} else {
1774
-+		logger.Infof("TCP health check on port: %d", Int64Val(portMaps[0].InstancePort))
1775
-+		healthCheck.Port = portMaps[0].InstancePort
1776
-+		healthCheck.Protocol = StringPtr(TCP_PROTOCOL)
1777
-+	}
1778
-+
1779
-+	// Create load balancer
1780
-+	createSpec := &LoadBalancerCreateSpec{
1781
-+		Name:        StringPtr(loadBalancerName),
1782
-+		Type:        StringPtr("PUBLIC"),
1783
-+		PortMaps:    portMaps,
1784
-+		HealthCheck: healthCheck,
1785
-+		SubDomain:   StringPtr(k8sService.Name),
1786
-+	}
1787
-+	logger.Infof("Load balancer create spec: %+v", *createSpec)
1788
-+
1789
-+	task, err := cc.apiClient.CreateOrUpdateLoadBalancer(createSpec)
1790
-+	if err != nil {
1791
-+		logger.Errorf("Failed to create or update load balancer. Error: [%v]", err)
1792
-+		return nil, err
1793
-+	}
1794
-+
1795
-+	_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
1796
-+	if err != nil {
1797
-+		logger.Errorf("Failed to poll task status of creating or updating load balancer. Error: [%v]", err)
1798
-+		return nil, err
1799
-+	}
1800
-+
1801
-+	// Apply VM update to load balancer
1802
-+	err = cc.updateLoadBalancerVMs(nodes, loadBalancerName, logger)
1803
-+	if err != nil {
1804
-+		// The private function already did logging. No need to log again.
1805
-+		return nil, err
1806
-+	}
1807
-+
1808
-+	// Get load balancer
1809
-+	loadBalancer, err := cc.apiClient.GetLoadBalancer(StringPtr(loadBalancerName))
1810
-+	if err != nil {
1811
-+		glog.Errorf("Failed to get load balancer. Error: [%v]", err)
1812
-+		return nil, err
1813
-+	}
1814
-+
1815
-+	return toLoadBalancerStatus(loadBalancer), nil
1816
-+}
1817
-+
1818
-+// GetLoadBalancer returns the information about a Cascade load balancer
1819
-+func (cc *CascadeCloud) GetLoadBalancer(ctx context.Context, clusterName string, k8sService *v1.Service) (*v1.LoadBalancerStatus, bool, error) {
1820
-+	logger := newLoadBalancerLogger(clusterName, k8sService, "GetLoadBalancer")
1821
-+
1822
-+	loadBalancerName := cloudprovider.GetLoadBalancerName(k8sService)
1823
-+	logger.Infof("Load balancer name: %s", loadBalancerName)
1824
-+
1825
-+	// Get load balancer
1826
-+	loadBalancer, err := cc.apiClient.GetLoadBalancer(StringPtr(loadBalancerName))
1827
-+	if err != nil {
1828
-+		logger.Errorf("Failed to get load balancer. Error: [%v]", err)
1829
-+		// Do not return error here because we want the caller of this function to determine
1830
-+		// what to do with the not-found situation.
1831
-+		switch err.(type) {
1832
-+		case APIError:
1833
-+			if err.(APIError).ErrorCode == NotFoundError {
1834
-+				return nil, false, nil
1835
-+			}
1836
-+		}
1837
-+		return nil, false, err
1838
-+	}
1839
-+
1840
-+	return toLoadBalancerStatus(loadBalancer), true, nil
1841
-+}
1842
-+
1843
-+// UpdateLoadBalancer updates the node information of a Cascade load balancer
1844
-+func (cc *CascadeCloud) UpdateLoadBalancer(ctx context.Context, clusterName string, k8sService *v1.Service, nodes []*v1.Node) error {
1845
-+	logger := newLoadBalancerLogger(clusterName, k8sService, "UpdateLoadBalancer")
1846
-+
1847
-+	loadBalancerName := cloudprovider.GetLoadBalancerName(k8sService)
1848
-+	logger.Infof("Load balancer name: %s", loadBalancerName)
1849
-+
1850
-+	err := cc.updateLoadBalancerVMs(nodes, loadBalancerName, logger)
1851
-+	if err != nil {
1852
-+		// The private function already did logging. No need to log again.
1853
-+		return err
1854
-+	}
1855
-+
1856
-+	return nil
1857
-+}
1858
-+
1859
-+// EnsureLoadBalancerDeleted deletes a Cascade load balancer
1860
-+func (cc *CascadeCloud) EnsureLoadBalancerDeleted(ctx context.Context, clusterName string, k8sService *v1.Service) error {
1861
-+	logger := newLoadBalancerLogger(clusterName, k8sService, "EnsureLoadBalancerDeleted")
1862
-+
1863
-+	loadBalancerName := cloudprovider.GetLoadBalancerName(k8sService)
1864
-+	logger.Infof("Load balancer name: %s", loadBalancerName)
1865
-+
1866
-+	task, err := cc.apiClient.DeleteLoadBalancer(StringPtr(loadBalancerName), k8sService.Name)
1867
-+	if err != nil {
1868
-+		logger.Errorf("Failed to delete load balancer. Error: [%v]", err)
1869
-+		// If we get a NotFound error, we assume that the load balancer is already deleted. So we don't return an error
1870
-+		// here.
1871
-+		switch err.(type) {
1872
-+		case APIError:
1873
-+			if err.(APIError).ErrorCode == NotFoundError {
1874
-+				return nil
1875
-+			}
1876
-+		}
1877
-+		return err
1878
-+	}
1879
-+
1880
-+	_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
1881
-+	if err != nil {
1882
-+		logger.Errorf("Failed to poll task status of deleting load balancer. Error: [%v]", err)
1883
-+		return err
1884
-+	}
1885
-+
1886
-+	return nil
1887
-+}
1888
-+
1889
-+func (cc *CascadeCloud) updateLoadBalancerVMs(
1890
-+	nodes []*v1.Node, loadBalancerName string, logger *loadBalancerLogger) error {
1891
-+
1892
-+	// Apply VM update to the load balancer
1893
-+	loadBalancerVMs := make([]*LoadBalancerVM, 0)
1894
-+
1895
-+	for _, node := range nodes {
1896
-+		// If the node does not have a name, we cannot derive its instance ID. Therefore we skip this node.
1897
-+		if len(node.Name) == 0 {
1898
-+			logger.Warningf("Node %s does not have a name. Skip updating this VM for load balancer", node.UID)
1899
-+			continue
1900
-+		}
1901
-+
1902
-+		// If we cannot get the instance ID, something is wrong on the Cascade Controller side.
1903
-+		// However, we should tolerate such failure and continue the load balancer VM update
1904
-+		// by skipping this VM.
1905
-+		instanceID, err := cc.InstanceID(context.TODO(), types.NodeName(node.Name))
1906
-+		if err != nil {
1907
-+			logger.Warningf("Unable to get instance ID for node %s, skip updating this VM for load balancer. Error [%v]", node.Name, err)
1908
-+			continue
1909
-+		}
1910
-+
1911
-+		loadBalancerVMs = append(loadBalancerVMs, &LoadBalancerVM{
1912
-+			ID: StringPtr(instanceID),
1913
-+		})
1914
-+	}
1915
-+
1916
-+	if len(loadBalancerVMs) == 0 {
1917
-+		logger.Infof("No nodes to be added to the load balancer. Skip updating load balancer VMs")
1918
-+		return nil
1919
-+	}
1920
-+
1921
-+	vmUpdate := &LoadBalancerVMUpdate{
1922
-+		VMIds: loadBalancerVMs,
1923
-+	}
1924
-+	logger.Infof("Load balancer VM update spec: %+v", vmUpdate.VMIds)
1925
-+
1926
-+	task, err := cc.apiClient.ApplyVMsToLoadBalancer(StringPtr(loadBalancerName), vmUpdate)
1927
-+	if err != nil {
1928
-+		logger.Errorf("Failed to update load balancer VMs. Error: [%v]", err)
1929
-+		return err
1930
-+	}
1931
-+
1932
-+	_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
1933
-+	if err != nil {
1934
-+		logger.Errorf("Failed to poll task status of updating load balancer VMs. Error: [%v]", err)
1935
-+		return err
1936
-+	}
1937
-+
1938
-+	return nil
1939
-+}
1940
-+
1941
-+func toLoadBalancerStatus(lb *LoadBalancer) *v1.LoadBalancerStatus {
1942
-+	var endpoint string
1943
-+	if lb != nil && lb.Endpoint != nil {
1944
-+		endpoint = StringVal(lb.Endpoint)
1945
-+	}
1946
-+
1947
-+	return &v1.LoadBalancerStatus{
1948
-+		Ingress: []v1.LoadBalancerIngress{
1949
-+			{
1950
-+				Hostname: endpoint,
1951
-+			},
1952
-+		},
1953
-+	}
1954
-+}
1955
-+
1956
-+type loadBalancerLogger struct {
1957
-+	clusterName string
1958
-+	k8sService  *v1.Service
1959
-+	callingFunc string
1960
-+}
1961
-+
1962
-+func newLoadBalancerLogger(clusterName string, k8sService *v1.Service, callingFunc string) *loadBalancerLogger {
1963
-+	return &loadBalancerLogger{
1964
-+		clusterName: clusterName,
1965
-+		k8sService:  k8sService,
1966
-+		callingFunc: callingFunc,
1967
-+	}
1968
-+}
1969
-+
1970
-+func (l *loadBalancerLogger) getLogMsg(
1971
-+	msgTemplate string, args ...interface{}) string {
1972
-+
1973
-+	errorMsg := fmt.Sprintf("Cascade Cloud Provider::%s::Cluster [%s] Service [%s]: %s",
1974
-+		l.callingFunc, l.clusterName, l.k8sService.Name,
1975
-+		msgTemplate)
1976
-+	return fmt.Sprintf(errorMsg, args)
1977
-+}
1978
-+
1979
-+func (l *loadBalancerLogger) Errorf(msgTemplate string, args ...interface{}) {
1980
-+	glog.Errorln(l.getLogMsg(msgTemplate, args))
1981
-+}
1982
-+
1983
-+func (l *loadBalancerLogger) Warningf(msgTemplate string, args ...interface{}) {
1984
-+	glog.Warningln(l.getLogMsg(msgTemplate, args))
1985
-+}
1986
-+
1987
-+func (l *loadBalancerLogger) Infof(msgTemplate string, args ...interface{}) {
1988
-+	glog.Infoln(l.getLogMsg(msgTemplate, args))
1989
-+}
1990
-diff --git a/pkg/cloudprovider/providers/cascade/client.go b/pkg/cloudprovider/providers/cascade/client.go
1991
-new file mode 100644
1992
-index 0000000..e4494e4
1993
-+++ b/pkg/cloudprovider/providers/cascade/client.go
1994
-@@ -0,0 +1,399 @@
1995
-+package cascade
1996
-+
1997
-+import (
1998
-+	"bytes"
1999
-+	"crypto/tls"
2000
-+	"crypto/x509"
2001
-+	"encoding/json"
2002
-+	"fmt"
2003
-+	"github.com/golang/glog"
2004
-+	"net/http"
2005
-+	"strings"
2006
-+	"time"
2007
-+)
2008
-+
2009
-+// Represents stateless context needed to call Cascade APIs.
2010
-+// Note that we are implementing the Cascade APIs manually instead of using the swagger generated code
2011
-+// because swagger uses a different version of openapi library than kubernetes. It is difficult to
2012
-+// address the version conflict to make it compile.
2013
-+type Client struct {
2014
-+	cfg        *ClientConfig
2015
-+	options    ClientOptions
2016
-+	restClient *restClient
2017
-+}
2018
-+
2019
-+type ClientConfig struct {
2020
-+	tenantName string
2021
-+	clusterID  string
2022
-+	region     string
2023
-+	endpoint   string
2024
-+}
2025
-+
2026
-+// Represents Tokens
2027
-+type TokenOptions struct {
2028
-+	AccessToken  string `json:"access_token"`
2029
-+	ExpiresIn    int    `json:"expires_in"`
2030
-+	RefreshToken string `json:"refresh_token,omitempty"`
2031
-+	IDToken      string `json:"id_token"`
2032
-+	TokenType    string `json:"token_type"`
2033
-+}
2034
-+
2035
-+type TokenCallback func(string)
2036
-+
2037
-+// Options for Client
2038
-+type ClientOptions struct {
2039
-+	// When using the Tasks.Wait APIs, defines the duration of how long
2040
-+	// we should continue to poll the server. Default is 30 minutes.
2041
-+	// TasksAPI.WaitTimeout() can be used to specify timeout on
2042
-+	// individual calls.
2043
-+	TaskPollTimeout time.Duration
2044
-+
2045
-+	// Whether or not to ignore any TLS errors when talking to Cascade,
2046
-+	// false by default.
2047
-+	IgnoreCertificate bool
2048
-+
2049
-+	// List of root CA's to use for server validation
2050
-+	// nil by default.
2051
-+	RootCAs *x509.CertPool
2052
-+
2053
-+	// For tasks APIs, defines the number of retries to make in the event
2054
-+	// of an error. Default is 3.
2055
-+	TaskRetryCount int
2056
-+
2057
-+	// Tokens for user authentication. Default is empty.
2058
-+	TokenOptions *TokenOptions
2059
-+}
2060
-+
2061
-+const minimumTaskPollDelay = 500 * time.Millisecond
2062
-+
2063
-+// Creates a new Cascade client which can be used to make API calls to Cascade.
2064
-+func NewClient(cfg *CascadeConfig, authClient *AuthClient) (c *Client, err error) {
2065
-+	tokenOptions, err := authClient.GetTokensByMachineAccount()
2066
-+	if err != nil {
2067
-+		glog.Errorf("Cascade Cloud Provider: Failed to create new client due to error: %+v", err)
2068
-+		return
2069
-+	}
2070
-+
2071
-+	options := &ClientOptions{
2072
-+		TaskPollTimeout:   30 * time.Minute,
2073
-+		TaskRetryCount:    3,
2074
-+		TokenOptions:      tokenOptions,
2075
-+		IgnoreCertificate: false,
2076
-+		RootCAs:           nil,
2077
-+	}
2078
-+
2079
-+	tr := &http.Transport{
2080
-+		TLSClientConfig: &tls.Config{
2081
-+			InsecureSkipVerify: options.IgnoreCertificate,
2082
-+			RootCAs:            options.RootCAs},
2083
-+	}
2084
-+
2085
-+	tokenCallback := func(newToken string) {
2086
-+		c.options.TokenOptions.AccessToken = newToken
2087
-+	}
2088
-+
2089
-+	restClient := &restClient{
2090
-+		authClient:                authClient,
2091
-+		httpClient:                &http.Client{Transport: tr},
2092
-+		UpdateAccessTokenCallback: tokenCallback,
2093
-+	}
2094
-+
2095
-+	clientConfig := &ClientConfig{
2096
-+		tenantName: cfg.Global.TenantName,
2097
-+		clusterID:  cfg.Global.ClusterID,
2098
-+		region:     cfg.Global.Region,
2099
-+		endpoint:   strings.TrimRight(cfg.Global.CloudTarget, "/"),
2100
-+	}
2101
-+
2102
-+	c = &Client{
2103
-+		cfg:        clientConfig,
2104
-+		restClient: restClient,
2105
-+		// Ensure a copy of options is made, rather than using a pointer
2106
-+		// which may change out from underneath if misused by the caller.
2107
-+		options: *options,
2108
-+	}
2109
-+
2110
-+	return
2111
-+}
2112
-+
2113
-+// Gets VM with the specified ID.
2114
-+func (api *Client) GetVM(vmID string) (vm *VM, err error) {
2115
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/vms/%s", api.cfg.endpoint, api.cfg.tenantName,
2116
-+		api.cfg.clusterID, vmID)
2117
-+	res, err := api.restClient.Get(uri, api.options.TokenOptions)
2118
-+	if err != nil {
2119
-+		return
2120
-+	}
2121
-+	defer res.Body.Close()
2122
-+	res, err = getError(res)
2123
-+	if err != nil {
2124
-+		return
2125
-+	}
2126
-+	vm = &VM{}
2127
-+	err = json.NewDecoder(res.Body).Decode(vm)
2128
-+	return
2129
-+}
2130
-+
2131
-+// Gets disk with the specified ID.
2132
-+func (api *Client) GetDisk(diskID string) (disk *PersistentDisk, err error) {
2133
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/disks/%s", api.cfg.endpoint, api.cfg.tenantName,
2134
-+		api.cfg.clusterID, diskID)
2135
-+	res, err := api.restClient.Get(uri, api.options.TokenOptions)
2136
-+	if err != nil {
2137
-+		return
2138
-+	}
2139
-+	defer res.Body.Close()
2140
-+	res, err = getError(res)
2141
-+	if err != nil {
2142
-+		return
2143
-+	}
2144
-+	disk = &PersistentDisk{}
2145
-+	err = json.NewDecoder(res.Body).Decode(disk)
2146
-+	return
2147
-+}
2148
-+
2149
-+// Creates a disk under the cluster.
2150
-+func (api *Client) CreateDisk(spec *DiskCreateSpec) (task *Task, err error) {
2151
-+	body, err := json.Marshal(spec)
2152
-+	if err != nil {
2153
-+		return
2154
-+	}
2155
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/disks", api.cfg.endpoint, api.cfg.tenantName,
2156
-+		api.cfg.clusterID)
2157
-+	res, err := api.restClient.Post(uri, "application/json", bytes.NewReader(body), api.options.TokenOptions)
2158
-+	if err != nil {
2159
-+		return
2160
-+	}
2161
-+	defer res.Body.Close()
2162
-+	task, err = getTask(getError(res))
2163
-+	return
2164
-+}
2165
-+
2166
-+// Deletes a disk with the specified ID.
2167
-+func (api *Client) DeleteDisk(diskID string) (task *Task, err error) {
2168
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/disks/%s", api.cfg.endpoint, api.cfg.tenantName,
2169
-+		api.cfg.clusterID, diskID)
2170
-+	res, err := api.restClient.Delete(uri, api.options.TokenOptions)
2171
-+	if err != nil {
2172
-+		return
2173
-+	}
2174
-+	defer res.Body.Close()
2175
-+	task, err = getTask(getError(res))
2176
-+	return
2177
-+}
2178
-+
2179
-+// Attaches a disk to the specified VM.
2180
-+func (api *Client) AttachDisk(vmID string, op *VMDiskOperation) (task *Task, err error) {
2181
-+	body, err := json.Marshal(op)
2182
-+	if err != nil {
2183
-+		return
2184
-+	}
2185
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/vms/%s/attach_disk", api.cfg.endpoint, api.cfg.tenantName,
2186
-+		api.cfg.clusterID, vmID)
2187
-+	res, err := api.restClient.Post(uri, "application/json", bytes.NewReader(body), api.options.TokenOptions)
2188
-+	if err != nil {
2189
-+		return
2190
-+	}
2191
-+	defer res.Body.Close()
2192
-+	task, err = getTask(getError(res))
2193
-+	return
2194
-+}
2195
-+
2196
-+// Detaches a disk from the specified VM.
2197
-+func (api *Client) DetachDisk(vmID string, op *VMDiskOperation) (task *Task, err error) {
2198
-+	body, err := json.Marshal(op)
2199
-+	if err != nil {
2200
-+		return
2201
-+	}
2202
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/vms/%s/detach_disk", api.cfg.endpoint, api.cfg.tenantName,
2203
-+		api.cfg.clusterID, vmID)
2204
-+	res, err := api.restClient.Post(uri, "application/json", bytes.NewReader(body), api.options.TokenOptions)
2205
-+	if err != nil {
2206
-+		return
2207
-+	}
2208
-+	defer res.Body.Close()
2209
-+	task, err = getTask(getError(res))
2210
-+	return
2211
-+}
2212
-+
2213
-+// Gets a task by ID.
2214
-+func (api *Client) GetTask(taskID string) (task *Task, err error) {
2215
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/tasks/%s?region=%s", api.cfg.endpoint, api.cfg.tenantName,
2216
-+		taskID, api.cfg.region)
2217
-+	res, err := api.restClient.Get(uri, api.options.TokenOptions)
2218
-+	if err != nil {
2219
-+		return
2220
-+	}
2221
-+	defer res.Body.Close()
2222
-+	result, err := getTask(getError(res))
2223
-+	return result, err
2224
-+}
2225
-+
2226
-+// Waits for a task to complete by polling the tasks API until a task returns with the state COMPLETED or ERROR.
2227
-+func (api *Client) WaitForTask(taskID string) (task *Task, err error) {
2228
-+	start := time.Now()
2229
-+	numErrors := 0
2230
-+	maxErrors := api.options.TaskRetryCount
2231
-+	backoffMultiplier := 1
2232
-+
2233
-+	for time.Since(start) < api.options.TaskPollTimeout {
2234
-+		task, err = api.GetTask(taskID)
2235
-+		if err != nil {
2236
-+			switch err.(type) {
2237
-+			// If an ApiError comes back, something is wrong, return the error to the caller
2238
-+			case APIError:
2239
-+				return
2240
-+				// For other errors, retry before giving up
2241
-+			default:
2242
-+				numErrors++
2243
-+				if numErrors > maxErrors {
2244
-+					return
2245
-+				}
2246
-+			}
2247
-+		} else {
2248
-+			// Reset the error count any time a successful call is made
2249
-+			numErrors = 0
2250
-+			if StringVal(task.State) == "COMPLETED" {
2251
-+				return
2252
-+			}
2253
-+			if StringVal(task.State) == "ERROR" {
2254
-+				err = TaskError{StringVal(task.ID), getFailedStep(task)}
2255
-+				return
2256
-+			}
2257
-+		}
2258
-+
2259
-+		// Perform backoff based on how long it has been since we started polling. The logic is as follows:
2260
-+		// For the first 10 seconds, poll every 500 milliseconds.
2261
-+		// From there till the first 1 minute, poll every 1 second.
2262
-+		// From there till the first 10 minutes, poll every 5 seconds.
2263
-+		// From there till the timeout (30 minutes), poll every 10 seconds.
2264
-+		elapsedTime := time.Since(start)
2265
-+		if elapsedTime > 10*time.Second && elapsedTime <= 60*time.Second {
2266
-+			backoffMultiplier = 2
2267
-+		} else if elapsedTime > 60*time.Second && elapsedTime <= 600*time.Second {
2268
-+			backoffMultiplier = 10
2269
-+		} else if elapsedTime > 600*time.Second && elapsedTime <= api.options.TaskPollTimeout {
2270
-+			backoffMultiplier = 20
2271
-+		}
2272
-+		time.Sleep(time.Duration(backoffMultiplier) * minimumTaskPollDelay)
2273
-+	}
2274
-+	err = TaskTimeoutError{taskID}
2275
-+	return
2276
-+}
2277
-+
2278
-+// CreateOrUpdateLoadBalancer creates a load balancer if not existed, or update one otherwise
2279
-+func (api *Client) CreateOrUpdateLoadBalancer(spec *LoadBalancerCreateSpec) (*Task, error) {
2280
-+	body, err := json.Marshal(spec)
2281
-+	if err != nil {
2282
-+		return nil, err
2283
-+	}
2284
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/loadbalancers", api.cfg.endpoint, api.cfg.tenantName,
2285
-+		api.cfg.clusterID)
2286
-+	res, err := api.restClient.Post(uri, "application/json", bytes.NewReader(body), api.options.TokenOptions)
2287
-+	if err != nil {
2288
-+		return nil, err
2289
-+	}
2290
-+	defer res.Body.Close()
2291
-+	return getTask(getError(res))
2292
-+}
2293
-+
2294
-+// GetLoadBalancer returns a load balancer by name
2295
-+func (api *Client) GetLoadBalancer(loadBalancerName *string) (*LoadBalancer, error) {
2296
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/loadbalancers/%s", api.cfg.endpoint, api.cfg.tenantName,
2297
-+		api.cfg.clusterID, StringVal(loadBalancerName))
2298
-+	res, err := api.restClient.Get(uri, api.options.TokenOptions)
2299
-+	if err != nil {
2300
-+		return nil, err
2301
-+	}
2302
-+	defer res.Body.Close()
2303
-+	res, err = getError(res)
2304
-+	if err != nil {
2305
-+		return nil, err
2306
-+	}
2307
-+	loadBalancer := &LoadBalancer{}
2308
-+	err = json.NewDecoder(res.Body).Decode(loadBalancer)
2309
-+	return loadBalancer, err
2310
-+}
2311
-+
2312
-+// DeleteLoadBalancer deletes a load balancer by name
2313
-+func (api *Client) DeleteLoadBalancer(loadBalancerName *string, subDomain string) (*Task, error) {
2314
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/loadbalancers/%s", api.cfg.endpoint, api.cfg.tenantName,
2315
-+		api.cfg.clusterID, StringVal(loadBalancerName))
2316
-+
2317
-+	if len(subDomain) > 0 {
2318
-+		uri = fmt.Sprintf(uri + "?sub-domain=%s", subDomain)
2319
-+	}
2320
-+
2321
-+	res, err := api.restClient.Delete(uri, api.options.TokenOptions)
2322
-+	if err != nil {
2323
-+		return nil, err
2324
-+	}
2325
-+	return getTask(getError(res))
2326
-+}
2327
-+
2328
-+// ApplyVMsToLoadBalancer updates the instances that are registered with the load balancer
2329
-+func (api *Client) ApplyVMsToLoadBalancer(loadBalancerName *string, update *LoadBalancerVMUpdate) (*Task, error) {
2330
-+	body, err := json.Marshal(update)
2331
-+	if err != nil {
2332
-+		return nil, err
2333
-+	}
2334
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/loadbalancers/%s/update_vms", api.cfg.endpoint, api.cfg.tenantName,
2335
-+		api.cfg.clusterID, StringVal(loadBalancerName))
2336
-+	res, err := api.restClient.Post(uri, "application/json", bytes.NewReader(body), api.options.TokenOptions)
2337
-+	if err != nil {
2338
-+		return nil, err
2339
-+	}
2340
-+	defer res.Body.Close()
2341
-+	return getTask(getError(res))
2342
-+}
2343
-+
2344
-+// Gets all the zones in which the cluster has the VMs in.
2345
-+func (api *Client) GetZones() (zones []string, err error) {
2346
-+	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/zones", api.cfg.endpoint, api.cfg.tenantName,
2347
-+		api.cfg.clusterID)
2348
-+	res, err := api.restClient.Get(uri, api.options.TokenOptions)
2349
-+	if err != nil {
2350
-+		return
2351
-+	}
2352
-+	defer res.Body.Close()
2353
-+	res, err = getError(res)
2354
-+	if err != nil {
2355
-+		return
2356
-+	}
2357
-+	err = json.NewDecoder(res.Body).Decode(&zones)
2358
-+	return
2359
-+}
2360
-+
2361
-+// Reads a task object out of the HTTP response. Takes an error argument
2362
-+// so that GetTask can easily wrap GetError. This function will do nothing
2363
-+// if e is not nil.
2364
-+// e.g. res, err := getTask(getError(someApi.Get()))
2365
-+func getTask(res *http.Response, e error) (*Task, error) {
2366
-+	if e != nil {
2367
-+		return nil, e
2368
-+	}
2369
-+	var task Task
2370
-+	err := json.NewDecoder(res.Body).Decode(&task)
2371
-+	if err != nil {
2372
-+		return nil, err
2373
-+	}
2374
-+	if StringVal(task.State) == "ERROR" {
2375
-+		// Critical: return task as well, so that it can be examined
2376
-+		// for error details.
2377
-+		return &task, TaskError{StringVal(task.ID), getFailedStep(&task)}
2378
-+	}
2379
-+	return &task, nil
2380
-+}
2381
-+
2382
-+// Gets the failed step in the task to get error details for failed task.
2383
-+func getFailedStep(task *Task) (step Step) {
2384
-+	var errorStep Step
2385
-+	for _, s := range task.Steps {
2386
-+		if StringVal(s.State) == "ERROR" {
2387
-+			errorStep = *s
2388
-+			break
2389
-+		}
2390
-+	}
2391
-+
2392
-+	return errorStep
2393
-+}
2394
-diff --git a/pkg/cloudprovider/providers/cascade/oidcclient.go b/pkg/cloudprovider/providers/cascade/oidcclient.go
2395
-new file mode 100644
2396
-index 0000000..6a71cc1
2397
-+++ b/pkg/cloudprovider/providers/cascade/oidcclient.go
2398
-@@ -0,0 +1,297 @@
2399
-+package cascade
2400
-+
2401
-+import (
2402
-+	"crypto/tls"
2403
-+	"crypto/x509"
2404
-+	"encoding/json"
2405
-+	"encoding/pem"
2406
-+	"fmt"
2407
-+	"io/ioutil"
2408
-+	"log"
2409
-+	"net/http"
2410
-+	"net/url"
2411
-+	"strings"
2412
-+)
2413
-+
2414
-+const tokenScope string = "openid offline_access"
2415
-+
2416
-+// OIDCClient is client for OIDC
2417
-+type OIDCClient struct {
2418
-+	httpClient *http.Client
2419
-+	logger     *log.Logger
2420
-+
2421
-+	Endpoint string
2422
-+	Options  *OIDCClientOptions
2423
-+}
2424
-+
2425
-+// OIDCClientOptions is OIDC client options
2426
-+type OIDCClientOptions struct {
2427
-+	// Whether or not to ignore any TLS errors when talking to Cascade,
2428
-+	// false by default.
2429
-+	IgnoreCertificate bool
2430
-+
2431
-+	// List of root CA's to use for server validation
2432
-+	// nil by default.
2433
-+	RootCAs *x509.CertPool
2434
-+
2435
-+	// The scope values to use when requesting tokens
2436
-+	TokenScope string
2437
-+}
2438
-+
2439
-+// NewOIDCClient creates an instance of OIDCClient
2440
-+func NewOIDCClient(endpoint string, options *OIDCClientOptions, logger *log.Logger) (c *OIDCClient) {
2441
-+	if logger == nil {
2442
-+		logger = log.New(ioutil.Discard, "", log.LstdFlags)
2443
-+	}
2444
-+
2445
-+	options = buildOptions(options)
2446
-+	tr := &http.Transport{
2447
-+		TLSClientConfig: &tls.Config{
2448
-+			InsecureSkipVerify: options.IgnoreCertificate,
2449
-+			RootCAs:            options.RootCAs},
2450
-+	}
2451
-+
2452
-+	c = &OIDCClient{
2453
-+		httpClient: &http.Client{Transport: tr},
2454
-+		logger:     logger,
2455
-+		Endpoint:   strings.TrimRight(endpoint, "/"),
2456
-+		Options:    options,
2457
-+	}
2458
-+	return
2459
-+}
2460
-+
2461
-+func buildOptions(options *OIDCClientOptions) (result *OIDCClientOptions) {
2462
-+	result = &OIDCClientOptions{
2463
-+		TokenScope: tokenScope,
2464
-+	}
2465
-+
2466
-+	if options == nil {
2467
-+		return
2468
-+	}
2469
-+
2470
-+	result.IgnoreCertificate = options.IgnoreCertificate
2471
-+
2472
-+	if options.RootCAs != nil {
2473
-+		result.RootCAs = options.RootCAs
2474
-+	}
2475
-+
2476
-+	if options.TokenScope != "" {
2477
-+		result.TokenScope = options.TokenScope
2478
-+	}
2479
-+
2480
-+	return
2481
-+}
2482
-+
2483
-+func (client *OIDCClient) buildURL(path string) (url string) {
2484
-+	return fmt.Sprintf("%s%s", client.Endpoint, path)
2485
-+}
2486
-+
2487
-+// Cert download helper
2488
-+
2489
-+const certDownloadPath string = "/afd/vecs/ssl"
2490
-+
2491
-+type lightWaveCert struct {
2492
-+	Value string `json:"encoded"`
2493
-+}
2494
-+
2495
-+// GetRootCerts gets root certs
2496
-+func (client *OIDCClient) GetRootCerts() (certList []*x509.Certificate, err error) {
2497
-+	// turn TLS verification off for
2498
-+	originalTr := client.httpClient.Transport
2499
-+	defer client.setTransport(originalTr)
2500
-+
2501
-+	tr := &http.Transport{
2502
-+		TLSClientConfig: &tls.Config{
2503
-+			InsecureSkipVerify: false,
2504
-+		},
2505
-+	}
2506
-+	client.setTransport(tr)
2507
-+
2508
-+	// get the certs
2509
-+	resp, err := client.httpClient.Get(client.buildURL(certDownloadPath))
2510
-+	if err != nil {
2511
-+		return
2512
-+	}
2513
-+	defer resp.Body.Close()
2514
-+	if resp.StatusCode != 200 {
2515
-+		err = fmt.Errorf("Unexpected error retrieving auth server certs: %v %s", resp.StatusCode, resp.Status)
2516
-+		return
2517
-+	}
2518
-+
2519
-+	// parse the certs
2520
-+	certsData := &[]lightWaveCert{}
2521
-+	err = json.NewDecoder(resp.Body).Decode(certsData)
2522
-+	if err != nil {
2523
-+		return
2524
-+	}
2525
-+
2526
-+	certList = make([]*x509.Certificate, len(*certsData))
2527
-+	for idx, cert := range *certsData {
2528
-+		block, _ := pem.Decode([]byte(cert.Value))
2529
-+		if block == nil {
2530
-+			err = fmt.Errorf("Unexpected response format: %v", certsData)
2531
-+			return nil, err
2532
-+		}
2533
-+
2534
-+		decodedCert, err := x509.ParseCertificate(block.Bytes)
2535
-+		if err != nil {
2536
-+			return nil, err
2537
-+		}
2538
-+
2539
-+		certList[idx] = decodedCert
2540
-+	}
2541
-+
2542
-+	return
2543
-+}
2544
-+
2545
-+func (client *OIDCClient) setTransport(tr http.RoundTripper) {
2546
-+	client.httpClient.Transport = tr
2547
-+}
2548
-+
2549
-+// Metadata request helpers
2550
-+const metadataPathFormat string = "/openidconnect/%s/.well-known/openid-configuration"
2551
-+
2552
-+// OIDCMetadataResponse is the response for Metadata request
2553
-+type OIDCMetadataResponse struct {
2554
-+	TokenEndpoint         string `json:"token_endpoint"`
2555
-+	AuthorizationEndpoint string `json:"authorization_endpoint"`
2556
-+	EndSessionEndpoint    string `json:"end_session_endpoint"`
2557
-+}
2558
-+
2559
-+func (client *OIDCClient) getMetadata(domain string) (metadata *OIDCMetadataResponse, err error) {
2560
-+	metadataPath := fmt.Sprintf(metadataPathFormat, domain)
2561
-+	request, err := http.NewRequest("GET", client.buildURL(metadataPath), nil)
2562
-+	if err != nil {
2563
-+		return nil, err
2564
-+	}
2565
-+
2566
-+	resp, err := client.httpClient.Do(request)
2567
-+	if err != nil {
2568
-+		return nil, err
2569
-+	}
2570
-+	defer resp.Body.Close()
2571
-+
2572
-+	err = client.checkResponse(resp)
2573
-+	if err != nil {
2574
-+		return nil, err
2575
-+	}
2576
-+
2577
-+	metadata = &OIDCMetadataResponse{}
2578
-+	err = json.NewDecoder(resp.Body).Decode(metadata)
2579
-+	if err != nil {
2580
-+		return nil, err
2581
-+	}
2582
-+
2583
-+	return
2584
-+}
2585
-+
2586
-+// Token request helpers
2587
-+
2588
-+const passwordGrantFormatString = "grant_type=password&username=%s&password=%s&scope=%s"
2589
-+const refreshTokenGrantFormatString = "grant_type=refresh_token&refresh_token=%s"
2590
-+const clientGrantFormatString = "grant_type=password&username=%s&password=%s&scope=%s&client_id=%s"
2591
-+
2592
-+// OIDCTokenResponse is the response for OIDC request
2593
-+type OIDCTokenResponse struct {
2594
-+	AccessToken  string `json:"access_token"`
2595
-+	ExpiresIn    int    `json:"expires_in"`
2596
-+	RefreshToken string `json:"refresh_token,omitempty"`
2597
-+	IDToken      string `json:"id_token"`
2598
-+	TokenType    string `json:"token_type"`
2599
-+}
2600
-+
2601
-+// GetTokenByPasswordGrant gets OIDC tokens by password
2602
-+func (client *OIDCClient) GetTokenByPasswordGrant(domain, username, password string) (tokens *OIDCTokenResponse, err error) {
2603
-+	metadata, err := client.getMetadata(domain)
2604
-+	if err != nil {
2605
-+		return nil, err
2606
-+	}
2607
-+
2608
-+	username = url.QueryEscape(username)
2609
-+	password = url.QueryEscape(password)
2610
-+	body := fmt.Sprintf(passwordGrantFormatString, username, password, client.Options.TokenScope)
2611
-+	return client.getToken(metadata.TokenEndpoint, body)
2612
-+}
2613
-+
2614
-+// GetClientTokenByPasswordGrant gets OIDC tokens by password
2615
-+func (client *OIDCClient) GetClientTokenByPasswordGrant(domain, username, password, clientID string) (tokens *OIDCTokenResponse, err error) {
2616
-+	metadata, err := client.getMetadata(domain)
2617
-+	if err != nil {
2618
-+		return nil, err
2619
-+	}
2620
-+
2621
-+	username = url.QueryEscape(username)
2622
-+	password = url.QueryEscape(password)
2623
-+	clientID = url.QueryEscape(clientID)
2624
-+	body := fmt.Sprintf(clientGrantFormatString, username, password, client.Options.TokenScope, clientID)
2625
-+	return client.getToken(metadata.TokenEndpoint, body)
2626
-+}
2627
-+
2628
-+// GetTokenByRefreshTokenGrant gets OIDC tokens by refresh token
2629
-+func (client *OIDCClient) GetTokenByRefreshTokenGrant(domain, refreshToken string) (tokens *OIDCTokenResponse, err error) {
2630
-+	metadata, err := client.getMetadata(domain)
2631
-+	if err != nil {
2632
-+		return nil, err
2633
-+	}
2634
-+
2635
-+	body := fmt.Sprintf(refreshTokenGrantFormatString, refreshToken)
2636
-+	return client.getToken(metadata.TokenEndpoint, body)
2637
-+}
2638
-+
2639
-+func (client *OIDCClient) getToken(tokenEndpoint, body string) (tokens *OIDCTokenResponse, err error) {
2640
-+	request, err := http.NewRequest("POST", tokenEndpoint, strings.NewReader(body))
2641
-+	if err != nil {
2642
-+		return nil, err
2643
-+	}
2644
-+	request.Header.Add("Content-Type", "application/x-www-form-urlencoded")
2645
-+
2646
-+	resp, err := client.httpClient.Do(request)
2647
-+	if err != nil {
2648
-+		return nil, err
2649
-+	}
2650
-+	defer resp.Body.Close()
2651
-+
2652
-+	err = client.checkResponse(resp)
2653
-+	if err != nil {
2654
-+		return nil, err
2655
-+	}
2656
-+
2657
-+	tokens = &OIDCTokenResponse{}
2658
-+	err = json.NewDecoder(resp.Body).Decode(tokens)
2659
-+	if err != nil {
2660
-+		return nil, err
2661
-+	}
2662
-+
2663
-+	return
2664
-+}
2665
-+
2666
-+// OIDCError is OIDC error
2667
-+type OIDCError struct {
2668
-+	Code    string `json:"error"`
2669
-+	Message string `json:"error_description"`
2670
-+}
2671
-+
2672
-+func (e OIDCError) Error() string {
2673
-+	return fmt.Sprintf("%v: %v", e.Code, e.Message)
2674
-+}
2675
-+
2676
-+func (client *OIDCClient) checkResponse(response *http.Response) (err error) {
2677
-+	if response.StatusCode/100 == 2 {
2678
-+		return
2679
-+	}
2680
-+
2681
-+	respBody, readErr := ioutil.ReadAll(response.Body)
2682
-+	if readErr != nil {
2683
-+		return fmt.Errorf(
2684
-+			"Status: %v, Body: %v [%v]", response.Status, string(respBody[:]), readErr)
2685
-+	}
2686
-+
2687
-+	var oidcErr OIDCError
2688
-+	err = json.Unmarshal(respBody, &oidcErr)
2689
-+	if err != nil || oidcErr.Code == "" {
2690
-+		return fmt.Errorf(
2691
-+			"Status: %v, Body: %v [%v]", response.Status, string(respBody[:]), readErr)
2692
-+	}
2693
-+
2694
-+	return oidcErr
2695
-+}
2696
-diff --git a/pkg/cloudprovider/providers/cascade/restclient.go b/pkg/cloudprovider/providers/cascade/restclient.go
2697
-new file mode 100644
2698
-index 0000000..71d8d1c
2699
-+++ b/pkg/cloudprovider/providers/cascade/restclient.go
2700
-@@ -0,0 +1,262 @@
2701
-+package cascade
2702
-+
2703
-+import (
2704
-+	"bytes"
2705
-+	"encoding/json"
2706
-+	"io"
2707
-+	"io/ioutil"
2708
-+	"net/http"
2709
-+)
2710
-+
2711
-+type restClient struct {
2712
-+	httpClient                *http.Client
2713
-+	authClient                *AuthClient
2714
-+	UpdateAccessTokenCallback TokenCallback
2715
-+}
2716
-+
2717
-+type request struct {
2718
-+	Method      string
2719
-+	URL         string
2720
-+	ContentType string
2721
-+	Body        io.Reader
2722
-+	Tokens      *TokenOptions
2723
-+}
2724
-+
2725
-+type page struct {
2726
-+	Items            []interface{} `json:"items"`
2727
-+	NextPageLink     string        `json:"nextPageLink"`
2728
-+	PreviousPageLink string        `json:"previousPageLink"`
2729
-+}
2730
-+
2731
-+type documentList struct {
2732
-+	Items []interface{}
2733
-+}
2734
-+
2735
-+type bodyRewinder func() io.Reader
2736
-+
2737
-+const appJson string = "application/json"
2738
-+const expiredAuthToken int32 = 1904
2739
-+
2740
-+func (client *restClient) AppendSlice(origSlice []interface{}, dataToAppend []interface{}) []interface{} {
2741
-+	origLen := len(origSlice)
2742
-+	newLen := origLen + len(dataToAppend)
2743
-+
2744
-+	if newLen > cap(origSlice) {
2745
-+		newSlice := make([]interface{}, (newLen+1)*2)
2746
-+		copy(newSlice, origSlice)
2747
-+		origSlice = newSlice
2748
-+	}
2749
-+
2750
-+	origSlice = origSlice[0:newLen]
2751
-+	copy(origSlice[origLen:newLen], dataToAppend)
2752
-+
2753
-+	return origSlice
2754
-+}
2755
-+
2756
-+func (client *restClient) Get(url string, tokens *TokenOptions) (res *http.Response, err error) {
2757
-+	req := request{"GET", url, "", nil, tokens}
2758
-+	res, err = client.SendRequest(&req, nil)
2759
-+	return
2760
-+}
2761
-+
2762
-+func (client *restClient) GetList(endpoint string, url string, tokens *TokenOptions) (result []byte, err error) {
2763
-+	req := request{"GET", url, "", nil, tokens}
2764
-+	res, err := client.SendRequest(&req, nil)
2765
-+	if err != nil {
2766
-+		return
2767
-+	}
2768
-+	res, err = getError(res)
2769
-+	if err != nil {
2770
-+		return
2771
-+	}
2772
-+
2773
-+	decoder := json.NewDecoder(res.Body)
2774
-+	decoder.UseNumber()
2775
-+
2776
-+	page := &page{}
2777
-+	err = decoder.Decode(page)
2778
-+	if err != nil {
2779
-+		return
2780
-+	}
2781
-+
2782
-+	documentList := &documentList{}
2783
-+	documentList.Items = client.AppendSlice(documentList.Items, page.Items)
2784
-+
2785
-+	for page.NextPageLink != "" {
2786
-+		req = request{"GET", endpoint + page.NextPageLink, "", nil, tokens}
2787
-+		res, err = client.SendRequest(&req, nil)
2788
-+		if err != nil {
2789
-+			return
2790
-+		}
2791
-+		res, err = getError(res)
2792
-+		if err != nil {
2793
-+			return
2794
-+		}
2795
-+
2796
-+		decoder = json.NewDecoder(res.Body)
2797
-+		decoder.UseNumber()
2798
-+
2799
-+		page.NextPageLink = ""
2800
-+		page.PreviousPageLink = ""
2801
-+
2802
-+		err = decoder.Decode(page)
2803
-+		if err != nil {
2804
-+			return
2805
-+		}
2806
-+
2807
-+		documentList.Items = client.AppendSlice(documentList.Items, page.Items)
2808
-+	}
2809
-+
2810
-+	result, err = json.Marshal(documentList)
2811
-+
2812
-+	return
2813
-+}
2814
-+
2815
-+func (client *restClient) Post(url string, contentType string, body io.ReadSeeker, tokens *TokenOptions) (res *http.Response, err error) {
2816
-+	if contentType == "" {
2817
-+		contentType = appJson
2818
-+	}
2819
-+
2820
-+	req := request{"POST", url, contentType, body, tokens}
2821
-+	rewinder := func() io.Reader {
2822
-+		body.Seek(0, 0)
2823
-+		return body
2824
-+	}
2825
-+	res, err = client.SendRequest(&req, rewinder)
2826
-+	return
2827
-+}
2828
-+
2829
-+func (client *restClient) Patch(url string, contentType string, body io.ReadSeeker, tokens *TokenOptions) (res *http.Response, err error) {
2830
-+	if contentType == "" {
2831
-+		contentType = appJson
2832
-+	}
2833
-+
2834
-+	req := request{"PATCH", url, contentType, body, tokens}
2835
-+	rewinder := func() io.Reader {
2836
-+		body.Seek(0, 0)
2837
-+		return body
2838
-+	}
2839
-+	res, err = client.SendRequest(&req, rewinder)
2840
-+	return
2841
-+}
2842
-+
2843
-+func (client *restClient) Put(url string, contentType string, body io.ReadSeeker, tokens *TokenOptions) (res *http.Response, err error) {
2844
-+	if contentType == "" {
2845
-+		contentType = appJson
2846
-+	}
2847
-+
2848
-+	req := request{"PUT", url, contentType, body, tokens}
2849
-+	rewinder := func() io.Reader {
2850
-+		body.Seek(0, 0)
2851
-+		return body
2852
-+	}
2853
-+	res, err = client.SendRequest(&req, rewinder)
2854
-+	return
2855
-+}
2856
-+
2857
-+func (client *restClient) Delete(url string, tokens *TokenOptions) (res *http.Response, err error) {
2858
-+	req := request{"DELETE", url, "", nil, tokens}
2859
-+	res, err = client.SendRequest(&req, nil)
2860
-+	return
2861
-+}
2862
-+
2863
-+func (client *restClient) SendRequest(req *request, bodyRewinder bodyRewinder) (res *http.Response, err error) {
2864
-+	res, err = client.sendRequestHelper(req)
2865
-+	// In most cases, we'll return immediately
2866
-+	// If the operation succeeded, but we got a 401 response and if we're using
2867
-+	// authentication, then we'll look into the body to see if the token expired
2868
-+	if err != nil {
2869
-+		return res, err
2870
-+	}
2871
-+	if res.StatusCode != 401 {
2872
-+		// It's not a 401, so the token didn't expire
2873
-+		return res, err
2874
-+	}
2875
-+	if req.Tokens == nil || req.Tokens.AccessToken == "" {
2876
-+		// We don't have a token, so we can't renew the token, no need to proceed
2877
-+		return res, err
2878
-+	}
2879
-+
2880
-+	// We're going to look in the body to see if it failed because the token expired
2881
-+	// This means we need to read the body, but the functions that call us also
2882
-+	// expect to read the body. So we read the body, then create a new reader
2883
-+	// so they can read the body as normal.
2884
-+	body, err := ioutil.ReadAll(res.Body)
2885
-+	if err != nil {
2886
-+		return res, err
2887
-+	}
2888
-+	res.Body = ioutil.NopCloser(bytes.NewReader(body))
2889
-+
2890
-+	// Now see if we had an expired token or not
2891
-+	var apiError APIError
2892
-+	err = json.Unmarshal(body, &apiError)
2893
-+	if err != nil {
2894
-+		return res, err
2895
-+	}
2896
-+	if apiError.ErrorCode != expiredAuthToken {
2897
-+		return res, nil
2898
-+	}
2899
-+
2900
-+	// We were told that the access token expired, so we acquire a new token using the refresh token.
2901
-+	newTokens, err := client.authClient.GetTokensByRefreshToken(req.Tokens.RefreshToken)
2902
-+	// If there is an error during token refresh, we assume that the refresh token also expired. So we login again using
2903
-+	// the machine account.
2904
-+	if err != nil {
2905
-+		newTokens, err = client.authClient.GetTokensByMachineAccount()
2906
-+		if err != nil {
2907
-+			return res, err
2908
-+		}
2909
-+	}
2910
-+	req.Tokens.AccessToken = newTokens.AccessToken
2911
-+	if client.UpdateAccessTokenCallback != nil {
2912
-+		client.UpdateAccessTokenCallback(newTokens.AccessToken)
2913
-+	}
2914
-+	if req.Body != nil && bodyRewinder != nil {
2915
-+		req.Body = bodyRewinder()
2916
-+	}
2917
-+	res, err = client.sendRequestHelper(req)
2918
-+	return res, nil
2919
-+}
2920
-+
2921
-+func (client *restClient) sendRequestHelper(req *request) (res *http.Response, err error) {
2922
-+	r, err := http.NewRequest(req.Method, req.URL, req.Body)
2923
-+	if err != nil {
2924
-+		return
2925
-+	}
2926
-+	if req.ContentType != "" {
2927
-+		r.Header.Add("Content-Type", req.ContentType)
2928
-+	}
2929
-+	if req.Tokens != nil && req.Tokens.AccessToken != "" {
2930
-+		r.Header.Add("Authorization", "Bearer "+req.Tokens.AccessToken)
2931
-+	}
2932
-+	res, err = client.httpClient.Do(r)
2933
-+	if err != nil {
2934
-+		return
2935
-+	}
2936
-+
2937
-+	return
2938
-+}
2939
-+
2940
-+// Reads an error out of the HTTP response, or does nothing if
2941
-+// no error occured.
2942
-+func getError(res *http.Response) (*http.Response, error) {
2943
-+	// Do nothing if the response is a successful 2xx
2944
-+	if res.StatusCode/100 == 2 {
2945
-+		return res, nil
2946
-+	}
2947
-+	var apiError APIError
2948
-+	// ReadAll is usually a bad practice, but here we need to read the response all
2949
-+	// at once because we may attempt to use the data twice. It's preferable to use
2950
-+	// methods that take io.Reader, e.g. json.NewDecoder
2951
-+	body, err := ioutil.ReadAll(res.Body)
2952
-+	if err != nil {
2953
-+		return nil, err
2954
-+	}
2955
-+	err = json.Unmarshal(body, &apiError)
2956
-+	if err != nil {
2957
-+		// If deserializing into ApiError fails, return a generic HttpError instead
2958
-+		return nil, HttpError{res.StatusCode, string(body[:])}
2959
-+	}
2960
-+	apiError.HttpStatusCode = res.StatusCode
2961
-+	return nil, apiError
2962
-+}
2963
-diff --git a/pkg/cloudprovider/providers/cascade/tests_owed b/pkg/cloudprovider/providers/cascade/tests_owed
2964
-new file mode 100644
2965
-index 0000000..dff5ab1
2966
-+++ b/pkg/cloudprovider/providers/cascade/tests_owed
2967
-@@ -0,0 +1,5 @@
2968
-+
2969
-+Yu Sheng
2970
-+Change-Id: Ifc11818f65a3e018aeea6988d9e2c0719b592920
2971
-+
2972
-+
2973
-diff --git a/pkg/cloudprovider/providers/cascade/utils.go b/pkg/cloudprovider/providers/cascade/utils.go
2974
-new file mode 100644
2975
-index 0000000..866f853
2976
-+++ b/pkg/cloudprovider/providers/cascade/utils.go
2977
-@@ -0,0 +1,29 @@
2978
-+package cascade
2979
-+
2980
-+func StringPtr(s string) *string {
2981
-+	return &s
2982
-+}
2983
-+
2984
-+// StringVal returns string from string pointer, nil returns ""
2985
-+func StringVal(p *string) (s string) {
2986
-+	if p != nil {
2987
-+		s = *p
2988
-+	}
2989
-+	return
2990
-+}
2991
-+
2992
-+func Int64Ptr(s int64) *int64 {
2993
-+	return &s
2994
-+}
2995
-+
2996
-+func Int64Val(s *int64) int64 {
2997
-+	return *s
2998
-+}
2999
-+
3000
-+func Int32Ptr(s int32) *int32 {
3001
-+	return &s
3002
-+}
3003
-+
3004
-+func BoolPtr(s bool) *bool {
3005
-+	return &s
3006
-+}
3007
-diff --git a/pkg/cloudprovider/providers/providers.go b/pkg/cloudprovider/providers/providers.go
3008
-index 7de9ca9..a655477 100644
3009
-+++ b/pkg/cloudprovider/providers/providers.go
3010
-@@ -21,6 +21,7 @@ import (
3011
- 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/aws"
3012
- 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/azure"
3013
- 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/cloudstack"
3014
-+	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/cascade"
3015
- 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/gce"
3016
- 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/openstack"
3017
- 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt"
3018
-diff --git a/pkg/kubeapiserver/authorizer/config.go b/pkg/kubeapiserver/authorizer/config.go
3019
-index a72ba5e..78fa9e1 100644
3020
-+++ b/pkg/kubeapiserver/authorizer/config.go
3021
-@@ -32,6 +32,7 @@ import (
3022
- 	"k8s.io/kubernetes/plugin/pkg/auth/authorizer/node"
3023
- 	"k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac"
3024
- 	"k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy"
3025
-+	"k8s.io/kubernetes/plugin/pkg/auth/authorizer/vke"
3026
- )
3027
- 
3028
- type AuthorizationConfig struct {
3029
-@@ -81,7 +82,12 @@ func (config AuthorizationConfig) New() (authorizer.Authorizer, authorizer.RuleR
3030
- 			)
3031
- 			nodeAuthorizer := node.NewAuthorizer(graph, nodeidentifier.NewDefaultNodeIdentifier(), bootstrappolicy.NodeRules())
3032
- 			authorizers = append(authorizers, nodeAuthorizer)
3033
--
3034
-+		case modes.ModeVKE:
3035
-+			vkeAuthorizer, err := vke.NewAuthorizer()
3036
-+			if err != nil {
3037
-+				return nil, nil, err
3038
-+			}
3039
-+			authorizers = append(authorizers, vkeAuthorizer)
3040
- 		case modes.ModeAlwaysAllow:
3041
- 			alwaysAllowAuthorizer := authorizerfactory.NewAlwaysAllowAuthorizer()
3042
- 			authorizers = append(authorizers, alwaysAllowAuthorizer)
3043
-diff --git a/pkg/kubeapiserver/authorizer/modes/modes.go b/pkg/kubeapiserver/authorizer/modes/modes.go
3044
-index 54d0a62..73a763f 100644
3045
-+++ b/pkg/kubeapiserver/authorizer/modes/modes.go
3046
-@@ -25,9 +25,10 @@ const (
3047
- 	ModeWebhook     string = "Webhook"
3048
- 	ModeRBAC        string = "RBAC"
3049
- 	ModeNode        string = "Node"
3050
-+	ModeVKE         string = "VKE"
3051
- )
3052
- 
3053
--var AuthorizationModeChoices = []string{ModeAlwaysAllow, ModeAlwaysDeny, ModeABAC, ModeWebhook, ModeRBAC, ModeNode}
3054
-+var AuthorizationModeChoices = []string{ModeAlwaysAllow, ModeAlwaysDeny, ModeABAC, ModeWebhook, ModeRBAC, ModeNode, ModeVKE}
3055
- 
3056
- // IsValidAuthorizationMode returns true if the given authorization mode is a valid one for the apiserver
3057
- func IsValidAuthorizationMode(authzMode string) bool {
3058
-diff --git a/pkg/kubeapiserver/options/plugins.go b/pkg/kubeapiserver/options/plugins.go
3059
-index abcb5b4..292fcdd 100644
3060
-+++ b/pkg/kubeapiserver/options/plugins.go
3061
-@@ -57,6 +57,7 @@ import (
3062
- 	"k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle"
3063
- 	mutatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating"
3064
- 	validatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/validating"
3065
-+	"k8s.io/kubernetes/plugin/pkg/admission/vke"
3066
- 	utilfeature "k8s.io/apiserver/pkg/util/feature"
3067
- 	"k8s.io/kubernetes/pkg/features"
3068
- )
3069
-@@ -93,6 +94,7 @@ var AllOrderedPlugins = []string{
3070
- 	initialization.PluginName,               // Initializers
3071
- 	validatingwebhook.PluginName,            // ValidatingAdmissionWebhook
3072
- 	resourcequota.PluginName,                // ResourceQuota
3073
-+	vke.PluginName,                          // VMwareAdmissionController
3074
- 	deny.PluginName,                         // AlwaysDeny
3075
- }
3076
- 
3077
-@@ -125,6 +127,7 @@ func RegisterAllAdmissionPlugins(plugins *admission.Plugins) {
3078
- 	setdefault.Register(plugins)
3079
- 	resize.Register(plugins)
3080
- 	storageobjectinuseprotection.Register(plugins)
3081
-+	vke.Register(plugins)
3082
- }
3083
- 
3084
- // DefaultOffAdmissionPlugins get admission plugins off by default for kube-apiserver.
3085
-diff --git a/pkg/printers/internalversion/describe.go b/pkg/printers/internalversion/describe.go
3086
-index c1b59cf..f6b18a7 100644
3087
-+++ b/pkg/printers/internalversion/describe.go
3088
-@@ -757,6 +757,8 @@ func describeVolumes(volumes []api.Volume, w PrefixWriter, space string) {
3089
- 			printFlexVolumeSource(volume.VolumeSource.FlexVolume, w)
3090
- 		case volume.VolumeSource.Flocker != nil:
3091
- 			printFlockerVolumeSource(volume.VolumeSource.Flocker, w)
3092
-+		case volume.VolumeSource.CascadeDisk != nil:
3093
-+			printCascadeDiskVolumeSource(volume.VolumeSource.CascadeDisk, w)
3094
- 		default:
3095
- 			w.Write(LEVEL_1, "<unknown>\n")
3096
- 		}
3097
-@@ -1127,6 +1129,13 @@ func printCSIPersistentVolumeSource(csi *api.CSIPersistentVolumeSource, w Prefix
3098
- 		csi.Driver, csi.VolumeHandle, csi.ReadOnly)
3099
- }
3100
- 
3101
-+func printCascadeDiskVolumeSource(cascade *api.CascadeDiskVolumeSource, w PrefixWriter) {
3102
-+	w.Write(LEVEL_2, "Type:\tVKEDisk (a Persistent Disk resource in VKE)\n"+
3103
-+		"    DiskID:\t%v\n"+
3104
-+		"    FSType:\t%v\n",
3105
-+		cascade.DiskID, cascade.FSType)
3106
-+}
3107
-+
3108
- type PersistentVolumeDescriber struct {
3109
- 	clientset.Interface
3110
- }
3111
-@@ -1263,6 +1272,8 @@ func describePersistentVolume(pv *api.PersistentVolume, events *api.EventList) (
3112
- 			printFlockerVolumeSource(pv.Spec.Flocker, w)
3113
- 		case pv.Spec.CSI != nil:
3114
- 			printCSIPersistentVolumeSource(pv.Spec.CSI, w)
3115
-+		case pv.Spec.CascadeDisk != nil:
3116
-+			printCascadeDiskVolumeSource(pv.Spec.CascadeDisk, w)
3117
- 		default:
3118
- 			w.Write(LEVEL_1, "<unknown>\n")
3119
- 		}
3120
-diff --git a/pkg/security/podsecuritypolicy/util/util.go b/pkg/security/podsecuritypolicy/util/util.go
3121
-index 3f29f6e..8e96503 100644
3122
-+++ b/pkg/security/podsecuritypolicy/util/util.go
3123
-@@ -68,6 +68,7 @@ func GetAllFSTypesAsSet() sets.String {
3124
- 		string(policy.PortworxVolume),
3125
- 		string(policy.ScaleIO),
3126
- 		string(policy.CSI),
3127
-+		string(policy.CascadeDisk),
3128
- 	)
3129
- 	return fstypes
3130
- }
3131
-@@ -129,6 +130,8 @@ func GetVolumeFSType(v api.Volume) (policy.FSType, error) {
3132
- 		return policy.PortworxVolume, nil
3133
- 	case v.ScaleIO != nil:
3134
- 		return policy.ScaleIO, nil
3135
-+	case v.CascadeDisk != nil:
3136
-+		return policy.CascadeDisk, nil
3137
- 	}
3138
- 
3139
- 	return "", fmt.Errorf("unknown volume type for volume: %#v", v)
3140
-diff --git a/pkg/volume/cascade_disk/BUILD b/pkg/volume/cascade_disk/BUILD
3141
-new file mode 100644
3142
-index 0000000..3386612
3143
-+++ b/pkg/volume/cascade_disk/BUILD
3144
-@@ -0,0 +1,43 @@
3145
-+package(default_visibility = ["//visibility:public"])
3146
-+
3147
-+load(
3148
-+    "@io_bazel_rules_go//go:def.bzl",
3149
-+    "go_library",
3150
-+    "go_test",
3151
-+)
3152
-+
3153
-+go_library(
3154
-+    name = "go_default_library",
3155
-+    srcs = [
3156
-+        "attacher.go",
3157
-+        "cascade_disk.go",
3158
-+        "cascade_util.go",
3159
-+    ],
3160
-+    deps = [
3161
-+        "//pkg/cloudprovider:go_default_library",
3162
-+        "//pkg/cloudprovider/providers/cascade:go_default_library",
3163
-+        "//pkg/util/mount:go_default_library",
3164
-+        "//pkg/util/strings:go_default_library",
3165
-+        "//pkg/volume:go_default_library",
3166
-+        "//pkg/volume/util:go_default_library",
3167
-+        "//pkg/volume/util/volumehelper:go_default_library",
3168
-+        "//vendor/github.com/golang/glog:go_default_library",
3169
-+        "//vendor/k8s.io/api/core/v1:go_default_library",
3170
-+        "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
3171
-+        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
3172
-+        "//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
3173
-+    ],
3174
-+)
3175
-+
3176
-+filegroup(
3177
-+    name = "package-srcs",
3178
-+    srcs = glob(["**"]),
3179
-+    tags = ["automanaged"],
3180
-+    visibility = ["//visibility:private"],
3181
-+)
3182
-+
3183
-+filegroup(
3184
-+    name = "all-srcs",
3185
-+    srcs = [":package-srcs"],
3186
-+    tags = ["automanaged"],
3187
-+)
3188
-diff --git a/pkg/volume/cascade_disk/OWNERS b/pkg/volume/cascade_disk/OWNERS
3189
-new file mode 100644
3190
-index 0000000..c3a4ed7
3191
-+++ b/pkg/volume/cascade_disk/OWNERS
3192
-@@ -0,0 +1,2 @@
3193
-+maintainers:
3194
-+- ashokc
3195
-diff --git a/pkg/volume/cascade_disk/attacher.go b/pkg/volume/cascade_disk/attacher.go
3196
-new file mode 100644
3197
-index 0000000..c19c37c
3198
-+++ b/pkg/volume/cascade_disk/attacher.go
3199
-@@ -0,0 +1,264 @@
3200
-+package cascade_disk
3201
-+
3202
-+import (
3203
-+	"fmt"
3204
-+	"os"
3205
-+	"path"
3206
-+	"time"
3207
-+
3208
-+	"github.com/golang/glog"
3209
-+	"k8s.io/api/core/v1"
3210
-+	"k8s.io/apimachinery/pkg/types"
3211
-+	"k8s.io/kubernetes/pkg/cloudprovider/providers/cascade"
3212
-+	"k8s.io/kubernetes/pkg/util/mount"
3213
-+	"k8s.io/kubernetes/pkg/volume"
3214
-+	volumeutil "k8s.io/kubernetes/pkg/volume/util"
3215
-+)
3216
-+
3217
-+type cascadeDiskAttacher struct {
3218
-+	host         volume.VolumeHost
3219
-+	cascadeDisks cascade.Disks
3220
-+}
3221
-+
3222
-+var _ volume.Attacher = &cascadeDiskAttacher{}
3223
-+var _ volume.AttachableVolumePlugin = &cascadeDiskPlugin{}
3224
-+
3225
-+func (plugin *cascadeDiskPlugin) NewAttacher() (volume.Attacher, error) {
3226
-+	cascadeCloud, err := getCloudProvider(plugin.host.GetCloudProvider())
3227
-+	if err != nil {
3228
-+		glog.Errorf("Cascade attacher: NewAttacher failed to get cloud provider")
3229
-+		return nil, err
3230
-+	}
3231
-+
3232
-+	return &cascadeDiskAttacher{
3233
-+		host:         plugin.host,
3234
-+		cascadeDisks: cascadeCloud,
3235
-+	}, nil
3236
-+}
3237
-+
3238
-+// Attach attaches the volume specified by the given spec to the given host. On success, returns the device path where
3239
-+// the device was attached on the node.
3240
-+func (attacher *cascadeDiskAttacher) Attach(spec *volume.Spec, nodeName types.NodeName) (string, error) {
3241
-+	hostName := string(nodeName)
3242
-+	volumeSource, _, err := getVolumeSource(spec)
3243
-+	if err != nil {
3244
-+		glog.Errorf("Cascade attacher: Attach failed to get volume source")
3245
-+		return "", err
3246
-+	}
3247
-+
3248
-+	// cascadeDisks.AttachDisk checks if disk is already attached to the node. So we don't have to do that separately
3249
-+	// here.
3250
-+	glog.V(4).Infof("Cascade: Attach disk called for host %s", hostName)
3251
-+	devicePath, err := attacher.cascadeDisks.AttachDisk(volumeSource.DiskID, nodeName)
3252
-+	if err != nil {
3253
-+		glog.Errorf("Error attaching volume %q to node %q: %+v", volumeSource.DiskID, nodeName, err)
3254
-+		return "", err
3255
-+	}
3256
-+	return devicePath, nil
3257
-+}
3258
-+
3259
-+// VolumesAreAttached verifies whether the volumes specified in the spec are attached to the specified node.
3260
-+func (attacher *cascadeDiskAttacher) VolumesAreAttached(specs []*volume.Spec,
3261
-+	nodeName types.NodeName) (map[*volume.Spec]bool, error) {
3262
-+	volumesAttachedCheck := make(map[*volume.Spec]bool)
3263
-+	volumeSpecMap := make(map[string]*volume.Spec)
3264
-+	diskIDList := []string{}
3265
-+	for _, spec := range specs {
3266
-+		volumeSource, _, err := getVolumeSource(spec)
3267
-+		if err != nil {
3268
-+			glog.Errorf("Error getting volume (%q) source : %v", spec.Name(), err)
3269
-+			continue
3270
-+		}
3271
-+
3272
-+		diskIDList = append(diskIDList, volumeSource.DiskID)
3273
-+		volumesAttachedCheck[spec] = true
3274
-+		volumeSpecMap[volumeSource.DiskID] = spec
3275
-+	}
3276
-+	attachedResult, err := attacher.cascadeDisks.DisksAreAttached(diskIDList, nodeName)
3277
-+	if err != nil {
3278
-+		glog.Errorf(
3279
-+			"Error checking if volumes (%v) are attached to current node (%q). err=%v",
3280
-+			diskIDList, nodeName, err)
3281
-+		return volumesAttachedCheck, err
3282
-+	}
3283
-+
3284
-+	for diskID, attached := range attachedResult {
3285
-+		if !attached {
3286
-+			spec := volumeSpecMap[diskID]
3287
-+			volumesAttachedCheck[spec] = false
3288
-+			glog.V(2).Infof("VolumesAreAttached: check volume %q (specName: %q) is no longer attached",
3289
-+				diskID, spec.Name())
3290
-+		}
3291
-+	}
3292
-+	return volumesAttachedCheck, nil
3293
-+}
3294
-+
3295
-+// WaitForAttach waits until the devicePath returned by the Attach call is available.
3296
-+func (attacher *cascadeDiskAttacher) WaitForAttach(spec *volume.Spec, devicePath string, _ *v1.Pod,
3297
-+	timeout time.Duration) (string, error) {
3298
-+	volumeSource, _, err := getVolumeSource(spec)
3299
-+	if err != nil {
3300
-+		glog.Errorf("Cascade attacher: WaitForAttach failed to get volume source")
3301
-+		return "", err
3302
-+	}
3303
-+
3304
-+	if devicePath == "" {
3305
-+		return "", fmt.Errorf("WaitForAttach failed for disk %s: devicePath is empty.", volumeSource.DiskID)
3306
-+	}
3307
-+
3308
-+	ticker := time.NewTicker(checkSleepDuration)
3309
-+	defer ticker.Stop()
3310
-+
3311
-+	timer := time.NewTimer(timeout)
3312
-+	defer timer.Stop()
3313
-+
3314
-+	for {
3315
-+		select {
3316
-+		case <-ticker.C:
3317
-+			glog.V(4).Infof("Checking disk %s is attached", volumeSource.DiskID)
3318
-+			devicePath := getDiskByIdPath(devicePath)
3319
-+			checkPath, err := verifyDevicePath(devicePath)
3320
-+			if err != nil {
3321
-+				// Log error, if any, and continue checking periodically. See issue #11321
3322
-+				glog.Warningf("Cascade attacher: WaitForAttach with devicePath %s Checking PD %s Error verify "+
3323
-+					"path", devicePath, volumeSource.DiskID)
3324
-+			} else if checkPath != "" {
3325
-+				// A device path has successfully been created for the disk
3326
-+				glog.V(4).Infof("Successfully found attached disk %s.", volumeSource.DiskID)
3327
-+				return checkPath, nil
3328
-+			}
3329
-+		case <-timer.C:
3330
-+			return "", fmt.Errorf("Could not find attached disk %s. Timeout waiting for mount paths to be "+
3331
-+				"created.", volumeSource.DiskID)
3332
-+		}
3333
-+	}
3334
-+}
3335
-+
3336
-+// GetDeviceMountPath returns a path where the device should point which should be bind mounted for individual volumes.
3337
-+func (attacher *cascadeDiskAttacher) GetDeviceMountPath(spec *volume.Spec) (string, error) {
3338
-+	volumeSource, _, err := getVolumeSource(spec)
3339
-+	if err != nil {
3340
-+		glog.Errorf("Cascade attacher: GetDeviceMountPath failed to get volume source")
3341
-+		return "", err
3342
-+	}
3343
-+
3344
-+	return makeGlobalPDPath(attacher.host, volumeSource.DiskID), nil
3345
-+}
3346
-+
3347
-+// GetMountDeviceRefs finds all other references to the device referenced by deviceMountPath; returns a list of paths.
3348
-+func (plugin *cascadeDiskPlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) {
3349
-+	mounter := plugin.host.GetMounter(plugin.GetPluginName())
3350
-+	return mount.GetMountRefs(mounter, deviceMountPath)
3351
-+}
3352
-+
3353
-+// MountDevice mounts device to global mount point.
3354
-+func (attacher *cascadeDiskAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error {
3355
-+	mounter := attacher.host.GetMounter(cascadeDiskPluginName)
3356
-+	notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath)
3357
-+	if err != nil {
3358
-+		if os.IsNotExist(err) {
3359
-+			if err := os.MkdirAll(deviceMountPath, 0750); err != nil {
3360
-+				glog.Errorf("Failed to create directory at %#v. err: %s", deviceMountPath, err)
3361
-+				return err
3362
-+			}
3363
-+			notMnt = true
3364
-+		} else {
3365
-+			return err
3366
-+		}
3367
-+	}
3368
-+
3369
-+	volumeSource, _, err := getVolumeSource(spec)
3370
-+	if err != nil {
3371
-+		glog.Errorf("Cascade attacher: MountDevice failed to get volume source. err: %s", err)
3372
-+		return err
3373
-+	}
3374
-+
3375
-+	options := []string{}
3376
-+
3377
-+	if notMnt {
3378
-+		diskMounter := volumeutil.NewSafeFormatAndMountFromHost(cascadeDiskPluginName, attacher.host)
3379
-+		mountOptions := volumeutil.MountOptionFromSpec(spec)
3380
-+		err = diskMounter.FormatAndMount(devicePath, deviceMountPath, volumeSource.FSType, mountOptions)
3381
-+		if err != nil {
3382
-+			os.Remove(deviceMountPath)
3383
-+			return err
3384
-+		}
3385
-+		glog.V(4).Infof("formatting spec %v devicePath %v deviceMountPath %v fs %v with options %+v",
3386
-+			spec.Name(), devicePath, deviceMountPath, volumeSource.FSType, options)
3387
-+	}
3388
-+	return nil
3389
-+}
3390
-+
3391
-+type cascadeDiskDetacher struct {
3392
-+	mounter      mount.Interface
3393
-+	cascadeDisks cascade.Disks
3394
-+}
3395
-+
3396
-+var _ volume.Detacher = &cascadeDiskDetacher{}
3397
-+
3398
-+// NewDetacher returns the detacher associated with the Cascade volume plugin.
3399
-+func (plugin *cascadeDiskPlugin) NewDetacher() (volume.Detacher, error) {
3400
-+	cascadeCloud, err := getCloudProvider(plugin.host.GetCloudProvider())
3401
-+	if err != nil {
3402
-+		glog.Errorf("Cascade attacher: NewDetacher failed to get cloud provider. err: %s", err)
3403
-+		return nil, err
3404
-+	}
3405
-+
3406
-+	return &cascadeDiskDetacher{
3407
-+		mounter:      plugin.host.GetMounter(plugin.GetPluginName()),
3408
-+		cascadeDisks: cascadeCloud,
3409
-+	}, nil
3410
-+}
3411
-+
3412
-+// Detach detaches the given device from the given host.
3413
-+func (detacher *cascadeDiskDetacher) Detach(deviceMountPath string, nodeName types.NodeName) error {
3414
-+	hostName := string(nodeName)
3415
-+	diskID := path.Base(deviceMountPath)
3416
-+	attached, err := detacher.cascadeDisks.DiskIsAttached(diskID, nodeName)
3417
-+	if err != nil {
3418
-+		// Log error and continue with detach
3419
-+		glog.Errorf(
3420
-+			"Error checking if persistent disk (%q) is already attached to current node (%q). "+
3421
-+				"Will continue and try detach anyway. err=%v", diskID, hostName, err)
3422
-+	}
3423
-+
3424
-+	if err == nil && !attached {
3425
-+		// Volume is already detached from node.
3426
-+		glog.V(4).Infof("detach operation was successful. persistent disk %q is already detached "+
3427
-+			"from node %q.", diskID, hostName)
3428
-+		return nil
3429
-+	}
3430
-+
3431
-+	if err := detacher.cascadeDisks.DetachDisk(diskID, nodeName); err != nil {
3432
-+		glog.Errorf("Error detaching volume %q: %v", diskID, err)
3433
-+		return err
3434
-+	}
3435
-+	return nil
3436
-+}
3437
-+
3438
-+// WaitForDetach waits for the devicePath to become unavailable.
3439
-+func (detacher *cascadeDiskDetacher) WaitForDetach(devicePath string, timeout time.Duration) error {
3440
-+	ticker := time.NewTicker(checkSleepDuration)
3441
-+	defer ticker.Stop()
3442
-+	timer := time.NewTimer(timeout)
3443
-+	defer timer.Stop()
3444
-+
3445
-+	for {
3446
-+		select {
3447
-+		case <-ticker.C:
3448
-+			glog.V(4).Infof("Checking device %q is detached.", devicePath)
3449
-+			if pathExists, err := volumeutil.PathExists(devicePath); err != nil {
3450
-+				return fmt.Errorf("Error checking if device path exists: %v", err)
3451
-+			} else if !pathExists {
3452
-+				return nil
3453
-+			}
3454
-+		case <-timer.C:
3455
-+			return fmt.Errorf("Timeout reached; Device %v is still attached", devicePath)
3456
-+		}
3457
-+	}
3458
-+}
3459
-+
3460
-+// UnmountDevice unmounts the disk specified by the device mount path.
3461
-+func (detacher *cascadeDiskDetacher) UnmountDevice(deviceMountPath string) error {
3462
-+	return volumeutil.UnmountPath(deviceMountPath, detacher.mounter)
3463
-+}
3464
-diff --git a/pkg/volume/cascade_disk/cascade_disk.go b/pkg/volume/cascade_disk/cascade_disk.go
3465
-new file mode 100644
3466
-index 0000000..d1b791c
3467
-+++ b/pkg/volume/cascade_disk/cascade_disk.go
3468
-@@ -0,0 +1,390 @@
3469
-+package cascade_disk
3470
-+
3471
-+import (
3472
-+	"fmt"
3473
-+	"os"
3474
-+	"path"
3475
-+
3476
-+	"github.com/golang/glog"
3477
-+	"k8s.io/api/core/v1"
3478
-+	"k8s.io/apimachinery/pkg/api/resource"
3479
-+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3480
-+	"k8s.io/apimachinery/pkg/types"
3481
-+	"k8s.io/kubernetes/pkg/util/mount"
3482
-+	utilstrings "k8s.io/kubernetes/pkg/util/strings"
3483
-+	"k8s.io/kubernetes/pkg/volume"
3484
-+	"k8s.io/kubernetes/pkg/volume/util"
3485
-+)
3486
-+
3487
-+// This is the primary entrypoint for volume plugins.
3488
-+func ProbeVolumePlugins() []volume.VolumePlugin {
3489
-+	return []volume.VolumePlugin{&cascadeDiskPlugin{}}
3490
-+}
3491
-+
3492
-+type cascadeDiskPlugin struct {
3493
-+	host volume.VolumeHost
3494
-+}
3495
-+
3496
-+var _ volume.VolumePlugin = &cascadeDiskPlugin{}
3497
-+var _ volume.PersistentVolumePlugin = &cascadeDiskPlugin{}
3498
-+var _ volume.DeletableVolumePlugin = &cascadeDiskPlugin{}
3499
-+var _ volume.ProvisionableVolumePlugin = &cascadeDiskPlugin{}
3500
-+
3501
-+const (
3502
-+	cascadeDiskPluginName = "kubernetes.io/vke-disk"
3503
-+)
3504
-+
3505
-+// Init initializes the Cascade volume plugin.
3506
-+func (plugin *cascadeDiskPlugin) Init(host volume.VolumeHost) error {
3507
-+	plugin.host = host
3508
-+	return nil
3509
-+}
3510
-+
3511
-+// GetPluginName returns the name of the Cascade volume plugin.
3512
-+func (plugin *cascadeDiskPlugin) GetPluginName() string {
3513
-+	return cascadeDiskPluginName
3514
-+}
3515
-+
3516
-+// GetVolumeName returns the name of the volume which is the diskID in our case.
3517
-+func (plugin *cascadeDiskPlugin) GetVolumeName(spec *volume.Spec) (string, error) {
3518
-+	volumeSource, _, err := getVolumeSource(spec)
3519
-+	if err != nil {
3520
-+		glog.Errorf("Cascade volume plugin: GetVolumeName failed to get volume source")
3521
-+		return "", err
3522
-+	}
3523
-+
3524
-+	return volumeSource.DiskID, nil
3525
-+}
3526
-+
3527
-+// CanSupport specifies whether the Cascade volume plguin can support the specific resource type.
3528
-+// Cascade plugin only supports the persistent volume and volume resource which has the Cascade disk annotation.
3529
-+func (plugin *cascadeDiskPlugin) CanSupport(spec *volume.Spec) bool {
3530
-+	return (spec.PersistentVolume != nil && spec.PersistentVolume.Spec.CascadeDisk != nil) ||
3531
-+		(spec.Volume != nil && spec.Volume.CascadeDisk != nil)
3532
-+}
3533
-+
3534
-+// RequiresRemount specifies whether remount is required for the disk.
3535
-+func (plugin *cascadeDiskPlugin) RequiresRemount() bool {
3536
-+	return false
3537
-+}
3538
-+
3539
-+// SupportsMountOption specifies whether the Cascade volume plugin supports the mount operation.
3540
-+func (plugin *cascadeDiskPlugin) SupportsMountOption() bool {
3541
-+	return true
3542
-+}
3543
-+
3544
-+// SupportsBulkVolumeVerification specifies whether bulk volume verification is supported.
3545
-+func (plugin *cascadeDiskPlugin) SupportsBulkVolumeVerification() bool {
3546
-+	return false
3547
-+}
3548
-+
3549
-+// NewMounter returns the mounter associated with the Cascade volume plugin.
3550
-+func (plugin *cascadeDiskPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod,
3551
-+	_ volume.VolumeOptions) (volume.Mounter, error) {
3552
-+	return plugin.newMounterInternal(spec, pod.UID, &CascadeDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName()))
3553
-+}
3554
-+
3555
-+// NewUnmounter returns the unmounter associated with the Cascade volume plugin.
3556
-+func (plugin *cascadeDiskPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) {
3557
-+	return plugin.newUnmounterInternal(volName, podUID, &CascadeDiskUtil{},
3558
-+		plugin.host.GetMounter(plugin.GetPluginName()))
3559
-+}
3560
-+
3561
-+func (plugin *cascadeDiskPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager diskManager,
3562
-+	mounter mount.Interface) (volume.Mounter, error) {
3563
-+	volumeSource, _, err := getVolumeSource(spec)
3564
-+	if err != nil {
3565
-+		glog.Errorf("Cascade volume plugin: newMounterInternal failed to get volume source")
3566
-+		return nil, err
3567
-+	}
3568
-+
3569
-+	diskID := volumeSource.DiskID
3570
-+	fsType := volumeSource.FSType
3571
-+
3572
-+	return &cascadeDiskMounter{
3573
-+		cascadeDisk: &cascadeDisk{
3574
-+			podUID:  podUID,
3575
-+			volName: spec.Name(),
3576
-+			diskID:  diskID,
3577
-+			manager: manager,
3578
-+			mounter: mounter,
3579
-+			plugin:  plugin,
3580
-+		},
3581
-+		fsType:      fsType,
3582
-+		diskMounter: util.NewSafeFormatAndMountFromHost(plugin.GetPluginName(), plugin.host)}, nil
3583
-+}
3584
-+
3585
-+func (plugin *cascadeDiskPlugin) newUnmounterInternal(volName string, podUID types.UID, manager diskManager,
3586
-+	mounter mount.Interface) (volume.Unmounter, error) {
3587
-+	return &cascadeDiskUnmounter{
3588
-+		&cascadeDisk{
3589
-+			podUID:  podUID,
3590
-+			volName: volName,
3591
-+			manager: manager,
3592
-+			mounter: mounter,
3593
-+			plugin:  plugin,
3594
-+		}}, nil
3595
-+}
3596
-+
3597
-+// ConstructVolumeSpec constructs a Cascade volume spec based on the name and mount path.
3598
-+func (plugin *cascadeDiskPlugin) ConstructVolumeSpec(volumeSpecName, mountPath string) (*volume.Spec, error) {
3599
-+	mounter := plugin.host.GetMounter(plugin.GetPluginName())
3600
-+	pluginDir := plugin.host.GetPluginDir(plugin.GetPluginName())
3601
-+	diskID, err := mounter.GetDeviceNameFromMount(mountPath, pluginDir)
3602
-+	if err != nil {
3603
-+		return nil, err
3604
-+	}
3605
-+
3606
-+	cascadeDisk := &v1.Volume{
3607
-+		Name: volumeSpecName,
3608
-+		VolumeSource: v1.VolumeSource{
3609
-+			CascadeDisk: &v1.CascadeDiskVolumeSource{
3610
-+				DiskID: diskID,
3611
-+			},
3612
-+		},
3613
-+	}
3614
-+	return volume.NewSpecFromVolume(cascadeDisk), nil
3615
-+}
3616
-+
3617
-+// Abstract interface to disk operations.
3618
-+type diskManager interface {
3619
-+	// Creates a volume
3620
-+	CreateVolume(provisioner *cascadeDiskProvisioner) (diskID string, volumeSizeGB int, fstype string, err error)
3621
-+	// Deletes a volume
3622
-+	DeleteVolume(deleter *cascadeDiskDeleter) error
3623
-+}
3624
-+
3625
-+// cascadeDisk volumes are disk resources attached to the kubelet's host machine and exposed to the pod.
3626
-+type cascadeDisk struct {
3627
-+	volName string
3628
-+	podUID  types.UID
3629
-+	diskID  string
3630
-+	fsType  string
3631
-+	manager diskManager
3632
-+	mounter mount.Interface
3633
-+	plugin  *cascadeDiskPlugin
3634
-+	volume.MetricsNil
3635
-+}
3636
-+
3637
-+var _ volume.Mounter = &cascadeDiskMounter{}
3638
-+
3639
-+type cascadeDiskMounter struct {
3640
-+	*cascadeDisk
3641
-+	fsType      string
3642
-+	diskMounter *mount.SafeFormatAndMount
3643
-+}
3644
-+
3645
-+// GetAttributes returns the attributes associated with a Cascade disk.
3646
-+func (b *cascadeDiskMounter) GetAttributes() volume.Attributes {
3647
-+	return volume.Attributes{
3648
-+		SupportsSELinux: true,
3649
-+	}
3650
-+}
3651
-+
3652
-+// CanMount checks prior to mount operations to verify that the required components (binaries, etc.) to mount the
3653
-+// volume are available on the underlying node. If not, it returns an error.
3654
-+func (b *cascadeDiskMounter) CanMount() error {
3655
-+	return nil
3656
-+}
3657
-+
3658
-+// SetUp attaches the disk and bind mounts to the volume path.
3659
-+func (b *cascadeDiskMounter) SetUp(fsGroup *int64) error {
3660
-+	return b.SetUpAt(b.GetPath(), fsGroup)
3661
-+}
3662
-+
3663
-+// SetUpAt attaches the disk and bind mounts to the volume path.
3664
-+func (b *cascadeDiskMounter) SetUpAt(dir string, fsGroup *int64) error {
3665
-+	glog.V(4).Infof("Cascade Persistent Disk setup %s to %s", b.diskID, dir)
3666
-+
3667
-+	// TODO: handle failed mounts here.
3668
-+	notmnt, err := b.mounter.IsLikelyNotMountPoint(dir)
3669
-+	if err != nil && !os.IsNotExist(err) {
3670
-+		glog.Errorf("cannot validate mount point: %s %v", dir, err)
3671
-+		return err
3672
-+	}
3673
-+	if !notmnt {
3674
-+		return nil
3675
-+	}
3676
-+
3677
-+	if err := os.MkdirAll(dir, 0750); err != nil {
3678
-+		glog.Errorf("mkdir failed on disk %s (%v)", dir, err)
3679
-+		return err
3680
-+	}
3681
-+
3682
-+	options := []string{"bind"}
3683
-+
3684
-+	// Perform a bind mount to the full path to allow duplicate mounts of the same PD.
3685
-+	globalPDPath := makeGlobalPDPath(b.plugin.host, b.diskID)
3686
-+	glog.V(4).Infof("attempting to mount %s", dir)
3687
-+
3688
-+	err = b.mounter.Mount(globalPDPath, dir, "", options)
3689
-+	if err != nil {
3690
-+		notmnt, mntErr := b.mounter.IsLikelyNotMountPoint(dir)
3691
-+		if mntErr != nil {
3692
-+			glog.Errorf("IsLikelyNotMountPoint check failed: %v", mntErr)
3693
-+			return err
3694
-+		}
3695
-+		if !notmnt {
3696
-+			if mntErr = b.mounter.Unmount(dir); mntErr != nil {
3697
-+				glog.Errorf("Failed to unmount: %v", mntErr)
3698
-+				return err
3699
-+			}
3700
-+			notmnt, mntErr := b.mounter.IsLikelyNotMountPoint(dir)
3701
-+			if mntErr != nil {
3702
-+				glog.Errorf("IsLikelyNotMountPoint check failed: %v", mntErr)
3703
-+				return err
3704
-+			}
3705
-+			if !notmnt {
3706
-+				glog.Errorf("%s is still mounted, despite call to unmount().  Will try again next sync loop.",
3707
-+					b.GetPath())
3708
-+				return err
3709
-+			}
3710
-+		}
3711
-+		os.Remove(dir)
3712
-+		glog.Errorf("Mount of disk %s failed: %v", dir, err)
3713
-+		return err
3714
-+	}
3715
-+	volume.SetVolumeOwnership(b, fsGroup)
3716
-+
3717
-+	return nil
3718
-+}
3719
-+
3720
-+var _ volume.Unmounter = &cascadeDiskUnmounter{}
3721
-+
3722
-+type cascadeDiskUnmounter struct {
3723
-+	*cascadeDisk
3724
-+}
3725
-+
3726
-+// TearDown unmounts the bind mount, and detaches the disk only if the disk resource was the last reference to that
3727
-+// disk on the kubelet.
3728
-+func (c *cascadeDiskUnmounter) TearDown() error {
3729
-+	return c.TearDownAt(c.GetPath())
3730
-+}
3731
-+
3732
-+// TearDownAt unmounts the bind mount, and detaches the disk only if the disk resource was the last reference to that
3733
-+// disk on the kubelet.
3734
-+func (c *cascadeDiskUnmounter) TearDownAt(dir string) error {
3735
-+	return util.UnmountPath(dir, c.mounter)
3736
-+}
3737
-+
3738
-+func makeGlobalPDPath(host volume.VolumeHost, diskID string) string {
3739
-+	return path.Join(host.GetPluginDir(cascadeDiskPluginName), mount.MountsInGlobalPDPath, diskID)
3740
-+}
3741
-+
3742
-+func (cd *cascadeDisk) GetPath() string {
3743
-+	name := cascadeDiskPluginName
3744
-+	return cd.plugin.host.GetPodVolumeDir(cd.podUID, utilstrings.EscapeQualifiedNameForDisk(name), cd.volName)
3745
-+}
3746
-+
3747
-+func (plugin *cascadeDiskPlugin) GetAccessModes() []v1.PersistentVolumeAccessMode {
3748
-+	return []v1.PersistentVolumeAccessMode{
3749
-+		v1.ReadWriteOnce,
3750
-+	}
3751
-+}
3752
-+
3753
-+type cascadeDiskDeleter struct {
3754
-+	*cascadeDisk
3755
-+}
3756
-+
3757
-+var _ volume.Deleter = &cascadeDiskDeleter{}
3758
-+
3759
-+// NewDeleter returns the deleter associated with the Cascade volume plugin.
3760
-+func (plugin *cascadeDiskPlugin) NewDeleter(spec *volume.Spec) (volume.Deleter, error) {
3761
-+	return plugin.newDeleterInternal(spec, &CascadeDiskUtil{})
3762
-+}
3763
-+
3764
-+func (plugin *cascadeDiskPlugin) newDeleterInternal(spec *volume.Spec, manager diskManager) (volume.Deleter, error) {
3765
-+	if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.CascadeDisk == nil {
3766
-+		return nil, fmt.Errorf("spec.PersistentVolumeSource.CascadeDisk is nil")
3767
-+	}
3768
-+	return &cascadeDiskDeleter{
3769
-+		&cascadeDisk{
3770
-+			volName: spec.Name(),
3771
-+			diskID:  spec.PersistentVolume.Spec.CascadeDisk.DiskID,
3772
-+			manager: manager,
3773
-+			plugin:  plugin,
3774
-+		}}, nil
3775
-+}
3776
-+
3777
-+func (r *cascadeDiskDeleter) Delete() error {
3778
-+	return r.manager.DeleteVolume(r)
3779
-+}
3780
-+
3781
-+type cascadeDiskProvisioner struct {
3782
-+	*cascadeDisk
3783
-+	options volume.VolumeOptions
3784
-+}
3785
-+
3786
-+var _ volume.Provisioner = &cascadeDiskProvisioner{}
3787
-+
3788
-+// NewProvisioner returns the provisioner associated with the Cascade volume plugin.
3789
-+func (plugin *cascadeDiskPlugin) NewProvisioner(options volume.VolumeOptions) (volume.Provisioner, error) {
3790
-+	return plugin.newProvisionerInternal(options, &CascadeDiskUtil{})
3791
-+}
3792
-+
3793
-+func (plugin *cascadeDiskPlugin) newProvisionerInternal(options volume.VolumeOptions,
3794
-+	manager diskManager) (volume.Provisioner, error) {
3795
-+	return &cascadeDiskProvisioner{
3796
-+		cascadeDisk: &cascadeDisk{
3797
-+			manager: manager,
3798
-+			plugin:  plugin,
3799
-+		},
3800
-+		options: options,
3801
-+	}, nil
3802
-+}
3803
-+
3804
-+// Provision provisions the persistent volume by making a CreateDisk call to Cascade Controller.
3805
-+func (p *cascadeDiskProvisioner) Provision(selectedNode *v1.Node, allowedTopologies []v1.TopologySelectorTerm) (*v1.PersistentVolume, error) {
3806
-+	if !util.AccessModesContainedInAll(p.plugin.GetAccessModes(), p.options.PVC.Spec.AccessModes) {
3807
-+		return nil, fmt.Errorf("invalid AccessModes %v: only AccessModes %v are supported",
3808
-+			p.options.PVC.Spec.AccessModes, p.plugin.GetAccessModes())
3809
-+	}
3810
-+
3811
-+	diskID, sizeGB, fstype, err := p.manager.CreateVolume(p)
3812
-+	if err != nil {
3813
-+		return nil, err
3814
-+	}
3815
-+
3816
-+	if fstype == "" {
3817
-+		fstype = "ext4"
3818
-+	}
3819
-+
3820
-+	pv := &v1.PersistentVolume{
3821
-+		ObjectMeta: metav1.ObjectMeta{
3822
-+			Name:   p.options.PVName,
3823
-+			Labels: map[string]string{},
3824
-+			Annotations: map[string]string{
3825
-+				util.VolumeDynamicallyCreatedByKey: "vke-volume-dynamic-provisioner",
3826
-+			},
3827
-+		},
3828
-+		Spec: v1.PersistentVolumeSpec{
3829
-+			PersistentVolumeReclaimPolicy: p.options.PersistentVolumeReclaimPolicy,
3830
-+			AccessModes:                   p.options.PVC.Spec.AccessModes,
3831
-+			Capacity: v1.ResourceList{
3832
-+				v1.ResourceName(v1.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", sizeGB)),
3833
-+			},
3834
-+			PersistentVolumeSource: v1.PersistentVolumeSource{
3835
-+				CascadeDisk: &v1.CascadeDiskVolumeSource{
3836
-+					DiskID: diskID,
3837
-+					FSType: fstype,
3838
-+				},
3839
-+			},
3840
-+			MountOptions: p.options.MountOptions,
3841
-+		},
3842
-+	}
3843
-+	if len(p.options.PVC.Spec.AccessModes) == 0 {
3844
-+		pv.Spec.AccessModes = p.plugin.GetAccessModes()
3845
-+	}
3846
-+
3847
-+	return pv, nil
3848
-+}
3849
-+
3850
-+func getVolumeSource(spec *volume.Spec) (*v1.CascadeDiskVolumeSource, bool, error) {
3851
-+	if spec.Volume != nil && spec.Volume.CascadeDisk != nil {
3852
-+		return spec.Volume.CascadeDisk, spec.ReadOnly, nil
3853
-+	} else if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.CascadeDisk != nil {
3854
-+		return spec.PersistentVolume.Spec.CascadeDisk, spec.ReadOnly, nil
3855
-+	}
3856
-+
3857
-+	return nil, false, fmt.Errorf("Spec does not reference a Cascade disk type")
3858
-+}
3859
-diff --git a/pkg/volume/cascade_disk/cascade_util.go b/pkg/volume/cascade_disk/cascade_util.go
3860
-new file mode 100644
3861
-index 0000000..e16199c
3862
-+++ b/pkg/volume/cascade_disk/cascade_util.go
3863
-@@ -0,0 +1,162 @@
3864
-+package cascade_disk
3865
-+
3866
-+import (
3867
-+	"fmt"
3868
-+	"strconv"
3869
-+	"strings"
3870
-+	"time"
3871
-+
3872
-+	"github.com/golang/glog"
3873
-+	"k8s.io/api/core/v1"
3874
-+	"k8s.io/kubernetes/pkg/cloudprovider"
3875
-+	"k8s.io/kubernetes/pkg/cloudprovider/providers/cascade"
3876
-+	"k8s.io/kubernetes/pkg/volume"
3877
-+	volumeutil "k8s.io/kubernetes/pkg/volume/util"
3878
-+	"path/filepath"
3879
-+	"os"
3880
-+)
3881
-+
3882
-+const (
3883
-+	checkSleepDuration = time.Second
3884
-+)
3885
-+
3886
-+type CascadeDiskUtil struct{}
3887
-+
3888
-+func verifyDevicePath(path string) (string, error) {
3889
-+	if pathExists, err := volumeutil.PathExists(path); err != nil {
3890
-+		return "", fmt.Errorf("Error checking if path exists: %v", err)
3891
-+	} else if pathExists {
3892
-+		return path, nil
3893
-+	}
3894
-+
3895
-+	glog.V(4).Infof("verifyDevicePath: path does not exist yet")
3896
-+	return "", nil
3897
-+}
3898
-+
3899
-+// Returns path for given VKE disk mount
3900
-+func getDiskByIdPath(devicePath string) string {
3901
-+	nvmePath, err := findNvmeVolume(devicePath)
3902
-+	if err != nil {
3903
-+		glog.Warningf("error looking for nvme volume %q: %v", devicePath, err)
3904
-+	} else if nvmePath != "" {
3905
-+		devicePath = nvmePath
3906
-+	}
3907
-+
3908
-+	return devicePath
3909
-+}
3910
-+
3911
-+// CreateVolume creates a Cascade persistent disk.
3912
-+func (util *CascadeDiskUtil) CreateVolume(p *cascadeDiskProvisioner) (diskID string, capacityGB int, fstype string,
3913
-+	err error) {
3914
-+	cloud, err := getCloudProvider(p.plugin.host.GetCloudProvider())
3915
-+	if err != nil {
3916
-+		glog.Errorf("Cascade Util: CreateVolume failed to get cloud provider. Error [%v]", err)
3917
-+		return "", 0, "", err
3918
-+	}
3919
-+
3920
-+	capacity := p.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)]
3921
-+	volSizeBytes := capacity.Value()
3922
-+	// Cascade works with GB, convert to GB with rounding up
3923
-+	volSizeGB := int(volumeutil.RoundUpSize(volSizeBytes, 1024*1024*1024))
3924
-+	name := volumeutil.GenerateVolumeName(p.options.ClusterName, p.options.PVName, 255)
3925
-+	volumeOptions := &cascade.VolumeOptions{
3926
-+		CapacityGB: volSizeGB,
3927
-+		Tags:       *p.options.CloudTags,
3928
-+		Name:       name,
3929
-+	}
3930
-+
3931
-+	// enabling encryption by default if not provided from within storage class
3932
-+	volumeOptions.Encrypted = true
3933
-+	for parameter, value := range p.options.Parameters {
3934
-+		switch strings.ToLower(parameter) {
3935
-+		case "flavor":
3936
-+			volumeOptions.Flavor = value
3937
-+		case "encrypted":
3938
-+			volumeOptions.Encrypted, err = strconv.ParseBool(value)
3939
-+			if err != nil {
3940
-+				glog.Errorf("Cascade Util: invalid value %q for encryption of volume plugin %s.", value,
3941
-+					p.plugin.GetPluginName())
3942
-+				return "", 0, "", fmt.Errorf("invalid encrypted boolean value %q, must be true or false: %v", value, err)
3943
-+			}
3944
-+		case volume.VolumeParameterFSType:
3945
-+			fstype = value
3946
-+			glog.V(4).Infof("Cascade Util: Setting fstype to %s", fstype)
3947
-+		default:
3948
-+			glog.Errorf("Cascade Util: invalid option %s for volume plugin %s.", parameter,
3949
-+				p.plugin.GetPluginName())
3950
-+			return "", 0, "", fmt.Errorf("Cascade Util: invalid option %s for volume plugin %s.", parameter,
3951
-+				p.plugin.GetPluginName())
3952
-+		}
3953
-+	}
3954
-+
3955
-+	diskID, err = cloud.CreateDisk(volumeOptions)
3956
-+	if err != nil {
3957
-+		glog.Errorf("Cascade Util: failed to CreateDisk. Error [%v]", err)
3958
-+		return "", 0, "", err
3959
-+	}
3960
-+
3961
-+	glog.V(4).Infof("Successfully created Cascade persistent disk %s", name)
3962
-+	return diskID, volSizeGB, "", nil
3963
-+}
3964
-+
3965
-+// DeleteVolume deletes a Cascade volume.
3966
-+func (util *CascadeDiskUtil) DeleteVolume(disk *cascadeDiskDeleter) error {
3967
-+	cloud, err := getCloudProvider(disk.plugin.host.GetCloudProvider())
3968
-+	if err != nil {
3969
-+		glog.Errorf("Cascade Util: DeleteVolume failed to get cloud provider. Error [%v]", err)
3970
-+		return err
3971
-+	}
3972
-+
3973
-+	if err = cloud.DeleteDisk(disk.diskID); err != nil {
3974
-+		glog.Errorf("Cascade Util: failed to DeleteDisk for diskID %s. Error [%v]", disk.diskID, err)
3975
-+		return err
3976
-+	}
3977
-+
3978
-+	glog.V(4).Infof("Successfully deleted Cascade persistent disk %s", disk.diskID)
3979
-+	return nil
3980
-+}
3981
-+
3982
-+func getCloudProvider(cloud cloudprovider.Interface) (*cascade.CascadeCloud, error) {
3983
-+	if cloud == nil {
3984
-+		glog.Errorf("Cascade Util: Cloud provider not initialized properly")
3985
-+		return nil, fmt.Errorf("Cascade Util: Cloud provider not initialized properly")
3986
-+	}
3987
-+
3988
-+	cc := cloud.(*cascade.CascadeCloud)
3989
-+	if cc == nil {
3990
-+		glog.Errorf("Invalid cloud provider: expected Cascade")
3991
-+		return nil, fmt.Errorf("Invalid cloud provider: expected Cascade")
3992
-+	}
3993
-+	return cc, nil
3994
-+}
3995
-+
3996
-+// findNvmeVolume looks for the nvme volume with the specified name
3997
-+// It follows the symlink (if it exists) and returns the absolute path to the device
3998
-+func findNvmeVolume(findName string) (device string, err error) {
3999
-+	stat, err := os.Lstat(findName)
4000
-+	if err != nil {
4001
-+		if os.IsNotExist(err) {
4002
-+			glog.V(6).Infof("nvme path not found %q", findName)
4003
-+			return "", nil
4004
-+		}
4005
-+		return "", fmt.Errorf("error getting stat of %q: %v", findName, err)
4006
-+	}
4007
-+
4008
-+	if stat.Mode()&os.ModeSymlink != os.ModeSymlink {
4009
-+		glog.Warningf("nvme file %q found, but was not a symlink", findName)
4010
-+		return "", nil
4011
-+	}
4012
-+
4013
-+	// Find the target, resolving to an absolute path
4014
-+	// For example, /dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_vol0fab1d5e3f72a5e23 -> ../../nvme2n1
4015
-+	resolved, err := filepath.EvalSymlinks(findName)
4016
-+	if err != nil {
4017
-+		return "", fmt.Errorf("error reading target of symlink %q: %v", findName, err)
4018
-+	}
4019
-+
4020
-+	if !strings.HasPrefix(resolved, "/dev") {
4021
-+		return "", fmt.Errorf("resolved symlink for %q was unexpected: %q", findName, resolved)
4022
-+	}
4023
-+
4024
-+	return resolved, nil
4025
-+}
4026
-diff --git a/plugin/pkg/admission/storage/persistentvolume/label/admission.go b/plugin/pkg/admission/storage/persistentvolume/label/admission.go
4027
-index 19fc962..8c51e38 100644
4028
-+++ b/plugin/pkg/admission/storage/persistentvolume/label/admission.go
4029
-@@ -27,6 +27,7 @@ import (
4030
- 	api "k8s.io/kubernetes/pkg/apis/core"
4031
- 	"k8s.io/kubernetes/pkg/cloudprovider"
4032
- 	"k8s.io/kubernetes/pkg/cloudprovider/providers/aws"
4033
-+	"k8s.io/kubernetes/pkg/cloudprovider/providers/cascade"
4034
- 	"k8s.io/kubernetes/pkg/cloudprovider/providers/gce"
4035
- 	kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission"
4036
- 	kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis"
4037
-@@ -55,6 +56,7 @@ type persistentVolumeLabel struct {
4038
- 	ebsVolumes       aws.Volumes
4039
- 	cloudConfig      []byte
4040
- 	gceCloudProvider *gce.GCECloud
4041
-+	cascadeDisks     cascade.Disks
4042
- }
4043
- 
4044
- var _ admission.MutationInterface = &persistentVolumeLabel{}
4045
-@@ -107,6 +109,13 @@ func (l *persistentVolumeLabel) Admit(a admission.Attributes) (err error) {
4046
- 		}
4047
- 		volumeLabels = labels
4048
- 	}
4049
-+	if volume.Spec.CascadeDisk != nil {
4050
-+		labels, err := l.findCascadeDiskLabels(volume)
4051
-+		if err != nil {
4052
-+			return admission.NewForbidden(a, fmt.Errorf("error querying Cascade volume %s: %v", volume.Spec.CascadeDisk.DiskID, err))
4053
-+		}
4054
-+		volumeLabels = labels
4055
-+	}
4056
- 
4057
- 	if len(volumeLabels) != 0 {
4058
- 		if volume.Labels == nil {
4059
-@@ -219,3 +228,48 @@ func (l *persistentVolumeLabel) getGCECloudProvider() (*gce.GCECloud, error) {
4060
- 	}
4061
- 	return l.gceCloudProvider, nil
4062
- }
4063
-+
4064
-+func (l *persistentVolumeLabel) findCascadeDiskLabels(volume *api.PersistentVolume) (map[string]string, error) {
4065
-+	// Ignore any volumes that are being provisioned
4066
-+	if volume.Spec.CascadeDisk.DiskID == vol.ProvisionedVolumeName {
4067
-+		return nil, nil
4068
-+	}
4069
-+	cascadeDisks, err := l.getCascadeDisks()
4070
-+	if err != nil {
4071
-+		return nil, err
4072
-+	}
4073
-+	if cascadeDisks == nil {
4074
-+		return nil, fmt.Errorf("unable to build Cascade cloud provider for volumes")
4075
-+	}
4076
-+
4077
-+	labels, err := cascadeDisks.GetVolumeLabels(volume.Spec.CascadeDisk.DiskID)
4078
-+	if err != nil {
4079
-+		return nil, err
4080
-+	}
4081
-+
4082
-+	return labels, nil
4083
-+}
4084
-+
4085
-+// getCascadeDisks returns the Cascade Disks interface
4086
-+func (l *persistentVolumeLabel) getCascadeDisks() (cascade.Disks, error) {
4087
-+	l.mutex.Lock()
4088
-+	defer l.mutex.Unlock()
4089
-+
4090
-+	if l.cascadeDisks == nil {
4091
-+		var cloudConfigReader io.Reader
4092
-+		if len(l.cloudConfig) > 0 {
4093
-+			cloudConfigReader = bytes.NewReader(l.cloudConfig)
4094
-+		}
4095
-+		cloudProvider, err := cloudprovider.GetCloudProvider("vke", cloudConfigReader)
4096
-+		if err != nil || cloudProvider == nil {
4097
-+			return nil, err
4098
-+		}
4099
-+		provider, ok := cloudProvider.(*cascade.CascadeCloud)
4100
-+		if !ok {
4101
-+			// GetCloudProvider has gone very wrong
4102
-+			return nil, fmt.Errorf("error retrieving Cascade cloud provider")
4103
-+		}
4104
-+		l.cascadeDisks = provider
4105
-+	}
4106
-+	return l.cascadeDisks, nil
4107
-+}
4108
-diff --git a/plugin/pkg/admission/vke/BUILD b/plugin/pkg/admission/vke/BUILD
4109
-new file mode 100644
4110
-index 0000000..530877a
4111
-+++ b/plugin/pkg/admission/vke/BUILD
4112
-@@ -0,0 +1,61 @@
4113
-+package(default_visibility = ["//visibility:public"])
4114
-+
4115
-+load(
4116
-+    "@io_bazel_rules_go//go:def.bzl",
4117
-+    "go_library",
4118
-+)
4119
-+
4120
-+go_library(
4121
-+    name = "go_default_library",
4122
-+    srcs = ["admission.go"],
4123
-+    importpath = "k8s.io/kubernetes/plugin/pkg/admission/vke",
4124
-+    deps = [
4125
-+        "//pkg/apis/core:go_default_library",
4126
-+        "//pkg/apis/extensions:go_default_library",
4127
-+        "//pkg/apis/policy/v1beta1:go_default_library",
4128
-+        "//pkg/apis/rbac:go_default_library",
4129
-+        "//pkg/registry/rbac:go_default_library",
4130
-+        "//pkg/security/podsecuritypolicy:go_default_library",
4131
-+        "//vendor/github.com/golang/glog:go_default_library",
4132
-+        "//vendor/k8s.io/api/policy/v1beta1:go_default_library"
4133
-+        "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
4134
-+        "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
4135
-+        "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library",
4136
-+        "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
4137
-+        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
4138
-+        "//vendor/k8s.io/apiserver/pkg/admission:go_default_library",
4139
-+    ],
4140
-+)
4141
-+
4142
-+go_test(
4143
-+    name = "go_default_test",
4144
-+    srcs = ["admission_test.go"],
4145
-+    embed = [":go_default_library"],
4146
-+    deps = [
4147
-+        "//pkg/apis/core:go_default_library",
4148
-+        "//pkg/apis/extensions:go_default_library",
4149
-+        "//pkg/apis/rbac:go_default_library",
4150
-+        "//pkg/registry/rbac:go_default_library",
4151
-+        "//pkg/security/podsecuritypolicy:go_default_library",
4152
-+        "//vendor/github.com/golang/glog:go_default_library",
4153
-+        "//vendor/github.com/stretchr/testify/assert:go_default_library",
4154
-+        "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
4155
-+        "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library",
4156
-+        "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
4157
-+        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
4158
-+        "//vendor/k8s.io/apiserver/pkg/admission:go_default_library",
4159
-+    ],
4160
-+)
4161
-+
4162
-+filegroup(
4163
-+    name = "package-srcs",
4164
-+    srcs = glob(["**"]),
4165
-+    tags = ["automanaged"],
4166
-+    visibility = ["//visibility:private"],
4167
-+)
4168
-+
4169
-+filegroup(
4170
-+    name = "all-srcs",
4171
-+    srcs = [":package-srcs"],
4172
-+    tags = ["automanaged"],
4173
-+)
4174
-\ No newline at end of file
4175
-diff --git a/plugin/pkg/admission/vke/admission.go b/plugin/pkg/admission/vke/admission.go
4176
-new file mode 100644
4177
-index 0000000..53a9d6a
4178
-+++ b/plugin/pkg/admission/vke/admission.go
4179
-@@ -0,0 +1,624 @@
4180
-+package vke
4181
-+
4182
-+import (
4183
-+	"fmt"
4184
-+	"io"
4185
-+	"os"
4186
-+	"strings"
4187
-+
4188
-+	"github.com/golang/glog"
4189
-+	"k8s.io/api/policy/v1beta1"
4190
-+	apiequality "k8s.io/apimachinery/pkg/api/equality"
4191
-+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
4192
-+	"k8s.io/apimachinery/pkg/util/validation/field"
4193
-+	"k8s.io/apimachinery/pkg/util/yaml"
4194
-+	"k8s.io/apiserver/pkg/admission"
4195
-+	api "k8s.io/kubernetes/pkg/apis/core"
4196
-+	"k8s.io/kubernetes/pkg/apis/policy"
4197
-+	policybeta "k8s.io/kubernetes/pkg/apis/policy/v1beta1"
4198
-+	"k8s.io/kubernetes/pkg/apis/rbac"
4199
-+	rbacregistry "k8s.io/kubernetes/pkg/registry/rbac"
4200
-+	"k8s.io/kubernetes/pkg/security/podsecuritypolicy"
4201
-+)
4202
-+
4203
-+const (
4204
-+	// PluginName indicates name of admission plugin.
4205
-+	PluginName = "VMwareAdmissionController"
4206
-+
4207
-+	systemNodesGroup         = "system:nodes"
4208
-+	systemMastersGroup       = "system:masters"
4209
-+	systemWorkerGroup        = "system:worker"
4210
-+	privilegedNamespace      = "vke-system"
4211
-+	privilegedServiceAccount = "system:serviceaccount:" + privilegedNamespace + ":"
4212
-+	reservedPrefix           = "vke"
4213
-+	reservedTolerationKey    = "Dedicated"
4214
-+	reservedTolerationValue  = "Master"
4215
-+	masterNodePrefix         = "master"
4216
-+	etcSslCerts              = "/etc/ssl/certs"
4217
-+)
4218
-+
4219
-+// Register registers a plugin.
4220
-+func Register(plugins *admission.Plugins) {
4221
-+	plugins.Register(PluginName, func(config io.Reader) (admission.Interface, error) {
4222
-+		return NewVMwareAdmissionController(config)
4223
-+	})
4224
-+}
4225
-+
4226
-+// vmwareAdmissionController is an implementation of admission.Interface.
4227
-+// It restricts access to VKE namespace for users and prevents the users from creating privileged pods.
4228
-+type vmwareAdmissionController struct {
4229
-+	psp             *policy.PodSecurityPolicy
4230
-+	strategyFactory podsecuritypolicy.StrategyFactory
4231
-+	privilegedGroup string
4232
-+	clusterID       string
4233
-+}
4234
-+
4235
-+// vmwareAdmissionControllerConfig holds config data for VMwareAdmissionController.
4236
-+type vmwareAdmissionControllerConfig struct {
4237
-+	ClusterID             string `yaml:"clusterID"`
4238
-+	PrivilegedGroup       string `yaml:"privilegedGroup"`
4239
-+	PodSecurityPolicyFile string `yaml:"podSecurityPolicyFile"`
4240
-+}
4241
-+
4242
-+// AdmissionConfig holds config data for admission controllers.
4243
-+type AdmissionConfig struct {
4244
-+	VMwareAdmissionController vmwareAdmissionControllerConfig `yaml:"vmwareAdmissionController"`
4245
-+}
4246
-+
4247
-+var _ admission.MutationInterface = &vmwareAdmissionController{}
4248
-+
4249
-+// Admit makes an admission decision based on the request attributes.
4250
-+// Note: We implement the mutation interface for this admission controller, which means we have the ability to modify
4251
-+// the resources. But we do not modify them because we just need to validate the requests to either let them through or
4252
-+// block them. We have implemented this as a mutation interface because we need access to oldObjects during update
4253
-+// operations to find out what values are being modified. For node update operation, the old and new objects are always
4254
-+// identical in the validation phase (possibly due to some initializer modifying it). So, we are performing our
4255
-+// validation during the mutation phase.
4256
-+func (vac *vmwareAdmissionController) Admit(a admission.Attributes) (err error) {
4257
-+
4258
-+	if isPrivilegedUser(vac, a) {
4259
-+		return nil
4260
-+	}
4261
-+
4262
-+	if isCertificateFromMaster(a) {
4263
-+		return validateCertificateFromMaster(vac, a)
4264
-+	}
4265
-+
4266
-+	if isCertificateFromWorker(a) {
4267
-+		return validateCertificateFromWorker(a)
4268
-+	}
4269
-+
4270
-+
4271
-+	if isPrivilegedServiceAccount(a) {
4272
-+		return validatePrivilegedServiceAccount(a)
4273
-+	}
4274
-+
4275
-+	if isPrivilegedNamespace(a) {
4276
-+		return admission.NewForbidden(a,
4277
-+			fmt.Errorf("%s validation failed: cannot modify resources in namespace %s", PluginName, a.GetNamespace()))
4278
-+	}
4279
-+
4280
-+	switch a.GetResource().GroupResource() {
4281
-+	case api.Resource("pods"):
4282
-+		err = validatePods(vac, a)
4283
-+	case api.Resource("nodes"):
4284
-+		err = validateNodes(a)
4285
-+	case rbac.Resource("clusterroles"):
4286
-+		err = validateClusterRoles(a)
4287
-+	case rbac.Resource("clusterrolebindings"):
4288
-+		err = validateClusterRoleBindings(a)
4289
-+	}
4290
-+
4291
-+	return err
4292
-+}
4293
-+
4294
-+// Handles returns true if this admission controller can handle the given operation
4295
-+// where operation can be one of CREATE, UPDATE, DELETE, or CONNECT.
4296
-+func (vac *vmwareAdmissionController) Handles(operation admission.Operation) bool {
4297
-+	return true
4298
-+}
4299
-+
4300
-+// NewVMwareAdmissionController creates a new VMwareAdmissionController.
4301
-+func NewVMwareAdmissionController(configFile io.Reader) (*vmwareAdmissionController, error) {
4302
-+	glog.V(2).Infof("%s is enabled", PluginName)
4303
-+	if configFile == nil {
4304
-+		glog.Warningf("No config specified for %s. Using default configuration", PluginName)
4305
-+		return nil, fmt.Errorf("no config file specified for %s", PluginName)
4306
-+	}
4307
-+
4308
-+	var config AdmissionConfig
4309
-+	d := yaml.NewYAMLOrJSONDecoder(configFile, 4096)
4310
-+	err := d.Decode(&config)
4311
-+	if err != nil {
4312
-+		return nil, err
4313
-+	}
4314
-+
4315
-+	// Load PSP from file. If it fails, use default.
4316
-+	psp := getPSPFromFile(config.VMwareAdmissionController.PodSecurityPolicyFile)
4317
-+	if psp == nil {
4318
-+		psp = getDefaultPSP()
4319
-+	}
4320
-+
4321
-+	return &vmwareAdmissionController{
4322
-+		psp:             psp,
4323
-+		strategyFactory: podsecuritypolicy.NewSimpleStrategyFactory(),
4324
-+		privilegedGroup: config.VMwareAdmissionController.PrivilegedGroup,
4325
-+		clusterID:       config.VMwareAdmissionController.ClusterID,
4326
-+	}, nil
4327
-+}
4328
-+
4329
-+func getDefaultPSP() *policy.PodSecurityPolicy {
4330
-+	return &policy.PodSecurityPolicy{
4331
-+		TypeMeta: metav1.TypeMeta{
4332
-+			Kind:       "PodSecurityPolicy",
4333
-+			APIVersion: "policy/v1beta1",
4334
-+		},
4335
-+		Spec: policy.PodSecurityPolicySpec{
4336
-+			Privileged:               false,
4337
-+			HostNetwork:              false,
4338
-+			HostIPC:                  false,
4339
-+			HostPID:                  false,
4340
-+			AllowPrivilegeEscalation: false,
4341
-+			HostPorts: []policy.HostPortRange{
4342
-+				{1, 65535},
4343
-+			},
4344
-+			Volumes: []policy.FSType{
4345
-+				"emptyDir",
4346
-+				"secret",
4347
-+				"downwardAPI",
4348
-+				"configMap",
4349
-+				"persistentVolumeClaim",
4350
-+				"projected",
4351
-+				"hostPath",
4352
-+			},
4353
-+			// We allow /etc/ssl/certs to be mounted in read only mode as a hack to allow Wavefront pods to be deployed.
4354
-+			// TODO(ashokc): Once we have support for users to create pods using privileged mode and host path, remove this.
4355
-+			AllowedHostPaths: []policy.AllowedHostPath{
4356
-+				{
4357
-+					PathPrefix: etcSslCerts,
4358
-+					ReadOnly:   true,
4359
-+				},
4360
-+			},
4361
-+			FSGroup: policy.FSGroupStrategyOptions{
4362
-+				Rule: policy.FSGroupStrategyRunAsAny,
4363
-+			},
4364
-+			RunAsUser: policy.RunAsUserStrategyOptions{
4365
-+				Rule: policy.RunAsUserStrategyRunAsAny,
4366
-+			},
4367
-+			SELinux: policy.SELinuxStrategyOptions{
4368
-+				Rule: policy.SELinuxStrategyRunAsAny,
4369
-+			},
4370
-+			SupplementalGroups: policy.SupplementalGroupsStrategyOptions{
4371
-+				Rule: policy.SupplementalGroupsStrategyRunAsAny,
4372
-+			},
4373
-+		},
4374
-+	}
4375
-+}
4376
-+
4377
-+func getPSPFromFile(pspFile string) *policy.PodSecurityPolicy {
4378
-+	pspBeta := v1beta1.PodSecurityPolicy{}
4379
-+	pspExtensions := policy.PodSecurityPolicy{}
4380
-+
4381
-+	if pspFile == "" {
4382
-+		glog.V(2).Infof("%s: PSP file not specified, using default PSP", PluginName)
4383
-+		return nil
4384
-+	}
4385
-+
4386
-+	pspConfig, err := os.Open(pspFile)
4387
-+	if err != nil {
4388
-+		glog.V(2).Infof("%s: cannot open PSP file, using default PSP: %v", PluginName, err)
4389
-+		return nil
4390
-+	}
4391
-+
4392
-+	// We load the PSP that we read from file into pspBeta because this is the struct to which we can decode yaml to.
4393
-+	d := yaml.NewYAMLOrJSONDecoder(pspConfig, 4096)
4394
-+	err = d.Decode(&pspBeta)
4395
-+	if err != nil {
4396
-+		glog.V(2).Infof("%s: cannot decode PSP file, using default PSP: %v", PluginName, err)
4397
-+		return nil
4398
-+	}
4399
-+
4400
-+	// We convert pspBeta object into pspExtensions object because this is the one that pod validation uses.
4401
-+	err = policybeta.Convert_v1beta1_PodSecurityPolicy_To_policy_PodSecurityPolicy(&pspBeta, &pspExtensions, nil)
4402
-+	if err != nil {
4403
-+		glog.V(2).Infof("%s: cannot convert v1beta1.PSP to extensions.PSP, using default PSP: %v", PluginName, err)
4404
-+		return nil
4405
-+	}
4406
-+
4407
-+	return &pspExtensions
4408
-+}
4409
-+
4410
-+func isPrivilegedUser(vac *vmwareAdmissionController, a admission.Attributes) bool {
4411
-+	// If the request comes from a user belonging to a privileged group, then we allow it. Only calls from Cascade
4412
-+	// controller will belong to this privileged group.
4413
-+	groups := a.GetUserInfo().GetGroups()
4414
-+	for _, group := range groups {
4415
-+		if group == vac.privilegedGroup {
4416
-+			return true
4417
-+		}
4418
-+	}
4419
-+
4420
-+	return false
4421
-+}
4422
-+
4423
-+func isCertificateFromMaster(a admission.Attributes) bool {
4424
-+	groups := a.GetUserInfo().GetGroups()
4425
-+	for _, group := range groups {
4426
-+		if group == systemMastersGroup {
4427
-+			return true
4428
-+		}
4429
-+	}
4430
-+	return false
4431
-+}
4432
-+
4433
-+
4434
-+func validateCertificateFromMaster(vac *vmwareAdmissionController, a admission.Attributes) (err error) {
4435
-+	// kube-controller-manager, kube-scheduler and cloud-init script which creates our pods and other resources can use
4436
-+	// the master certificate to create pods in privileged namespace. If the request comes to any other namespace,
4437
-+	// we need to make it go through our pod validation. This is needed because a user can create a deployment or
4438
-+	// replica set which has a privileged pod. Since our admission controller does not look at deployments or replica
4439
-+	// sets, we will allow it. The actual pod inside the deployment or replica set will be created by the
4440
-+	// controller-manager and if we allow it to create pods in any namespace, then a user can create a privileged pod
4441
-+	// totally bypassing our security checks.
4442
-+	if !isPrivilegedNamespace(a) && (a.GetResource().GroupResource() == api.Resource("pods")) {
4443
-+		return validatePods(vac, a)
4444
-+	}
4445
-+
4446
-+	// For all other resources, allow.
4447
-+	return nil
4448
-+}
4449
-+
4450
-+func isCertificateFromWorker(a admission.Attributes) bool {
4451
-+	groups := a.GetUserInfo().GetGroups()
4452
-+	for _, group := range groups {
4453
-+		if group == systemWorkerGroup {
4454
-+			return true
4455
-+		}
4456
-+	}
4457
-+	return false
4458
-+}
4459
-+
4460
-+
4461
-+func isCreatingPodsThroughControllerManager(resource string) bool {
4462
-+	// If the resource is one of the following, it means the controller manager will create a pod for them and not the
4463
-+	// user directly. So, we need to identify these cases and block them in certain scenarios.
4464
-+	if resource == "deployments" ||
4465
-+		resource == "replicasets" ||
4466
-+		resource == "replicationcontrollers" ||
4467
-+		resource == "statefulsets" ||
4468
-+		resource == "daemonsets" ||
4469
-+		resource == "jobs" ||
4470
-+		resource == "cronjobs" {
4471
-+		return true
4472
-+	}
4473
-+	return false
4474
-+}
4475
-+
4476
-+func validateCertificateFromWorker(a admission.Attributes) error {
4477
-+	// Block exec operations into pods for workers. This is needed to block someone from using Kubelet's certificate to
4478
-+	// exec into privileged pods running on the master. Other operations with the node certificate like modifying master
4479
-+	// node, creating pods on master node, etc. are blocked by the node restriction admission controller.
4480
-+	resource := a.GetResource().GroupResource()
4481
-+	if resource == api.Resource("pods") && a.GetOperation() == admission.Connect {
4482
-+		return admission.NewForbidden(a,
4483
-+			fmt.Errorf("%s validation failed: cannot modify pods in namespace %s", PluginName, a.GetNamespace()))
4484
-+	}
4485
-+
4486
-+	// Block creation of pods indirectly by going through the controller manager.
4487
-+	if isCreatingPodsThroughControllerManager(resource.Resource) {
4488
-+		return admission.NewForbidden(a,
4489
-+			fmt.Errorf("%s validation failed: cannot modify %s in namespace %s", PluginName, resource.Resource, a.GetNamespace()))
4490
-+	}
4491
-+
4492
-+	return nil
4493
-+}
4494
-+
4495
-+func isPrivilegedNamespace(a admission.Attributes) bool {
4496
-+	// If the namespace mentioned in the resource is privileged, return true. We will hit this for calls made to all
4497
-+	// resources in this namespace and during delete and update operation on the namespace itself.
4498
-+	if a.GetNamespace() == privilegedNamespace {
4499
-+		return true
4500
-+	}
4501
-+
4502
-+	// If the resource is a namespace and if its name matched the privileged namespace, return true. We will hit this
4503
-+	// during creation of the namespace.
4504
-+	if a.GetResource().GroupResource() == api.Resource("namespaces") {
4505
-+		if namespace, ok := a.GetObject().(*api.Namespace); ok {
4506
-+			if namespace.Name == privilegedNamespace {
4507
-+				return true
4508
-+			}
4509
-+		}
4510
-+	}
4511
-+
4512
-+	return false
4513
-+}
4514
-+
4515
-+func isPrivilegedServiceAccount(a admission.Attributes) bool {
4516
-+	user := a.GetUserInfo().GetName()
4517
-+	return strings.HasPrefix(user, privilegedServiceAccount)
4518
-+}
4519
-+
4520
-+func validatePrivilegedServiceAccount(a admission.Attributes) error {
4521
-+	// If the privileged service account performs any operation on the pods resource like create, update or connect,
4522
-+	// we block it. This is needed so that we can block exec access into privileged pods running on the master. Also,
4523
-+	// privileged service account does not need to perform these operations. So, just to be extra cautious we also block
4524
-+	// off create and update pods.
4525
-+	resource := a.GetResource().GroupResource()
4526
-+	if resource == api.Resource("pods") {
4527
-+		// Allow Delete operation on pods
4528
-+		if a.GetOperation() == admission.Delete {
4529
-+			return nil
4530
-+		}
4531
-+		// Allow subresources other than exec on pods
4532
-+		if len(a.GetSubresource()) != 0 && a.GetSubresource() != "exec" {
4533
-+			return nil
4534
-+		}
4535
-+		// Block all other operations
4536
-+		if a.GetOperation() == admission.Create || a.GetOperation() == admission.Update || a.GetOperation() == admission.Connect {
4537
-+			return admission.NewForbidden(a,
4538
-+				fmt.Errorf("%s validation failed: cannot modify pods in namespace %s", PluginName, a.GetNamespace()))
4539
-+		}
4540
-+	}
4541
-+
4542
-+	// If the privileged service account tries to update taints on the master node, we block. We need to do this so that
4543
-+	// a user cannot use a privileged service account to untaint the node and run pods on a master.
4544
-+	if resource == api.Resource("nodes") {
4545
-+		if a.GetOperation() == admission.Update && strings.HasPrefix(a.GetName(), masterNodePrefix) {
4546
-+			node, ok := a.GetObject().(*api.Node)
4547
-+			if !ok {
4548
-+				return admission.NewForbidden(a,
4549
-+					fmt.Errorf("%s validation failed: unexpected type %T", PluginName, a.GetObject()))
4550
-+			}
4551
-+			oldNode, ok := a.GetOldObject().(*api.Node)
4552
-+			if !ok {
4553
-+				return admission.NewForbidden(a,
4554
-+					fmt.Errorf("%s validation failed: unexpected type %T", PluginName, a.GetOldObject()))
4555
-+			}
4556
-+
4557
-+			if !apiequality.Semantic.DeepEqual(node.Spec.Taints, oldNode.Spec.Taints) {
4558
-+				return admission.NewForbidden(a,
4559
-+					fmt.Errorf("%s validation failed: cannot modify taints on a node", PluginName))
4560
-+			}
4561
-+		}
4562
-+	}
4563
-+
4564
-+	// Block creation of pods indirectly by going through the controller manager.
4565
-+	if isCreatingPodsThroughControllerManager(resource.Resource) {
4566
-+		return admission.NewForbidden(a,
4567
-+			fmt.Errorf("%s validation failed: cannot modify %s in namespace %s", PluginName, resource.Resource, a.GetNamespace()))
4568
-+	}
4569
-+
4570
-+	return nil
4571
-+}
4572
-+
4573
-+
4574
-+func validateNodes(a admission.Attributes) error {
4575
-+	// If it is a connect operation on the sub resource, allow it. Sub resources of nodes are nodes/nodename/proxy and
4576
-+	// nodes/nodename/status. Prometheus needs read access to nodes/nodename/proxy/metrics. To support that and other
4577
-+	// pods which might need read access to node metrics, we need to allow this. But the VKE authorizer blocks off any
4578
-+	// access to perform exec, attach or run on the proxy resource on a master which will prevent the users from getting
4579
-+	// access to the privileged pods on master.
4580
-+	if a.GetOperation() == admission.Connect && len(a.GetSubresource()) != 0 {
4581
-+		return nil
4582
-+	}
4583
-+
4584
-+	// If the operation is Delete, fail. Deleting a node is not something that is useful to the user. Also, by deleting
4585
-+	// a node, they can potentially make their cluster useless.
4586
-+	if a.GetOperation() == admission.Delete {
4587
-+		return admission.NewForbidden(a, fmt.Errorf("%s validation failed: cannot delete nodes", PluginName))
4588
-+	}
4589
-+
4590
-+	// If the operation is on a master node, fail. We do not want to allow the users to modify labels and taints on the
4591
-+	// master node because it can compromise the security of the cluster.
4592
-+	if strings.HasPrefix(a.GetName(), masterNodePrefix) {
4593
-+		return admission.NewForbidden(a, fmt.Errorf("%s validation failed: cannot modify master nodes", PluginName))
4594
-+	}
4595
-+
4596
-+	return nil
4597
-+}
4598
-+
4599
-+func validateClusterRoles(a admission.Attributes) error {
4600
-+	// If the name in the request is not empty and has the reserved prefix, then fail. We will hit this during delete
4601
-+	// and update operations on the cluster roles. If it does not have the reserved prefix, allow it. If the name is
4602
-+	// empty then proceed to read it from the object in the request.
4603
-+	if a.GetName() != "" {
4604
-+		return checkReservedPrefix(a.GetName(), a)
4605
-+	}
4606
-+
4607
-+	clusterRole, ok := a.GetObject().(*rbac.ClusterRole)
4608
-+	// If we cannot get the cluster role binding object, fail.
4609
-+	if !ok {
4610
-+		return admission.NewForbidden(a,
4611
-+			fmt.Errorf("%s validation failed: unexpected type %T", PluginName, a.GetObject()))
4612
-+	}
4613
-+	// If we get the object and the name has the reserved prefix, fail. We will hit this when someone tries to create a
4614
-+	// cluster role with the reserved prefix.
4615
-+	return checkReservedPrefix(clusterRole.Name, a)
4616
-+}
4617
-+
4618
-+func validateClusterRoleBindings(a admission.Attributes) error {
4619
-+	// If the name in the request is not empty and has the reserved prefix, then fail. We will hit this during delete
4620
-+	// and update operations on the cluster role bindings. If it does not have the reserved prefix, allow it. If the
4621
-+	// name is empty then proceed to read it from the object in the request.
4622
-+	if a.GetName() != "" {
4623
-+		return checkReservedPrefix(a.GetName(), a)
4624
-+	}
4625
-+
4626
-+	clusterRoleBinding, ok := a.GetObject().(*rbac.ClusterRoleBinding)
4627
-+	// If we cannot get the cluster role binding object, fail.
4628
-+	if !ok {
4629
-+		return admission.NewForbidden(a,
4630
-+			fmt.Errorf("%s validation failed: unexpected type %T", PluginName, a.GetObject()))
4631
-+	}
4632
-+	// If we get the object and the name has the reserved prefix, fail. We will hit this when someone tries to create a
4633
-+	// cluster role binding with the reserved prefix.
4634
-+	return checkReservedPrefix(clusterRoleBinding.Name, a)
4635
-+}
4636
-+
4637
-+func validatePods(vac *vmwareAdmissionController, a admission.Attributes) error {
4638
-+	// If the request is acting on a sub resource of a pod then allow it. This request is not directly coming to a pod,
4639
-+	// but to a sub-resource like pods/foo/status. So, this does not have to be blocked.
4640
-+	if len(a.GetSubresource()) != 0 {
4641
-+		return nil
4642
-+	}
4643
-+
4644
-+	// If it is a Connect or Delete operation, allow it. We restrict access to connect to any pods in the vke-system
4645
-+	// namespace. So it is OK to allow this.
4646
-+	if a.GetOperation() == admission.Connect || a.GetOperation() == admission.Delete {
4647
-+		return nil
4648
-+	}
4649
-+
4650
-+	// If we cannot get the pod object, fail.
4651
-+	if _, ok := a.GetObject().(*api.Pod); !ok {
4652
-+		return admission.NewForbidden(a,
4653
-+			fmt.Errorf("%s validation failed: unexpected type %T", PluginName, a.GetObject()))
4654
-+	}
4655
-+
4656
-+	// If this is an update, see if we are only updating the ownerRef/finalizers.  Garbage collection does this
4657
-+	// and we should allow it in general, since you had the power to update and the power to delete.
4658
-+	// The worst that happens is that you delete something, but you aren't controlling the privileged object itself
4659
-+	if a.GetOperation() == admission.Update &&
4660
-+		rbacregistry.IsOnlyMutatingGCFields(a.GetObject(), a.GetOldObject(), apiequality.Semantic) {
4661
-+		return nil
4662
-+	}
4663
-+
4664
-+	errs := field.ErrorList{}
4665
-+	originalPod := a.GetObject().(*api.Pod)
4666
-+
4667
-+	// Generate a copy of the pod object because we are not allowed to mutate the pod object.
4668
-+	pod := originalPod.DeepCopy()
4669
-+
4670
-+	provider, err := podsecuritypolicy.NewSimpleProvider(vac.psp, pod.Namespace, vac.strategyFactory)
4671
-+	if err != nil {
4672
-+		return admission.NewForbidden(a, fmt.Errorf("%s validation failed: %v", PluginName, err))
4673
-+	}
4674
-+
4675
-+	// Set default security context for the pod. This fills in the defaults for the security context values that are not
4676
-+	// provided. This is needed to validate the security context correctly.
4677
-+	err = provider.DefaultPodSecurityContext(pod)
4678
-+	if err != nil {
4679
-+		errs = append(errs, field.Invalid(field.NewPath("spec", "securityContext"),
4680
-+			pod.Spec.SecurityContext, err.Error()))
4681
-+	}
4682
-+
4683
-+	// Validate the pod.
4684
-+	errs = append(errs, provider.ValidatePod(pod, field.NewPath("spec", "securityContext"))...)
4685
-+
4686
-+	// Validate the pod's tolerations.
4687
-+	fieldErr := validatePodToleration(pod)
4688
-+	if fieldErr != nil {
4689
-+		errs = append(errs, fieldErr)
4690
-+	}
4691
-+
4692
-+	// Validate the initContainers that are part of the pod.
4693
-+	for i := range pod.Spec.InitContainers {
4694
-+		err := provider.DefaultContainerSecurityContext(pod, &pod.Spec.InitContainers[i])
4695
-+		if err != nil {
4696
-+			errs = append(errs, field.Invalid(field.NewPath("spec", "initContainers").Index(i).
4697
-+				Child("securityContext"), "", err.Error()))
4698
-+			continue
4699
-+		}
4700
-+		errs = append(errs, provider.ValidateContainerSecurityContext(pod, &pod.Spec.InitContainers[i],
4701
-+			field.NewPath("spec", "initContainers").Index(i).Child("securityContext"))...)
4702
-+	}
4703
-+
4704
-+	// Validate the containers that are part of the pod.
4705
-+	for i := range pod.Spec.Containers {
4706
-+		err := provider.DefaultContainerSecurityContext(pod, &pod.Spec.Containers[i])
4707
-+		if err != nil {
4708
-+			errs = append(errs, field.Invalid(field.NewPath("spec", "containers").Index(i).
4709
-+				Child("securityContext"), "", err.Error()))
4710
-+			continue
4711
-+		}
4712
-+		errs = append(errs, provider.ValidateContainerSecurityContext(pod, &pod.Spec.Containers[i],
4713
-+			field.NewPath("spec", "containers").Index(i).Child("securityContext"))...)
4714
-+	}
4715
-+
4716
-+	// Validate that /etc/ssl/certs if mounted using hostPath volume mount is readOnly.
4717
-+	fieldErr = validateEtcSslCertsHostPath(pod)
4718
-+	if fieldErr != nil {
4719
-+		errs = append(errs, fieldErr)
4720
-+	}
4721
-+
4722
-+	if len(errs) > 0 {
4723
-+		return admission.NewForbidden(a,
4724
-+			fmt.Errorf("%s validation failed: %v", PluginName, errs))
4725
-+	}
4726
-+
4727
-+	return nil
4728
-+}
4729
-+
4730
-+func validatePodToleration(pod *api.Pod) *field.Error {
4731
-+	// Master nodes are tainted with "Dedicated=Master:NoSchedule". Only vke-system pods are allowed to tolerate
4732
-+	// this taint and to run on master nodes. A user's pod will be rejected if its spec has toleration for this taint.
4733
-+	for _, t := range pod.Spec.Tolerations {
4734
-+		reject := false
4735
-+
4736
-+		if t.Key == reservedTolerationKey && t.Value == reservedTolerationValue {
4737
-+			// Reject pod that has the reserved toleration "Dedicated=Master"
4738
-+			reject = true
4739
-+		} else if t.Operator == api.TolerationOpExists && (t.Key == reservedTolerationKey || t.Key == "") {
4740
-+			// Reject pod that has wildcard toleration matching the reserved toleration
4741
-+			reject = true
4742
-+		}
4743
-+
4744
-+		if reject {
4745
-+			return field.Invalid(field.NewPath("spec", "toleration"), fmt.Sprintf("%+v", t),
4746
-+				fmt.Sprintf("%s validation failed: should not tolerate master node taint", PluginName))
4747
-+		}
4748
-+	}
4749
-+	return nil
4750
-+}
4751
-+
4752
-+// Validate that /etc/ssl/certs if mounted using hostPath volume mount is readOnly. If not, fail.
4753
-+// This is a hack that is needed to get Wavefront pods to work.
4754
-+// TODO(ashokc): Once we have support for users to create pods using privileged mode and host path, remove this.
4755
-+func validateEtcSslCertsHostPath(pod *api.Pod) *field.Error {
4756
-+	// Get volumes which mount /etc/ssl/certs and put them in a map.
4757
-+	volumes := map[string]struct{}{}
4758
-+	for _, vol := range pod.Spec.Volumes {
4759
-+		if vol.HostPath != nil && strings.HasPrefix(vol.HostPath.Path, etcSslCerts) {
4760
-+			volumes[vol.Name] = struct{}{}
4761
-+		}
4762
-+	}
4763
-+
4764
-+	// For every initContainer, get all volumeMounts and verify if it matches any of the volumes in the volumes map.
4765
-+	// If yes, then check if they are read only. If not, return an error.
4766
-+	err := checkVolumeReadOnly(pod.Spec.InitContainers, volumes, "initContainers")
4767
-+	if err != nil {
4768
-+		return err
4769
-+	}
4770
-+
4771
-+	// For every container, get all volumeMounts and verify if it matches any of the volumes in the volumes map.
4772
-+	// If yes, then check if they are read only. If not, return an error.
4773
-+	err = checkVolumeReadOnly(pod.Spec.Containers, volumes, "containers")
4774
-+	if err != nil {
4775
-+		return err
4776
-+	}
4777
-+
4778
-+	return nil
4779
-+}
4780
-+
4781
-+// Checks if the container has a volumeMount belonging to the volumes map. If yes, it has to be read only. If not,
4782
-+// return error.
4783
-+func checkVolumeReadOnly(containers []api.Container, volumes map[string]struct{}, containerType string) *field.Error {
4784
-+	for i, container := range containers {
4785
-+		for _, vol := range container.VolumeMounts {
4786
-+			if _, ok := volumes[vol.Name]; ok {
4787
-+				if !vol.ReadOnly {
4788
-+					return field.Invalid(field.NewPath("spec", containerType).Index(i).Child("volumeMounts"),
4789
-+						fmt.Sprintf("%+v", vol), fmt.Sprintf("%s has to be mount as readOnly", etcSslCerts))
4790
-+				}
4791
-+			}
4792
-+		}
4793
-+	}
4794
-+	return nil
4795
-+}
4796
-+
4797
-+func checkReservedPrefix(resourceName string, a admission.Attributes) error {
4798
-+	if strings.HasPrefix(resourceName, reservedPrefix) {
4799
-+		return admission.NewForbidden(a,
4800
-+			fmt.Errorf("%s validation failed: cannot modify resources with prefix %s", PluginName, reservedPrefix))
4801
-+	}
4802
-+	return nil
4803
-+}
4804
-diff --git a/plugin/pkg/admission/vke/admission_test.go b/plugin/pkg/admission/vke/admission_test.go
4805
-new file mode 100644
4806
-index 0000000..3486f10
4807
-+++ b/plugin/pkg/admission/vke/admission_test.go
4808
-@@ -0,0 +1,960 @@
4809
-+package vke
4810
-+
4811
-+import (
4812
-+	"fmt"
4813
-+	"os"
4814
-+	"strings"
4815
-+	"testing"
4816
-+
4817
-+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
4818
-+	"k8s.io/apimachinery/pkg/runtime"
4819
-+	kadmission "k8s.io/apiserver/pkg/admission"
4820
-+	kapi "k8s.io/kubernetes/pkg/apis/core"
4821
-+	"k8s.io/kubernetes/pkg/apis/rbac"
4822
-+	"k8s.io/kubernetes/staging/src/k8s.io/apiserver/pkg/authentication/user"
4823
-+)
4824
-+
4825
-+const (
4826
-+	testServiceAccountsGroup = "system.test\\cascade-controller-service-accounts"
4827
-+	clusterID                = "cluster-id"
4828
-+	defaultConfigFileFormat  = `
4829
-+vmwareAdmissionController:
4830
-+  privilegedGroup: %s
4831
-+  podSecurityPolicyFile: %s
4832
-+  clusterID: %s
4833
-+`
4834
-+	pspFileName   = "/tmp/psp.yaml"
4835
-+	pspConfigFile = `
4836
-+apiVersion: extensions/v1beta1
4837
-+kind: PodSecurityPolicy
4838
-+metadata:
4839
-+  name: vmware-pod-security-policy-restricted
4840
-+spec:
4841
-+  privileged: true
4842
-+  fsGroup:
4843
-+    rule: RunAsAny
4844
-+  runAsUser:
4845
-+    rule: RunAsAny
4846
-+  seLinux:
4847
-+    rule: RunAsAny
4848
-+  supplementalGroups:
4849
-+    rule: RunAsAny
4850
-+  volumes:
4851
-+  - 'emptyDir'
4852
-+  - 'secret'
4853
-+  - 'downwardAPI'
4854
-+  - 'configMap'
4855
-+  - 'persistentVolumeClaim'
4856
-+  - 'projected'
4857
-+  - 'hostPath'
4858
-+  hostPID: false
4859
-+  hostIPC: false
4860
-+  hostNetwork: true
4861
-+  hostPorts:
4862
-+  - min: 1
4863
-+    max: 65536
4864
-+`
4865
-+)
4866
-+
4867
-+func TestAdmitPrivileged(t *testing.T) {
4868
-+	tests := map[string]struct {
4869
-+		operation          kadmission.Operation
4870
-+		pod                *kapi.Pod
4871
-+		name               string
4872
-+		userInfo           user.Info
4873
-+		shouldPassValidate bool
4874
-+	}{
4875
-+		"create pod with Privileged=nil allowed": {
4876
-+			operation:          kadmission.Create,
4877
-+			pod:                newTestPodBuilder().build(),
4878
-+			userInfo:           newTestUserBuilder().build(),
4879
-+			shouldPassValidate: true,
4880
-+		},
4881
-+		"create pod with Privileged=false allowed": {
4882
-+			operation:          kadmission.Create,
4883
-+			pod:                newTestPodBuilder().withPrivileged(false).build(),
4884
-+			userInfo:           newTestUserBuilder().build(),
4885
-+			shouldPassValidate: true,
4886
-+		},
4887
-+		"create pod with Privileged=true denied": {
4888
-+			operation:          kadmission.Create,
4889
-+			pod:                newTestPodBuilder().withPrivileged(true).build(),
4890
-+			userInfo:           newTestUserBuilder().build(),
4891
-+			shouldPassValidate: false,
4892
-+		},
4893
-+		"create pod with multiple containers, one has Privileged=true denied": {
4894
-+			operation:          kadmission.Create,
4895
-+			pod:                newTestPodBuilder().withPrivileged(true).withInitContainer().withContainer().build(),
4896
-+			userInfo:           newTestUserBuilder().build(),
4897
-+			shouldPassValidate: false,
4898
-+		},
4899
-+		"update pod with Privileged=true denied": {
4900
-+			operation:          kadmission.Update,
4901
-+			pod:                newTestPodBuilder().withPrivileged(true).build(),
4902
-+			userInfo:           newTestUserBuilder().build(),
4903
-+			shouldPassValidate: false,
4904
-+		},
4905
-+		"create pod with HostNetwork=true denied": {
4906
-+			operation:          kadmission.Create,
4907
-+			pod:                newTestPodBuilder().withHostNetwork(true).build(),
4908
-+			userInfo:           newTestUserBuilder().build(),
4909
-+			shouldPassValidate: false,
4910
-+		},
4911
-+		"create pod with HostIPC=true denied": {
4912
-+			operation:          kadmission.Create,
4913
-+			pod:                newTestPodBuilder().withHostIPC(true).build(),
4914
-+			userInfo:           newTestUserBuilder().build(),
4915
-+			shouldPassValidate: false,
4916
-+		},
4917
-+		"create pod with HostPID=true denied": {
4918
-+			operation:          kadmission.Create,
4919
-+			pod:                newTestPodBuilder().withHostPID(true).build(),
4920
-+			userInfo:           newTestUserBuilder().build(),
4921
-+			shouldPassValidate: false,
4922
-+		},
4923
-+		"create pod with HostPort allowed": {
4924
-+			operation:          kadmission.Create,
4925
-+			pod:                newTestPodBuilder().withHostPort().build(),
4926
-+			userInfo:           newTestUserBuilder().build(),
4927
-+			shouldPassValidate: true,
4928
-+		},
4929
-+		"create pod with HostVolume denied": {
4930
-+			operation:          kadmission.Create,
4931
-+			pod:                newTestPodBuilder().withHostVolume("/", false).build(),
4932
-+			userInfo:           newTestUserBuilder().build(),
4933
-+			shouldPassValidate: false,
4934
-+		},
4935
-+		"create pod with HostVolume /etc/ssl/certs in read-only mode allowed": {
4936
-+			operation:          kadmission.Create,
4937
-+			pod:                newTestPodBuilder().withHostVolume("/etc/ssl/certs", true).build(),
4938
-+			userInfo:           newTestUserBuilder().build(),
4939
-+			shouldPassValidate: true,
4940
-+		},
4941
-+		"create pod with HostVolume /etc/ssl/certs in read-write mode denied": {
4942
-+			operation:          kadmission.Create,
4943
-+			pod:                newTestPodBuilder().withHostVolume("/etc/ssl/certs", false).build(),
4944
-+			userInfo:           newTestUserBuilder().build(),
4945
-+			shouldPassValidate: false,
4946
-+		},
4947
-+		"create pod with CascadeDisk allowed": {
4948
-+			operation:          kadmission.Create,
4949
-+			pod:                newTestPodBuilder().withCascadeDisk().build(),
4950
-+			userInfo:           newTestUserBuilder().build(),
4951
-+			shouldPassValidate: true,
4952
-+		},
4953
-+		"create pod with HostVolume and CascadeDisk denied": {
4954
-+			operation:          kadmission.Create,
4955
-+			pod:                newTestPodBuilder().withHostVolume("/", false).withCascadeDisk().build(),
4956
-+			userInfo:           newTestUserBuilder().build(),
4957
-+			shouldPassValidate: false,
4958
-+		},
4959
-+		"connect pod allowed": {
4960
-+			operation:          kadmission.Connect,
4961
-+			pod:                newTestPodBuilder().build(),
4962
-+			userInfo:           newTestUserBuilder().build(),
4963
-+			shouldPassValidate: true,
4964
-+		},
4965
-+		"delete pod allowed": {
4966
-+			operation:          kadmission.Delete,
4967
-+			pod:                nil,
4968
-+			userInfo:           newTestUserBuilder().build(),
4969
-+			shouldPassValidate: true,
4970
-+		},
4971
-+	}
4972
-+
4973
-+	for k, v := range tests {
4974
-+		testPodValidation(k, v.operation, v.pod, v.name, v.userInfo, v.shouldPassValidate, t)
4975
-+	}
4976
-+}
4977
-+
4978
-+func TestAdmitPrivilegedWithCustomPSP(t *testing.T) {
4979
-+	tests := map[string]struct {
4980
-+		operation          kadmission.Operation
4981
-+		pod                *kapi.Pod
4982
-+		name               string
4983
-+		userInfo           user.Info
4984
-+		shouldPassValidate bool
4985
-+	}{
4986
-+		"create pod with Privileged=nil allowed": {
4987
-+			operation:          kadmission.Create,
4988
-+			pod:                newTestPodBuilder().build(),
4989
-+			userInfo:           newTestUserBuilder().build(),
4990
-+			shouldPassValidate: true,
4991
-+		},
4992
-+		"create pod with Privileged=false allowed": {
4993
-+			operation:          kadmission.Create,
4994
-+			pod:                newTestPodBuilder().withPrivileged(false).build(),
4995
-+			userInfo:           newTestUserBuilder().build(),
4996
-+			shouldPassValidate: true,
4997
-+		},
4998
-+		"create pod with Privileged=true allowed": {
4999
-+			operation:          kadmission.Create,
5000
-+			pod:                newTestPodBuilder().withPrivileged(true).build(),
5001
-+			userInfo:           newTestUserBuilder().build(),
5002
-+			shouldPassValidate: true,
5003
-+		},
5004
-+		"create pod with multiple containers, one has Privileged=true allowed": {
5005
-+			operation:          kadmission.Create,
5006
-+			pod:                newTestPodBuilder().withPrivileged(true).withInitContainer().withContainer().build(),
5007
-+			userInfo:           newTestUserBuilder().build(),
5008
-+			shouldPassValidate: true,
5009
-+		},
5010
-+		"update pod with Privileged=true allowed": {
5011
-+			operation:          kadmission.Update,
5012
-+			pod:                newTestPodBuilder().withPrivileged(true).build(),
5013
-+			userInfo:           newTestUserBuilder().build(),
5014
-+			shouldPassValidate: true,
5015
-+		},
5016
-+		"create pod with HostNetwork=true allowed": {
5017
-+			operation:          kadmission.Create,
5018
-+			pod:                newTestPodBuilder().withHostNetwork(true).build(),
5019
-+			userInfo:           newTestUserBuilder().build(),
5020
-+			shouldPassValidate: true,
5021
-+		},
5022
-+		"create pod with HostIPC=true denied": {
5023
-+			operation:          kadmission.Create,
5024
-+			pod:                newTestPodBuilder().withHostIPC(true).build(),
5025
-+			userInfo:           newTestUserBuilder().build(),
5026
-+			shouldPassValidate: false,
5027
-+		},
5028
-+		"create pod with HostPID=true denied": {
5029
-+			operation:          kadmission.Create,
5030
-+			pod:                newTestPodBuilder().withHostPID(true).build(),
5031
-+			userInfo:           newTestUserBuilder().build(),
5032
-+			shouldPassValidate: false,
5033
-+		},
5034
-+		"create pod with HostPort allowed": {
5035
-+			operation:          kadmission.Create,
5036
-+			pod:                newTestPodBuilder().withHostPort().build(),
5037
-+			userInfo:           newTestUserBuilder().build(),
5038
-+			shouldPassValidate: true,
5039
-+		},
5040
-+		"create pod with HostVolume allowed": {
5041
-+			operation:          kadmission.Create,
5042
-+			pod:                newTestPodBuilder().withHostVolume("/", false).build(),
5043
-+			userInfo:           newTestUserBuilder().build(),
5044
-+			shouldPassValidate: true,
5045
-+		},
5046
-+		"create pod with HostVolume /etc/ssl/certs in read-only mode allowed": {
5047
-+			operation:          kadmission.Create,
5048
-+			pod:                newTestPodBuilder().withHostVolume("/etc/ssl/certs", true).build(),
5049
-+			userInfo:           newTestUserBuilder().build(),
5050
-+			shouldPassValidate: true,
5051
-+		},
5052
-+		"create pod with HostVolume /etc/ssl/certs in read-write mode denied": {
5053
-+			operation:          kadmission.Create,
5054
-+			pod:                newTestPodBuilder().withHostVolume("/etc/ssl/certs", false).build(),
5055
-+			userInfo:           newTestUserBuilder().build(),
5056
-+			shouldPassValidate: false,
5057
-+		},
5058
-+		"create pod with CascadeDisk allowed": {
5059
-+			operation:          kadmission.Create,
5060
-+			pod:                newTestPodBuilder().withCascadeDisk().build(),
5061
-+			userInfo:           newTestUserBuilder().build(),
5062
-+			shouldPassValidate: true,
5063
-+		},
5064
-+		"create pod with HostVolume and CascadeDisk allowed": {
5065
-+			operation:          kadmission.Create,
5066
-+			pod:                newTestPodBuilder().withHostVolume("/", false).withCascadeDisk().build(),
5067
-+			userInfo:           newTestUserBuilder().build(),
5068
-+			shouldPassValidate: true,
5069
-+		},
5070
-+		"connect pod allowed": {
5071
-+			operation:          kadmission.Connect,
5072
-+			pod:                newTestPodBuilder().build(),
5073
-+			userInfo:           newTestUserBuilder().build(),
5074
-+			shouldPassValidate: true,
5075
-+		},
5076
-+		"delete pod allowed": {
5077
-+			operation:          kadmission.Delete,
5078
-+			pod:                nil,
5079
-+			userInfo:           newTestUserBuilder().build(),
5080
-+			shouldPassValidate: true,
5081
-+		},
5082
-+	}
5083
-+
5084
-+	// Setup custom PSP file.
5085
-+	file, err := os.Create(pspFileName)
5086
-+	if err != nil {
5087
-+		t.Errorf("TestAdmitPrivilegedWithCustomPSP: failed to open custom PSP file %v", err)
5088
-+		return
5089
-+	}
5090
-+	_, err = file.WriteString(pspConfigFile)
5091
-+	if err != nil {
5092
-+		t.Errorf("TestAdmitPrivilegedWithCustomPSP: failed to write to custom PSP file %v", err)
5093
-+		return
5094
-+	}
5095
-+
5096
-+	for k, v := range tests {
5097
-+		testPodValidation(k, v.operation, v.pod, v.name, v.userInfo, v.shouldPassValidate, t)
5098
-+	}
5099
-+
5100
-+	// Delete custom PSP file.
5101
-+	err = os.Remove(pspFileName)
5102
-+	if err != nil {
5103
-+		t.Errorf("TestAdmitPrivilegedWithCustomPSP: failed to delete custom PSP file %v", err)
5104
-+	}
5105
-+}
5106
-+
5107
-+func TestPrivilegedNamespace(t *testing.T) {
5108
-+	tests := map[string]struct {
5109
-+		operation          kadmission.Operation
5110
-+		pod                *kapi.Pod
5111
-+		name               string
5112
-+		userInfo           user.Info
5113
-+		shouldPassValidate bool
5114
-+	}{
5115
-+		"denied: regular lightwave user creates pod in vke-system namespace": {
5116
-+			operation:          kadmission.Create,
5117
-+			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5118
-+			userInfo:           newTestUserBuilder().build(),
5119
-+			shouldPassValidate: false,
5120
-+		},
5121
-+		"denied: regular lightwave user cannot escalate privilege using service account": {
5122
-+			operation:          kadmission.Create,
5123
-+			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).withServiceAccount(privilegedServiceAccount + "default").build(),			userInfo:           newTestUserBuilder().build(),
5124
-+			shouldPassValidate: false,
5125
-+		},
5126
-+		"denied: regular service account creates pod in vke-system namespace": {
5127
-+			operation:          kadmission.Create,
5128
-+			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5129
-+			userInfo:           newTestUserBuilder().withName("system:serviceaccount:kube-system:default").build(),
5130
-+			shouldPassValidate: false,
5131
-+		},
5132
-+		"allowed: privileged service account deletes a pod in privileged namespace": {
5133
-+			operation:          kadmission.Delete,
5134
-+			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5135
-+			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5136
-+			shouldPassValidate: true,
5137
-+		},
5138
-+		"denied: privileged service account creates a pod in privileged namespace": {
5139
-+			operation:          kadmission.Create,
5140
-+			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5141
-+			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5142
-+			shouldPassValidate: false,
5143
-+		},
5144
-+		"denied: privileged service account execs into a pod in privileged namespace": {
5145
-+			operation:          kadmission.Connect,
5146
-+			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5147
-+			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5148
-+			shouldPassValidate: false,
5149
-+		},
5150
-+		"denied: privileged service account updates a pod in privileged namespace": {
5151
-+			operation:          kadmission.Update,
5152
-+			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5153
-+			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5154
-+			shouldPassValidate: false,
5155
-+		},
5156
-+		"allowed: regular user creates pod in other namespace": {
5157
-+			operation:          kadmission.Create,
5158
-+			pod:                newTestPodBuilder().withNamespace("default").build(),
5159
-+			userInfo:           newTestUserBuilder().build(),
5160
-+			shouldPassValidate: true,
5161
-+		},
5162
-+		"allowed: Cascade Controller Service Account creates pod in vke-system namespace": {
5163
-+			operation:          kadmission.Create,
5164
-+			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5165
-+			userInfo:           newTestUserBuilder().withGroup(testServiceAccountsGroup).build(),
5166
-+			shouldPassValidate: true,
5167
-+		},
5168
-+		"allowed: systemMasters group creates pod in vke-system namespace": {
5169
-+			operation:          kadmission.Create,
5170
-+			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5171
-+			userInfo:           newTestUserBuilder().withGroup(systemMastersGroup).build(),
5172
-+			shouldPassValidate: true,
5173
-+		},
5174
-+		"denied: regular lightwave group does not grant privileged access": {
5175
-+			operation:          kadmission.Create,
5176
-+			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5177
-+			userInfo:           newTestUserBuilder().withGroup("test1\\group1").build(),
5178
-+			shouldPassValidate: false,
5179
-+		},
5180
-+		"allowed: if user has multiple groups, any privileged group can grant privileged access": {
5181
-+			operation:          kadmission.Create,
5182
-+			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5183
-+			userInfo:           newTestUserBuilder().withGroup("test1\\group1").withGroup(testServiceAccountsGroup).build(),
5184
-+			shouldPassValidate: true,
5185
-+		},
5186
-+		"denied: worker kubelet exec into pod": {
5187
-+			operation:          kadmission.Connect,
5188
-+			pod:                newTestPodBuilder().build(),
5189
-+			userInfo:           newTestUserBuilder().withGroup("system:worker").build(),
5190
-+			shouldPassValidate: false,
5191
-+		},
5192
-+	}
5193
-+	for k, v := range tests {
5194
-+		testPodValidation(k, v.operation, v.pod, v.name, v.userInfo, v.shouldPassValidate, t)
5195
-+	}
5196
-+}
5197
-+
5198
-+func TestToleration(t *testing.T) {
5199
-+	tests := map[string]struct {
5200
-+		operation          kadmission.Operation
5201
-+		pod                *kapi.Pod
5202
-+		name               string
5203
-+		userInfo           user.Info
5204
-+		shouldPassValidate bool
5205
-+	}{
5206
-+		"allowed: create pod with no toleration": {
5207
-+			operation:          kadmission.Create,
5208
-+			pod:                newTestPodBuilder().build(),
5209
-+			userInfo:           newTestUserBuilder().build(),
5210
-+			shouldPassValidate: true,
5211
-+		},
5212
-+		"allowed: create pod with normal toleration key": {
5213
-+			operation:          kadmission.Create,
5214
-+			pod:                newTestPodBuilder().withToleration("mykey", reservedTolerationValue, kapi.TolerationOpEqual, kapi.TaintEffectNoSchedule).build(),
5215
-+			userInfo:           newTestUserBuilder().build(),
5216
-+			shouldPassValidate: true,
5217
-+		},
5218
-+		"allowed: create pod with normal toleration value": {
5219
-+			operation:          kadmission.Create,
5220
-+			pod:                newTestPodBuilder().withToleration(reservedTolerationKey, "myval", kapi.TolerationOpEqual, kapi.TaintEffectNoSchedule).build(),
5221
-+			userInfo:           newTestUserBuilder().build(),
5222
-+			shouldPassValidate: true,
5223
-+		},
5224
-+		"denied: create pod with reserved toleration": {
5225
-+			operation:          kadmission.Create,
5226
-+			pod:                newTestPodBuilder().withToleration(reservedTolerationKey, reservedTolerationValue, kapi.TolerationOpEqual, kapi.TaintEffectNoSchedule).build(),
5227
-+			userInfo:           newTestUserBuilder().build(),
5228
-+			shouldPassValidate: false,
5229
-+		},
5230
-+		"denied: create pod with wildcard toleration": {
5231
-+			operation:          kadmission.Create,
5232
-+			pod:                newTestPodBuilder().withToleration("", "", kapi.TolerationOpExists, "").build(),
5233
-+			userInfo:           newTestUserBuilder().build(),
5234
-+			shouldPassValidate: false,
5235
-+		},
5236
-+		"denied: create pod with value wildcard toleration": {
5237
-+			operation:          kadmission.Create,
5238
-+			pod:                newTestPodBuilder().withToleration(reservedTolerationKey, "", kapi.TolerationOpExists, kapi.TaintEffectNoSchedule).build(),
5239
-+			userInfo:           newTestUserBuilder().build(),
5240
-+			shouldPassValidate: false,
5241
-+		},
5242
-+		"allowed: create pod with value wildcard and normal key": {
5243
-+			operation:          kadmission.Create,
5244
-+			pod:                newTestPodBuilder().withToleration("mykey", "", kapi.TolerationOpExists, kapi.TaintEffectNoSchedule).build(),
5245
-+			userInfo:           newTestUserBuilder().build(),
5246
-+			shouldPassValidate: true,
5247
-+		},
5248
-+	}
5249
-+
5250
-+	for k, v := range tests {
5251
-+		testPodValidation(k, v.operation, v.pod, v.name, v.userInfo, v.shouldPassValidate, t)
5252
-+	}
5253
-+}
5254
-+
5255
-+func TestClusterLevelResources(t *testing.T) {
5256
-+	tests := map[string]struct {
5257
-+		operation          kadmission.Operation
5258
-+		resource           string
5259
-+		subresource        string
5260
-+		name               string
5261
-+		namespace          string
5262
-+		userInfo           user.Info
5263
-+		object             runtime.Object
5264
-+		oldObject          runtime.Object
5265
-+		shouldPassValidate bool
5266
-+	}{
5267
-+		"denied: regular lightwave user update configmaps in vke-system namespace": {
5268
-+			operation:          kadmission.Update,
5269
-+			resource:           "configmaps",
5270
-+			namespace:          privilegedNamespace,
5271
-+			userInfo:           newTestUserBuilder().build(),
5272
-+			shouldPassValidate: false,
5273
-+		},
5274
-+		"denied: regular lightwave user delete daemonsets in vke-system namespace": {
5275
-+			operation:          kadmission.Delete,
5276
-+			resource:           "daemonsets",
5277
-+			namespace:          privilegedNamespace,
5278
-+			userInfo:           newTestUserBuilder().build(),
5279
-+			shouldPassValidate: false,
5280
-+		},
5281
-+		"denied: regular lightwave user create deployments in vke-system namespace": {
5282
-+			operation:          kadmission.Create,
5283
-+			resource:           "deployments",
5284
-+			namespace:          privilegedNamespace,
5285
-+			userInfo:           newTestUserBuilder().build(),
5286
-+			shouldPassValidate: false,
5287
-+		},
5288
-+		"denied: regular lightwave user create rolebindings in vke-system namespace": {
5289
-+			operation:          kadmission.Create,
5290
-+			resource:           "rolebindings",
5291
-+			namespace:          privilegedNamespace,
5292
-+			userInfo:           newTestUserBuilder().build(),
5293
-+			shouldPassValidate: false,
5294
-+		},
5295
-+		"allowed: regular lightwave user create rolebindings in other namespace": {
5296
-+			operation:          kadmission.Create,
5297
-+			resource:           "rolebindings",
5298
-+			namespace:          "default",
5299
-+			userInfo:           newTestUserBuilder().build(),
5300
-+			shouldPassValidate: true,
5301
-+		},
5302
-+		"allowed: regular lightwave user create clusterroles": {
5303
-+			operation:          kadmission.Create,
5304
-+			resource:           "clusterroles",
5305
-+			name:               "cluster-role",
5306
-+			namespace:          "",
5307
-+			userInfo:           newTestUserBuilder().build(),
5308
-+			shouldPassValidate: true,
5309
-+		},
5310
-+		"denied: regular lightwave user create clusterroles with vke: prefix": {
5311
-+			operation:          kadmission.Create,
5312
-+			resource:           "clusterroles",
5313
-+			name:               "vke:clusterrole",
5314
-+			namespace:          "",
5315
-+			userInfo:           newTestUserBuilder().build(),
5316
-+			shouldPassValidate: false,
5317
-+		},
5318
-+		"denied: regular lightwave user delete clusterroles with vke: prefix": {
5319
-+			operation:          kadmission.Delete,
5320
-+			resource:           "clusterroles",
5321
-+			name:               "vke:clusterrole",
5322
-+			namespace:          "",
5323
-+			userInfo:           newTestUserBuilder().build(),
5324
-+			shouldPassValidate: false,
5325
-+		},
5326
-+		"allowed: systemMasters group update clusterroles with vke: prefix": {
5327
-+			operation:          kadmission.Update,
5328
-+			resource:           "clusterroles",
5329
-+			name:               "vke:clusterrole",
5330
-+			namespace:          "",
5331
-+			userInfo:           newTestUserBuilder().withGroup(systemMastersGroup).build(),
5332
-+			shouldPassValidate: true,
5333
-+		},
5334
-+		"allowed: regular lightwave user create clusterrolebindings": {
5335
-+			operation:          kadmission.Create,
5336
-+			resource:           "clusterrolebindings",
5337
-+			name:               "cluster-role-binding",
5338
-+			namespace:          "",
5339
-+			userInfo:           newTestUserBuilder().build(),
5340
-+			shouldPassValidate: true,
5341
-+		},
5342
-+		"denied: regular lightwave user create clusterrolebindings with vke: prefix": {
5343
-+			operation:          kadmission.Create,
5344
-+			resource:           "clusterrolebindings",
5345
-+			name:               "vke:clusterrolebinding",
5346
-+			namespace:          "",
5347
-+			userInfo:           newTestUserBuilder().build(),
5348
-+			shouldPassValidate: false,
5349
-+		},
5350
-+		"denied: regular lightwave user update clusterrolebindings with vke: prefix": {
5351
-+			operation:          kadmission.Delete,
5352
-+			resource:           "clusterrolebindings",
5353
-+			name:               "vke:clusterrolebinding",
5354
-+			namespace:          "",
5355
-+			userInfo:           newTestUserBuilder().build(),
5356
-+			shouldPassValidate: false,
5357
-+		},
5358
-+		"allowed: systemMastersGroup update clusterrolebindings with vke: prefix": {
5359
-+			operation:          kadmission.Update,
5360
-+			resource:           "clusterrolebindings",
5361
-+			name:               "vke:clusterrolebinding",
5362
-+			namespace:          "",
5363
-+			userInfo:           newTestUserBuilder().withGroup(systemMastersGroup).build(),
5364
-+			shouldPassValidate: true,
5365
-+		},
5366
-+		"allowed: regular lightwave user update worker nodes": {
5367
-+			operation:          kadmission.Update,
5368
-+			resource:           "nodes",
5369
-+			name:               "worker-guid",
5370
-+			namespace:          "",
5371
-+			userInfo:           newTestUserBuilder().build(),
5372
-+			shouldPassValidate: true,
5373
-+		},
5374
-+		"allowed: regular lightwave user get worker nodes proxy subresource": {
5375
-+			operation:          kadmission.Connect,
5376
-+			resource:           "nodes",
5377
-+			subresource:        "proxy",
5378
-+			name:               "worker-guid",
5379
-+			namespace:          "",
5380
-+			userInfo:           newTestUserBuilder().build(),
5381
-+			shouldPassValidate: true,
5382
-+		},
5383
-+		"allowed: regular lightwave user patch worker nodes proxy subresource": {
5384
-+			operation:          kadmission.Update,
5385
-+			resource:           "nodes",
5386
-+			subresource:        "proxy",
5387
-+			name:               "worker-guid",
5388
-+			namespace:          "",
5389
-+			userInfo:           newTestUserBuilder().build(),
5390
-+			shouldPassValidate: true,
5391
-+		},
5392
-+		"allowed: regular lightwave user create worker nodes proxy subresource": {
5393
-+			operation:          kadmission.Create,
5394
-+			resource:           "nodes",
5395
-+			subresource:        "proxy",
5396
-+			name:               "worker-guid",
5397
-+			namespace:          "",
5398
-+			userInfo:           newTestUserBuilder().build(),
5399
-+			shouldPassValidate: true,
5400
-+		},
5401
-+		"allowed: regular lightwave user get master nodes proxy subresource": {
5402
-+			operation:          kadmission.Connect,
5403
-+			resource:           "nodes",
5404
-+			subresource:        "proxy",
5405
-+			name:               "master-guid",
5406
-+			namespace:          "",
5407
-+			userInfo:           newTestUserBuilder().build(),
5408
-+			shouldPassValidate: true,
5409
-+		},
5410
-+		"denied: regular lightwave user patch master nodes proxy subresource": {
5411
-+			operation:          kadmission.Update,
5412
-+			resource:           "nodes",
5413
-+			subresource:        "proxy",
5414
-+			name:               "master-guid",
5415
-+			namespace:          "",
5416
-+			userInfo:           newTestUserBuilder().build(),
5417
-+			shouldPassValidate: false,
5418
-+		},
5419
-+		"denied: regular lightwave user create master nodes proxy subresource": {
5420
-+			operation:          kadmission.Create,
5421
-+			resource:           "nodes",
5422
-+			subresource:        "proxy",
5423
-+			name:               "master-guid",
5424
-+			namespace:          "",
5425
-+			userInfo:           newTestUserBuilder().build(),
5426
-+			shouldPassValidate: false,
5427
-+		},
5428
-+		"denied: regular lightwave user update master nodes": {
5429
-+			operation:          kadmission.Update,
5430
-+			resource:           "nodes",
5431
-+			name:               "master-guid",
5432
-+			namespace:          "",
5433
-+			userInfo:           newTestUserBuilder().build(),
5434
-+			shouldPassValidate: false,
5435
-+		},
5436
-+		"denied: regular lightwave user delete master nodes": {
5437
-+			operation:          kadmission.Delete,
5438
-+			resource:           "nodes",
5439
-+			name:               "master-guid",
5440
-+			namespace:          "",
5441
-+			userInfo:           newTestUserBuilder().build(),
5442
-+			shouldPassValidate: false,
5443
-+		},
5444
-+		"denied: regular lightwave user delete worker nodes": {
5445
-+			operation:          kadmission.Delete,
5446
-+			resource:           "nodes",
5447
-+			name:               "worker-guid",
5448
-+			namespace:          "",
5449
-+			userInfo:           newTestUserBuilder().build(),
5450
-+			shouldPassValidate: false,
5451
-+		},
5452
-+		"allowed: systemMasters group update nodes": {
5453
-+			operation:          kadmission.Update,
5454
-+			resource:           "nodes",
5455
-+			namespace:          "",
5456
-+			userInfo:           newTestUserBuilder().withGroup(systemMastersGroup).build(),
5457
-+			shouldPassValidate: true,
5458
-+		},
5459
-+		"allowed: kubelet update node": {
5460
-+			operation:          kadmission.Update,
5461
-+			resource:           "nodes",
5462
-+			namespace:          "",
5463
-+			userInfo:           newTestUserBuilder().withGroup(systemNodesGroup).build(),
5464
-+			shouldPassValidate: true,
5465
-+		},
5466
-+		"allowed: privileged service account update worker node taint": {
5467
-+			operation:          kadmission.Update,
5468
-+			resource:           "nodes",
5469
-+			namespace:          "",
5470
-+			name:               "worker-guid",
5471
-+			oldObject:          newTestNodeBuilder().build(),
5472
-+			object:             newTestNodeBuilder().withTaint(nil).build(),
5473
-+			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5474
-+			shouldPassValidate: true,
5475
-+		},
5476
-+		"denied: privileged service account update master node taint": {
5477
-+			operation:          kadmission.Update,
5478
-+			resource:           "nodes",
5479
-+			namespace:          "",
5480
-+			name:               "master-guid",
5481
-+			oldObject:          newTestNodeBuilder().build(),
5482
-+			object:             newTestNodeBuilder().withTaint(nil).build(),
5483
-+			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5484
-+			shouldPassValidate: false,
5485
-+		},
5486
-+		"denied: privileged service account create a deployment": {
5487
-+			operation:          kadmission.Create,
5488
-+			resource:           "deployments",
5489
-+			namespace:          "vke-system",
5490
-+			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5491
-+			shouldPassValidate: false,
5492
-+		},
5493
-+		"denied: worker kubelet create a deployment": {
5494
-+			operation:          kadmission.Create,
5495
-+			resource:           "deployments",
5496
-+			namespace:          "vke-system",
5497
-+			userInfo:           newTestUserBuilder().withGroup(systemWorkerGroup).build(),
5498
-+			shouldPassValidate: false,
5499
-+		},
5500
-+	}
5501
-+	for k, v := range tests {
5502
-+		testResourceValidation(k, v.operation, v.resource, v.subresource, v.name, v.namespace, v.userInfo, v.object,
5503
-+			v.oldObject, v.shouldPassValidate, t)
5504
-+	}
5505
-+}
5506
-+
5507
-+func testPodValidation(testCaseName string, op kadmission.Operation, pod *kapi.Pod, name string, userInfo user.Info,
5508
-+	shouldPassValidate bool, t *testing.T) {
5509
-+
5510
-+	defaultConfigFile := fmt.Sprintf(defaultConfigFileFormat, testServiceAccountsGroup, pspFileName, clusterID)
5511
-+	configFile := strings.NewReader(defaultConfigFile)
5512
-+	plugin, err := NewVMwareAdmissionController(configFile)
5513
-+	if err != nil {
5514
-+		t.Errorf("%s: failed to create admission controller %v", testCaseName, err)
5515
-+	}
5516
-+
5517
-+	namespace := "default"
5518
-+	if pod != nil {
5519
-+		namespace = pod.Namespace
5520
-+	}
5521
-+
5522
-+	attrs := kadmission.NewAttributesRecord(pod, nil, kapi.Kind("Pod").WithVersion("version"),
5523
-+		namespace, name, kapi.Resource("pods").WithVersion("version"), "", op, userInfo)
5524
-+
5525
-+	err = plugin.Admit(attrs)
5526
-+	if shouldPassValidate && err != nil {
5527
-+		t.Errorf("%s: expected no errors on Validate but received %v", testCaseName, err)
5528
-+	} else if !shouldPassValidate && err == nil {
5529
-+		t.Errorf("%s: expected errors on Validate but received none", testCaseName)
5530
-+	}
5531
-+}
5532
-+
5533
-+func testResourceValidation(testCaseName string, op kadmission.Operation, resource, subresource, name, namespace string,
5534
-+	userInfo user.Info, object runtime.Object, oldObject runtime.Object, shouldPassValidate bool, t *testing.T) {
5535
-+
5536
-+	defaultConfigFile := fmt.Sprintf(defaultConfigFileFormat, testServiceAccountsGroup, pspFileName, clusterID)
5537
-+	configFile := strings.NewReader(defaultConfigFile)
5538
-+	plugin, err := NewVMwareAdmissionController(configFile)
5539
-+	if err != nil {
5540
-+		t.Errorf("%s: failed to create admission controller %v", testCaseName, err)
5541
-+	}
5542
-+
5543
-+	groupResource := kapi.Resource(resource).WithVersion("version")
5544
-+	if resource == "clusterroles" || resource == "clusterrolebindings" {
5545
-+		groupResource = rbac.Resource(resource).WithVersion("version")
5546
-+	}
5547
-+
5548
-+	attrs := kadmission.NewAttributesRecord(object, oldObject, kapi.Kind("kind").WithVersion("version"),
5549
-+		namespace, name, groupResource, subresource, op, userInfo)
5550
-+
5551
-+	err = plugin.Admit(attrs)
5552
-+	if shouldPassValidate && err != nil {
5553
-+		t.Errorf("%s: expected no errors on Validate but received %v", testCaseName, err)
5554
-+	} else if !shouldPassValidate && err == nil {
5555
-+		t.Errorf("%s: expected errors on Validate but received none", testCaseName)
5556
-+	}
5557
-+}
5558
-+
5559
-+// testPodBuilder
5560
-+type testPodBuilder struct {
5561
-+	pod kapi.Pod
5562
-+}
5563
-+
5564
-+func newTestPodBuilder() *testPodBuilder {
5565
-+	builder := new(testPodBuilder)
5566
-+	return builder.init()
5567
-+}
5568
-+
5569
-+func (p *testPodBuilder) init() *testPodBuilder {
5570
-+	p.pod = kapi.Pod{
5571
-+		ObjectMeta: metav1.ObjectMeta{
5572
-+			Name:        "pod",
5573
-+			Namespace:   "namespace",
5574
-+			Annotations: map[string]string{},
5575
-+		},
5576
-+		Spec: kapi.PodSpec{
5577
-+			ServiceAccountName: "default",
5578
-+			SecurityContext:    &kapi.PodSecurityContext{},
5579
-+			Containers: []kapi.Container{
5580
-+				{
5581
-+					Name:            "test-container-1",
5582
-+					SecurityContext: &kapi.SecurityContext{},
5583
-+				},
5584
-+			},
5585
-+		},
5586
-+	}
5587
-+	return p
5588
-+}
5589
-+
5590
-+func (p *testPodBuilder) build() *kapi.Pod {
5591
-+	return &p.pod
5592
-+}
5593
-+
5594
-+func (p *testPodBuilder) withNamespace(namespace string) *testPodBuilder {
5595
-+	p.pod.ObjectMeta.Namespace = namespace
5596
-+	return p
5597
-+}
5598
-+
5599
-+func (p *testPodBuilder) withServiceAccount(sa string) *testPodBuilder {
5600
-+	p.pod.Spec.ServiceAccountName = sa
5601
-+	return p
5602
-+}
5603
-+
5604
-+func (p *testPodBuilder) withPrivileged(v bool) *testPodBuilder {
5605
-+	p.pod.Spec.Containers[0].SecurityContext.Privileged = &v
5606
-+	return p
5607
-+}
5608
-+
5609
-+func (p *testPodBuilder) withHostNetwork(v bool) *testPodBuilder {
5610
-+	p.pod.Spec.SecurityContext.HostNetwork = v
5611
-+	return p
5612
-+}
5613
-+
5614
-+func (p *testPodBuilder) withHostIPC(v bool) *testPodBuilder {
5615
-+	p.pod.Spec.SecurityContext.HostIPC = v
5616
-+	return p
5617
-+}
5618
-+
5619
-+func (p *testPodBuilder) withHostPID(v bool) *testPodBuilder {
5620
-+	p.pod.Spec.SecurityContext.HostPID = v
5621
-+	return p
5622
-+}
5623
-+
5624
-+func (p *testPodBuilder) withHostPort() *testPodBuilder {
5625
-+	containerPorts := []kapi.ContainerPort{
5626
-+		{
5627
-+			HostPort:      3000,
5628
-+			ContainerPort: 80,
5629
-+		},
5630
-+	}
5631
-+
5632
-+	p.pod.Spec.Containers[0].Ports = containerPorts
5633
-+	return p
5634
-+}
5635
-+
5636
-+func (p *testPodBuilder) withHostVolume(hostPath string, readOnly bool) *testPodBuilder {
5637
-+	volume := kapi.Volume{
5638
-+		Name: "host",
5639
-+		VolumeSource: kapi.VolumeSource{
5640
-+			HostPath: &kapi.HostPathVolumeSource{
5641
-+				Path: hostPath,
5642
-+			},
5643
-+		},
5644
-+	}
5645
-+	volumeMount := kapi.VolumeMount{Name: "host", MountPath: "/data", ReadOnly: readOnly}
5646
-+
5647
-+	p.pod.Spec.Volumes = append(p.pod.Spec.Volumes, volume)
5648
-+	p.pod.Spec.Containers[0].VolumeMounts = append(p.pod.Spec.Containers[0].VolumeMounts, volumeMount)
5649
-+	return p
5650
-+}
5651
-+
5652
-+func (p *testPodBuilder) withCascadeDisk() *testPodBuilder {
5653
-+	volume := kapi.Volume{
5654
-+		Name: "cascadeDisk",
5655
-+		VolumeSource: kapi.VolumeSource{
5656
-+			PersistentVolumeClaim: &kapi.PersistentVolumeClaimVolumeSource{
5657
-+				ClaimName: "00000000-0000-0000-0000-000000000001",
5658
-+				ReadOnly:  false,
5659
-+			},
5660
-+		},
5661
-+	}
5662
-+	device := kapi.VolumeDevice{Name: "cascadeDisk", DevicePath: "/cascadeDisk"}
5663
-+
5664
-+	p.pod.Spec.Volumes = append(p.pod.Spec.Volumes, volume)
5665
-+	p.pod.Spec.Containers[0].VolumeDevices = append(p.pod.Spec.Containers[0].VolumeDevices, device)
5666
-+	return p
5667
-+}
5668
-+
5669
-+func (p *testPodBuilder) withContainer() *testPodBuilder {
5670
-+	container := kapi.Container{
5671
-+		Name:            "test-container-2",
5672
-+		SecurityContext: &kapi.SecurityContext{},
5673
-+	}
5674
-+
5675
-+	p.pod.Spec.Containers = append(p.pod.Spec.Containers, container)
5676
-+	return p
5677
-+}
5678
-+
5679
-+func (p *testPodBuilder) withInitContainer() *testPodBuilder {
5680
-+	container := kapi.Container{
5681
-+		Name:            "test-init-container",
5682
-+		SecurityContext: &kapi.SecurityContext{},
5683
-+	}
5684
-+
5685
-+	p.pod.Spec.Containers = append(p.pod.Spec.Containers, container)
5686
-+	return p
5687
-+}
5688
-+
5689
-+func (p *testPodBuilder) withToleration(key, value string, operator kapi.TolerationOperator, effect kapi.TaintEffect) *testPodBuilder {
5690
-+	p.pod.Spec.Tolerations = append(p.pod.Spec.Tolerations, kapi.Toleration{
5691
-+		Key:      key,
5692
-+		Value:    value,
5693
-+		Operator: operator,
5694
-+		Effect:   effect,
5695
-+	})
5696
-+	return p
5697
-+}
5698
-+
5699
-+// testUserBuilder
5700
-+type testUserBuilder struct {
5701
-+	user *user.DefaultInfo
5702
-+}
5703
-+
5704
-+func newTestUserBuilder() *testUserBuilder {
5705
-+	builder := new(testUserBuilder)
5706
-+	return builder.init()
5707
-+}
5708
-+
5709
-+func (p *testUserBuilder) init() *testUserBuilder {
5710
-+	p.user = &user.DefaultInfo{
5711
-+		Name:   "https://lightwave.cascade-cloud.com/openidconnect/00000000-0000-0000-0000-000000000001#joe@vmware.com",
5712
-+		UID:    "10001",
5713
-+		Groups: []string{},
5714
-+	}
5715
-+	return p
5716
-+}
5717
-+
5718
-+func (p *testUserBuilder) build() *user.DefaultInfo {
5719
-+	return p.user
5720
-+}
5721
-+
5722
-+func (p *testUserBuilder) withName(name string) *testUserBuilder {
5723
-+	p.user.Name = name
5724
-+	return p
5725
-+}
5726
-+
5727
-+func (p *testUserBuilder) withGroup(group string) *testUserBuilder {
5728
-+	p.user.Groups = append(p.user.Groups, group)
5729
-+	return p
5730
-+}
5731
-+
5732
-+// testNodeBuilder
5733
-+type testNodeBuilder struct {
5734
-+	node kapi.Node
5735
-+}
5736
-+
5737
-+func newTestNodeBuilder() *testNodeBuilder {
5738
-+	builder := new(testNodeBuilder)
5739
-+	return builder.init()
5740
-+}
5741
-+
5742
-+func (n *testNodeBuilder) init() *testNodeBuilder {
5743
-+	n.node = kapi.Node{
5744
-+		ObjectMeta: metav1.ObjectMeta{
5745
-+			Name:        "node",
5746
-+			Namespace:   "",
5747
-+			Annotations: nil,
5748
-+		},
5749
-+		Spec: kapi.NodeSpec{
5750
-+			Taints: []kapi.Taint{
5751
-+				{
5752
-+					"Dedicated", "Master", "NoSchedule", nil,
5753
-+				},
5754
-+			},
5755
-+		},
5756
-+	}
5757
-+	return n
5758
-+}
5759
-+
5760
-+func (n *testNodeBuilder) build() *kapi.Node {
5761
-+	return &n.node
5762
-+}
5763
-+
5764
-+func (n *testNodeBuilder) withTaint(taints []kapi.Taint) *testNodeBuilder {
5765
-+	n.node.Spec.Taints = taints
5766
-+	return n
5767
-+}
5768
-+
5769
-diff --git a/plugin/pkg/auth/authorizer/vke/BUILD b/plugin/pkg/auth/authorizer/vke/BUILD
5770
-new file mode 100644
5771
-index 0000000..4b984f1
5772
-+++ b/plugin/pkg/auth/authorizer/vke/BUILD
5773
-@@ -0,0 +1,40 @@
5774
-+package(default_visibility = ["//visibility:public"])
5775
-+
5776
-+load(
5777
-+    "@io_bazel_rules_go//go:def.bzl",
5778
-+    "go_library",
5779
-+)
5780
-+
5781
-+go_test(
5782
-+    name = "go_default_test",
5783
-+    srcs = ["vke_authorizer_test.go"],
5784
-+    embed = [":go_default_library"],
5785
-+    deps = [
5786
-+        "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library",
5787
-+        "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
5788
-+    ],
5789
-+)
5790
-+
5791
-+go_library(
5792
-+    name = "go_default_library",
5793
-+    srcs = [
5794
-+        "vke_authorizer.go",
5795
-+    ],
5796
-+    importpath = "k8s.io/kubernetes/plugin/pkg/auth/authorizer/vke",
5797
-+    deps = [
5798
-+        "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
5799
-+    ],
5800
-+)
5801
-+
5802
-+filegroup(
5803
-+    name = "package-srcs",
5804
-+    srcs = glob(["**"]),
5805
-+    tags = ["automanaged"],
5806
-+    visibility = ["//visibility:private"],
5807
-+)
5808
-+
5809
-+filegroup(
5810
-+    name = "all-srcs",
5811
-+    srcs = [":package-srcs"],
5812
-+    tags = ["automanaged"],
5813
-+)
5814
-diff --git a/plugin/pkg/auth/authorizer/vke/OWNERS b/plugin/pkg/auth/authorizer/vke/OWNERS
5815
-new file mode 100644
5816
-index 0000000..c3a4ed7
5817
-+++ b/plugin/pkg/auth/authorizer/vke/OWNERS
5818
-@@ -0,0 +1,2 @@
5819
-+maintainers:
5820
-+- ashokc
5821
-diff --git a/plugin/pkg/auth/authorizer/vke/vke_authorizer.go b/plugin/pkg/auth/authorizer/vke/vke_authorizer.go
5822
-new file mode 100644
5823
-index 0000000..6d7f9ae
5824
-+++ b/plugin/pkg/auth/authorizer/vke/vke_authorizer.go
5825
-@@ -0,0 +1,125 @@
5826
-+package vke
5827
-+
5828
-+import (
5829
-+	"bufio"
5830
-+	"fmt"
5831
-+	"os"
5832
-+	"strings"
5833
-+
5834
-+	"github.com/golang/glog"
5835
-+	"k8s.io/apiserver/pkg/authorization/authorizer"
5836
-+)
5837
-+
5838
-+const (
5839
-+	systemClusterPrefix = "system:clusterID:"
5840
-+	systemNodePrefix    = "system:node:"
5841
-+	systemWorkerGroup   = "system:worker"
5842
-+	masterPrefix        = "master-"
5843
-+)
5844
-+
5845
-+
5846
-+// VKEAuthorizer authorizes requests which comes from nodes using certificates.
5847
-+// If a request is from a node which is not a part of the cluster, reject.
5848
-+type VKEAuthorizer struct {
5849
-+	clusterID string
5850
-+}
5851
-+
5852
-+// NewAuthorizer returns a new node authorizer
5853
-+func NewAuthorizer() (authorizer.Authorizer, error) {
5854
-+	file, err := os.Open("/etc/kubernetes/cc_cloud.config")
5855
-+	if err != nil {
5856
-+		return nil, err
5857
-+	}
5858
-+	defer file.Close()
5859
-+
5860
-+	scanner := bufio.NewScanner(file)
5861
-+
5862
-+	for scanner.Scan() {
5863
-+		lineContent := scanner.Text()
5864
-+		if strings.Contains(lineContent, "clusterID = ") {
5865
-+			clusterID := strings.SplitAfter(lineContent, "= ")[1]
5866
-+			return &VKEAuthorizer{clusterID: clusterID}, nil
5867
-+		}
5868
-+	}
5869
-+
5870
-+	return nil, fmt.Errorf("Cluster ID cannot be parsed from config file successfully")
5871
-+}
5872
-+
5873
-+// Authorize authorizes requests based on the VKE authorizer.
5874
-+func (v *VKEAuthorizer) Authorize(attrs authorizer.Attributes) (authorizer.Decision, string, error) {
5875
-+	// If the request comes from a non cluster node, then deny.
5876
-+	if isNonClusterNode(attrs, v.clusterID) {
5877
-+		glog.V(2).Infof("VKE authorizer: DENY the request because it is from a different cluster")
5878
-+		return authorizer.DecisionDeny, "", nil
5879
-+	}
5880
-+
5881
-+	// If a worker node name does not have the node prefix, then deny. This is needed for the request to go through node
5882
-+	// authorizer and node restriction admission controller. If it is not set, then a user can bypass node authorizer
5883
-+	// and the node restriction admission controller and modify the master node.
5884
-+	if isWorkerWithoutNodeNameRestriction(attrs) {
5885
-+		glog.V(2).Infof("VKE authorizer: DENY the request because the node name restriction is not met")
5886
-+		return authorizer.DecisionDeny, "", nil
5887
-+	}
5888
-+
5889
-+	// If it is a proxy request to the master node to exec, run or attach to a container, then deny.
5890
-+	if isProxyRequestToMasterNode(attrs) {
5891
-+		glog.V(2).Infof("VKE authorizer: DENY the request because it tried to execute commands on master pods")
5892
-+		return authorizer.DecisionDeny, "", nil
5893
-+	}
5894
-+
5895
-+	return authorizer.DecisionNoOpinion, "", nil
5896
-+}
5897
-+
5898
-+// isNonClusterNode verifies that the request is not from a node which does not belong to this cluster. This is needed
5899
-+// to prevent cross cluster attacks where a user can use the kubelet certificate of one cluster to access the resources
5900
-+// in another cluster. The reason we have this check is because, when a certificate is presented for authentication,
5901
-+// Kubernetes just verifies that the certificate is signed by the CA that the cluster trusts. Since, in our case, the CA
5902
-+// is same for all clusters, authentication with certificate is not enough. So, we make sure that the request is not
5903
-+// from another cluster. Lightwave will make sure that any certificates generated on a worker will always have the
5904
-+// "system:clusterID:<id>" group. This way, we can just check the cluster ID in the group and reject if it is not the
5905
-+// same as this cluster's ID.
5906
-+func isNonClusterNode(attrs authorizer.Attributes, clusterID string) bool {
5907
-+	groups := attrs.GetUser().GetGroups()
5908
-+	for _, group := range groups {
5909
-+		if strings.HasPrefix(group, systemClusterPrefix) {
5910
-+			groupParts := strings.Split(group, ":")
5911
-+			if clusterID != "" && groupParts[len(groupParts)-1] != clusterID {
5912
-+				return true
5913
-+			}
5914
-+		}
5915
-+	}
5916
-+
5917
-+	return false
5918
-+}
5919
-+
5920
-+// isWorkerWithoutNodeNameRestriction verifies that the certificate presented by the worker nodes also have the
5921
-+// appropriate name "system:node:<hostname>". We need to validate this because it is possible for a user to generate
5922
-+// certificates with CN other than "system:node:<hostname>". This is because lightwave does group validation and that
5923
-+// the CNs can be one of system:node:<hostname>, kubernetes-master and etcd. When that happens, that certificate will be
5924
-+// able to bypass the NodeRestriction admission controller which will allow access to modify master node and create pods
5925
-+// on master. To prevent that from happening, we need to verify that if a request comes from a worker node, then it has
5926
-+// to have the expected name so that NodeRestriction admission controller is enforced.
5927
-+func isWorkerWithoutNodeNameRestriction(attrs authorizer.Attributes) bool {
5928
-+	groups := attrs.GetUser().GetGroups()
5929
-+	name := attrs.GetUser().GetName()
5930
-+	for _, group := range groups {
5931
-+		if group == systemWorkerGroup && !strings.HasPrefix(name, systemNodePrefix) {
5932
-+			return true
5933
-+		}
5934
-+	}
5935
-+	return false
5936
-+}
5937
-+
5938
-+// isProxyRequestToMasterNode checks if the request is made to exec, run or attach to a container on the master node. We
5939
-+// need this check because we do not want to allow a user to exec into a privileged pod on the master node.
5940
-+func isProxyRequestToMasterNode(attrs authorizer.Attributes) bool {
5941
-+	if attrs.GetResource() == "nodes" && strings.HasPrefix(attrs.GetName(), masterPrefix) {
5942
-+		if strings.Contains(attrs.GetPath(), "proxy/run") ||
5943
-+			strings.Contains(attrs.GetPath(), "proxy/exec") ||
5944
-+			strings.Contains(attrs.GetPath(), "proxy/attach") {
5945
-+			return true
5946
-+		}
5947
-+	}
5948
-+	return false
5949
-+}
5950
-+
5951
-diff --git a/plugin/pkg/auth/authorizer/vke/vke_authorizer_test.go b/plugin/pkg/auth/authorizer/vke/vke_authorizer_test.go
5952
-new file mode 100644
5953
-index 0000000..6aba9ec
5954
-+++ b/plugin/pkg/auth/authorizer/vke/vke_authorizer_test.go
5955
-@@ -0,0 +1,230 @@
5956
-+package vke
5957
-+
5958
-+import (
5959
-+	"testing"
5960
-+
5961
-+	"k8s.io/apiserver/pkg/authentication/user"
5962
-+	"k8s.io/apiserver/pkg/authorization/authorizer"
5963
-+)
5964
-+
5965
-+const (
5966
-+	masterProxyAttachPath = "/api/v1/nodes/master-0/proxy/attach/vke-system/pod-name/container-name"
5967
-+	masterProxyExecPath   = "/api/v1/nodes/master-0/proxy/exec/vke-system/pod-name/container-name"
5968
-+	masterProxyRunPath    = "/api/v1/nodes/master-0/proxy/run/vke-system/pod-name/container-name"
5969
-+	workerProxyAttachPath = "/api/v1/nodes/worker-0/proxy/attach/vke-system/pod-name/container-name"
5970
-+	workerProxyExecPath   = "/api/v1/nodes/worker-0/proxy/exec/vke-system/pod-name/container-name"
5971
-+	workerProxyRunPath    = "/api/v1/nodes/worker-0/proxy/run/vke-system/pod-name/container-name"
5972
-+)
5973
-+
5974
-+func TestAuthorizer(t *testing.T) {
5975
-+	authz := &VKEAuthorizer{clusterID: "cluster-id"}
5976
-+
5977
-+	clusterNode := &user.DefaultInfo{Name: "system:node:worker-0", Groups: []string{"system:nodes", "system:clusterID:cluster-id", "system:worker"}}
5978
-+	crossClusterNode := &user.DefaultInfo{Name: "system:node:worker-0", Groups: []string{"system:nodes", "system:clusterID:invalid", "system:worker"}}
5979
-+	invalidWorker := &user.DefaultInfo{Name: "worker-0", Groups: []string{"system:nodes", "system:clusterID:cluster-id", "system:worker"}}
5980
-+
5981
-+	tests := []struct {
5982
-+		name   string
5983
-+		attrs  authorizer.AttributesRecord
5984
-+		expect authorizer.Decision
5985
-+	}{
5986
-+		// Do not deny requests from a normal cluster node user.
5987
-+		{
5988
-+			name:   "allowed: cluster node get pod",
5989
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "get", Resource: "pods", Name: "pod", Namespace: "ns"},
5990
-+			expect: authorizer.DecisionNoOpinion,
5991
-+		},
5992
-+		{
5993
-+			name:   "allowed: cluster node list pod",
5994
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "list", Resource: "pods", Namespace: "ns"},
5995
-+			expect: authorizer.DecisionNoOpinion,
5996
-+		},
5997
-+		{
5998
-+			name:   "allowed: cluster node create pod",
5999
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "pods", Name: "pod", Namespace: "ns"},
6000
-+			expect: authorizer.DecisionNoOpinion,
6001
-+		},
6002
-+		{
6003
-+			name:   "allowed: cluster node update pod",
6004
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "update", Resource: "pods", Name: "pod", Namespace: "ns"},
6005
-+			expect: authorizer.DecisionNoOpinion,
6006
-+		},
6007
-+		{
6008
-+			name:   "allowed: cluster node delete pod",
6009
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "delete", Resource: "pods", Name: "pod", Namespace: "ns"},
6010
-+			expect: authorizer.DecisionNoOpinion,
6011
-+		},
6012
-+		{
6013
-+			name:   "allowed: cluster node get node",
6014
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "get", Resource: "nodes", Name: "node"},
6015
-+			expect: authorizer.DecisionNoOpinion,
6016
-+		},
6017
-+		{
6018
-+			name:   "allowed: cluster node list nodes",
6019
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "list", Resource: "nodes"},
6020
-+			expect: authorizer.DecisionNoOpinion,
6021
-+		},
6022
-+		{
6023
-+			name:   "allowed: cluster node create nodes",
6024
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "node"},
6025
-+			expect: authorizer.DecisionNoOpinion,
6026
-+		},
6027
-+		{
6028
-+			name:   "allowed: cluster node update nodes",
6029
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "update", Resource: "nodes", Name: "node"},
6030
-+			expect: authorizer.DecisionNoOpinion,
6031
-+		},
6032
-+		{
6033
-+			name:   "allowed: cluster node delete nodes",
6034
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "delete", Resource: "nodes", Name: "node"},
6035
-+			expect: authorizer.DecisionNoOpinion,
6036
-+		},
6037
-+
6038
-+		// Deny requests from another cluster node.
6039
-+		{
6040
-+			name:   "denied: cross cluster node get pod",
6041
-+			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "get", Resource: "pods", Name: "pod", Namespace: "ns"},
6042
-+			expect: authorizer.DecisionDeny,
6043
-+		},
6044
-+		{
6045
-+			name:   "denied: cross cluster node list pod",
6046
-+			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "list", Resource: "pods", Namespace: "ns"},
6047
-+			expect: authorizer.DecisionDeny,
6048
-+		},
6049
-+		{
6050
-+			name:   "denied: cross cluster node create pod",
6051
-+			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "create", Resource: "pods", Name: "pod", Namespace: "ns"},
6052
-+			expect: authorizer.DecisionDeny,
6053
-+		},
6054
-+		{
6055
-+			name:   "denied: cross cluster node update pod",
6056
-+			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "update", Resource: "pods", Name: "pod", Namespace: "ns"},
6057
-+			expect: authorizer.DecisionDeny,
6058
-+		},
6059
-+		{
6060
-+			name:   "denied: cross cluster node delete pod",
6061
-+			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "delete", Resource: "pods", Name: "pod", Namespace: "ns"},
6062
-+			expect: authorizer.DecisionDeny,
6063
-+		},
6064
-+		{
6065
-+			name:   "denied: cross cluster node get node",
6066
-+			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "get", Resource: "nodes", Name: "node"},
6067
-+			expect: authorizer.DecisionDeny,
6068
-+		},
6069
-+		{
6070
-+			name:   "denied: cross cluster node list nodes",
6071
-+			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "list", Resource: "nodes"},
6072
-+			expect: authorizer.DecisionDeny,
6073
-+		},
6074
-+		{
6075
-+			name:   "denied: cross cluster node create nodes",
6076
-+			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "node"},
6077
-+			expect: authorizer.DecisionDeny,
6078
-+		},
6079
-+		{
6080
-+			name:   "denied: cross cluster node update nodes",
6081
-+			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "update", Resource: "nodes", Name: "node"},
6082
-+			expect: authorizer.DecisionDeny,
6083
-+		},
6084
-+		{
6085
-+			name:   "denied: cross cluster node delete nodes",
6086
-+			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "delete", Resource: "nodes", Name: "node"},
6087
-+			expect: authorizer.DecisionDeny,
6088
-+		},
6089
-+
6090
-+		// Deny requests from invalid node.
6091
-+		{
6092
-+			name:   "denied: invalid worker get pod",
6093
-+			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "get", Resource: "pods", Name: "pod", Namespace: "ns"},
6094
-+			expect: authorizer.DecisionDeny,
6095
-+		},
6096
-+		{
6097
-+			name:   "denied: invalid worker list pod",
6098
-+			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "list", Resource: "pods", Namespace: "ns"},
6099
-+			expect: authorizer.DecisionDeny,
6100
-+		},
6101
-+		{
6102
-+			name:   "denied: invalid worker create pod",
6103
-+			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "create", Resource: "pods", Name: "pod", Namespace: "ns"},
6104
-+			expect: authorizer.DecisionDeny,
6105
-+		},
6106
-+		{
6107
-+			name:   "denied: invalid worker update pod",
6108
-+			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "update", Resource: "pods", Name: "pod", Namespace: "ns"},
6109
-+			expect: authorizer.DecisionDeny,
6110
-+		},
6111
-+		{
6112
-+			name:   "denied: invalid worker delete pod",
6113
-+			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "delete", Resource: "pods", Name: "pod", Namespace: "ns"},
6114
-+			expect: authorizer.DecisionDeny,
6115
-+		},
6116
-+		{
6117
-+			name:   "denied: invalid worker get node",
6118
-+			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "get", Resource: "nodes", Name: "node"},
6119
-+			expect: authorizer.DecisionDeny,
6120
-+		},
6121
-+		{
6122
-+			name:   "denied: invalid worker list nodes",
6123
-+			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "list", Resource: "nodes"},
6124
-+			expect: authorizer.DecisionDeny,
6125
-+		},
6126
-+		{
6127
-+			name:   "denied: invalid worker create nodes",
6128
-+			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "node"},
6129
-+			expect: authorizer.DecisionDeny,
6130
-+		},
6131
-+		{
6132
-+			name:   "denied: invalid worker update nodes",
6133
-+			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "update", Resource: "nodes", Name: "node"},
6134
-+			expect: authorizer.DecisionDeny,
6135
-+		},
6136
-+		{
6137
-+			name:   "denied: invalid worker delete nodes",
6138
-+			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "delete", Resource: "nodes", Name: "node"},
6139
-+			expect: authorizer.DecisionDeny,
6140
-+		},
6141
-+
6142
-+		// Deny exec, run and attach operation on master nodes using proxy resource.
6143
-+		{
6144
-+			name:   "denied: attach using proxy resource on master",
6145
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "master-0", Path: masterProxyAttachPath},
6146
-+			expect: authorizer.DecisionDeny,
6147
-+		},
6148
-+		{
6149
-+			name:   "denied: exec using proxy resource on master",
6150
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "master-0", Path: masterProxyExecPath},
6151
-+			expect: authorizer.DecisionDeny,
6152
-+		},
6153
-+		{
6154
-+			name:   "denied: run using proxy resource on master",
6155
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "master-0", Path: masterProxyRunPath},
6156
-+			expect: authorizer.DecisionDeny,
6157
-+		},
6158
-+
6159
-+		// Do not deny exec, run and attach operation on worker nodes using proxy resource.
6160
-+		{
6161
-+			name:   "allowed: attach using proxy resource on worker",
6162
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "worker-0", Path: workerProxyAttachPath},
6163
-+			expect: authorizer.DecisionNoOpinion,
6164
-+		},
6165
-+		{
6166
-+			name:   "allowed: exec using proxy resource on worker",
6167
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "worker-0", Path: workerProxyExecPath},
6168
-+			expect: authorizer.DecisionNoOpinion,
6169
-+		},
6170
-+		{
6171
-+			name:   "allowed: run using proxy resource on worker",
6172
-+			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "worker-0", Path: workerProxyRunPath},
6173
-+			expect: authorizer.DecisionNoOpinion,
6174
-+		},
6175
-+	}
6176
-+
6177
-+	for _, tc := range tests {
6178
-+		t.Run(tc.name, func(t *testing.T) {
6179
-+			decision, _, _ := authz.Authorize(tc.attrs)
6180
-+			if decision != tc.expect {
6181
-+				t.Errorf("expected %v, got %v", tc.expect, decision)
6182
-+			}
6183
-+		})
6184
-+	}
6185
-+}
6186
-diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go
6187
-index a809ceb..f27250e 100644
6188
-+++ b/staging/src/k8s.io/api/core/v1/generated.pb.go
6189
-@@ -35,6 +35,7 @@ limitations under the License.
6190
- 		Binding
6191
- 		CSIPersistentVolumeSource
6192
- 		Capabilities
6193
-+		CascadeDiskVolumeSource
6194
- 		CephFSPersistentVolumeSource
6195
- 		CephFSVolumeSource
6196
- 		CinderPersistentVolumeSource
6197
-@@ -296,800 +297,806 @@ func (m *Capabilities) Reset()                    { *m = Capabilities{} }
6198
- func (*Capabilities) ProtoMessage()               {}
6199
- func (*Capabilities) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} }
6200
- 
6201
-+func (m *CascadeDiskVolumeSource) Reset()      { *m = CascadeDiskVolumeSource{} }
6202
-+func (*CascadeDiskVolumeSource) ProtoMessage() {}
6203
-+func (*CascadeDiskVolumeSource) Descriptor() ([]byte, []int) {
6204
-+	return fileDescriptorGenerated, []int{10}
6205
-+}
6206
-+
6207
- func (m *CephFSPersistentVolumeSource) Reset()      { *m = CephFSPersistentVolumeSource{} }
6208
- func (*CephFSPersistentVolumeSource) ProtoMessage() {}
6209
- func (*CephFSPersistentVolumeSource) Descriptor() ([]byte, []int) {
6210
--	return fileDescriptorGenerated, []int{10}
6211
-+	return fileDescriptorGenerated, []int{11}
6212
- }
6213
- 
6214
- func (m *CephFSVolumeSource) Reset()                    { *m = CephFSVolumeSource{} }
6215
- func (*CephFSVolumeSource) ProtoMessage()               {}
6216
--func (*CephFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} }
6217
-+func (*CephFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} }
6218
- 
6219
- func (m *CinderPersistentVolumeSource) Reset()      { *m = CinderPersistentVolumeSource{} }
6220
- func (*CinderPersistentVolumeSource) ProtoMessage() {}
6221
- func (*CinderPersistentVolumeSource) Descriptor() ([]byte, []int) {
6222
--	return fileDescriptorGenerated, []int{12}
6223
-+	return fileDescriptorGenerated, []int{13}
6224
- }
6225
- 
6226
- func (m *CinderVolumeSource) Reset()                    { *m = CinderVolumeSource{} }
6227
- func (*CinderVolumeSource) ProtoMessage()               {}
6228
--func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} }
6229
-+func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} }
6230
- 
6231
- func (m *ClientIPConfig) Reset()                    { *m = ClientIPConfig{} }
6232
- func (*ClientIPConfig) ProtoMessage()               {}
6233
--func (*ClientIPConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} }
6234
-+func (*ClientIPConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} }
6235
- 
6236
- func (m *ComponentCondition) Reset()                    { *m = ComponentCondition{} }
6237
- func (*ComponentCondition) ProtoMessage()               {}
6238
--func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} }
6239
-+func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} }
6240
- 
6241
- func (m *ComponentStatus) Reset()                    { *m = ComponentStatus{} }
6242
- func (*ComponentStatus) ProtoMessage()               {}
6243
--func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} }
6244
-+func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} }
6245
- 
6246
- func (m *ComponentStatusList) Reset()                    { *m = ComponentStatusList{} }
6247
- func (*ComponentStatusList) ProtoMessage()               {}
6248
--func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} }
6249
-+func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} }
6250
- 
6251
- func (m *ConfigMap) Reset()                    { *m = ConfigMap{} }
6252
- func (*ConfigMap) ProtoMessage()               {}
6253
--func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} }
6254
-+func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} }
6255
- 
6256
- func (m *ConfigMapEnvSource) Reset()                    { *m = ConfigMapEnvSource{} }
6257
- func (*ConfigMapEnvSource) ProtoMessage()               {}
6258
--func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} }
6259
-+func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} }
6260
- 
6261
- func (m *ConfigMapKeySelector) Reset()                    { *m = ConfigMapKeySelector{} }
6262
- func (*ConfigMapKeySelector) ProtoMessage()               {}
6263
--func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} }
6264
-+func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} }
6265
- 
6266
- func (m *ConfigMapList) Reset()                    { *m = ConfigMapList{} }
6267
- func (*ConfigMapList) ProtoMessage()               {}
6268
--func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} }
6269
-+func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} }
6270
- 
6271
- func (m *ConfigMapNodeConfigSource) Reset()      { *m = ConfigMapNodeConfigSource{} }
6272
- func (*ConfigMapNodeConfigSource) ProtoMessage() {}
6273
- func (*ConfigMapNodeConfigSource) Descriptor() ([]byte, []int) {
6274
--	return fileDescriptorGenerated, []int{22}
6275
-+	return fileDescriptorGenerated, []int{23}
6276
- }
6277
- 
6278
- func (m *ConfigMapProjection) Reset()                    { *m = ConfigMapProjection{} }
6279
- func (*ConfigMapProjection) ProtoMessage()               {}
6280
--func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} }
6281
-+func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} }
6282
- 
6283
- func (m *ConfigMapVolumeSource) Reset()                    { *m = ConfigMapVolumeSource{} }
6284
- func (*ConfigMapVolumeSource) ProtoMessage()               {}
6285
--func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} }
6286
-+func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} }
6287
- 
6288
- func (m *Container) Reset()                    { *m = Container{} }
6289
- func (*Container) ProtoMessage()               {}
6290
--func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} }
6291
-+func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} }
6292
- 
6293
- func (m *ContainerImage) Reset()                    { *m = ContainerImage{} }
6294
- func (*ContainerImage) ProtoMessage()               {}
6295
--func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} }
6296
-+func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} }
6297
- 
6298
- func (m *ContainerPort) Reset()                    { *m = ContainerPort{} }
6299
- func (*ContainerPort) ProtoMessage()               {}
6300
--func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} }
6301
-+func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} }
6302
- 
6303
- func (m *ContainerState) Reset()                    { *m = ContainerState{} }
6304
- func (*ContainerState) ProtoMessage()               {}
6305
--func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} }
6306
-+func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} }
6307
- 
6308
- func (m *ContainerStateRunning) Reset()                    { *m = ContainerStateRunning{} }
6309
- func (*ContainerStateRunning) ProtoMessage()               {}
6310
--func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} }
6311
-+func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} }
6312
- 
6313
- func (m *ContainerStateTerminated) Reset()      { *m = ContainerStateTerminated{} }
6314
- func (*ContainerStateTerminated) ProtoMessage() {}
6315
- func (*ContainerStateTerminated) Descriptor() ([]byte, []int) {
6316
--	return fileDescriptorGenerated, []int{30}
6317
-+	return fileDescriptorGenerated, []int{31}
6318
- }
6319
- 
6320
- func (m *ContainerStateWaiting) Reset()                    { *m = ContainerStateWaiting{} }
6321
- func (*ContainerStateWaiting) ProtoMessage()               {}
6322
--func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} }
6323
-+func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} }
6324
- 
6325
- func (m *ContainerStatus) Reset()                    { *m = ContainerStatus{} }
6326
- func (*ContainerStatus) ProtoMessage()               {}
6327
--func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} }
6328
-+func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} }
6329
- 
6330
- func (m *DaemonEndpoint) Reset()                    { *m = DaemonEndpoint{} }
6331
- func (*DaemonEndpoint) ProtoMessage()               {}
6332
--func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} }
6333
-+func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} }
6334
- 
6335
- func (m *DownwardAPIProjection) Reset()                    { *m = DownwardAPIProjection{} }
6336
- func (*DownwardAPIProjection) ProtoMessage()               {}
6337
--func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} }
6338
-+func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} }
6339
- 
6340
- func (m *DownwardAPIVolumeFile) Reset()                    { *m = DownwardAPIVolumeFile{} }
6341
- func (*DownwardAPIVolumeFile) ProtoMessage()               {}
6342
--func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} }
6343
-+func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} }
6344
- 
6345
- func (m *DownwardAPIVolumeSource) Reset()      { *m = DownwardAPIVolumeSource{} }
6346
- func (*DownwardAPIVolumeSource) ProtoMessage() {}
6347
- func (*DownwardAPIVolumeSource) Descriptor() ([]byte, []int) {
6348
--	return fileDescriptorGenerated, []int{36}
6349
-+	return fileDescriptorGenerated, []int{37}
6350
- }
6351
- 
6352
- func (m *EmptyDirVolumeSource) Reset()                    { *m = EmptyDirVolumeSource{} }
6353
- func (*EmptyDirVolumeSource) ProtoMessage()               {}
6354
--func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} }
6355
-+func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} }
6356
- 
6357
- func (m *EndpointAddress) Reset()                    { *m = EndpointAddress{} }
6358
- func (*EndpointAddress) ProtoMessage()               {}
6359
--func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} }
6360
-+func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} }
6361
- 
6362
- func (m *EndpointPort) Reset()                    { *m = EndpointPort{} }
6363
- func (*EndpointPort) ProtoMessage()               {}
6364
--func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} }
6365
-+func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} }
6366
- 
6367
- func (m *EndpointSubset) Reset()                    { *m = EndpointSubset{} }
6368
- func (*EndpointSubset) ProtoMessage()               {}
6369
--func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} }
6370
-+func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} }
6371
- 
6372
- func (m *Endpoints) Reset()                    { *m = Endpoints{} }
6373
- func (*Endpoints) ProtoMessage()               {}
6374
--func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} }
6375
-+func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} }
6376
- 
6377
- func (m *EndpointsList) Reset()                    { *m = EndpointsList{} }
6378
- func (*EndpointsList) ProtoMessage()               {}
6379
--func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} }
6380
-+func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} }
6381
- 
6382
- func (m *EnvFromSource) Reset()                    { *m = EnvFromSource{} }
6383
- func (*EnvFromSource) ProtoMessage()               {}
6384
--func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} }
6385
-+func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} }
6386
- 
6387
- func (m *EnvVar) Reset()                    { *m = EnvVar{} }
6388
- func (*EnvVar) ProtoMessage()               {}
6389
--func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} }
6390
-+func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} }
6391
- 
6392
- func (m *EnvVarSource) Reset()                    { *m = EnvVarSource{} }
6393
- func (*EnvVarSource) ProtoMessage()               {}
6394
--func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} }
6395
-+func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} }
6396
- 
6397
- func (m *Event) Reset()                    { *m = Event{} }
6398
- func (*Event) ProtoMessage()               {}
6399
--func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} }
6400
-+func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} }
6401
- 
6402
- func (m *EventList) Reset()                    { *m = EventList{} }
6403
- func (*EventList) ProtoMessage()               {}
6404
--func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} }
6405
-+func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} }
6406
- 
6407
- func (m *EventSeries) Reset()                    { *m = EventSeries{} }
6408
- func (*EventSeries) ProtoMessage()               {}
6409
--func (*EventSeries) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} }
6410
-+func (*EventSeries) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} }
6411
- 
6412
- func (m *EventSource) Reset()                    { *m = EventSource{} }
6413
- func (*EventSource) ProtoMessage()               {}
6414
--func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} }
6415
-+func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} }
6416
- 
6417
- func (m *ExecAction) Reset()                    { *m = ExecAction{} }
6418
- func (*ExecAction) ProtoMessage()               {}
6419
--func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} }
6420
-+func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} }
6421
- 
6422
- func (m *FCVolumeSource) Reset()                    { *m = FCVolumeSource{} }
6423
- func (*FCVolumeSource) ProtoMessage()               {}
6424
--func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} }
6425
-+func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} }
6426
- 
6427
- func (m *FlexPersistentVolumeSource) Reset()      { *m = FlexPersistentVolumeSource{} }
6428
- func (*FlexPersistentVolumeSource) ProtoMessage() {}
6429
- func (*FlexPersistentVolumeSource) Descriptor() ([]byte, []int) {
6430
--	return fileDescriptorGenerated, []int{52}
6431
-+	return fileDescriptorGenerated, []int{53}
6432
- }
6433
- 
6434
- func (m *FlexVolumeSource) Reset()                    { *m = FlexVolumeSource{} }
6435
- func (*FlexVolumeSource) ProtoMessage()               {}
6436
--func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} }
6437
-+func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} }
6438
- 
6439
- func (m *FlockerVolumeSource) Reset()                    { *m = FlockerVolumeSource{} }
6440
- func (*FlockerVolumeSource) ProtoMessage()               {}
6441
--func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} }
6442
-+func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} }
6443
- 
6444
- func (m *GCEPersistentDiskVolumeSource) Reset()      { *m = GCEPersistentDiskVolumeSource{} }
6445
- func (*GCEPersistentDiskVolumeSource) ProtoMessage() {}
6446
- func (*GCEPersistentDiskVolumeSource) Descriptor() ([]byte, []int) {
6447
--	return fileDescriptorGenerated, []int{55}
6448
-+	return fileDescriptorGenerated, []int{56}
6449
- }
6450
- 
6451
- func (m *GitRepoVolumeSource) Reset()                    { *m = GitRepoVolumeSource{} }
6452
- func (*GitRepoVolumeSource) ProtoMessage()               {}
6453
--func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} }
6454
-+func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} }
6455
- 
6456
- func (m *GlusterfsVolumeSource) Reset()                    { *m = GlusterfsVolumeSource{} }
6457
- func (*GlusterfsVolumeSource) ProtoMessage()               {}
6458
--func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} }
6459
-+func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} }
6460
- 
6461
- func (m *HTTPGetAction) Reset()                    { *m = HTTPGetAction{} }
6462
- func (*HTTPGetAction) ProtoMessage()               {}
6463
--func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} }
6464
-+func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} }
6465
- 
6466
- func (m *HTTPHeader) Reset()                    { *m = HTTPHeader{} }
6467
- func (*HTTPHeader) ProtoMessage()               {}
6468
--func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} }
6469
-+func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} }
6470
- 
6471
- func (m *Handler) Reset()                    { *m = Handler{} }
6472
- func (*Handler) ProtoMessage()               {}
6473
--func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} }
6474
-+func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} }
6475
- 
6476
- func (m *HostAlias) Reset()                    { *m = HostAlias{} }
6477
- func (*HostAlias) ProtoMessage()               {}
6478
--func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} }
6479
-+func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} }
6480
- 
6481
- func (m *HostPathVolumeSource) Reset()                    { *m = HostPathVolumeSource{} }
6482
- func (*HostPathVolumeSource) ProtoMessage()               {}
6483
--func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} }
6484
-+func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} }
6485
- 
6486
- func (m *ISCSIPersistentVolumeSource) Reset()      { *m = ISCSIPersistentVolumeSource{} }
6487
- func (*ISCSIPersistentVolumeSource) ProtoMessage() {}
6488
- func (*ISCSIPersistentVolumeSource) Descriptor() ([]byte, []int) {
6489
--	return fileDescriptorGenerated, []int{63}
6490
-+	return fileDescriptorGenerated, []int{64}
6491
- }
6492
- 
6493
- func (m *ISCSIVolumeSource) Reset()                    { *m = ISCSIVolumeSource{} }
6494
- func (*ISCSIVolumeSource) ProtoMessage()               {}
6495
--func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} }
6496
-+func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} }
6497
- 
6498
- func (m *KeyToPath) Reset()                    { *m = KeyToPath{} }
6499
- func (*KeyToPath) ProtoMessage()               {}
6500
--func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} }
6501
-+func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} }
6502
- 
6503
- func (m *Lifecycle) Reset()                    { *m = Lifecycle{} }
6504
- func (*Lifecycle) ProtoMessage()               {}
6505
--func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} }
6506
-+func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} }
6507
- 
6508
- func (m *LimitRange) Reset()                    { *m = LimitRange{} }
6509
- func (*LimitRange) ProtoMessage()               {}
6510
--func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} }
6511
-+func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} }
6512
- 
6513
- func (m *LimitRangeItem) Reset()                    { *m = LimitRangeItem{} }
6514
- func (*LimitRangeItem) ProtoMessage()               {}
6515
--func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} }
6516
-+func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} }
6517
- 
6518
- func (m *LimitRangeList) Reset()                    { *m = LimitRangeList{} }
6519
- func (*LimitRangeList) ProtoMessage()               {}
6520
--func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} }
6521
-+func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} }
6522
- 
6523
- func (m *LimitRangeSpec) Reset()                    { *m = LimitRangeSpec{} }
6524
- func (*LimitRangeSpec) ProtoMessage()               {}
6525
--func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} }
6526
-+func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} }
6527
- 
6528
- func (m *List) Reset()                    { *m = List{} }
6529
- func (*List) ProtoMessage()               {}
6530
--func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} }
6531
-+func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} }
6532
- 
6533
- func (m *LoadBalancerIngress) Reset()                    { *m = LoadBalancerIngress{} }
6534
- func (*LoadBalancerIngress) ProtoMessage()               {}
6535
--func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} }
6536
-+func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} }
6537
- 
6538
- func (m *LoadBalancerStatus) Reset()                    { *m = LoadBalancerStatus{} }
6539
- func (*LoadBalancerStatus) ProtoMessage()               {}
6540
--func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} }
6541
-+func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} }
6542
- 
6543
- func (m *LocalObjectReference) Reset()                    { *m = LocalObjectReference{} }
6544
- func (*LocalObjectReference) ProtoMessage()               {}
6545
--func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} }
6546
-+func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} }
6547
- 
6548
- func (m *LocalVolumeSource) Reset()                    { *m = LocalVolumeSource{} }
6549
- func (*LocalVolumeSource) ProtoMessage()               {}
6550
--func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} }
6551
-+func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} }
6552
- 
6553
- func (m *NFSVolumeSource) Reset()                    { *m = NFSVolumeSource{} }
6554
- func (*NFSVolumeSource) ProtoMessage()               {}
6555
--func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} }
6556
-+func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} }
6557
- 
6558
- func (m *Namespace) Reset()                    { *m = Namespace{} }
6559
- func (*Namespace) ProtoMessage()               {}
6560
--func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} }
6561
-+func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} }
6562
- 
6563
- func (m *NamespaceList) Reset()                    { *m = NamespaceList{} }
6564
- func (*NamespaceList) ProtoMessage()               {}
6565
--func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} }
6566
-+func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} }
6567
- 
6568
- func (m *NamespaceSpec) Reset()                    { *m = NamespaceSpec{} }
6569
- func (*NamespaceSpec) ProtoMessage()               {}
6570
--func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} }
6571
-+func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} }
6572
- 
6573
- func (m *NamespaceStatus) Reset()                    { *m = NamespaceStatus{} }
6574
- func (*NamespaceStatus) ProtoMessage()               {}
6575
--func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} }
6576
-+func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} }
6577
- 
6578
- func (m *Node) Reset()                    { *m = Node{} }
6579
- func (*Node) ProtoMessage()               {}
6580
--func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} }
6581
-+func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} }
6582
- 
6583
- func (m *NodeAddress) Reset()                    { *m = NodeAddress{} }
6584
- func (*NodeAddress) ProtoMessage()               {}
6585
--func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} }
6586
-+func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} }
6587
- 
6588
- func (m *NodeAffinity) Reset()                    { *m = NodeAffinity{} }
6589
- func (*NodeAffinity) ProtoMessage()               {}
6590
--func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} }
6591
-+func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} }
6592
- 
6593
- func (m *NodeCondition) Reset()                    { *m = NodeCondition{} }
6594
- func (*NodeCondition) ProtoMessage()               {}
6595
--func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} }
6596
-+func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} }
6597
- 
6598
- func (m *NodeConfigSource) Reset()                    { *m = NodeConfigSource{} }
6599
- func (*NodeConfigSource) ProtoMessage()               {}
6600
--func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} }
6601
-+func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} }
6602
- 
6603
- func (m *NodeConfigStatus) Reset()                    { *m = NodeConfigStatus{} }
6604
- func (*NodeConfigStatus) ProtoMessage()               {}
6605
--func (*NodeConfigStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} }
6606
-+func (*NodeConfigStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} }
6607
- 
6608
- func (m *NodeDaemonEndpoints) Reset()                    { *m = NodeDaemonEndpoints{} }
6609
- func (*NodeDaemonEndpoints) ProtoMessage()               {}
6610
--func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} }
6611
-+func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} }
6612
- 
6613
- func (m *NodeList) Reset()                    { *m = NodeList{} }
6614
- func (*NodeList) ProtoMessage()               {}
6615
--func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} }
6616
-+func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} }
6617
- 
6618
- func (m *NodeProxyOptions) Reset()                    { *m = NodeProxyOptions{} }
6619
- func (*NodeProxyOptions) ProtoMessage()               {}
6620
--func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} }
6621
-+func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} }
6622
- 
6623
- func (m *NodeResources) Reset()                    { *m = NodeResources{} }
6624
- func (*NodeResources) ProtoMessage()               {}
6625
--func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} }
6626
-+func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} }
6627
- 
6628
- func (m *NodeSelector) Reset()                    { *m = NodeSelector{} }
6629
- func (*NodeSelector) ProtoMessage()               {}
6630
--func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} }
6631
-+func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} }
6632
- 
6633
- func (m *NodeSelectorRequirement) Reset()      { *m = NodeSelectorRequirement{} }
6634
- func (*NodeSelectorRequirement) ProtoMessage() {}
6635
- func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) {
6636
--	return fileDescriptorGenerated, []int{92}
6637
-+	return fileDescriptorGenerated, []int{93}
6638
- }
6639
- 
6640
- func (m *NodeSelectorTerm) Reset()                    { *m = NodeSelectorTerm{} }
6641
- func (*NodeSelectorTerm) ProtoMessage()               {}
6642
--func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} }
6643
-+func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} }
6644
- 
6645
- func (m *NodeSpec) Reset()                    { *m = NodeSpec{} }
6646
- func (*NodeSpec) ProtoMessage()               {}
6647
--func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} }
6648
-+func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} }
6649
- 
6650
- func (m *NodeStatus) Reset()                    { *m = NodeStatus{} }
6651
- func (*NodeStatus) ProtoMessage()               {}
6652
--func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} }
6653
-+func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} }
6654
- 
6655
- func (m *NodeSystemInfo) Reset()                    { *m = NodeSystemInfo{} }
6656
- func (*NodeSystemInfo) ProtoMessage()               {}
6657
--func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} }
6658
-+func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{97} }
6659
- 
6660
- func (m *ObjectFieldSelector) Reset()                    { *m = ObjectFieldSelector{} }
6661
- func (*ObjectFieldSelector) ProtoMessage()               {}
6662
--func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{97} }
6663
-+func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{98} }
6664
- 
6665
- func (m *ObjectReference) Reset()                    { *m = ObjectReference{} }
6666
- func (*ObjectReference) ProtoMessage()               {}
6667
--func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{98} }
6668
-+func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{99} }
6669
- 
6670
- func (m *PersistentVolume) Reset()                    { *m = PersistentVolume{} }
6671
- func (*PersistentVolume) ProtoMessage()               {}
6672
--func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{99} }
6673
-+func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{100} }
6674
- 
6675
- func (m *PersistentVolumeClaim) Reset()                    { *m = PersistentVolumeClaim{} }
6676
- func (*PersistentVolumeClaim) ProtoMessage()               {}
6677
--func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{100} }
6678
-+func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{101} }
6679
- 
6680
- func (m *PersistentVolumeClaimCondition) Reset()      { *m = PersistentVolumeClaimCondition{} }
6681
- func (*PersistentVolumeClaimCondition) ProtoMessage() {}
6682
- func (*PersistentVolumeClaimCondition) Descriptor() ([]byte, []int) {
6683
--	return fileDescriptorGenerated, []int{101}
6684
-+	return fileDescriptorGenerated, []int{102}
6685
- }
6686
- 
6687
- func (m *PersistentVolumeClaimList) Reset()      { *m = PersistentVolumeClaimList{} }
6688
- func (*PersistentVolumeClaimList) ProtoMessage() {}
6689
- func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) {
6690
--	return fileDescriptorGenerated, []int{102}
6691
-+	return fileDescriptorGenerated, []int{103}
6692
- }
6693
- 
6694
- func (m *PersistentVolumeClaimSpec) Reset()      { *m = PersistentVolumeClaimSpec{} }
6695
- func (*PersistentVolumeClaimSpec) ProtoMessage() {}
6696
- func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) {
6697
--	return fileDescriptorGenerated, []int{103}
6698
-+	return fileDescriptorGenerated, []int{104}
6699
- }
6700
- 
6701
- func (m *PersistentVolumeClaimStatus) Reset()      { *m = PersistentVolumeClaimStatus{} }
6702
- func (*PersistentVolumeClaimStatus) ProtoMessage() {}
6703
- func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) {
6704
--	return fileDescriptorGenerated, []int{104}
6705
-+	return fileDescriptorGenerated, []int{105}
6706
- }
6707
- 
6708
- func (m *PersistentVolumeClaimVolumeSource) Reset()      { *m = PersistentVolumeClaimVolumeSource{} }
6709
- func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {}
6710
- func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) {
6711
--	return fileDescriptorGenerated, []int{105}
6712
-+	return fileDescriptorGenerated, []int{106}
6713
- }
6714
- 
6715
- func (m *PersistentVolumeList) Reset()                    { *m = PersistentVolumeList{} }
6716
- func (*PersistentVolumeList) ProtoMessage()               {}
6717
--func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} }
6718
-+func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} }
6719
- 
6720
- func (m *PersistentVolumeSource) Reset()      { *m = PersistentVolumeSource{} }
6721
- func (*PersistentVolumeSource) ProtoMessage() {}
6722
- func (*PersistentVolumeSource) Descriptor() ([]byte, []int) {
6723
--	return fileDescriptorGenerated, []int{107}
6724
-+	return fileDescriptorGenerated, []int{108}
6725
- }
6726
- 
6727
- func (m *PersistentVolumeSpec) Reset()                    { *m = PersistentVolumeSpec{} }
6728
- func (*PersistentVolumeSpec) ProtoMessage()               {}
6729
--func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} }
6730
-+func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} }
6731
- 
6732
- func (m *PersistentVolumeStatus) Reset()      { *m = PersistentVolumeStatus{} }
6733
- func (*PersistentVolumeStatus) ProtoMessage() {}
6734
- func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) {
6735
--	return fileDescriptorGenerated, []int{109}
6736
-+	return fileDescriptorGenerated, []int{110}
6737
- }
6738
- 
6739
- func (m *PhotonPersistentDiskVolumeSource) Reset()      { *m = PhotonPersistentDiskVolumeSource{} }
6740
- func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {}
6741
- func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) {
6742
--	return fileDescriptorGenerated, []int{110}
6743
-+	return fileDescriptorGenerated, []int{111}
6744
- }
6745
- 
6746
- func (m *Pod) Reset()                    { *m = Pod{} }
6747
- func (*Pod) ProtoMessage()               {}
6748
--func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} }
6749
-+func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} }
6750
- 
6751
- func (m *PodAffinity) Reset()                    { *m = PodAffinity{} }
6752
- func (*PodAffinity) ProtoMessage()               {}
6753
--func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} }
6754
-+func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} }
6755
- 
6756
- func (m *PodAffinityTerm) Reset()                    { *m = PodAffinityTerm{} }
6757
- func (*PodAffinityTerm) ProtoMessage()               {}
6758
--func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} }
6759
-+func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} }
6760
- 
6761
- func (m *PodAntiAffinity) Reset()                    { *m = PodAntiAffinity{} }
6762
- func (*PodAntiAffinity) ProtoMessage()               {}
6763
--func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} }
6764
-+func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} }
6765
- 
6766
- func (m *PodAttachOptions) Reset()                    { *m = PodAttachOptions{} }
6767
- func (*PodAttachOptions) ProtoMessage()               {}
6768
--func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} }
6769
-+func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} }
6770
- 
6771
- func (m *PodCondition) Reset()                    { *m = PodCondition{} }
6772
- func (*PodCondition) ProtoMessage()               {}
6773
--func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} }
6774
-+func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} }
6775
- 
6776
- func (m *PodDNSConfig) Reset()                    { *m = PodDNSConfig{} }
6777
- func (*PodDNSConfig) ProtoMessage()               {}
6778
--func (*PodDNSConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} }
6779
-+func (*PodDNSConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} }
6780
- 
6781
- func (m *PodDNSConfigOption) Reset()                    { *m = PodDNSConfigOption{} }
6782
- func (*PodDNSConfigOption) ProtoMessage()               {}
6783
--func (*PodDNSConfigOption) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} }
6784
-+func (*PodDNSConfigOption) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} }
6785
- 
6786
- func (m *PodExecOptions) Reset()                    { *m = PodExecOptions{} }
6787
- func (*PodExecOptions) ProtoMessage()               {}
6788
--func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} }
6789
-+func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} }
6790
- 
6791
- func (m *PodList) Reset()                    { *m = PodList{} }
6792
- func (*PodList) ProtoMessage()               {}
6793
--func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} }
6794
-+func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} }
6795
- 
6796
- func (m *PodLogOptions) Reset()                    { *m = PodLogOptions{} }
6797
- func (*PodLogOptions) ProtoMessage()               {}
6798
--func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} }
6799
-+func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} }
6800
- 
6801
- func (m *PodPortForwardOptions) Reset()                    { *m = PodPortForwardOptions{} }
6802
- func (*PodPortForwardOptions) ProtoMessage()               {}
6803
--func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} }
6804
-+func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} }
6805
- 
6806
- func (m *PodProxyOptions) Reset()                    { *m = PodProxyOptions{} }
6807
- func (*PodProxyOptions) ProtoMessage()               {}
6808
--func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} }
6809
-+func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} }
6810
- 
6811
- func (m *PodReadinessGate) Reset()                    { *m = PodReadinessGate{} }
6812
- func (*PodReadinessGate) ProtoMessage()               {}
6813
--func (*PodReadinessGate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} }
6814
-+func (*PodReadinessGate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} }
6815
- 
6816
- func (m *PodSecurityContext) Reset()                    { *m = PodSecurityContext{} }
6817
- func (*PodSecurityContext) ProtoMessage()               {}
6818
--func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} }
6819
-+func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} }
6820
- 
6821
- func (m *PodSignature) Reset()                    { *m = PodSignature{} }
6822
- func (*PodSignature) ProtoMessage()               {}
6823
--func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} }
6824
-+func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} }
6825
- 
6826
- func (m *PodSpec) Reset()                    { *m = PodSpec{} }
6827
- func (*PodSpec) ProtoMessage()               {}
6828
--func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} }
6829
-+func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} }
6830
- 
6831
- func (m *PodStatus) Reset()                    { *m = PodStatus{} }
6832
- func (*PodStatus) ProtoMessage()               {}
6833
--func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} }
6834
-+func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} }
6835
- 
6836
- func (m *PodStatusResult) Reset()                    { *m = PodStatusResult{} }
6837
- func (*PodStatusResult) ProtoMessage()               {}
6838
--func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} }
6839
-+func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} }
6840
- 
6841
- func (m *PodTemplate) Reset()                    { *m = PodTemplate{} }
6842
- func (*PodTemplate) ProtoMessage()               {}
6843
--func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} }
6844
-+func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} }
6845
- 
6846
- func (m *PodTemplateList) Reset()                    { *m = PodTemplateList{} }
6847
- func (*PodTemplateList) ProtoMessage()               {}
6848
--func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} }
6849
-+func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} }
6850
- 
6851
- func (m *PodTemplateSpec) Reset()                    { *m = PodTemplateSpec{} }
6852
- func (*PodTemplateSpec) ProtoMessage()               {}
6853
--func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} }
6854
-+func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} }
6855
- 
6856
- func (m *PortworxVolumeSource) Reset()                    { *m = PortworxVolumeSource{} }
6857
- func (*PortworxVolumeSource) ProtoMessage()               {}
6858
--func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} }
6859
-+func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} }
6860
- 
6861
- func (m *Preconditions) Reset()                    { *m = Preconditions{} }
6862
- func (*Preconditions) ProtoMessage()               {}
6863
--func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} }
6864
-+func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} }
6865
- 
6866
- func (m *PreferAvoidPodsEntry) Reset()                    { *m = PreferAvoidPodsEntry{} }
6867
- func (*PreferAvoidPodsEntry) ProtoMessage()               {}
6868
--func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} }
6869
-+func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} }
6870
- 
6871
- func (m *PreferredSchedulingTerm) Reset()      { *m = PreferredSchedulingTerm{} }
6872
- func (*PreferredSchedulingTerm) ProtoMessage() {}
6873
- func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) {
6874
--	return fileDescriptorGenerated, []int{136}
6875
-+	return fileDescriptorGenerated, []int{137}
6876
- }
6877
- 
6878
- func (m *Probe) Reset()                    { *m = Probe{} }
6879
- func (*Probe) ProtoMessage()               {}
6880
--func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} }
6881
-+func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} }
6882
- 
6883
- func (m *ProjectedVolumeSource) Reset()                    { *m = ProjectedVolumeSource{} }
6884
- func (*ProjectedVolumeSource) ProtoMessage()               {}
6885
--func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} }
6886
-+func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} }
6887
- 
6888
- func (m *QuobyteVolumeSource) Reset()                    { *m = QuobyteVolumeSource{} }
6889
- func (*QuobyteVolumeSource) ProtoMessage()               {}
6890
--func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} }
6891
-+func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} }
6892
- 
6893
- func (m *RBDPersistentVolumeSource) Reset()      { *m = RBDPersistentVolumeSource{} }
6894
- func (*RBDPersistentVolumeSource) ProtoMessage() {}
6895
- func (*RBDPersistentVolumeSource) Descriptor() ([]byte, []int) {
6896
--	return fileDescriptorGenerated, []int{140}
6897
-+	return fileDescriptorGenerated, []int{141}
6898
- }
6899
- 
6900
- func (m *RBDVolumeSource) Reset()                    { *m = RBDVolumeSource{} }
6901
- func (*RBDVolumeSource) ProtoMessage()               {}
6902
--func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} }
6903
-+func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} }
6904
- 
6905
- func (m *RangeAllocation) Reset()                    { *m = RangeAllocation{} }
6906
- func (*RangeAllocation) ProtoMessage()               {}
6907
--func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} }
6908
-+func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} }
6909
- 
6910
- func (m *ReplicationController) Reset()                    { *m = ReplicationController{} }
6911
- func (*ReplicationController) ProtoMessage()               {}
6912
--func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} }
6913
-+func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} }
6914
- 
6915
- func (m *ReplicationControllerCondition) Reset()      { *m = ReplicationControllerCondition{} }
6916
- func (*ReplicationControllerCondition) ProtoMessage() {}
6917
- func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) {
6918
--	return fileDescriptorGenerated, []int{144}
6919
-+	return fileDescriptorGenerated, []int{145}
6920
- }
6921
- 
6922
- func (m *ReplicationControllerList) Reset()      { *m = ReplicationControllerList{} }
6923
- func (*ReplicationControllerList) ProtoMessage() {}
6924
- func (*ReplicationControllerList) Descriptor() ([]byte, []int) {
6925
--	return fileDescriptorGenerated, []int{145}
6926
-+	return fileDescriptorGenerated, []int{146}
6927
- }
6928
- 
6929
- func (m *ReplicationControllerSpec) Reset()      { *m = ReplicationControllerSpec{} }
6930
- func (*ReplicationControllerSpec) ProtoMessage() {}
6931
- func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) {
6932
--	return fileDescriptorGenerated, []int{146}
6933
-+	return fileDescriptorGenerated, []int{147}
6934
- }
6935
- 
6936
- func (m *ReplicationControllerStatus) Reset()      { *m = ReplicationControllerStatus{} }
6937
- func (*ReplicationControllerStatus) ProtoMessage() {}
6938
- func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) {
6939
--	return fileDescriptorGenerated, []int{147}
6940
-+	return fileDescriptorGenerated, []int{148}
6941
- }
6942
- 
6943
- func (m *ResourceFieldSelector) Reset()                    { *m = ResourceFieldSelector{} }
6944
- func (*ResourceFieldSelector) ProtoMessage()               {}
6945
--func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} }
6946
-+func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} }
6947
- 
6948
- func (m *ResourceQuota) Reset()                    { *m = ResourceQuota{} }
6949
- func (*ResourceQuota) ProtoMessage()               {}
6950
--func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} }
6951
-+func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} }
6952
- 
6953
- func (m *ResourceQuotaList) Reset()                    { *m = ResourceQuotaList{} }
6954
- func (*ResourceQuotaList) ProtoMessage()               {}
6955
--func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} }
6956
-+func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} }
6957
- 
6958
- func (m *ResourceQuotaSpec) Reset()                    { *m = ResourceQuotaSpec{} }
6959
- func (*ResourceQuotaSpec) ProtoMessage()               {}
6960
--func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} }
6961
-+func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} }
6962
- 
6963
- func (m *ResourceQuotaStatus) Reset()                    { *m = ResourceQuotaStatus{} }
6964
- func (*ResourceQuotaStatus) ProtoMessage()               {}
6965
--func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} }
6966
-+func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} }
6967
- 
6968
- func (m *ResourceRequirements) Reset()                    { *m = ResourceRequirements{} }
6969
- func (*ResourceRequirements) ProtoMessage()               {}
6970
--func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} }
6971
-+func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} }
6972
- 
6973
- func (m *SELinuxOptions) Reset()                    { *m = SELinuxOptions{} }
6974
- func (*SELinuxOptions) ProtoMessage()               {}
6975
--func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} }
6976
-+func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} }
6977
- 
6978
- func (m *ScaleIOPersistentVolumeSource) Reset()      { *m = ScaleIOPersistentVolumeSource{} }
6979
- func (*ScaleIOPersistentVolumeSource) ProtoMessage() {}
6980
- func (*ScaleIOPersistentVolumeSource) Descriptor() ([]byte, []int) {
6981
--	return fileDescriptorGenerated, []int{155}
6982
-+	return fileDescriptorGenerated, []int{156}
6983
- }
6984
- 
6985
- func (m *ScaleIOVolumeSource) Reset()                    { *m = ScaleIOVolumeSource{} }
6986
- func (*ScaleIOVolumeSource) ProtoMessage()               {}
6987
--func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} }
6988
-+func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} }
6989
- 
6990
- func (m *ScopeSelector) Reset()                    { *m = ScopeSelector{} }
6991
- func (*ScopeSelector) ProtoMessage()               {}
6992
--func (*ScopeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} }
6993
-+func (*ScopeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} }
6994
- 
6995
- func (m *ScopedResourceSelectorRequirement) Reset()      { *m = ScopedResourceSelectorRequirement{} }
6996
- func (*ScopedResourceSelectorRequirement) ProtoMessage() {}
6997
- func (*ScopedResourceSelectorRequirement) Descriptor() ([]byte, []int) {
6998
--	return fileDescriptorGenerated, []int{158}
6999
-+	return fileDescriptorGenerated, []int{159}
7000
- }
7001
- 
7002
- func (m *Secret) Reset()                    { *m = Secret{} }
7003
- func (*Secret) ProtoMessage()               {}
7004
--func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} }
7005
-+func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} }
7006
- 
7007
- func (m *SecretEnvSource) Reset()                    { *m = SecretEnvSource{} }
7008
- func (*SecretEnvSource) ProtoMessage()               {}
7009
--func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} }
7010
-+func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} }
7011
- 
7012
- func (m *SecretKeySelector) Reset()                    { *m = SecretKeySelector{} }
7013
- func (*SecretKeySelector) ProtoMessage()               {}
7014
--func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} }
7015
-+func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} }
7016
- 
7017
- func (m *SecretList) Reset()                    { *m = SecretList{} }
7018
- func (*SecretList) ProtoMessage()               {}
7019
--func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} }
7020
-+func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} }
7021
- 
7022
- func (m *SecretProjection) Reset()                    { *m = SecretProjection{} }
7023
- func (*SecretProjection) ProtoMessage()               {}
7024
--func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} }
7025
-+func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} }
7026
- 
7027
- func (m *SecretReference) Reset()                    { *m = SecretReference{} }
7028
- func (*SecretReference) ProtoMessage()               {}
7029
--func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} }
7030
-+func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} }
7031
- 
7032
- func (m *SecretVolumeSource) Reset()                    { *m = SecretVolumeSource{} }
7033
- func (*SecretVolumeSource) ProtoMessage()               {}
7034
--func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} }
7035
-+func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} }
7036
- 
7037
- func (m *SecurityContext) Reset()                    { *m = SecurityContext{} }
7038
- func (*SecurityContext) ProtoMessage()               {}
7039
--func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} }
7040
-+func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} }
7041
- 
7042
- func (m *SerializedReference) Reset()                    { *m = SerializedReference{} }
7043
- func (*SerializedReference) ProtoMessage()               {}
7044
--func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} }
7045
-+func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} }
7046
- 
7047
- func (m *Service) Reset()                    { *m = Service{} }
7048
- func (*Service) ProtoMessage()               {}
7049
--func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} }
7050
-+func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} }
7051
- 
7052
- func (m *ServiceAccount) Reset()                    { *m = ServiceAccount{} }
7053
- func (*ServiceAccount) ProtoMessage()               {}
7054
--func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} }
7055
-+func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} }
7056
- 
7057
- func (m *ServiceAccountList) Reset()                    { *m = ServiceAccountList{} }
7058
- func (*ServiceAccountList) ProtoMessage()               {}
7059
--func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} }
7060
-+func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{171} }
7061
- 
7062
- func (m *ServiceAccountTokenProjection) Reset()      { *m = ServiceAccountTokenProjection{} }
7063
- func (*ServiceAccountTokenProjection) ProtoMessage() {}
7064
- func (*ServiceAccountTokenProjection) Descriptor() ([]byte, []int) {
7065
--	return fileDescriptorGenerated, []int{171}
7066
-+	return fileDescriptorGenerated, []int{172}
7067
- }
7068
- 
7069
- func (m *ServiceList) Reset()                    { *m = ServiceList{} }
7070
- func (*ServiceList) ProtoMessage()               {}
7071
--func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} }
7072
-+func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} }
7073
- 
7074
- func (m *ServicePort) Reset()                    { *m = ServicePort{} }
7075
- func (*ServicePort) ProtoMessage()               {}
7076
--func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} }
7077
-+func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} }
7078
- 
7079
- func (m *ServiceProxyOptions) Reset()                    { *m = ServiceProxyOptions{} }
7080
- func (*ServiceProxyOptions) ProtoMessage()               {}
7081
--func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} }
7082
-+func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} }
7083
- 
7084
- func (m *ServiceSpec) Reset()                    { *m = ServiceSpec{} }
7085
- func (*ServiceSpec) ProtoMessage()               {}
7086
--func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} }
7087
-+func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{176} }
7088
- 
7089
- func (m *ServiceStatus) Reset()                    { *m = ServiceStatus{} }
7090
- func (*ServiceStatus) ProtoMessage()               {}
7091
--func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{176} }
7092
-+func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} }
7093
- 
7094
- func (m *SessionAffinityConfig) Reset()                    { *m = SessionAffinityConfig{} }
7095
- func (*SessionAffinityConfig) ProtoMessage()               {}
7096
--func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} }
7097
-+func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{178} }
7098
- 
7099
- func (m *StorageOSPersistentVolumeSource) Reset()      { *m = StorageOSPersistentVolumeSource{} }
7100
- func (*StorageOSPersistentVolumeSource) ProtoMessage() {}
7101
- func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) {
7102
--	return fileDescriptorGenerated, []int{178}
7103
-+	return fileDescriptorGenerated, []int{179}
7104
- }
7105
- 
7106
- func (m *StorageOSVolumeSource) Reset()                    { *m = StorageOSVolumeSource{} }
7107
- func (*StorageOSVolumeSource) ProtoMessage()               {}
7108
--func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{179} }
7109
-+func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{180} }
7110
- 
7111
- func (m *Sysctl) Reset()                    { *m = Sysctl{} }
7112
- func (*Sysctl) ProtoMessage()               {}
7113
--func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{180} }
7114
-+func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{181} }
7115
- 
7116
- func (m *TCPSocketAction) Reset()                    { *m = TCPSocketAction{} }
7117
- func (*TCPSocketAction) ProtoMessage()               {}
7118
--func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{181} }
7119
-+func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{182} }
7120
- 
7121
- func (m *Taint) Reset()                    { *m = Taint{} }
7122
- func (*Taint) ProtoMessage()               {}
7123
--func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{182} }
7124
-+func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{183} }
7125
- 
7126
- func (m *Toleration) Reset()                    { *m = Toleration{} }
7127
- func (*Toleration) ProtoMessage()               {}
7128
--func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{183} }
7129
-+func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{184} }
7130
- 
7131
- func (m *TopologySelectorLabelRequirement) Reset()      { *m = TopologySelectorLabelRequirement{} }
7132
- func (*TopologySelectorLabelRequirement) ProtoMessage() {}
7133
- func (*TopologySelectorLabelRequirement) Descriptor() ([]byte, []int) {
7134
--	return fileDescriptorGenerated, []int{184}
7135
-+	return fileDescriptorGenerated, []int{185}
7136
- }
7137
- 
7138
- func (m *TopologySelectorTerm) Reset()                    { *m = TopologySelectorTerm{} }
7139
- func (*TopologySelectorTerm) ProtoMessage()               {}
7140
--func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{185} }
7141
-+func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{186} }
7142
- 
7143
- func (m *Volume) Reset()                    { *m = Volume{} }
7144
- func (*Volume) ProtoMessage()               {}
7145
--func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{186} }
7146
-+func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{187} }
7147
- 
7148
- func (m *VolumeDevice) Reset()                    { *m = VolumeDevice{} }
7149
- func (*VolumeDevice) ProtoMessage()               {}
7150
--func (*VolumeDevice) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{187} }
7151
-+func (*VolumeDevice) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{188} }
7152
- 
7153
- func (m *VolumeMount) Reset()                    { *m = VolumeMount{} }
7154
- func (*VolumeMount) ProtoMessage()               {}
7155
--func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{188} }
7156
-+func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{189} }
7157
- 
7158
- func (m *VolumeNodeAffinity) Reset()                    { *m = VolumeNodeAffinity{} }
7159
- func (*VolumeNodeAffinity) ProtoMessage()               {}
7160
--func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{189} }
7161
-+func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{190} }
7162
- 
7163
- func (m *VolumeProjection) Reset()                    { *m = VolumeProjection{} }
7164
- func (*VolumeProjection) ProtoMessage()               {}
7165
--func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{190} }
7166
-+func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{191} }
7167
- 
7168
- func (m *VolumeSource) Reset()                    { *m = VolumeSource{} }
7169
- func (*VolumeSource) ProtoMessage()               {}
7170
--func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{191} }
7171
-+func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{192} }
7172
- 
7173
- func (m *VsphereVirtualDiskVolumeSource) Reset()      { *m = VsphereVirtualDiskVolumeSource{} }
7174
- func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {}
7175
- func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) {
7176
--	return fileDescriptorGenerated, []int{192}
7177
-+	return fileDescriptorGenerated, []int{193}
7178
- }
7179
- 
7180
- func (m *WeightedPodAffinityTerm) Reset()      { *m = WeightedPodAffinityTerm{} }
7181
- func (*WeightedPodAffinityTerm) ProtoMessage() {}
7182
- func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) {
7183
--	return fileDescriptorGenerated, []int{193}
7184
-+	return fileDescriptorGenerated, []int{194}
7185
- }
7186
- 
7187
- func init() {
7188
-@@ -1103,6 +1110,7 @@ func init() {
7189
- 	proto.RegisterType((*Binding)(nil), "k8s.io.api.core.v1.Binding")
7190
- 	proto.RegisterType((*CSIPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CSIPersistentVolumeSource")
7191
- 	proto.RegisterType((*Capabilities)(nil), "k8s.io.api.core.v1.Capabilities")
7192
-+	proto.RegisterType((*CascadeDiskVolumeSource)(nil), "k8s.io.api.core.v1.CascadeDiskVolumeSource")
7193
- 	proto.RegisterType((*CephFSPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CephFSPersistentVolumeSource")
7194
- 	proto.RegisterType((*CephFSVolumeSource)(nil), "k8s.io.api.core.v1.CephFSVolumeSource")
7195
- 	proto.RegisterType((*CinderPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CinderPersistentVolumeSource")
7196
-@@ -1729,6 +1737,32 @@ func (m *Capabilities) MarshalTo(dAtA []byte) (int, error) {
7197
- 	return i, nil
7198
- }
7199
- 
7200
-+func (m *CascadeDiskVolumeSource) Marshal() (dAtA []byte, err error) {
7201
-+	size := m.Size()
7202
-+	dAtA = make([]byte, size)
7203
-+	n, err := m.MarshalTo(dAtA)
7204
-+	if err != nil {
7205
-+		return nil, err
7206
-+	}
7207
-+	return dAtA[:n], nil
7208
-+}
7209
-+
7210
-+func (m *CascadeDiskVolumeSource) MarshalTo(dAtA []byte) (int, error) {
7211
-+	var i int
7212
-+	_ = i
7213
-+	var l int
7214
-+	_ = l
7215
-+	dAtA[i] = 0xa
7216
-+	i++
7217
-+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.DiskID)))
7218
-+	i += copy(dAtA[i:], m.DiskID)
7219
-+	dAtA[i] = 0x12
7220
-+	i++
7221
-+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.FSType)))
7222
-+	i += copy(dAtA[i:], m.FSType)
7223
-+	return i, nil
7224
-+}
7225
-+
7226
- func (m *CephFSPersistentVolumeSource) Marshal() (dAtA []byte, err error) {
7227
- 	size := m.Size()
7228
- 	dAtA = make([]byte, size)
7229
-@@ -6404,13 +6438,13 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) {
7230
- 		}
7231
- 		i += n126
7232
- 	}
7233
--	if m.AzureDisk != nil {
7234
-+	if m.CascadeDisk != nil {
7235
- 		dAtA[i] = 0x82
7236
- 		i++
7237
- 		dAtA[i] = 0x1
7238
- 		i++
7239
--		i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size()))
7240
--		n127, err := m.AzureDisk.MarshalTo(dAtA[i:])
7241
-+		i = encodeVarintGenerated(dAtA, i, uint64(m.CascadeDisk.Size()))
7242
-+		n127, err := m.CascadeDisk.MarshalTo(dAtA[i:])
7243
- 		if err != nil {
7244
- 			return 0, err
7245
- 		}
7246
-@@ -6488,6 +6522,18 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) {
7247
- 		}
7248
- 		i += n133
7249
- 	}
7250
-+	if m.AzureDisk != nil {
7251
-+		dAtA[i] = 0xba
7252
-+		i++
7253
-+		dAtA[i] = 0x1
7254
-+		i++
7255
-+		i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size()))
7256
-+		n134, err := m.AzureDisk.MarshalTo(dAtA[i:])
7257
-+		if err != nil {
7258
-+			return 0, err
7259
-+		}
7260
-+		i += n134
7261
-+	}
7262
- 	return i, nil
7263
- }
7264
- 
7265
-@@ -6530,21 +6576,21 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) {
7266
- 			dAtA[i] = 0x12
7267
- 			i++
7268
- 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
7269
--			n134, err := (&v).MarshalTo(dAtA[i:])
7270
-+			n135, err := (&v).MarshalTo(dAtA[i:])
7271
- 			if err != nil {
7272
- 				return 0, err
7273
- 			}
7274
--			i += n134
7275
-+			i += n135
7276
- 		}
7277
- 	}
7278
- 	dAtA[i] = 0x12
7279
- 	i++
7280
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeSource.Size()))
7281
--	n135, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:])
7282
-+	n136, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:])
7283
- 	if err != nil {
7284
- 		return 0, err
7285
- 	}
7286
--	i += n135
7287
-+	i += n136
7288
- 	if len(m.AccessModes) > 0 {
7289
- 		for _, s := range m.AccessModes {
7290
- 			dAtA[i] = 0x1a
7291
-@@ -6564,11 +6610,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) {
7292
- 		dAtA[i] = 0x22
7293
- 		i++
7294
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.ClaimRef.Size()))
7295
--		n136, err := m.ClaimRef.MarshalTo(dAtA[i:])
7296
-+		n137, err := m.ClaimRef.MarshalTo(dAtA[i:])
7297
- 		if err != nil {
7298
- 			return 0, err
7299
- 		}
7300
--		i += n136
7301
-+		i += n137
7302
- 	}
7303
- 	dAtA[i] = 0x2a
7304
- 	i++
7305
-@@ -6603,11 +6649,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) {
7306
- 		dAtA[i] = 0x4a
7307
- 		i++
7308
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.NodeAffinity.Size()))
7309
--		n137, err := m.NodeAffinity.MarshalTo(dAtA[i:])
7310
-+		n138, err := m.NodeAffinity.MarshalTo(dAtA[i:])
7311
- 		if err != nil {
7312
- 			return 0, err
7313
- 		}
7314
--		i += n137
7315
-+		i += n138
7316
- 	}
7317
- 	return i, nil
7318
- }
7319
-@@ -6686,27 +6732,27 @@ func (m *Pod) MarshalTo(dAtA []byte) (int, error) {
7320
- 	dAtA[i] = 0xa
7321
- 	i++
7322
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7323
--	n138, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7324
-+	n139, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7325
- 	if err != nil {
7326
- 		return 0, err
7327
- 	}
7328
--	i += n138
7329
-+	i += n139
7330
- 	dAtA[i] = 0x12
7331
- 	i++
7332
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size()))
7333
--	n139, err := m.Spec.MarshalTo(dAtA[i:])
7334
-+	n140, err := m.Spec.MarshalTo(dAtA[i:])
7335
- 	if err != nil {
7336
- 		return 0, err
7337
- 	}
7338
--	i += n139
7339
-+	i += n140
7340
- 	dAtA[i] = 0x1a
7341
- 	i++
7342
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size()))
7343
--	n140, err := m.Status.MarshalTo(dAtA[i:])
7344
-+	n141, err := m.Status.MarshalTo(dAtA[i:])
7345
- 	if err != nil {
7346
- 		return 0, err
7347
- 	}
7348
--	i += n140
7349
-+	i += n141
7350
- 	return i, nil
7351
- }
7352
- 
7353
-@@ -6771,11 +6817,11 @@ func (m *PodAffinityTerm) MarshalTo(dAtA []byte) (int, error) {
7354
- 		dAtA[i] = 0xa
7355
- 		i++
7356
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.LabelSelector.Size()))
7357
--		n141, err := m.LabelSelector.MarshalTo(dAtA[i:])
7358
-+		n142, err := m.LabelSelector.MarshalTo(dAtA[i:])
7359
- 		if err != nil {
7360
- 			return 0, err
7361
- 		}
7362
--		i += n141
7363
-+		i += n142
7364
- 	}
7365
- 	if len(m.Namespaces) > 0 {
7366
- 		for _, s := range m.Namespaces {
7367
-@@ -6921,19 +6967,19 @@ func (m *PodCondition) MarshalTo(dAtA []byte) (int, error) {
7368
- 	dAtA[i] = 0x1a
7369
- 	i++
7370
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.LastProbeTime.Size()))
7371
--	n142, err := m.LastProbeTime.MarshalTo(dAtA[i:])
7372
-+	n143, err := m.LastProbeTime.MarshalTo(dAtA[i:])
7373
- 	if err != nil {
7374
- 		return 0, err
7375
- 	}
7376
--	i += n142
7377
-+	i += n143
7378
- 	dAtA[i] = 0x22
7379
- 	i++
7380
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size()))
7381
--	n143, err := m.LastTransitionTime.MarshalTo(dAtA[i:])
7382
-+	n144, err := m.LastTransitionTime.MarshalTo(dAtA[i:])
7383
- 	if err != nil {
7384
- 		return 0, err
7385
- 	}
7386
--	i += n143
7387
-+	i += n144
7388
- 	dAtA[i] = 0x2a
7389
- 	i++
7390
- 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason)))
7391
-@@ -7120,11 +7166,11 @@ func (m *PodList) MarshalTo(dAtA []byte) (int, error) {
7392
- 	dAtA[i] = 0xa
7393
- 	i++
7394
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
7395
--	n144, err := m.ListMeta.MarshalTo(dAtA[i:])
7396
-+	n145, err := m.ListMeta.MarshalTo(dAtA[i:])
7397
- 	if err != nil {
7398
- 		return 0, err
7399
- 	}
7400
--	i += n144
7401
-+	i += n145
7402
- 	if len(m.Items) > 0 {
7403
- 		for _, msg := range m.Items {
7404
- 			dAtA[i] = 0x12
7405
-@@ -7184,11 +7230,11 @@ func (m *PodLogOptions) MarshalTo(dAtA []byte) (int, error) {
7406
- 		dAtA[i] = 0x2a
7407
- 		i++
7408
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.SinceTime.Size()))
7409
--		n145, err := m.SinceTime.MarshalTo(dAtA[i:])
7410
-+		n146, err := m.SinceTime.MarshalTo(dAtA[i:])
7411
- 		if err != nil {
7412
- 			return 0, err
7413
- 		}
7414
--		i += n145
7415
-+		i += n146
7416
- 	}
7417
- 	dAtA[i] = 0x30
7418
- 	i++
7419
-@@ -7299,11 +7345,11 @@ func (m *PodSecurityContext) MarshalTo(dAtA []byte) (int, error) {
7420
- 		dAtA[i] = 0xa
7421
- 		i++
7422
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size()))
7423
--		n146, err := m.SELinuxOptions.MarshalTo(dAtA[i:])
7424
-+		n147, err := m.SELinuxOptions.MarshalTo(dAtA[i:])
7425
- 		if err != nil {
7426
- 			return 0, err
7427
- 		}
7428
--		i += n146
7429
-+		i += n147
7430
- 	}
7431
- 	if m.RunAsUser != nil {
7432
- 		dAtA[i] = 0x10
7433
-@@ -7371,11 +7417,11 @@ func (m *PodSignature) MarshalTo(dAtA []byte) (int, error) {
7434
- 		dAtA[i] = 0xa
7435
- 		i++
7436
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.PodController.Size()))
7437
--		n147, err := m.PodController.MarshalTo(dAtA[i:])
7438
-+		n148, err := m.PodController.MarshalTo(dAtA[i:])
7439
- 		if err != nil {
7440
- 			return 0, err
7441
- 		}
7442
--		i += n147
7443
-+		i += n148
7444
- 	}
7445
- 	return i, nil
7446
- }
7447
-@@ -7499,11 +7545,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) {
7448
- 		dAtA[i] = 0x72
7449
- 		i++
7450
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecurityContext.Size()))
7451
--		n148, err := m.SecurityContext.MarshalTo(dAtA[i:])
7452
-+		n149, err := m.SecurityContext.MarshalTo(dAtA[i:])
7453
- 		if err != nil {
7454
- 			return 0, err
7455
- 		}
7456
--		i += n148
7457
-+		i += n149
7458
- 	}
7459
- 	if len(m.ImagePullSecrets) > 0 {
7460
- 		for _, msg := range m.ImagePullSecrets {
7461
-@@ -7535,11 +7581,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) {
7462
- 		dAtA[i] = 0x1
7463
- 		i++
7464
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.Affinity.Size()))
7465
--		n149, err := m.Affinity.MarshalTo(dAtA[i:])
7466
-+		n150, err := m.Affinity.MarshalTo(dAtA[i:])
7467
- 		if err != nil {
7468
- 			return 0, err
7469
- 		}
7470
--		i += n149
7471
-+		i += n150
7472
- 	}
7473
- 	dAtA[i] = 0x9a
7474
- 	i++
7475
-@@ -7620,11 +7666,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) {
7476
- 		dAtA[i] = 0x1
7477
- 		i++
7478
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.DNSConfig.Size()))
7479
--		n150, err := m.DNSConfig.MarshalTo(dAtA[i:])
7480
-+		n151, err := m.DNSConfig.MarshalTo(dAtA[i:])
7481
- 		if err != nil {
7482
- 			return 0, err
7483
- 		}
7484
--		i += n150
7485
-+		i += n151
7486
- 	}
7487
- 	if m.ShareProcessNamespace != nil {
7488
- 		dAtA[i] = 0xd8
7489
-@@ -7706,11 +7752,11 @@ func (m *PodStatus) MarshalTo(dAtA []byte) (int, error) {
7490
- 		dAtA[i] = 0x3a
7491
- 		i++
7492
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.StartTime.Size()))
7493
--		n151, err := m.StartTime.MarshalTo(dAtA[i:])
7494
-+		n152, err := m.StartTime.MarshalTo(dAtA[i:])
7495
- 		if err != nil {
7496
- 			return 0, err
7497
- 		}
7498
--		i += n151
7499
-+		i += n152
7500
- 	}
7501
- 	if len(m.ContainerStatuses) > 0 {
7502
- 		for _, msg := range m.ContainerStatuses {
7503
-@@ -7765,19 +7811,19 @@ func (m *PodStatusResult) MarshalTo(dAtA []byte) (int, error) {
7504
- 	dAtA[i] = 0xa
7505
- 	i++
7506
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7507
--	n152, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7508
-+	n153, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7509
- 	if err != nil {
7510
- 		return 0, err
7511
- 	}
7512
--	i += n152
7513
-+	i += n153
7514
- 	dAtA[i] = 0x12
7515
- 	i++
7516
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size()))
7517
--	n153, err := m.Status.MarshalTo(dAtA[i:])
7518
-+	n154, err := m.Status.MarshalTo(dAtA[i:])
7519
- 	if err != nil {
7520
- 		return 0, err
7521
- 	}
7522
--	i += n153
7523
-+	i += n154
7524
- 	return i, nil
7525
- }
7526
- 
7527
-@@ -7799,19 +7845,19 @@ func (m *PodTemplate) MarshalTo(dAtA []byte) (int, error) {
7528
- 	dAtA[i] = 0xa
7529
- 	i++
7530
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7531
--	n154, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7532
-+	n155, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7533
- 	if err != nil {
7534
- 		return 0, err
7535
- 	}
7536
--	i += n154
7537
-+	i += n155
7538
- 	dAtA[i] = 0x12
7539
- 	i++
7540
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size()))
7541
--	n155, err := m.Template.MarshalTo(dAtA[i:])
7542
-+	n156, err := m.Template.MarshalTo(dAtA[i:])
7543
- 	if err != nil {
7544
- 		return 0, err
7545
- 	}
7546
--	i += n155
7547
-+	i += n156
7548
- 	return i, nil
7549
- }
7550
- 
7551
-@@ -7833,11 +7879,11 @@ func (m *PodTemplateList) MarshalTo(dAtA []byte) (int, error) {
7552
- 	dAtA[i] = 0xa
7553
- 	i++
7554
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
7555
--	n156, err := m.ListMeta.MarshalTo(dAtA[i:])
7556
-+	n157, err := m.ListMeta.MarshalTo(dAtA[i:])
7557
- 	if err != nil {
7558
- 		return 0, err
7559
- 	}
7560
--	i += n156
7561
-+	i += n157
7562
- 	if len(m.Items) > 0 {
7563
- 		for _, msg := range m.Items {
7564
- 			dAtA[i] = 0x12
7565
-@@ -7871,19 +7917,19 @@ func (m *PodTemplateSpec) MarshalTo(dAtA []byte) (int, error) {
7566
- 	dAtA[i] = 0xa
7567
- 	i++
7568
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7569
--	n157, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7570
-+	n158, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7571
- 	if err != nil {
7572
- 		return 0, err
7573
- 	}
7574
--	i += n157
7575
-+	i += n158
7576
- 	dAtA[i] = 0x12
7577
- 	i++
7578
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size()))
7579
--	n158, err := m.Spec.MarshalTo(dAtA[i:])
7580
-+	n159, err := m.Spec.MarshalTo(dAtA[i:])
7581
- 	if err != nil {
7582
- 		return 0, err
7583
- 	}
7584
--	i += n158
7585
-+	i += n159
7586
- 	return i, nil
7587
- }
7588
- 
7589
-@@ -7963,19 +8009,19 @@ func (m *PreferAvoidPodsEntry) MarshalTo(dAtA []byte) (int, error) {
7590
- 	dAtA[i] = 0xa
7591
- 	i++
7592
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.PodSignature.Size()))
7593
--	n159, err := m.PodSignature.MarshalTo(dAtA[i:])
7594
-+	n160, err := m.PodSignature.MarshalTo(dAtA[i:])
7595
- 	if err != nil {
7596
- 		return 0, err
7597
- 	}
7598
--	i += n159
7599
-+	i += n160
7600
- 	dAtA[i] = 0x12
7601
- 	i++
7602
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.EvictionTime.Size()))
7603
--	n160, err := m.EvictionTime.MarshalTo(dAtA[i:])
7604
-+	n161, err := m.EvictionTime.MarshalTo(dAtA[i:])
7605
- 	if err != nil {
7606
- 		return 0, err
7607
- 	}
7608
--	i += n160
7609
-+	i += n161
7610
- 	dAtA[i] = 0x1a
7611
- 	i++
7612
- 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason)))
7613
-@@ -8008,11 +8054,11 @@ func (m *PreferredSchedulingTerm) MarshalTo(dAtA []byte) (int, error) {
7614
- 	dAtA[i] = 0x12
7615
- 	i++
7616
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Preference.Size()))
7617
--	n161, err := m.Preference.MarshalTo(dAtA[i:])
7618
-+	n162, err := m.Preference.MarshalTo(dAtA[i:])
7619
- 	if err != nil {
7620
- 		return 0, err
7621
- 	}
7622
--	i += n161
7623
-+	i += n162
7624
- 	return i, nil
7625
- }
7626
- 
7627
-@@ -8034,11 +8080,11 @@ func (m *Probe) MarshalTo(dAtA []byte) (int, error) {
7628
- 	dAtA[i] = 0xa
7629
- 	i++
7630
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Handler.Size()))
7631
--	n162, err := m.Handler.MarshalTo(dAtA[i:])
7632
-+	n163, err := m.Handler.MarshalTo(dAtA[i:])
7633
- 	if err != nil {
7634
- 		return 0, err
7635
- 	}
7636
--	i += n162
7637
-+	i += n163
7638
- 	dAtA[i] = 0x10
7639
- 	i++
7640
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.InitialDelaySeconds))
7641
-@@ -8188,11 +8234,11 @@ func (m *RBDPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) {
7642
- 		dAtA[i] = 0x3a
7643
- 		i++
7644
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
7645
--		n163, err := m.SecretRef.MarshalTo(dAtA[i:])
7646
-+		n164, err := m.SecretRef.MarshalTo(dAtA[i:])
7647
- 		if err != nil {
7648
- 			return 0, err
7649
- 		}
7650
--		i += n163
7651
-+		i += n164
7652
- 	}
7653
- 	dAtA[i] = 0x40
7654
- 	i++
7655
-@@ -8259,11 +8305,11 @@ func (m *RBDVolumeSource) MarshalTo(dAtA []byte) (int, error) {
7656
- 		dAtA[i] = 0x3a
7657
- 		i++
7658
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
7659
--		n164, err := m.SecretRef.MarshalTo(dAtA[i:])
7660
-+		n165, err := m.SecretRef.MarshalTo(dAtA[i:])
7661
- 		if err != nil {
7662
- 			return 0, err
7663
- 		}
7664
--		i += n164
7665
-+		i += n165
7666
- 	}
7667
- 	dAtA[i] = 0x40
7668
- 	i++
7669
-@@ -8294,11 +8340,11 @@ func (m *RangeAllocation) MarshalTo(dAtA []byte) (int, error) {
7670
- 	dAtA[i] = 0xa
7671
- 	i++
7672
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7673
--	n165, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7674
-+	n166, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7675
- 	if err != nil {
7676
- 		return 0, err
7677
- 	}
7678
--	i += n165
7679
-+	i += n166
7680
- 	dAtA[i] = 0x12
7681
- 	i++
7682
- 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Range)))
7683
-@@ -8330,27 +8376,27 @@ func (m *ReplicationController) MarshalTo(dAtA []byte) (int, error) {
7684
- 	dAtA[i] = 0xa
7685
- 	i++
7686
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7687
--	n166, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7688
-+	n167, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7689
- 	if err != nil {
7690
- 		return 0, err
7691
- 	}
7692
--	i += n166
7693
-+	i += n167
7694
- 	dAtA[i] = 0x12
7695
- 	i++
7696
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size()))
7697
--	n167, err := m.Spec.MarshalTo(dAtA[i:])
7698
-+	n168, err := m.Spec.MarshalTo(dAtA[i:])
7699
- 	if err != nil {
7700
- 		return 0, err
7701
- 	}
7702
--	i += n167
7703
-+	i += n168
7704
- 	dAtA[i] = 0x1a
7705
- 	i++
7706
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size()))
7707
--	n168, err := m.Status.MarshalTo(dAtA[i:])
7708
-+	n169, err := m.Status.MarshalTo(dAtA[i:])
7709
- 	if err != nil {
7710
- 		return 0, err
7711
- 	}
7712
--	i += n168
7713
-+	i += n169
7714
- 	return i, nil
7715
- }
7716
- 
7717
-@@ -8380,11 +8426,11 @@ func (m *ReplicationControllerCondition) MarshalTo(dAtA []byte) (int, error) {
7718
- 	dAtA[i] = 0x1a
7719
- 	i++
7720
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size()))
7721
--	n169, err := m.LastTransitionTime.MarshalTo(dAtA[i:])
7722
-+	n170, err := m.LastTransitionTime.MarshalTo(dAtA[i:])
7723
- 	if err != nil {
7724
- 		return 0, err
7725
- 	}
7726
--	i += n169
7727
-+	i += n170
7728
- 	dAtA[i] = 0x22
7729
- 	i++
7730
- 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason)))
7731
-@@ -8414,11 +8460,11 @@ func (m *ReplicationControllerList) MarshalTo(dAtA []byte) (int, error) {
7732
- 	dAtA[i] = 0xa
7733
- 	i++
7734
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
7735
--	n170, err := m.ListMeta.MarshalTo(dAtA[i:])
7736
-+	n171, err := m.ListMeta.MarshalTo(dAtA[i:])
7737
- 	if err != nil {
7738
- 		return 0, err
7739
- 	}
7740
--	i += n170
7741
-+	i += n171
7742
- 	if len(m.Items) > 0 {
7743
- 		for _, msg := range m.Items {
7744
- 			dAtA[i] = 0x12
7745
-@@ -8480,11 +8526,11 @@ func (m *ReplicationControllerSpec) MarshalTo(dAtA []byte) (int, error) {
7746
- 		dAtA[i] = 0x1a
7747
- 		i++
7748
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size()))
7749
--		n171, err := m.Template.MarshalTo(dAtA[i:])
7750
-+		n172, err := m.Template.MarshalTo(dAtA[i:])
7751
- 		if err != nil {
7752
- 			return 0, err
7753
- 		}
7754
--		i += n171
7755
-+		i += n172
7756
- 	}
7757
- 	dAtA[i] = 0x20
7758
- 	i++
7759
-@@ -8563,11 +8609,11 @@ func (m *ResourceFieldSelector) MarshalTo(dAtA []byte) (int, error) {
7760
- 	dAtA[i] = 0x1a
7761
- 	i++
7762
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Divisor.Size()))
7763
--	n172, err := m.Divisor.MarshalTo(dAtA[i:])
7764
-+	n173, err := m.Divisor.MarshalTo(dAtA[i:])
7765
- 	if err != nil {
7766
- 		return 0, err
7767
- 	}
7768
--	i += n172
7769
-+	i += n173
7770
- 	return i, nil
7771
- }
7772
- 
7773
-@@ -8589,27 +8635,27 @@ func (m *ResourceQuota) MarshalTo(dAtA []byte) (int, error) {
7774
- 	dAtA[i] = 0xa
7775
- 	i++
7776
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7777
--	n173, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7778
-+	n174, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7779
- 	if err != nil {
7780
- 		return 0, err
7781
- 	}
7782
--	i += n173
7783
-+	i += n174
7784
- 	dAtA[i] = 0x12
7785
- 	i++
7786
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size()))
7787
--	n174, err := m.Spec.MarshalTo(dAtA[i:])
7788
-+	n175, err := m.Spec.MarshalTo(dAtA[i:])
7789
- 	if err != nil {
7790
- 		return 0, err
7791
- 	}
7792
--	i += n174
7793
-+	i += n175
7794
- 	dAtA[i] = 0x1a
7795
- 	i++
7796
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size()))
7797
--	n175, err := m.Status.MarshalTo(dAtA[i:])
7798
-+	n176, err := m.Status.MarshalTo(dAtA[i:])
7799
- 	if err != nil {
7800
- 		return 0, err
7801
- 	}
7802
--	i += n175
7803
-+	i += n176
7804
- 	return i, nil
7805
- }
7806
- 
7807
-@@ -8631,11 +8677,11 @@ func (m *ResourceQuotaList) MarshalTo(dAtA []byte) (int, error) {
7808
- 	dAtA[i] = 0xa
7809
- 	i++
7810
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
7811
--	n176, err := m.ListMeta.MarshalTo(dAtA[i:])
7812
-+	n177, err := m.ListMeta.MarshalTo(dAtA[i:])
7813
- 	if err != nil {
7814
- 		return 0, err
7815
- 	}
7816
--	i += n176
7817
-+	i += n177
7818
- 	if len(m.Items) > 0 {
7819
- 		for _, msg := range m.Items {
7820
- 			dAtA[i] = 0x12
7821
-@@ -8690,11 +8736,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) {
7822
- 			dAtA[i] = 0x12
7823
- 			i++
7824
- 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
7825
--			n177, err := (&v).MarshalTo(dAtA[i:])
7826
-+			n178, err := (&v).MarshalTo(dAtA[i:])
7827
- 			if err != nil {
7828
- 				return 0, err
7829
- 			}
7830
--			i += n177
7831
-+			i += n178
7832
- 		}
7833
- 	}
7834
- 	if len(m.Scopes) > 0 {
7835
-@@ -8716,11 +8762,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) {
7836
- 		dAtA[i] = 0x1a
7837
- 		i++
7838
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.ScopeSelector.Size()))
7839
--		n178, err := m.ScopeSelector.MarshalTo(dAtA[i:])
7840
-+		n179, err := m.ScopeSelector.MarshalTo(dAtA[i:])
7841
- 		if err != nil {
7842
- 			return 0, err
7843
- 		}
7844
--		i += n178
7845
-+		i += n179
7846
- 	}
7847
- 	return i, nil
7848
- }
7849
-@@ -8764,11 +8810,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) {
7850
- 			dAtA[i] = 0x12
7851
- 			i++
7852
- 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
7853
--			n179, err := (&v).MarshalTo(dAtA[i:])
7854
-+			n180, err := (&v).MarshalTo(dAtA[i:])
7855
- 			if err != nil {
7856
- 				return 0, err
7857
- 			}
7858
--			i += n179
7859
-+			i += n180
7860
- 		}
7861
- 	}
7862
- 	if len(m.Used) > 0 {
7863
-@@ -8795,11 +8841,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) {
7864
- 			dAtA[i] = 0x12
7865
- 			i++
7866
- 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
7867
--			n180, err := (&v).MarshalTo(dAtA[i:])
7868
-+			n181, err := (&v).MarshalTo(dAtA[i:])
7869
- 			if err != nil {
7870
- 				return 0, err
7871
- 			}
7872
--			i += n180
7873
-+			i += n181
7874
- 		}
7875
- 	}
7876
- 	return i, nil
7877
-@@ -8844,11 +8890,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) {
7878
- 			dAtA[i] = 0x12
7879
- 			i++
7880
- 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
7881
--			n181, err := (&v).MarshalTo(dAtA[i:])
7882
-+			n182, err := (&v).MarshalTo(dAtA[i:])
7883
- 			if err != nil {
7884
- 				return 0, err
7885
- 			}
7886
--			i += n181
7887
-+			i += n182
7888
- 		}
7889
- 	}
7890
- 	if len(m.Requests) > 0 {
7891
-@@ -8875,11 +8921,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) {
7892
- 			dAtA[i] = 0x12
7893
- 			i++
7894
- 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
7895
--			n182, err := (&v).MarshalTo(dAtA[i:])
7896
-+			n183, err := (&v).MarshalTo(dAtA[i:])
7897
- 			if err != nil {
7898
- 				return 0, err
7899
- 			}
7900
--			i += n182
7901
-+			i += n183
7902
- 		}
7903
- 	}
7904
- 	return i, nil
7905
-@@ -8946,11 +8992,11 @@ func (m *ScaleIOPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) {
7906
- 		dAtA[i] = 0x1a
7907
- 		i++
7908
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
7909
--		n183, err := m.SecretRef.MarshalTo(dAtA[i:])
7910
-+		n184, err := m.SecretRef.MarshalTo(dAtA[i:])
7911
- 		if err != nil {
7912
- 			return 0, err
7913
- 		}
7914
--		i += n183
7915
-+		i += n184
7916
- 	}
7917
- 	dAtA[i] = 0x20
7918
- 	i++
7919
-@@ -9018,11 +9064,11 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) {
7920
- 		dAtA[i] = 0x1a
7921
- 		i++
7922
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
7923
--		n184, err := m.SecretRef.MarshalTo(dAtA[i:])
7924
-+		n185, err := m.SecretRef.MarshalTo(dAtA[i:])
7925
- 		if err != nil {
7926
- 			return 0, err
7927
- 		}
7928
--		i += n184
7929
-+		i += n185
7930
- 	}
7931
- 	dAtA[i] = 0x20
7932
- 	i++
7933
-@@ -9152,11 +9198,11 @@ func (m *Secret) MarshalTo(dAtA []byte) (int, error) {
7934
- 	dAtA[i] = 0xa
7935
- 	i++
7936
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7937
--	n185, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7938
-+	n186, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7939
- 	if err != nil {
7940
- 		return 0, err
7941
- 	}
7942
--	i += n185
7943
-+	i += n186
7944
- 	if len(m.Data) > 0 {
7945
- 		keysForData := make([]string, 0, len(m.Data))
7946
- 		for k := range m.Data {
7947
-@@ -9232,11 +9278,11 @@ func (m *SecretEnvSource) MarshalTo(dAtA []byte) (int, error) {
7948
- 	dAtA[i] = 0xa
7949
- 	i++
7950
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size()))
7951
--	n186, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
7952
-+	n187, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
7953
- 	if err != nil {
7954
- 		return 0, err
7955
- 	}
7956
--	i += n186
7957
-+	i += n187
7958
- 	if m.Optional != nil {
7959
- 		dAtA[i] = 0x10
7960
- 		i++
7961
-@@ -9268,11 +9314,11 @@ func (m *SecretKeySelector) MarshalTo(dAtA []byte) (int, error) {
7962
- 	dAtA[i] = 0xa
7963
- 	i++
7964
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size()))
7965
--	n187, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
7966
-+	n188, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
7967
- 	if err != nil {
7968
- 		return 0, err
7969
- 	}
7970
--	i += n187
7971
-+	i += n188
7972
- 	dAtA[i] = 0x12
7973
- 	i++
7974
- 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key)))
7975
-@@ -9308,11 +9354,11 @@ func (m *SecretList) MarshalTo(dAtA []byte) (int, error) {
7976
- 	dAtA[i] = 0xa
7977
- 	i++
7978
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
7979
--	n188, err := m.ListMeta.MarshalTo(dAtA[i:])
7980
-+	n189, err := m.ListMeta.MarshalTo(dAtA[i:])
7981
- 	if err != nil {
7982
- 		return 0, err
7983
- 	}
7984
--	i += n188
7985
-+	i += n189
7986
- 	if len(m.Items) > 0 {
7987
- 		for _, msg := range m.Items {
7988
- 			dAtA[i] = 0x12
7989
-@@ -9346,11 +9392,11 @@ func (m *SecretProjection) MarshalTo(dAtA []byte) (int, error) {
7990
- 	dAtA[i] = 0xa
7991
- 	i++
7992
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size()))
7993
--	n189, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
7994
-+	n190, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
7995
- 	if err != nil {
7996
- 		return 0, err
7997
- 	}
7998
--	i += n189
7999
-+	i += n190
8000
- 	if len(m.Items) > 0 {
8001
- 		for _, msg := range m.Items {
8002
- 			dAtA[i] = 0x12
8003
-@@ -9470,11 +9516,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) {
8004
- 		dAtA[i] = 0xa
8005
- 		i++
8006
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.Capabilities.Size()))
8007
--		n190, err := m.Capabilities.MarshalTo(dAtA[i:])
8008
-+		n191, err := m.Capabilities.MarshalTo(dAtA[i:])
8009
- 		if err != nil {
8010
- 			return 0, err
8011
- 		}
8012
--		i += n190
8013
-+		i += n191
8014
- 	}
8015
- 	if m.Privileged != nil {
8016
- 		dAtA[i] = 0x10
8017
-@@ -9490,11 +9536,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) {
8018
- 		dAtA[i] = 0x1a
8019
- 		i++
8020
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size()))
8021
--		n191, err := m.SELinuxOptions.MarshalTo(dAtA[i:])
8022
-+		n192, err := m.SELinuxOptions.MarshalTo(dAtA[i:])
8023
- 		if err != nil {
8024
- 			return 0, err
8025
- 		}
8026
--		i += n191
8027
-+		i += n192
8028
- 	}
8029
- 	if m.RunAsUser != nil {
8030
- 		dAtA[i] = 0x20
8031
-@@ -9557,11 +9603,11 @@ func (m *SerializedReference) MarshalTo(dAtA []byte) (int, error) {
8032
- 	dAtA[i] = 0xa
8033
- 	i++
8034
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Reference.Size()))
8035
--	n192, err := m.Reference.MarshalTo(dAtA[i:])
8036
-+	n193, err := m.Reference.MarshalTo(dAtA[i:])
8037
- 	if err != nil {
8038
- 		return 0, err
8039
- 	}
8040
--	i += n192
8041
-+	i += n193
8042
- 	return i, nil
8043
- }
8044
- 
8045
-@@ -9583,27 +9629,27 @@ func (m *Service) MarshalTo(dAtA []byte) (int, error) {
8046
- 	dAtA[i] = 0xa
8047
- 	i++
8048
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
8049
--	n193, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8050
-+	n194, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8051
- 	if err != nil {
8052
- 		return 0, err
8053
- 	}
8054
--	i += n193
8055
-+	i += n194
8056
- 	dAtA[i] = 0x12
8057
- 	i++
8058
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size()))
8059
--	n194, err := m.Spec.MarshalTo(dAtA[i:])
8060
-+	n195, err := m.Spec.MarshalTo(dAtA[i:])
8061
- 	if err != nil {
8062
- 		return 0, err
8063
- 	}
8064
--	i += n194
8065
-+	i += n195
8066
- 	dAtA[i] = 0x1a
8067
- 	i++
8068
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size()))
8069
--	n195, err := m.Status.MarshalTo(dAtA[i:])
8070
-+	n196, err := m.Status.MarshalTo(dAtA[i:])
8071
- 	if err != nil {
8072
- 		return 0, err
8073
- 	}
8074
--	i += n195
8075
-+	i += n196
8076
- 	return i, nil
8077
- }
8078
- 
8079
-@@ -9625,11 +9671,11 @@ func (m *ServiceAccount) MarshalTo(dAtA []byte) (int, error) {
8080
- 	dAtA[i] = 0xa
8081
- 	i++
8082
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
8083
--	n196, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8084
-+	n197, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8085
- 	if err != nil {
8086
- 		return 0, err
8087
- 	}
8088
--	i += n196
8089
-+	i += n197
8090
- 	if len(m.Secrets) > 0 {
8091
- 		for _, msg := range m.Secrets {
8092
- 			dAtA[i] = 0x12
8093
-@@ -9685,11 +9731,11 @@ func (m *ServiceAccountList) MarshalTo(dAtA []byte) (int, error) {
8094
- 	dAtA[i] = 0xa
8095
- 	i++
8096
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
8097
--	n197, err := m.ListMeta.MarshalTo(dAtA[i:])
8098
-+	n198, err := m.ListMeta.MarshalTo(dAtA[i:])
8099
- 	if err != nil {
8100
- 		return 0, err
8101
- 	}
8102
--	i += n197
8103
-+	i += n198
8104
- 	if len(m.Items) > 0 {
8105
- 		for _, msg := range m.Items {
8106
- 			dAtA[i] = 0x12
8107
-@@ -9754,11 +9800,11 @@ func (m *ServiceList) MarshalTo(dAtA []byte) (int, error) {
8108
- 	dAtA[i] = 0xa
8109
- 	i++
8110
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
8111
--	n198, err := m.ListMeta.MarshalTo(dAtA[i:])
8112
-+	n199, err := m.ListMeta.MarshalTo(dAtA[i:])
8113
- 	if err != nil {
8114
- 		return 0, err
8115
- 	}
8116
--	i += n198
8117
-+	i += n199
8118
- 	if len(m.Items) > 0 {
8119
- 		for _, msg := range m.Items {
8120
- 			dAtA[i] = 0x12
8121
-@@ -9803,11 +9849,11 @@ func (m *ServicePort) MarshalTo(dAtA []byte) (int, error) {
8122
- 	dAtA[i] = 0x22
8123
- 	i++
8124
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.TargetPort.Size()))
8125
--	n199, err := m.TargetPort.MarshalTo(dAtA[i:])
8126
-+	n200, err := m.TargetPort.MarshalTo(dAtA[i:])
8127
- 	if err != nil {
8128
- 		return 0, err
8129
- 	}
8130
--	i += n199
8131
-+	i += n200
8132
- 	dAtA[i] = 0x28
8133
- 	i++
8134
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.NodePort))
8135
-@@ -9954,11 +10000,11 @@ func (m *ServiceSpec) MarshalTo(dAtA []byte) (int, error) {
8136
- 		dAtA[i] = 0x72
8137
- 		i++
8138
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.SessionAffinityConfig.Size()))
8139
--		n200, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:])
8140
-+		n201, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:])
8141
- 		if err != nil {
8142
- 			return 0, err
8143
- 		}
8144
--		i += n200
8145
-+		i += n201
8146
- 	}
8147
- 	return i, nil
8148
- }
8149
-@@ -9981,11 +10027,11 @@ func (m *ServiceStatus) MarshalTo(dAtA []byte) (int, error) {
8150
- 	dAtA[i] = 0xa
8151
- 	i++
8152
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.LoadBalancer.Size()))
8153
--	n201, err := m.LoadBalancer.MarshalTo(dAtA[i:])
8154
-+	n202, err := m.LoadBalancer.MarshalTo(dAtA[i:])
8155
- 	if err != nil {
8156
- 		return 0, err
8157
- 	}
8158
--	i += n201
8159
-+	i += n202
8160
- 	return i, nil
8161
- }
8162
- 
8163
-@@ -10008,11 +10054,11 @@ func (m *SessionAffinityConfig) MarshalTo(dAtA []byte) (int, error) {
8164
- 		dAtA[i] = 0xa
8165
- 		i++
8166
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.ClientIP.Size()))
8167
--		n202, err := m.ClientIP.MarshalTo(dAtA[i:])
8168
-+		n203, err := m.ClientIP.MarshalTo(dAtA[i:])
8169
- 		if err != nil {
8170
- 			return 0, err
8171
- 		}
8172
--		i += n202
8173
-+		i += n203
8174
- 	}
8175
- 	return i, nil
8176
- }
8177
-@@ -10056,11 +10102,11 @@ func (m *StorageOSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) {
8178
- 		dAtA[i] = 0x2a
8179
- 		i++
8180
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
8181
--		n203, err := m.SecretRef.MarshalTo(dAtA[i:])
8182
-+		n204, err := m.SecretRef.MarshalTo(dAtA[i:])
8183
- 		if err != nil {
8184
- 			return 0, err
8185
- 		}
8186
--		i += n203
8187
-+		i += n204
8188
- 	}
8189
- 	return i, nil
8190
- }
8191
-@@ -10104,11 +10150,11 @@ func (m *StorageOSVolumeSource) MarshalTo(dAtA []byte) (int, error) {
8192
- 		dAtA[i] = 0x2a
8193
- 		i++
8194
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
8195
--		n204, err := m.SecretRef.MarshalTo(dAtA[i:])
8196
-+		n205, err := m.SecretRef.MarshalTo(dAtA[i:])
8197
- 		if err != nil {
8198
- 			return 0, err
8199
- 		}
8200
--		i += n204
8201
-+		i += n205
8202
- 	}
8203
- 	return i, nil
8204
- }
8205
-@@ -10157,11 +10203,11 @@ func (m *TCPSocketAction) MarshalTo(dAtA []byte) (int, error) {
8206
- 	dAtA[i] = 0xa
8207
- 	i++
8208
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size()))
8209
--	n205, err := m.Port.MarshalTo(dAtA[i:])
8210
-+	n206, err := m.Port.MarshalTo(dAtA[i:])
8211
- 	if err != nil {
8212
- 		return 0, err
8213
- 	}
8214
--	i += n205
8215
-+	i += n206
8216
- 	dAtA[i] = 0x12
8217
- 	i++
8218
- 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host)))
8219
-@@ -10200,11 +10246,11 @@ func (m *Taint) MarshalTo(dAtA []byte) (int, error) {
8220
- 		dAtA[i] = 0x22
8221
- 		i++
8222
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.TimeAdded.Size()))
8223
--		n206, err := m.TimeAdded.MarshalTo(dAtA[i:])
8224
-+		n207, err := m.TimeAdded.MarshalTo(dAtA[i:])
8225
- 		if err != nil {
8226
- 			return 0, err
8227
- 		}
8228
--		i += n206
8229
-+		i += n207
8230
- 	}
8231
- 	return i, nil
8232
- }
8233
-@@ -10337,11 +10383,11 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) {
8234
- 	dAtA[i] = 0x12
8235
- 	i++
8236
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.VolumeSource.Size()))
8237
--	n207, err := m.VolumeSource.MarshalTo(dAtA[i:])
8238
-+	n208, err := m.VolumeSource.MarshalTo(dAtA[i:])
8239
- 	if err != nil {
8240
- 		return 0, err
8241
- 	}
8242
--	i += n207
8243
-+	i += n208
8244
- 	return i, nil
8245
- }
8246
- 
8247
-@@ -10434,11 +10480,11 @@ func (m *VolumeNodeAffinity) MarshalTo(dAtA []byte) (int, error) {
8248
- 		dAtA[i] = 0xa
8249
- 		i++
8250
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.Required.Size()))
8251
--		n208, err := m.Required.MarshalTo(dAtA[i:])
8252
-+		n209, err := m.Required.MarshalTo(dAtA[i:])
8253
- 		if err != nil {
8254
- 			return 0, err
8255
- 		}
8256
--		i += n208
8257
-+		i += n209
8258
- 	}
8259
- 	return i, nil
8260
- }
8261
-@@ -10462,41 +10508,41 @@ func (m *VolumeProjection) MarshalTo(dAtA []byte) (int, error) {
8262
- 		dAtA[i] = 0xa
8263
- 		i++
8264
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size()))
8265
--		n209, err := m.Secret.MarshalTo(dAtA[i:])
8266
-+		n210, err := m.Secret.MarshalTo(dAtA[i:])
8267
- 		if err != nil {
8268
- 			return 0, err
8269
- 		}
8270
--		i += n209
8271
-+		i += n210
8272
- 	}
8273
- 	if m.DownwardAPI != nil {
8274
- 		dAtA[i] = 0x12
8275
- 		i++
8276
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size()))
8277
--		n210, err := m.DownwardAPI.MarshalTo(dAtA[i:])
8278
-+		n211, err := m.DownwardAPI.MarshalTo(dAtA[i:])
8279
- 		if err != nil {
8280
- 			return 0, err
8281
- 		}
8282
--		i += n210
8283
-+		i += n211
8284
- 	}
8285
- 	if m.ConfigMap != nil {
8286
- 		dAtA[i] = 0x1a
8287
- 		i++
8288
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size()))
8289
--		n211, err := m.ConfigMap.MarshalTo(dAtA[i:])
8290
-+		n212, err := m.ConfigMap.MarshalTo(dAtA[i:])
8291
- 		if err != nil {
8292
- 			return 0, err
8293
- 		}
8294
--		i += n211
8295
-+		i += n212
8296
- 	}
8297
- 	if m.ServiceAccountToken != nil {
8298
- 		dAtA[i] = 0x22
8299
- 		i++
8300
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.ServiceAccountToken.Size()))
8301
--		n212, err := m.ServiceAccountToken.MarshalTo(dAtA[i:])
8302
-+		n213, err := m.ServiceAccountToken.MarshalTo(dAtA[i:])
8303
- 		if err != nil {
8304
- 			return 0, err
8305
- 		}
8306
--		i += n212
8307
-+		i += n213
8308
- 	}
8309
- 	return i, nil
8310
- }
8311
-@@ -10520,151 +10566,151 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8312
- 		dAtA[i] = 0xa
8313
- 		i++
8314
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size()))
8315
--		n213, err := m.HostPath.MarshalTo(dAtA[i:])
8316
-+		n214, err := m.HostPath.MarshalTo(dAtA[i:])
8317
- 		if err != nil {
8318
- 			return 0, err
8319
- 		}
8320
--		i += n213
8321
-+		i += n214
8322
- 	}
8323
- 	if m.EmptyDir != nil {
8324
- 		dAtA[i] = 0x12
8325
- 		i++
8326
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size()))
8327
--		n214, err := m.EmptyDir.MarshalTo(dAtA[i:])
8328
-+		n215, err := m.EmptyDir.MarshalTo(dAtA[i:])
8329
- 		if err != nil {
8330
- 			return 0, err
8331
- 		}
8332
--		i += n214
8333
-+		i += n215
8334
- 	}
8335
- 	if m.GCEPersistentDisk != nil {
8336
- 		dAtA[i] = 0x1a
8337
- 		i++
8338
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size()))
8339
--		n215, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:])
8340
-+		n216, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:])
8341
- 		if err != nil {
8342
- 			return 0, err
8343
- 		}
8344
--		i += n215
8345
-+		i += n216
8346
- 	}
8347
- 	if m.AWSElasticBlockStore != nil {
8348
- 		dAtA[i] = 0x22
8349
- 		i++
8350
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size()))
8351
--		n216, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:])
8352
-+		n217, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:])
8353
- 		if err != nil {
8354
- 			return 0, err
8355
- 		}
8356
--		i += n216
8357
-+		i += n217
8358
- 	}
8359
- 	if m.GitRepo != nil {
8360
- 		dAtA[i] = 0x2a
8361
- 		i++
8362
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size()))
8363
--		n217, err := m.GitRepo.MarshalTo(dAtA[i:])
8364
-+		n218, err := m.GitRepo.MarshalTo(dAtA[i:])
8365
- 		if err != nil {
8366
- 			return 0, err
8367
- 		}
8368
--		i += n217
8369
-+		i += n218
8370
- 	}
8371
- 	if m.Secret != nil {
8372
- 		dAtA[i] = 0x32
8373
- 		i++
8374
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size()))
8375
--		n218, err := m.Secret.MarshalTo(dAtA[i:])
8376
-+		n219, err := m.Secret.MarshalTo(dAtA[i:])
8377
- 		if err != nil {
8378
- 			return 0, err
8379
- 		}
8380
--		i += n218
8381
-+		i += n219
8382
- 	}
8383
- 	if m.NFS != nil {
8384
- 		dAtA[i] = 0x3a
8385
- 		i++
8386
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size()))
8387
--		n219, err := m.NFS.MarshalTo(dAtA[i:])
8388
-+		n220, err := m.NFS.MarshalTo(dAtA[i:])
8389
- 		if err != nil {
8390
- 			return 0, err
8391
- 		}
8392
--		i += n219
8393
-+		i += n220
8394
- 	}
8395
- 	if m.ISCSI != nil {
8396
- 		dAtA[i] = 0x42
8397
- 		i++
8398
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size()))
8399
--		n220, err := m.ISCSI.MarshalTo(dAtA[i:])
8400
-+		n221, err := m.ISCSI.MarshalTo(dAtA[i:])
8401
- 		if err != nil {
8402
- 			return 0, err
8403
- 		}
8404
--		i += n220
8405
-+		i += n221
8406
- 	}
8407
- 	if m.Glusterfs != nil {
8408
- 		dAtA[i] = 0x4a
8409
- 		i++
8410
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size()))
8411
--		n221, err := m.Glusterfs.MarshalTo(dAtA[i:])
8412
-+		n222, err := m.Glusterfs.MarshalTo(dAtA[i:])
8413
- 		if err != nil {
8414
- 			return 0, err
8415
- 		}
8416
--		i += n221
8417
-+		i += n222
8418
- 	}
8419
- 	if m.PersistentVolumeClaim != nil {
8420
- 		dAtA[i] = 0x52
8421
- 		i++
8422
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size()))
8423
--		n222, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:])
8424
-+		n223, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:])
8425
- 		if err != nil {
8426
- 			return 0, err
8427
- 		}
8428
--		i += n222
8429
-+		i += n223
8430
- 	}
8431
- 	if m.RBD != nil {
8432
- 		dAtA[i] = 0x5a
8433
- 		i++
8434
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size()))
8435
--		n223, err := m.RBD.MarshalTo(dAtA[i:])
8436
-+		n224, err := m.RBD.MarshalTo(dAtA[i:])
8437
- 		if err != nil {
8438
- 			return 0, err
8439
- 		}
8440
--		i += n223
8441
-+		i += n224
8442
- 	}
8443
- 	if m.FlexVolume != nil {
8444
- 		dAtA[i] = 0x62
8445
- 		i++
8446
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size()))
8447
--		n224, err := m.FlexVolume.MarshalTo(dAtA[i:])
8448
-+		n225, err := m.FlexVolume.MarshalTo(dAtA[i:])
8449
- 		if err != nil {
8450
- 			return 0, err
8451
- 		}
8452
--		i += n224
8453
-+		i += n225
8454
- 	}
8455
- 	if m.Cinder != nil {
8456
- 		dAtA[i] = 0x6a
8457
- 		i++
8458
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size()))
8459
--		n225, err := m.Cinder.MarshalTo(dAtA[i:])
8460
-+		n226, err := m.Cinder.MarshalTo(dAtA[i:])
8461
- 		if err != nil {
8462
- 			return 0, err
8463
- 		}
8464
--		i += n225
8465
-+		i += n226
8466
- 	}
8467
- 	if m.CephFS != nil {
8468
- 		dAtA[i] = 0x72
8469
- 		i++
8470
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size()))
8471
--		n226, err := m.CephFS.MarshalTo(dAtA[i:])
8472
-+		n227, err := m.CephFS.MarshalTo(dAtA[i:])
8473
- 		if err != nil {
8474
- 			return 0, err
8475
- 		}
8476
--		i += n226
8477
-+		i += n227
8478
- 	}
8479
- 	if m.Flocker != nil {
8480
- 		dAtA[i] = 0x7a
8481
- 		i++
8482
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size()))
8483
--		n227, err := m.Flocker.MarshalTo(dAtA[i:])
8484
-+		n228, err := m.Flocker.MarshalTo(dAtA[i:])
8485
- 		if err != nil {
8486
- 			return 0, err
8487
- 		}
8488
--		i += n227
8489
-+		i += n228
8490
- 	}
8491
- 	if m.DownwardAPI != nil {
8492
- 		dAtA[i] = 0x82
8493
-@@ -10672,11 +10718,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8494
- 		dAtA[i] = 0x1
8495
- 		i++
8496
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size()))
8497
--		n228, err := m.DownwardAPI.MarshalTo(dAtA[i:])
8498
-+		n229, err := m.DownwardAPI.MarshalTo(dAtA[i:])
8499
- 		if err != nil {
8500
- 			return 0, err
8501
- 		}
8502
--		i += n228
8503
-+		i += n229
8504
- 	}
8505
- 	if m.FC != nil {
8506
- 		dAtA[i] = 0x8a
8507
-@@ -10684,11 +10730,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8508
- 		dAtA[i] = 0x1
8509
- 		i++
8510
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size()))
8511
--		n229, err := m.FC.MarshalTo(dAtA[i:])
8512
-+		n230, err := m.FC.MarshalTo(dAtA[i:])
8513
- 		if err != nil {
8514
- 			return 0, err
8515
- 		}
8516
--		i += n229
8517
-+		i += n230
8518
- 	}
8519
- 	if m.AzureFile != nil {
8520
- 		dAtA[i] = 0x92
8521
-@@ -10696,11 +10742,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8522
- 		dAtA[i] = 0x1
8523
- 		i++
8524
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size()))
8525
--		n230, err := m.AzureFile.MarshalTo(dAtA[i:])
8526
-+		n231, err := m.AzureFile.MarshalTo(dAtA[i:])
8527
- 		if err != nil {
8528
- 			return 0, err
8529
- 		}
8530
--		i += n230
8531
-+		i += n231
8532
- 	}
8533
- 	if m.ConfigMap != nil {
8534
- 		dAtA[i] = 0x9a
8535
-@@ -10708,11 +10754,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8536
- 		dAtA[i] = 0x1
8537
- 		i++
8538
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size()))
8539
--		n231, err := m.ConfigMap.MarshalTo(dAtA[i:])
8540
-+		n232, err := m.ConfigMap.MarshalTo(dAtA[i:])
8541
- 		if err != nil {
8542
- 			return 0, err
8543
- 		}
8544
--		i += n231
8545
-+		i += n232
8546
- 	}
8547
- 	if m.VsphereVolume != nil {
8548
- 		dAtA[i] = 0xa2
8549
-@@ -10720,11 +10766,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8550
- 		dAtA[i] = 0x1
8551
- 		i++
8552
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size()))
8553
--		n232, err := m.VsphereVolume.MarshalTo(dAtA[i:])
8554
-+		n233, err := m.VsphereVolume.MarshalTo(dAtA[i:])
8555
- 		if err != nil {
8556
- 			return 0, err
8557
- 		}
8558
--		i += n232
8559
-+		i += n233
8560
- 	}
8561
- 	if m.Quobyte != nil {
8562
- 		dAtA[i] = 0xaa
8563
-@@ -10732,23 +10778,23 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8564
- 		dAtA[i] = 0x1
8565
- 		i++
8566
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size()))
8567
--		n233, err := m.Quobyte.MarshalTo(dAtA[i:])
8568
-+		n234, err := m.Quobyte.MarshalTo(dAtA[i:])
8569
- 		if err != nil {
8570
- 			return 0, err
8571
- 		}
8572
--		i += n233
8573
-+		i += n234
8574
- 	}
8575
--	if m.AzureDisk != nil {
8576
-+	if m.CascadeDisk != nil {
8577
- 		dAtA[i] = 0xb2
8578
- 		i++
8579
- 		dAtA[i] = 0x1
8580
- 		i++
8581
--		i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size()))
8582
--		n234, err := m.AzureDisk.MarshalTo(dAtA[i:])
8583
-+		i = encodeVarintGenerated(dAtA, i, uint64(m.CascadeDisk.Size()))
8584
-+		n235, err := m.CascadeDisk.MarshalTo(dAtA[i:])
8585
- 		if err != nil {
8586
- 			return 0, err
8587
- 		}
8588
--		i += n234
8589
-+		i += n235
8590
- 	}
8591
- 	if m.PhotonPersistentDisk != nil {
8592
- 		dAtA[i] = 0xba
8593
-@@ -10756,11 +10802,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8594
- 		dAtA[i] = 0x1
8595
- 		i++
8596
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size()))
8597
--		n235, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:])
8598
-+		n236, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:])
8599
- 		if err != nil {
8600
- 			return 0, err
8601
- 		}
8602
--		i += n235
8603
-+		i += n236
8604
- 	}
8605
- 	if m.PortworxVolume != nil {
8606
- 		dAtA[i] = 0xc2
8607
-@@ -10768,11 +10814,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8608
- 		dAtA[i] = 0x1
8609
- 		i++
8610
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size()))
8611
--		n236, err := m.PortworxVolume.MarshalTo(dAtA[i:])
8612
-+		n237, err := m.PortworxVolume.MarshalTo(dAtA[i:])
8613
- 		if err != nil {
8614
- 			return 0, err
8615
- 		}
8616
--		i += n236
8617
-+		i += n237
8618
- 	}
8619
- 	if m.ScaleIO != nil {
8620
- 		dAtA[i] = 0xca
8621
-@@ -10780,11 +10826,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8622
- 		dAtA[i] = 0x1
8623
- 		i++
8624
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size()))
8625
--		n237, err := m.ScaleIO.MarshalTo(dAtA[i:])
8626
-+		n238, err := m.ScaleIO.MarshalTo(dAtA[i:])
8627
- 		if err != nil {
8628
- 			return 0, err
8629
- 		}
8630
--		i += n237
8631
-+		i += n238
8632
- 	}
8633
- 	if m.Projected != nil {
8634
- 		dAtA[i] = 0xd2
8635
-@@ -10792,11 +10838,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8636
- 		dAtA[i] = 0x1
8637
- 		i++
8638
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.Projected.Size()))
8639
--		n238, err := m.Projected.MarshalTo(dAtA[i:])
8640
-+		n239, err := m.Projected.MarshalTo(dAtA[i:])
8641
- 		if err != nil {
8642
- 			return 0, err
8643
- 		}
8644
--		i += n238
8645
-+		i += n239
8646
- 	}
8647
- 	if m.StorageOS != nil {
8648
- 		dAtA[i] = 0xda
8649
-@@ -10804,11 +10850,23 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8650
- 		dAtA[i] = 0x1
8651
- 		i++
8652
- 		i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size()))
8653
--		n239, err := m.StorageOS.MarshalTo(dAtA[i:])
8654
-+		n240, err := m.StorageOS.MarshalTo(dAtA[i:])
8655
- 		if err != nil {
8656
- 			return 0, err
8657
- 		}
8658
--		i += n239
8659
-+		i += n240
8660
-+	}
8661
-+	if m.AzureDisk != nil {
8662
-+		dAtA[i] = 0xe2
8663
-+		i++
8664
-+		dAtA[i] = 0x1
8665
-+		i++
8666
-+		i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size()))
8667
-+		n241, err := m.AzureDisk.MarshalTo(dAtA[i:])
8668
-+		if err != nil {
8669
-+			return 0, err
8670
-+		}
8671
-+		i += n241
8672
- 	}
8673
- 	return i, nil
8674
- }
8675
-@@ -10868,11 +10926,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(dAtA []byte) (int, error) {
8676
- 	dAtA[i] = 0x12
8677
- 	i++
8678
- 	i = encodeVarintGenerated(dAtA, i, uint64(m.PodAffinityTerm.Size()))
8679
--	n240, err := m.PodAffinityTerm.MarshalTo(dAtA[i:])
8680
-+	n242, err := m.PodAffinityTerm.MarshalTo(dAtA[i:])
8681
- 	if err != nil {
8682
- 		return 0, err
8683
- 	}
8684
--	i += n240
8685
-+	i += n242
8686
- 	return i, nil
8687
- }
8688
- 
8689
-@@ -11067,6 +11125,16 @@ func (m *Capabilities) Size() (n int) {
8690
- 	return n
8691
- }
8692
- 
8693
-+func (m *CascadeDiskVolumeSource) Size() (n int) {
8694
-+	var l int
8695
-+	_ = l
8696
-+	l = len(m.DiskID)
8697
-+	n += 1 + l + sovGenerated(uint64(l))
8698
-+	l = len(m.FSType)
8699
-+	n += 1 + l + sovGenerated(uint64(l))
8700
-+	return n
8701
-+}
8702
-+
8703
- func (m *CephFSPersistentVolumeSource) Size() (n int) {
8704
- 	var l int
8705
- 	_ = l
8706
-@@ -12776,8 +12844,8 @@ func (m *PersistentVolumeSource) Size() (n int) {
8707
- 		l = m.Quobyte.Size()
8708
- 		n += 1 + l + sovGenerated(uint64(l))
8709
- 	}
8710
--	if m.AzureDisk != nil {
8711
--		l = m.AzureDisk.Size()
8712
-+	if m.CascadeDisk != nil {
8713
-+		l = m.CascadeDisk.Size()
8714
- 		n += 2 + l + sovGenerated(uint64(l))
8715
- 	}
8716
- 	if m.PhotonPersistentDisk != nil {
8717
-@@ -12804,6 +12872,10 @@ func (m *PersistentVolumeSource) Size() (n int) {
8718
- 		l = m.CSI.Size()
8719
- 		n += 2 + l + sovGenerated(uint64(l))
8720
- 	}
8721
-+	if m.AzureDisk != nil {
8722
-+		l = m.AzureDisk.Size()
8723
-+		n += 2 + l + sovGenerated(uint64(l))
8724
-+	}
8725
- 	return n
8726
- }
8727
- 
8728
-@@ -14353,8 +14425,8 @@ func (m *VolumeSource) Size() (n int) {
8729
- 		l = m.Quobyte.Size()
8730
- 		n += 2 + l + sovGenerated(uint64(l))
8731
- 	}
8732
--	if m.AzureDisk != nil {
8733
--		l = m.AzureDisk.Size()
8734
-+	if m.CascadeDisk != nil {
8735
-+		l = m.CascadeDisk.Size()
8736
- 		n += 2 + l + sovGenerated(uint64(l))
8737
- 	}
8738
- 	if m.PhotonPersistentDisk != nil {
8739
-@@ -14377,6 +14449,10 @@ func (m *VolumeSource) Size() (n int) {
8740
- 		l = m.StorageOS.Size()
8741
- 		n += 2 + l + sovGenerated(uint64(l))
8742
- 	}
8743
-+	if m.AzureDisk != nil {
8744
-+		l = m.AzureDisk.Size()
8745
-+		n += 2 + l + sovGenerated(uint64(l))
8746
-+	}
8747
- 	return n
8748
- }
8749
- 
8750
-@@ -14551,6 +14627,17 @@ func (this *Capabilities) String() string {
8751
- 	}, "")
8752
- 	return s
8753
- }
8754
-+func (this *CascadeDiskVolumeSource) String() string {
8755
-+	if this == nil {
8756
-+		return "nil"
8757
-+	}
8758
-+	s := strings.Join([]string{`&CascadeDiskVolumeSource{`,
8759
-+		`DiskID:` + fmt.Sprintf("%v", this.DiskID) + `,`,
8760
-+		`FSType:` + fmt.Sprintf("%v", this.FSType) + `,`,
8761
-+		`}`,
8762
-+	}, "")
8763
-+	return s
8764
-+}
8765
- func (this *CephFSPersistentVolumeSource) String() string {
8766
- 	if this == nil {
8767
- 		return "nil"
8768
-@@ -15920,13 +16007,14 @@ func (this *PersistentVolumeSource) String() string {
8769
- 		`AzureFile:` + strings.Replace(fmt.Sprintf("%v", this.AzureFile), "AzureFilePersistentVolumeSource", "AzureFilePersistentVolumeSource", 1) + `,`,
8770
- 		`VsphereVolume:` + strings.Replace(fmt.Sprintf("%v", this.VsphereVolume), "VsphereVirtualDiskVolumeSource", "VsphereVirtualDiskVolumeSource", 1) + `,`,
8771
- 		`Quobyte:` + strings.Replace(fmt.Sprintf("%v", this.Quobyte), "QuobyteVolumeSource", "QuobyteVolumeSource", 1) + `,`,
8772
--		`AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`,
8773
-+		`CascadeDisk:` + strings.Replace(fmt.Sprintf("%v", this.CascadeDisk), "CascadeDiskVolumeSource", "CascadeDiskVolumeSource", 1) + `,`,
8774
- 		`PhotonPersistentDisk:` + strings.Replace(fmt.Sprintf("%v", this.PhotonPersistentDisk), "PhotonPersistentDiskVolumeSource", "PhotonPersistentDiskVolumeSource", 1) + `,`,
8775
- 		`PortworxVolume:` + strings.Replace(fmt.Sprintf("%v", this.PortworxVolume), "PortworxVolumeSource", "PortworxVolumeSource", 1) + `,`,
8776
- 		`ScaleIO:` + strings.Replace(fmt.Sprintf("%v", this.ScaleIO), "ScaleIOPersistentVolumeSource", "ScaleIOPersistentVolumeSource", 1) + `,`,
8777
- 		`Local:` + strings.Replace(fmt.Sprintf("%v", this.Local), "LocalVolumeSource", "LocalVolumeSource", 1) + `,`,
8778
- 		`StorageOS:` + strings.Replace(fmt.Sprintf("%v", this.StorageOS), "StorageOSPersistentVolumeSource", "StorageOSPersistentVolumeSource", 1) + `,`,
8779
- 		`CSI:` + strings.Replace(fmt.Sprintf("%v", this.CSI), "CSIPersistentVolumeSource", "CSIPersistentVolumeSource", 1) + `,`,
8780
-+		`AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`,
8781
- 		`}`,
8782
- 	}, "")
8783
- 	return s
8784
-@@ -17137,12 +17225,13 @@ func (this *VolumeSource) String() string {
8785
- 		`ConfigMap:` + strings.Replace(fmt.Sprintf("%v", this.ConfigMap), "ConfigMapVolumeSource", "ConfigMapVolumeSource", 1) + `,`,
8786
- 		`VsphereVolume:` + strings.Replace(fmt.Sprintf("%v", this.VsphereVolume), "VsphereVirtualDiskVolumeSource", "VsphereVirtualDiskVolumeSource", 1) + `,`,
8787
- 		`Quobyte:` + strings.Replace(fmt.Sprintf("%v", this.Quobyte), "QuobyteVolumeSource", "QuobyteVolumeSource", 1) + `,`,
8788
--		`AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`,
8789
-+		`CascadeDisk:` + strings.Replace(fmt.Sprintf("%v", this.CascadeDisk), "CascadeDiskVolumeSource", "CascadeDiskVolumeSource", 1) + `,`,
8790
- 		`PhotonPersistentDisk:` + strings.Replace(fmt.Sprintf("%v", this.PhotonPersistentDisk), "PhotonPersistentDiskVolumeSource", "PhotonPersistentDiskVolumeSource", 1) + `,`,
8791
- 		`PortworxVolume:` + strings.Replace(fmt.Sprintf("%v", this.PortworxVolume), "PortworxVolumeSource", "PortworxVolumeSource", 1) + `,`,
8792
- 		`ScaleIO:` + strings.Replace(fmt.Sprintf("%v", this.ScaleIO), "ScaleIOVolumeSource", "ScaleIOVolumeSource", 1) + `,`,
8793
- 		`Projected:` + strings.Replace(fmt.Sprintf("%v", this.Projected), "ProjectedVolumeSource", "ProjectedVolumeSource", 1) + `,`,
8794
- 		`StorageOS:` + strings.Replace(fmt.Sprintf("%v", this.StorageOS), "StorageOSVolumeSource", "StorageOSVolumeSource", 1) + `,`,
8795
-+		`AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`,
8796
- 		`}`,
8797
- 	}, "")
8798
- 	return s
8799
-@@ -18759,6 +18848,114 @@ func (m *Capabilities) Unmarshal(dAtA []byte) error {
8800
- 	}
8801
- 	return nil
8802
- }
8803
-+func (m *CascadeDiskVolumeSource) Unmarshal(dAtA []byte) error {
8804
-+	l := len(dAtA)
8805
-+	iNdEx := 0
8806
-+	for iNdEx < l {
8807
-+		preIndex := iNdEx
8808
-+		var wire uint64
8809
-+		for shift := uint(0); ; shift += 7 {
8810
-+			if shift >= 64 {
8811
-+				return ErrIntOverflowGenerated
8812
-+			}
8813
-+			if iNdEx >= l {
8814
-+				return io.ErrUnexpectedEOF
8815
-+			}
8816
-+			b := dAtA[iNdEx]
8817
-+			iNdEx++
8818
-+			wire |= (uint64(b) & 0x7F) << shift
8819
-+			if b < 0x80 {
8820
-+				break
8821
-+			}
8822
-+		}
8823
-+		fieldNum := int32(wire >> 3)
8824
-+		wireType := int(wire & 0x7)
8825
-+		if wireType == 4 {
8826
-+			return fmt.Errorf("proto: CascadeDiskVolumeSource: wiretype end group for non-group")
8827
-+		}
8828
-+		if fieldNum <= 0 {
8829
-+			return fmt.Errorf("proto: CascadeDiskVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire)
8830
-+		}
8831
-+		switch fieldNum {
8832
-+		case 1:
8833
-+			if wireType != 2 {
8834
-+				return fmt.Errorf("proto: wrong wireType = %d for field DiskID", wireType)
8835
-+			}
8836
-+			var stringLen uint64
8837
-+			for shift := uint(0); ; shift += 7 {
8838
-+				if shift >= 64 {
8839
-+					return ErrIntOverflowGenerated
8840
-+				}
8841
-+				if iNdEx >= l {
8842
-+					return io.ErrUnexpectedEOF
8843
-+				}
8844
-+				b := dAtA[iNdEx]
8845
-+				iNdEx++
8846
-+				stringLen |= (uint64(b) & 0x7F) << shift
8847
-+				if b < 0x80 {
8848
-+					break
8849
-+				}
8850
-+			}
8851
-+			intStringLen := int(stringLen)
8852
-+			if intStringLen < 0 {
8853
-+				return ErrInvalidLengthGenerated
8854
-+			}
8855
-+			postIndex := iNdEx + intStringLen
8856
-+			if postIndex > l {
8857
-+				return io.ErrUnexpectedEOF
8858
-+			}
8859
-+			m.DiskID = string(dAtA[iNdEx:postIndex])
8860
-+			iNdEx = postIndex
8861
-+		case 2:
8862
-+			if wireType != 2 {
8863
-+				return fmt.Errorf("proto: wrong wireType = %d for field FSType", wireType)
8864
-+			}
8865
-+			var stringLen uint64
8866
-+			for shift := uint(0); ; shift += 7 {
8867
-+				if shift >= 64 {
8868
-+					return ErrIntOverflowGenerated
8869
-+				}
8870
-+				if iNdEx >= l {
8871
-+					return io.ErrUnexpectedEOF
8872
-+				}
8873
-+				b := dAtA[iNdEx]
8874
-+				iNdEx++
8875
-+				stringLen |= (uint64(b) & 0x7F) << shift
8876
-+				if b < 0x80 {
8877
-+					break
8878
-+				}
8879
-+			}
8880
-+			intStringLen := int(stringLen)
8881
-+			if intStringLen < 0 {
8882
-+				return ErrInvalidLengthGenerated
8883
-+			}
8884
-+			postIndex := iNdEx + intStringLen
8885
-+			if postIndex > l {
8886
-+				return io.ErrUnexpectedEOF
8887
-+			}
8888
-+			m.FSType = string(dAtA[iNdEx:postIndex])
8889
-+			iNdEx = postIndex
8890
-+		default:
8891
-+			iNdEx = preIndex
8892
-+			skippy, err := skipGenerated(dAtA[iNdEx:])
8893
-+			if err != nil {
8894
-+				return err
8895
-+			}
8896
-+			if skippy < 0 {
8897
-+				return ErrInvalidLengthGenerated
8898
-+			}
8899
-+			if (iNdEx + skippy) > l {
8900
-+				return io.ErrUnexpectedEOF
8901
-+			}
8902
-+			iNdEx += skippy
8903
-+		}
8904
-+	}
8905
-+
8906
-+	if iNdEx > l {
8907
-+		return io.ErrUnexpectedEOF
8908
-+	}
8909
-+	return nil
8910
-+}
8911
- func (m *CephFSPersistentVolumeSource) Unmarshal(dAtA []byte) error {
8912
- 	l := len(dAtA)
8913
- 	iNdEx := 0
8914
-@@ -35229,7 +35426,7 @@ func (m *PersistentVolumeSource) Unmarshal(dAtA []byte) error {
8915
- 			iNdEx = postIndex
8916
- 		case 16:
8917
- 			if wireType != 2 {
8918
--				return fmt.Errorf("proto: wrong wireType = %d for field AzureDisk", wireType)
8919
-+				return fmt.Errorf("proto: wrong wireType = %d for field CascadeDisk", wireType)
8920
- 			}
8921
- 			var msglen int
8922
- 			for shift := uint(0); ; shift += 7 {
8923
-@@ -35253,10 +35450,10 @@ func (m *PersistentVolumeSource) Unmarshal(dAtA []byte) error {
8924
- 			if postIndex > l {
8925
- 				return io.ErrUnexpectedEOF
8926
- 			}
8927
--			if m.AzureDisk == nil {
8928
--				m.AzureDisk = &AzureDiskVolumeSource{}
8929
-+			if m.CascadeDisk == nil {
8930
-+				m.CascadeDisk = &CascadeDiskVolumeSource{}
8931
- 			}
8932
--			if err := m.AzureDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
8933
-+			if err := m.CascadeDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
8934
- 				return err
8935
- 			}
8936
- 			iNdEx = postIndex
8937
-@@ -35458,6 +35655,39 @@ func (m *PersistentVolumeSource) Unmarshal(dAtA []byte) error {
8938
- 				return err
8939
- 			}
8940
- 			iNdEx = postIndex
8941
-+		case 23:
8942
-+			if wireType != 2 {
8943
-+				return fmt.Errorf("proto: wrong wireType = %d for field AzureDisk", wireType)
8944
-+			}
8945
-+			var msglen int
8946
-+			for shift := uint(0); ; shift += 7 {
8947
-+				if shift >= 64 {
8948
-+					return ErrIntOverflowGenerated
8949
-+				}
8950
-+				if iNdEx >= l {
8951
-+					return io.ErrUnexpectedEOF
8952
-+				}
8953
-+				b := dAtA[iNdEx]
8954
-+				iNdEx++
8955
-+				msglen |= (int(b) & 0x7F) << shift
8956
-+				if b < 0x80 {
8957
-+					break
8958
-+				}
8959
-+			}
8960
-+			if msglen < 0 {
8961
-+				return ErrInvalidLengthGenerated
8962
-+			}
8963
-+			postIndex := iNdEx + msglen
8964
-+			if postIndex > l {
8965
-+				return io.ErrUnexpectedEOF
8966
-+			}
8967
-+			if m.AzureDisk == nil {
8968
-+				m.AzureDisk = &AzureDiskVolumeSource{}
8969
-+			}
8970
-+			if err := m.AzureDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
8971
-+				return err
8972
-+			}
8973
-+			iNdEx = postIndex
8974
- 		default:
8975
- 			iNdEx = preIndex
8976
- 			skippy, err := skipGenerated(dAtA[iNdEx:])
8977
-@@ -50377,7 +50607,7 @@ func (m *VolumeSource) Unmarshal(dAtA []byte) error {
8978
- 			iNdEx = postIndex
8979
- 		case 22:
8980
- 			if wireType != 2 {
8981
--				return fmt.Errorf("proto: wrong wireType = %d for field AzureDisk", wireType)
8982
-+				return fmt.Errorf("proto: wrong wireType = %d for field CascadeDisk", wireType)
8983
- 			}
8984
- 			var msglen int
8985
- 			for shift := uint(0); ; shift += 7 {
8986
-@@ -50401,10 +50631,10 @@ func (m *VolumeSource) Unmarshal(dAtA []byte) error {
8987
- 			if postIndex > l {
8988
- 				return io.ErrUnexpectedEOF
8989
- 			}
8990
--			if m.AzureDisk == nil {
8991
--				m.AzureDisk = &AzureDiskVolumeSource{}
8992
-+			if m.CascadeDisk == nil {
8993
-+				m.CascadeDisk = &CascadeDiskVolumeSource{}
8994
- 			}
8995
--			if err := m.AzureDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
8996
-+			if err := m.CascadeDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
8997
- 				return err
8998
- 			}
8999
- 			iNdEx = postIndex
9000
-@@ -50573,6 +50803,39 @@ func (m *VolumeSource) Unmarshal(dAtA []byte) error {
9001
- 				return err
9002
- 			}
9003
- 			iNdEx = postIndex
9004
-+		case 28:
9005
-+			if wireType != 2 {
9006
-+				return fmt.Errorf("proto: wrong wireType = %d for field AzureDisk", wireType)
9007
-+			}
9008
-+			var msglen int
9009
-+			for shift := uint(0); ; shift += 7 {
9010
-+				if shift >= 64 {
9011
-+					return ErrIntOverflowGenerated
9012
-+				}
9013
-+				if iNdEx >= l {
9014
-+					return io.ErrUnexpectedEOF
9015
-+				}
9016
-+				b := dAtA[iNdEx]
9017
-+				iNdEx++
9018
-+				msglen |= (int(b) & 0x7F) << shift
9019
-+				if b < 0x80 {
9020
-+					break
9021
-+				}
9022
-+			}
9023
-+			if msglen < 0 {
9024
-+				return ErrInvalidLengthGenerated
9025
-+			}
9026
-+			postIndex := iNdEx + msglen
9027
-+			if postIndex > l {
9028
-+				return io.ErrUnexpectedEOF
9029
-+			}
9030
-+			if m.AzureDisk == nil {
9031
-+				m.AzureDisk = &AzureDiskVolumeSource{}
9032
-+			}
9033
-+			if err := m.AzureDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
9034
-+				return err
9035
-+			}
9036
-+			iNdEx = postIndex
9037
- 		default:
9038
- 			iNdEx = preIndex
9039
- 			skippy, err := skipGenerated(dAtA[iNdEx:])
9040
-@@ -50969,797 +51232,802 @@ func init() {
9041
- }
9042
- 
9043
- var fileDescriptorGenerated = []byte{
9044
--	// 12669 bytes of a gzipped FileDescriptorProto
9045
-+	// 12751 bytes of a gzipped FileDescriptorProto
9046
- 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x6c, 0x24, 0x57,
9047
--	0x76, 0x18, 0xbc, 0xd5, 0xdd, 0x7c, 0xf4, 0xe1, 0xfb, 0xce, 0x43, 0x1c, 0x4a, 0x33, 0x3d, 0x2a,
9048
--	0xed, 0x8e, 0x46, 0x2b, 0x89, 0xb3, 0x1a, 0x49, 0x2b, 0x79, 0xb5, 0x2b, 0x9b, 0x64, 0x93, 0x33,
9049
--	0xd4, 0x0c, 0x39, 0xad, 0xdb, 0x9c, 0xd1, 0xae, 0xac, 0x5d, 0x6f, 0xb1, 0xfb, 0xb2, 0x59, 0x62,
9050
--	0xb1, 0xaa, 0x55, 0x55, 0xcd, 0x19, 0xea, 0xb3, 0x81, 0x2f, 0xeb, 0xd8, 0x89, 0x1f, 0x08, 0x16,
9051
--	0xb1, 0x91, 0x87, 0x6d, 0x38, 0x80, 0xe3, 0xc0, 0x76, 0x9c, 0x04, 0x71, 0xec, 0xd8, 0xce, 0xae,
9052
--	0x9d, 0x38, 0x4e, 0x7e, 0x38, 0x7f, 0x36, 0x4e, 0x80, 0x60, 0x0d, 0x18, 0x61, 0x6c, 0xda, 0x49,
9053
--	0xe0, 0x1f, 0x79, 0x20, 0xce, 0x1f, 0x33, 0x46, 0x1c, 0xdc, 0x67, 0xdd, 0x5b, 0x5d, 0xd5, 0xdd,
9054
--	0x1c, 0x71, 0x28, 0xd9, 0xd8, 0x7f, 0xdd, 0xf7, 0x9c, 0x7b, 0xee, 0xad, 0xfb, 0x3c, 0xe7, 0xdc,
9055
--	0xf3, 0x80, 0xd7, 0x76, 0x5e, 0x8d, 0xe6, 0xdd, 0xe0, 0xda, 0x4e, 0x67, 0x93, 0x84, 0x3e, 0x89,
9056
--	0x49, 0x74, 0x6d, 0x8f, 0xf8, 0xcd, 0x20, 0xbc, 0x26, 0x00, 0x4e, 0xdb, 0xbd, 0xd6, 0x08, 0x42,
9057
--	0x72, 0x6d, 0xef, 0x85, 0x6b, 0x2d, 0xe2, 0x93, 0xd0, 0x89, 0x49, 0x73, 0xbe, 0x1d, 0x06, 0x71,
9058
--	0x80, 0x10, 0xc7, 0x99, 0x77, 0xda, 0xee, 0x3c, 0xc5, 0x99, 0xdf, 0x7b, 0x61, 0xee, 0xf9, 0x96,
9059
--	0x1b, 0x6f, 0x77, 0x36, 0xe7, 0x1b, 0xc1, 0xee, 0xb5, 0x56, 0xd0, 0x0a, 0xae, 0x31, 0xd4, 0xcd,
9060
--	0xce, 0x16, 0xfb, 0xc7, 0xfe, 0xb0, 0x5f, 0x9c, 0xc4, 0xdc, 0x4b, 0x49, 0x33, 0xbb, 0x4e, 0x63,
9061
--	0xdb, 0xf5, 0x49, 0xb8, 0x7f, 0xad, 0xbd, 0xd3, 0x62, 0xed, 0x86, 0x24, 0x0a, 0x3a, 0x61, 0x83,
9062
--	0xa4, 0x1b, 0xee, 0x59, 0x2b, 0xba, 0xb6, 0x4b, 0x62, 0x27, 0xa3, 0xbb, 0x73, 0xd7, 0xf2, 0x6a,
9063
--	0x85, 0x1d, 0x3f, 0x76, 0x77, 0xbb, 0x9b, 0xf9, 0x74, 0xbf, 0x0a, 0x51, 0x63, 0x9b, 0xec, 0x3a,
9064
--	0x5d, 0xf5, 0x5e, 0xcc, 0xab, 0xd7, 0x89, 0x5d, 0xef, 0x9a, 0xeb, 0xc7, 0x51, 0x1c, 0xa6, 0x2b,
9065
--	0xd9, 0xdf, 0xb4, 0xe0, 0xf2, 0xc2, 0x5b, 0xf5, 0x65, 0xcf, 0x89, 0x62, 0xb7, 0xb1, 0xe8, 0x05,
9066
--	0x8d, 0x9d, 0x7a, 0x1c, 0x84, 0xe4, 0x5e, 0xe0, 0x75, 0x76, 0x49, 0x9d, 0x0d, 0x04, 0x7a, 0x0e,
9067
--	0x46, 0xf7, 0xd8, 0xff, 0xd5, 0xea, 0xac, 0x75, 0xd9, 0xba, 0x5a, 0x5e, 0x9c, 0xfe, 0xad, 0x83,
9068
--	0xca, 0xc7, 0x0e, 0x0f, 0x2a, 0xa3, 0xf7, 0x44, 0x39, 0x56, 0x18, 0xe8, 0x0a, 0x0c, 0x6f, 0x45,
9069
--	0x1b, 0xfb, 0x6d, 0x32, 0x5b, 0x60, 0xb8, 0x93, 0x02, 0x77, 0x78, 0xa5, 0x4e, 0x4b, 0xb1, 0x80,
9070
--	0xa2, 0x6b, 0x50, 0x6e, 0x3b, 0x61, 0xec, 0xc6, 0x6e, 0xe0, 0xcf, 0x16, 0x2f, 0x5b, 0x57, 0x87,
9071
--	0x16, 0x67, 0x04, 0x6a, 0xb9, 0x26, 0x01, 0x38, 0xc1, 0xa1, 0xdd, 0x08, 0x89, 0xd3, 0xbc, 0xe3,
9072
--	0x7b, 0xfb, 0xb3, 0xa5, 0xcb, 0xd6, 0xd5, 0xd1, 0xa4, 0x1b, 0x58, 0x94, 0x63, 0x85, 0x61, 0xff,
9073
--	0x58, 0x01, 0x46, 0x17, 0xb6, 0xb6, 0x5c, 0xdf, 0x8d, 0xf7, 0xd1, 0x3d, 0x18, 0xf7, 0x83, 0x26,
9074
--	0x91, 0xff, 0xd9, 0x57, 0x8c, 0x5d, 0xbf, 0x3c, 0xdf, 0xbd, 0x94, 0xe6, 0xd7, 0x35, 0xbc, 0xc5,
9075
--	0xe9, 0xc3, 0x83, 0xca, 0xb8, 0x5e, 0x82, 0x0d, 0x3a, 0x08, 0xc3, 0x58, 0x3b, 0x68, 0x2a, 0xb2,
9076
--	0x05, 0x46, 0xb6, 0x92, 0x45, 0xb6, 0x96, 0xa0, 0x2d, 0x4e, 0x1d, 0x1e, 0x54, 0xc6, 0xb4, 0x02,
9077
--	0xac, 0x13, 0x41, 0x9b, 0x30, 0x45, 0xff, 0xfa, 0xb1, 0xab, 0xe8, 0x16, 0x19, 0xdd, 0xa7, 0xf2,
9078
--	0xe8, 0x6a, 0xa8, 0x8b, 0x67, 0x0e, 0x0f, 0x2a, 0x53, 0xa9, 0x42, 0x9c, 0x26, 0x68, 0xbf, 0x0f,
9079
--	0x93, 0x0b, 0x71, 0xec, 0x34, 0xb6, 0x49, 0x93, 0xcf, 0x20, 0x7a, 0x09, 0x4a, 0xbe, 0xb3, 0x4b,
9080
--	0xc4, 0xfc, 0x5e, 0x16, 0x03, 0x5b, 0x5a, 0x77, 0x76, 0xc9, 0xd1, 0x41, 0x65, 0xfa, 0xae, 0xef,
9081
--	0xbe, 0xd7, 0x11, 0xab, 0x82, 0x96, 0x61, 0x86, 0x8d, 0xae, 0x03, 0x34, 0xc9, 0x9e, 0xdb, 0x20,
9082
--	0x35, 0x27, 0xde, 0x16, 0xf3, 0x8d, 0x44, 0x5d, 0xa8, 0x2a, 0x08, 0xd6, 0xb0, 0xec, 0x07, 0x50,
9083
--	0x5e, 0xd8, 0x0b, 0xdc, 0x66, 0x2d, 0x68, 0x46, 0x68, 0x07, 0xa6, 0xda, 0x21, 0xd9, 0x22, 0xa1,
9084
--	0x2a, 0x9a, 0xb5, 0x2e, 0x17, 0xaf, 0x8e, 0x5d, 0xbf, 0x9a, 0xf9, 0xb1, 0x26, 0xea, 0xb2, 0x1f,
9085
--	0x87, 0xfb, 0x8b, 0x8f, 0x89, 0xf6, 0xa6, 0x52, 0x50, 0x9c, 0xa6, 0x6c, 0xff, 0xeb, 0x02, 0x9c,
9086
--	0x5b, 0x78, 0xbf, 0x13, 0x92, 0xaa, 0x1b, 0xed, 0xa4, 0x57, 0x78, 0xd3, 0x8d, 0x76, 0xd6, 0x93,
9087
--	0x11, 0x50, 0x4b, 0xab, 0x2a, 0xca, 0xb1, 0xc2, 0x40, 0xcf, 0xc3, 0x08, 0xfd, 0x7d, 0x17, 0xaf,
9088
--	0x8a, 0x4f, 0x3e, 0x23, 0x90, 0xc7, 0xaa, 0x4e, 0xec, 0x54, 0x39, 0x08, 0x4b, 0x1c, 0xb4, 0x06,
9089
--	0x63, 0x0d, 0xb6, 0x21, 0x5b, 0x6b, 0x41, 0x93, 0xb0, 0xc9, 0x2c, 0x2f, 0x3e, 0x4b, 0xd1, 0x97,
9090
--	0x92, 0xe2, 0xa3, 0x83, 0xca, 0x2c, 0xef, 0x9b, 0x20, 0xa1, 0xc1, 0xb0, 0x5e, 0x1f, 0xd9, 0x6a,
9091
--	0x7f, 0x95, 0x18, 0x25, 0xc8, 0xd8, 0x5b, 0x57, 0xb5, 0xad, 0x32, 0xc4, 0xb6, 0xca, 0x78, 0xf6,
9092
--	0x36, 0x41, 0x2f, 0x40, 0x69, 0xc7, 0xf5, 0x9b, 0xb3, 0xc3, 0x8c, 0xd6, 0x45, 0x3a, 0xe7, 0xb7,
9093
--	0x5c, 0xbf, 0x79, 0x74, 0x50, 0x99, 0x31, 0xba, 0x43, 0x0b, 0x31, 0x43, 0xb5, 0xff, 0xd8, 0x82,
9094
--	0x0a, 0x83, 0xad, 0xb8, 0x1e, 0xa9, 0x91, 0x30, 0x72, 0xa3, 0x98, 0xf8, 0xb1, 0x31, 0xa0, 0xd7,
9095
--	0x01, 0x22, 0xd2, 0x08, 0x49, 0xac, 0x0d, 0xa9, 0x5a, 0x18, 0x75, 0x05, 0xc1, 0x1a, 0x16, 0x3d,
9096
--	0x10, 0xa2, 0x6d, 0x27, 0x64, 0xeb, 0x4b, 0x0c, 0xac, 0x3a, 0x10, 0xea, 0x12, 0x80, 0x13, 0x1c,
9097
--	0xe3, 0x40, 0x28, 0xf6, 0x3b, 0x10, 0xd0, 0xe7, 0x60, 0x2a, 0x69, 0x2c, 0x6a, 0x3b, 0x0d, 0x39,
9098
--	0x80, 0x6c, 0xcb, 0xd4, 0x4d, 0x10, 0x4e, 0xe3, 0xda, 0x7f, 0xdf, 0x12, 0x8b, 0x87, 0x7e, 0xf5,
9099
--	0x47, 0xfc, 0x5b, 0xed, 0x5f, 0xb5, 0x60, 0x64, 0xd1, 0xf5, 0x9b, 0xae, 0xdf, 0x42, 0x5f, 0x86,
9100
--	0x51, 0x7a, 0x37, 0x35, 0x9d, 0xd8, 0x11, 0xe7, 0xde, 0xa7, 0xb4, 0xbd, 0xa5, 0xae, 0x8a, 0xf9,
9101
--	0xf6, 0x4e, 0x8b, 0x16, 0x44, 0xf3, 0x14, 0x9b, 0xee, 0xb6, 0x3b, 0x9b, 0xef, 0x92, 0x46, 0xbc,
9102
--	0x46, 0x62, 0x27, 0xf9, 0x9c, 0xa4, 0x0c, 0x2b, 0xaa, 0xe8, 0x16, 0x0c, 0xc7, 0x4e, 0xd8, 0x22,
9103
--	0xb1, 0x38, 0x00, 0x33, 0x0f, 0x2a, 0x5e, 0x13, 0xd3, 0x1d, 0x49, 0xfc, 0x06, 0x49, 0xae, 0x85,
9104
--	0x0d, 0x56, 0x15, 0x0b, 0x12, 0xf6, 0x0f, 0x0e, 0xc3, 0x85, 0xa5, 0xfa, 0x6a, 0xce, 0xba, 0xba,
9105
--	0x02, 0xc3, 0xcd, 0xd0, 0xdd, 0x23, 0xa1, 0x18, 0x67, 0x45, 0xa5, 0xca, 0x4a, 0xb1, 0x80, 0xa2,
9106
--	0x57, 0x61, 0x9c, 0x5f, 0x48, 0x37, 0x1d, 0xbf, 0xe9, 0xc9, 0x21, 0x3e, 0x2b, 0xb0, 0xc7, 0xef,
9107
--	0x69, 0x30, 0x6c, 0x60, 0x1e, 0x73, 0x51, 0x5d, 0x49, 0x6d, 0xc6, 0xbc, 0xcb, 0xee, 0x07, 0x2c,
9108
--	0x98, 0xe6, 0xcd, 0x2c, 0xc4, 0x71, 0xe8, 0x6e, 0x76, 0x62, 0x12, 0xcd, 0x0e, 0xb1, 0x93, 0x6e,
9109
--	0x29, 0x6b, 0xb4, 0x72, 0x47, 0x60, 0xfe, 0x5e, 0x8a, 0x0a, 0x3f, 0x04, 0x67, 0x45, 0xbb, 0xd3,
9110
--	0x69, 0x30, 0xee, 0x6a, 0x16, 0x7d, 0xaf, 0x05, 0x73, 0x8d, 0xc0, 0x8f, 0xc3, 0xc0, 0xf3, 0x48,
9111
--	0x58, 0xeb, 0x6c, 0x7a, 0x6e, 0xb4, 0xcd, 0xd7, 0x29, 0x26, 0x5b, 0xec, 0x24, 0xc8, 0x99, 0x43,
9112
--	0x85, 0x24, 0xe6, 0xf0, 0xd2, 0xe1, 0x41, 0x65, 0x6e, 0x29, 0x97, 0x14, 0xee, 0xd1, 0x0c, 0xda,
9113
--	0x01, 0x44, 0xaf, 0xd2, 0x7a, 0xec, 0xb4, 0x48, 0xd2, 0xf8, 0xc8, 0xe0, 0x8d, 0x9f, 0x3f, 0x3c,
9114
--	0xa8, 0xa0, 0xf5, 0x2e, 0x12, 0x38, 0x83, 0x2c, 0x7a, 0x0f, 0xce, 0xd2, 0xd2, 0xae, 0x6f, 0x1d,
9115
--	0x1d, 0xbc, 0xb9, 0xd9, 0xc3, 0x83, 0xca, 0xd9, 0xf5, 0x0c, 0x22, 0x38, 0x93, 0xf4, 0xdc, 0x12,
9116
--	0x9c, 0xcb, 0x9c, 0x2a, 0x34, 0x0d, 0xc5, 0x1d, 0xc2, 0x59, 0x90, 0x32, 0xa6, 0x3f, 0xd1, 0x59,
9117
--	0x18, 0xda, 0x73, 0xbc, 0x8e, 0x58, 0xa5, 0x98, 0xff, 0xf9, 0x4c, 0xe1, 0x55, 0xcb, 0x6e, 0xc0,
9118
--	0xf8, 0x92, 0xd3, 0x76, 0x36, 0x5d, 0xcf, 0x8d, 0x5d, 0x12, 0xa1, 0xa7, 0xa1, 0xe8, 0x34, 0x9b,
9119
--	0xec, 0x8a, 0x2c, 0x2f, 0x9e, 0x3b, 0x3c, 0xa8, 0x14, 0x17, 0x9a, 0xf4, 0xac, 0x06, 0x85, 0xb5,
9120
--	0x8f, 0x29, 0x06, 0xfa, 0x24, 0x94, 0x9a, 0x61, 0xd0, 0x9e, 0x2d, 0x30, 0x4c, 0x3a, 0x54, 0xa5,
9121
--	0x6a, 0x18, 0xb4, 0x53, 0xa8, 0x0c, 0xc7, 0xfe, 0x8d, 0x02, 0x3c, 0xb1, 0x44, 0xda, 0xdb, 0x2b,
9122
--	0xf5, 0x9c, 0x4d, 0x77, 0x15, 0x46, 0x77, 0x03, 0xdf, 0x8d, 0x83, 0x30, 0x12, 0x4d, 0xb3, 0xdb,
9123
--	0x64, 0x4d, 0x94, 0x61, 0x05, 0x45, 0x97, 0xa1, 0xd4, 0x4e, 0x38, 0x81, 0x71, 0xc9, 0x45, 0x30,
9124
--	0x1e, 0x80, 0x41, 0x28, 0x46, 0x27, 0x22, 0xa1, 0xb8, 0x05, 0x15, 0xc6, 0xdd, 0x88, 0x84, 0x98,
9125
--	0x41, 0x92, 0xe3, 0x94, 0x1e, 0xb4, 0x62, 0x5b, 0xa5, 0x8e, 0x53, 0x0a, 0xc1, 0x1a, 0x16, 0xaa,
9126
--	0x41, 0x39, 0x52, 0x93, 0x3a, 0x34, 0xf8, 0xa4, 0x4e, 0xb0, 0xf3, 0x56, 0xcd, 0x64, 0x42, 0xc4,
9127
--	0x38, 0x06, 0x86, 0xfb, 0x9e, 0xb7, 0x5f, 0x2f, 0x00, 0xe2, 0x43, 0xf8, 0xe7, 0x6c, 0xe0, 0xee,
9128
--	0x76, 0x0f, 0x5c, 0x26, 0xe7, 0x75, 0x3b, 0x68, 0x38, 0x5e, 0xfa, 0x08, 0x3f, 0xa9, 0xd1, 0xfb,
9129
--	0xdf, 0x16, 0x3c, 0xb1, 0xe4, 0xfa, 0x4d, 0x12, 0xe6, 0x2c, 0xc0, 0x47, 0x23, 0x80, 0x1c, 0xef,
9130
--	0xa4, 0x37, 0x96, 0x58, 0xe9, 0x04, 0x96, 0x98, 0xfd, 0x3f, 0x2c, 0x40, 0xfc, 0xb3, 0x3f, 0x72,
9131
--	0x1f, 0x7b, 0xb7, 0xfb, 0x63, 0x4f, 0x60, 0x59, 0xd8, 0xb7, 0x61, 0x72, 0xc9, 0x73, 0x89, 0x1f,
9132
--	0xaf, 0xd6, 0x96, 0x02, 0x7f, 0xcb, 0x6d, 0xa1, 0xcf, 0xc0, 0x24, 0x95, 0x69, 0x83, 0x4e, 0x5c,
9133
--	0x27, 0x8d, 0xc0, 0x67, 0xec, 0x3f, 0x95, 0x04, 0xd1, 0xe1, 0x41, 0x65, 0x72, 0xc3, 0x80, 0xe0,
9134
--	0x14, 0xa6, 0xfd, 0xbb, 0x74, 0xfc, 0x82, 0xdd, 0x76, 0xe0, 0x13, 0x3f, 0x5e, 0x0a, 0xfc, 0x26,
9135
--	0x17, 0x13, 0x3f, 0x03, 0xa5, 0x98, 0x8e, 0x07, 0x1f, 0xbb, 0x2b, 0x72, 0xa3, 0xd0, 0x51, 0x38,
9136
--	0x3a, 0xa8, 0x9c, 0xef, 0xae, 0xc1, 0xc6, 0x89, 0xd5, 0x41, 0xdf, 0x06, 0xc3, 0x51, 0xec, 0xc4,
9137
--	0x9d, 0x48, 0x8c, 0xe6, 0x93, 0x72, 0x34, 0xeb, 0xac, 0xf4, 0xe8, 0xa0, 0x32, 0xa5, 0xaa, 0xf1,
9138
--	0x22, 0x2c, 0x2a, 0xa0, 0x67, 0x60, 0x64, 0x97, 0x44, 0x91, 0xd3, 0x92, 0x1c, 0xfe, 0x94, 0xa8,
9139
--	0x3b, 0xb2, 0xc6, 0x8b, 0xb1, 0x84, 0xa3, 0xa7, 0x60, 0x88, 0x84, 0x61, 0x10, 0x8a, 0x3d, 0x3a,
9140
--	0x21, 0x10, 0x87, 0x96, 0x69, 0x21, 0xe6, 0x30, 0xfb, 0xdf, 0x5a, 0x30, 0xa5, 0xfa, 0xca, 0xdb,
9141
--	0x3a, 0x05, 0x56, 0xee, 0x6d, 0x80, 0x86, 0xfc, 0xc0, 0x88, 0xdd, 0x1e, 0x63, 0xd7, 0xaf, 0x64,
9142
--	0x32, 0x28, 0x5d, 0xc3, 0x98, 0x50, 0x56, 0x45, 0x11, 0xd6, 0xa8, 0xd9, 0xbf, 0x6e, 0xc1, 0x99,
9143
--	0xd4, 0x17, 0xdd, 0x76, 0xa3, 0x18, 0xbd, 0xd3, 0xf5, 0x55, 0xf3, 0x83, 0x7d, 0x15, 0xad, 0xcd,
9144
--	0xbe, 0x49, 0x2d, 0x65, 0x59, 0xa2, 0x7d, 0xd1, 0x4d, 0x18, 0x72, 0x63, 0xb2, 0x2b, 0x3f, 0xe6,
9145
--	0xa9, 0x9e, 0x1f, 0xc3, 0x7b, 0x95, 0xcc, 0xc8, 0x2a, 0xad, 0x89, 0x39, 0x01, 0xfb, 0x47, 0x8a,
9146
--	0x50, 0xe6, 0xcb, 0x76, 0xcd, 0x69, 0x9f, 0xc2, 0x5c, 0xac, 0x42, 0x89, 0x51, 0xe7, 0x1d, 0x7f,
9147
--	0x3a, 0xbb, 0xe3, 0xa2, 0x3b, 0xf3, 0x54, 0x4e, 0xe3, 0xac, 0xa0, 0xba, 0x1a, 0x68, 0x11, 0x66,
9148
--	0x24, 0x90, 0x03, 0xb0, 0xe9, 0xfa, 0x4e, 0xb8, 0x4f, 0xcb, 0x66, 0x8b, 0x8c, 0xe0, 0xf3, 0xbd,
9149
--	0x09, 0x2e, 0x2a, 0x7c, 0x4e, 0x56, 0xf5, 0x35, 0x01, 0x60, 0x8d, 0xe8, 0xdc, 0x2b, 0x50, 0x56,
9150
--	0xc8, 0xc7, 0xe1, 0x71, 0xe6, 0x3e, 0x07, 0x53, 0xa9, 0xb6, 0xfa, 0x55, 0x1f, 0xd7, 0x59, 0xa4,
9151
--	0xaf, 0xb1, 0x53, 0x40, 0xf4, 0x7a, 0xd9, 0xdf, 0x13, 0xa7, 0xe8, 0xfb, 0x70, 0xd6, 0xcb, 0x38,
9152
--	0x9c, 0xc4, 0x54, 0x0d, 0x7e, 0x98, 0x3d, 0x21, 0x3e, 0xfb, 0x6c, 0x16, 0x14, 0x67, 0xb6, 0x41,
9153
--	0xaf, 0xfd, 0xa0, 0x4d, 0xd7, 0xbc, 0xe3, 0xb1, 0xfe, 0x0a, 0xe9, 0xfb, 0x8e, 0x28, 0xc3, 0x0a,
9154
--	0x4a, 0x8f, 0xb0, 0xb3, 0xaa, 0xf3, 0xb7, 0xc8, 0x7e, 0x9d, 0x78, 0xa4, 0x11, 0x07, 0xe1, 0x87,
9155
--	0xda, 0xfd, 0x8b, 0x7c, 0xf4, 0xf9, 0x09, 0x38, 0x26, 0x08, 0x14, 0x6f, 0x91, 0x7d, 0x3e, 0x15,
9156
--	0xfa, 0xd7, 0x15, 0x7b, 0x7e, 0xdd, 0x2f, 0x58, 0x30, 0xa1, 0xbe, 0xee, 0x14, 0xb6, 0xfa, 0xa2,
9157
--	0xb9, 0xd5, 0x2f, 0xf6, 0x5c, 0xe0, 0x39, 0x9b, 0xfc, 0xeb, 0x05, 0xb8, 0xa0, 0x70, 0x28, 0xbb,
9158
--	0xcf, 0xff, 0x88, 0x55, 0x75, 0x0d, 0xca, 0xbe, 0xd2, 0x1e, 0x58, 0xa6, 0xd8, 0x9e, 0xe8, 0x0e,
9159
--	0x12, 0x1c, 0xca, 0xb5, 0xf9, 0x89, 0x88, 0x3f, 0xae, 0xab, 0xd5, 0x84, 0x0a, 0x6d, 0x11, 0x8a,
9160
--	0x1d, 0xb7, 0x29, 0xee, 0x8c, 0x4f, 0xc9, 0xd1, 0xbe, 0xbb, 0x5a, 0x3d, 0x3a, 0xa8, 0x3c, 0x99,
9161
--	0xa7, 0xd2, 0xa5, 0x97, 0x55, 0x34, 0x7f, 0x77, 0xb5, 0x8a, 0x69, 0x65, 0xb4, 0x00, 0x53, 0x52,
9162
--	0x6b, 0x7d, 0x8f, 0x72, 0x50, 0x81, 0x2f, 0xae, 0x16, 0xa5, 0x1b, 0xc3, 0x26, 0x18, 0xa7, 0xf1,
9163
--	0x51, 0x15, 0xa6, 0x77, 0x3a, 0x9b, 0xc4, 0x23, 0x31, 0xff, 0xe0, 0x5b, 0x84, 0x6b, 0x8e, 0xca,
9164
--	0x89, 0x68, 0x79, 0x2b, 0x05, 0xc7, 0x5d, 0x35, 0xec, 0x3f, 0x63, 0x47, 0xbc, 0x18, 0xbd, 0x5a,
9165
--	0x18, 0xd0, 0x85, 0x45, 0xa9, 0x7f, 0x98, 0xcb, 0x79, 0x90, 0x55, 0x71, 0x8b, 0xec, 0x6f, 0x04,
9166
--	0x94, 0xd9, 0xce, 0x5e, 0x15, 0xc6, 0x9a, 0x2f, 0xf5, 0x5c, 0xf3, 0xbf, 0x54, 0x80, 0x73, 0x6a,
9167
--	0x04, 0x0c, 0xbe, 0xee, 0xcf, 0xfb, 0x18, 0xbc, 0x00, 0x63, 0x4d, 0xb2, 0xe5, 0x74, 0xbc, 0x58,
9168
--	0xa9, 0x31, 0x87, 0xb8, 0x2a, 0xbb, 0x9a, 0x14, 0x63, 0x1d, 0xe7, 0x18, 0xc3, 0xf6, 0xd3, 0x63,
9169
--	0xec, 0x6e, 0x8d, 0x1d, 0xba, 0xc6, 0xd5, 0xae, 0xb1, 0x72, 0x77, 0xcd, 0x53, 0x30, 0xe4, 0xee,
9170
--	0x52, 0x5e, 0xab, 0x60, 0xb2, 0x50, 0xab, 0xb4, 0x10, 0x73, 0x18, 0xfa, 0x04, 0x8c, 0x34, 0x82,
9171
--	0xdd, 0x5d, 0xc7, 0x6f, 0xb2, 0x2b, 0xaf, 0xbc, 0x38, 0x46, 0xd9, 0xb1, 0x25, 0x5e, 0x84, 0x25,
9172
--	0x0c, 0x3d, 0x01, 0x25, 0x27, 0x6c, 0x45, 0xb3, 0x25, 0x86, 0x33, 0x4a, 0x5b, 0x5a, 0x08, 0x5b,
9173
--	0x11, 0x66, 0xa5, 0x54, 0xaa, 0xba, 0x1f, 0x84, 0x3b, 0xae, 0xdf, 0xaa, 0xba, 0xa1, 0xd8, 0x12,
9174
--	0xea, 0x2e, 0x7c, 0x4b, 0x41, 0xb0, 0x86, 0x85, 0x56, 0x60, 0xa8, 0x1d, 0x84, 0x71, 0x34, 0x3b,
9175
--	0xcc, 0x86, 0xfb, 0xc9, 0x9c, 0x83, 0x88, 0x7f, 0x6d, 0x2d, 0x08, 0xe3, 0xe4, 0x03, 0xe8, 0xbf,
9176
--	0x08, 0xf3, 0xea, 0xe8, 0xdb, 0xa0, 0x48, 0xfc, 0xbd, 0xd9, 0x11, 0x46, 0x65, 0x2e, 0x8b, 0xca,
9177
--	0xb2, 0xbf, 0x77, 0xcf, 0x09, 0x93, 0x53, 0x7a, 0xd9, 0xdf, 0xc3, 0xb4, 0x0e, 0xfa, 0x02, 0x94,
9178
--	0xe5, 0x16, 0x8f, 0x84, 0x9a, 0x23, 0x73, 0x89, 0xc9, 0x83, 0x01, 0x93, 0xf7, 0x3a, 0x6e, 0x48,
9179
--	0x76, 0x89, 0x1f, 0x47, 0xc9, 0x99, 0x26, 0xa1, 0x11, 0x4e, 0xa8, 0xa1, 0x2f, 0x48, 0xdd, 0xda,
9180
--	0x5a, 0xd0, 0xf1, 0xe3, 0x68, 0xb6, 0xcc, 0xba, 0x97, 0xf9, 0xea, 0x71, 0x2f, 0xc1, 0x4b, 0x2b,
9181
--	0xdf, 0x78, 0x65, 0x6c, 0x90, 0x42, 0x18, 0x26, 0x3c, 0x77, 0x8f, 0xf8, 0x24, 0x8a, 0x6a, 0x61,
9182
--	0xb0, 0x49, 0x66, 0x81, 0xf5, 0xfc, 0x42, 0xf6, 0x63, 0x40, 0xb0, 0x49, 0x16, 0x67, 0x0e, 0x0f,
9183
--	0x2a, 0x13, 0xb7, 0xf5, 0x3a, 0xd8, 0x24, 0x81, 0xee, 0xc2, 0x24, 0x95, 0x6b, 0xdc, 0x84, 0xe8,
9184
--	0x58, 0x3f, 0xa2, 0x4c, 0xfa, 0xc0, 0x46, 0x25, 0x9c, 0x22, 0x82, 0xde, 0x80, 0xb2, 0xe7, 0x6e,
9185
--	0x91, 0xc6, 0x7e, 0xc3, 0x23, 0xb3, 0xe3, 0x8c, 0x62, 0xe6, 0xb6, 0xba, 0x2d, 0x91, 0xb8, 0x5c,
9186
--	0xa4, 0xfe, 0xe2, 0xa4, 0x3a, 0xba, 0x07, 0xe7, 0x63, 0x12, 0xee, 0xba, 0xbe, 0x43, 0xb7, 0x83,
9187
--	0x90, 0x17, 0xd8, 0x93, 0xca, 0x04, 0x5b, 0x6f, 0x97, 0xc4, 0xd0, 0x9d, 0xdf, 0xc8, 0xc4, 0xc2,
9188
--	0x39, 0xb5, 0xd1, 0x1d, 0x98, 0x62, 0x3b, 0xa1, 0xd6, 0xf1, 0xbc, 0x5a, 0xe0, 0xb9, 0x8d, 0xfd,
9189
--	0xd9, 0x49, 0x46, 0xf0, 0x13, 0xf2, 0x5e, 0x58, 0x35, 0xc1, 0x47, 0x07, 0x15, 0x48, 0xfe, 0xe1,
9190
--	0x74, 0x6d, 0xb4, 0xc9, 0x74, 0xe8, 0x9d, 0xd0, 0x8d, 0xf7, 0xe9, 0xfa, 0x25, 0x0f, 0xe2, 0xd9,
9191
--	0xa9, 0x9e, 0xa2, 0xb0, 0x8e, 0xaa, 0x14, 0xed, 0x7a, 0x21, 0x4e, 0x13, 0xa4, 0x5b, 0x3b, 0x8a,
9192
--	0x9b, 0xae, 0x3f, 0x3b, 0xcd, 0x4e, 0x0c, 0xb5, 0x33, 0xea, 0xb4, 0x10, 0x73, 0x18, 0xd3, 0x9f,
9193
--	0xd3, 0x1f, 0x77, 0xe8, 0x09, 0x3a, 0xc3, 0x10, 0x13, 0xfd, 0xb9, 0x04, 0xe0, 0x04, 0x87, 0x32,
9194
--	0x35, 0x71, 0xbc, 0x3f, 0x8b, 0x18, 0xaa, 0xda, 0x2e, 0x1b, 0x1b, 0x5f, 0xc0, 0xb4, 0x1c, 0xdd,
9195
--	0x86, 0x11, 0xe2, 0xef, 0xad, 0x84, 0xc1, 0xee, 0xec, 0x99, 0xfc, 0x3d, 0xbb, 0xcc, 0x51, 0xf8,
9196
--	0x81, 0x9e, 0x08, 0x78, 0xa2, 0x18, 0x4b, 0x12, 0xe8, 0x01, 0xcc, 0x66, 0xcc, 0x08, 0x9f, 0x80,
9197
--	0xb3, 0x6c, 0x02, 0x3e, 0x2b, 0xea, 0xce, 0x6e, 0xe4, 0xe0, 0x1d, 0xf5, 0x80, 0xe1, 0x5c, 0xea,
9198
--	0xe8, 0x8b, 0x30, 0xc1, 0x37, 0x14, 0x7f, 0x7c, 0x8b, 0x66, 0xcf, 0xb1, 0xaf, 0xb9, 0x9c, 0xbf,
9199
--	0x39, 0x39, 0xe2, 0xe2, 0x39, 0xd1, 0xa1, 0x09, 0xbd, 0x34, 0xc2, 0x26, 0x35, 0x7b, 0x13, 0x26,
9200
--	0xd5, 0xb9, 0xc5, 0x96, 0x0e, 0xaa, 0xc0, 0x10, 0xe3, 0x76, 0x84, 0x7e, 0xab, 0x4c, 0x67, 0x8a,
9201
--	0x71, 0x42, 0x98, 0x97, 0xb3, 0x99, 0x72, 0xdf, 0x27, 0x8b, 0xfb, 0x31, 0xe1, 0x52, 0x75, 0x51,
9202
--	0x9b, 0x29, 0x09, 0xc0, 0x09, 0x8e, 0xfd, 0x7f, 0x39, 0xd7, 0x98, 0x1c, 0x8e, 0x03, 0x5c, 0x07,
9203
--	0xcf, 0xc1, 0xe8, 0x76, 0x10, 0xc5, 0x14, 0x9b, 0xb5, 0x31, 0x94, 0xf0, 0x89, 0x37, 0x45, 0x39,
9204
--	0x56, 0x18, 0xe8, 0x35, 0x98, 0x68, 0xe8, 0x0d, 0x88, 0xbb, 0x4c, 0x0d, 0x81, 0xd1, 0x3a, 0x36,
9205
--	0x71, 0xd1, 0xab, 0x30, 0xca, 0x9e, 0xce, 0x1b, 0x81, 0x27, 0x98, 0x2c, 0x79, 0x21, 0x8f, 0xd6,
9206
--	0x44, 0xf9, 0x91, 0xf6, 0x1b, 0x2b, 0x6c, 0x74, 0x05, 0x86, 0x69, 0x17, 0x56, 0x6b, 0xe2, 0x16,
9207
--	0x51, 0xaa, 0x9a, 0x9b, 0xac, 0x14, 0x0b, 0xa8, 0xfd, 0xd7, 0x0b, 0xda, 0x28, 0x53, 0x89, 0x94,
9208
--	0xa0, 0x1a, 0x8c, 0xdc, 0x77, 0xdc, 0xd8, 0xf5, 0x5b, 0x82, 0x5d, 0x78, 0xa6, 0xe7, 0x95, 0xc2,
9209
--	0x2a, 0xbd, 0xc5, 0x2b, 0xf0, 0x4b, 0x4f, 0xfc, 0xc1, 0x92, 0x0c, 0xa5, 0x18, 0x76, 0x7c, 0x9f,
9210
--	0x52, 0x2c, 0x0c, 0x4a, 0x11, 0xf3, 0x0a, 0x9c, 0xa2, 0xf8, 0x83, 0x25, 0x19, 0xf4, 0x0e, 0x80,
9211
--	0x5c, 0x96, 0xa4, 0x29, 0x9e, 0xac, 0x9f, 0xeb, 0x4f, 0x74, 0x43, 0xd5, 0x59, 0x9c, 0xa4, 0x57,
9212
--	0x6a, 0xf2, 0x1f, 0x6b, 0xf4, 0xec, 0x98, 0xb1, 0x55, 0xdd, 0x9d, 0x41, 0xdf, 0x49, 0x4f, 0x02,
9213
--	0x27, 0x8c, 0x49, 0x73, 0x21, 0x16, 0x83, 0xf3, 0xc9, 0xc1, 0x64, 0x8a, 0x0d, 0x77, 0x97, 0xe8,
9214
--	0xa7, 0x86, 0x20, 0x82, 0x13, 0x7a, 0xf6, 0xaf, 0x14, 0x61, 0x36, 0xaf, 0xbb, 0x74, 0xd1, 0x91,
9215
--	0x07, 0x6e, 0xbc, 0x44, 0xb9, 0x21, 0xcb, 0x5c, 0x74, 0xcb, 0xa2, 0x1c, 0x2b, 0x0c, 0x3a, 0xfb,
9216
--	0x91, 0xdb, 0x92, 0x22, 0xe1, 0x50, 0x32, 0xfb, 0x75, 0x56, 0x8a, 0x05, 0x94, 0xe2, 0x85, 0xc4,
9217
--	0x89, 0x84, 0x4d, 0x84, 0xb6, 0x4a, 0x30, 0x2b, 0xc5, 0x02, 0xaa, 0xeb, 0x9b, 0x4a, 0x7d, 0xf4,
9218
--	0x4d, 0xc6, 0x10, 0x0d, 0x9d, 0xec, 0x10, 0xa1, 0x2f, 0x01, 0x6c, 0xb9, 0xbe, 0x1b, 0x6d, 0x33,
9219
--	0xea, 0xc3, 0xc7, 0xa6, 0xae, 0x78, 0xa9, 0x15, 0x45, 0x05, 0x6b, 0x14, 0xd1, 0xcb, 0x30, 0xa6,
9220
--	0x36, 0xe0, 0x6a, 0x95, 0x3d, 0x10, 0x69, 0x0f, 0xee, 0xc9, 0x69, 0x54, 0xc5, 0x3a, 0x9e, 0xfd,
9221
--	0x6e, 0x7a, 0xbd, 0x88, 0x1d, 0xa0, 0x8d, 0xaf, 0x35, 0xe8, 0xf8, 0x16, 0x7a, 0x8f, 0xaf, 0xfd,
9222
--	0x9b, 0x45, 0x98, 0x32, 0x1a, 0xeb, 0x44, 0x03, 0x9c, 0x59, 0x37, 0xe8, 0x3d, 0xe7, 0xc4, 0x44,
9223
--	0xec, 0x3f, 0xbb, 0xff, 0x56, 0xd1, 0xef, 0x42, 0xba, 0x03, 0x78, 0x7d, 0xf4, 0x25, 0x28, 0x7b,
9224
--	0x4e, 0xc4, 0x74, 0x57, 0x44, 0xec, 0xbb, 0x41, 0x88, 0x25, 0x72, 0x84, 0x13, 0xc5, 0xda, 0x55,
9225
--	0xc3, 0x69, 0x27, 0x24, 0xe9, 0x85, 0x4c, 0x79, 0x1f, 0x69, 0x74, 0xa3, 0x3a, 0x41, 0x19, 0xa4,
9226
--	0x7d, 0xcc, 0x61, 0xe8, 0x55, 0x18, 0x0f, 0x09, 0x5b, 0x15, 0x4b, 0x94, 0x95, 0x63, 0xcb, 0x6c,
9227
--	0x28, 0xe1, 0xf9, 0xb0, 0x06, 0xc3, 0x06, 0x66, 0xc2, 0xca, 0x0f, 0xf7, 0x60, 0xe5, 0x9f, 0x81,
9228
--	0x11, 0xf6, 0x43, 0xad, 0x00, 0x35, 0x1b, 0xab, 0xbc, 0x18, 0x4b, 0x78, 0x7a, 0xc1, 0x8c, 0x0e,
9229
--	0xb8, 0x60, 0x3e, 0x09, 0x93, 0x55, 0x87, 0xec, 0x06, 0xfe, 0xb2, 0xdf, 0x6c, 0x07, 0xae, 0x1f,
9230
--	0xa3, 0x59, 0x28, 0xb1, 0xdb, 0x81, 0xef, 0xed, 0x12, 0xa5, 0x80, 0x4b, 0x94, 0x31, 0xb7, 0x5b,
9231
--	0x70, 0xae, 0x1a, 0xdc, 0xf7, 0xef, 0x3b, 0x61, 0x73, 0xa1, 0xb6, 0xaa, 0xc9, 0xb9, 0xeb, 0x52,
9232
--	0xce, 0xe2, 0x46, 0x2c, 0x99, 0x67, 0xaa, 0x56, 0x93, 0xdf, 0xb5, 0x2b, 0xae, 0x47, 0x72, 0xb4,
9233
--	0x11, 0x7f, 0xb3, 0x60, 0xb4, 0x94, 0xe0, 0xab, 0x07, 0x23, 0x2b, 0xf7, 0xc1, 0xe8, 0x4d, 0x18,
9234
--	0xdd, 0x72, 0x89, 0xd7, 0xc4, 0x64, 0x4b, 0x2c, 0xb1, 0xa7, 0xf3, 0xdf, 0xe5, 0x57, 0x28, 0xa6,
9235
--	0xd4, 0x3e, 0x71, 0x29, 0x6d, 0x45, 0x54, 0xc6, 0x8a, 0x0c, 0xda, 0x81, 0x69, 0x29, 0x06, 0x48,
9236
--	0xa8, 0x58, 0x70, 0xcf, 0xf4, 0x92, 0x2d, 0x4c, 0xe2, 0x67, 0x0f, 0x0f, 0x2a, 0xd3, 0x38, 0x45,
9237
--	0x06, 0x77, 0x11, 0xa6, 0x62, 0xd9, 0x2e, 0x3d, 0x5a, 0x4b, 0x6c, 0xf8, 0x99, 0x58, 0xc6, 0x24,
9238
--	0x4c, 0x56, 0x6a, 0xff, 0x84, 0x05, 0x8f, 0x75, 0x8d, 0x8c, 0x90, 0xb4, 0x4f, 0x78, 0x16, 0xd2,
9239
--	0x92, 0x6f, 0xa1, 0xbf, 0xe4, 0x6b, 0xff, 0x03, 0x0b, 0xce, 0x2e, 0xef, 0xb6, 0xe3, 0xfd, 0xaa,
9240
--	0x6b, 0xbe, 0xee, 0xbc, 0x02, 0xc3, 0xbb, 0xa4, 0xe9, 0x76, 0x76, 0xc5, 0xcc, 0x55, 0xe4, 0xf1,
9241
--	0xb3, 0xc6, 0x4a, 0x8f, 0x0e, 0x2a, 0x13, 0xf5, 0x38, 0x08, 0x9d, 0x16, 0xe1, 0x05, 0x58, 0xa0,
9242
--	0xb3, 0x43, 0xdc, 0x7d, 0x9f, 0xdc, 0x76, 0x77, 0x5d, 0x69, 0x67, 0xd1, 0x53, 0x77, 0x36, 0x2f,
9243
--	0x07, 0x74, 0xfe, 0xcd, 0x8e, 0xe3, 0xc7, 0x6e, 0xbc, 0x2f, 0x1e, 0x66, 0x24, 0x11, 0x9c, 0xd0,
9244
--	0xb3, 0xbf, 0x69, 0xc1, 0x94, 0x5c, 0xf7, 0x0b, 0xcd, 0x66, 0x48, 0xa2, 0x08, 0xcd, 0x41, 0xc1,
9245
--	0x6d, 0x8b, 0x5e, 0x82, 0xe8, 0x65, 0x61, 0xb5, 0x86, 0x0b, 0x6e, 0x1b, 0xd5, 0xa0, 0xcc, 0xcd,
9246
--	0x35, 0x92, 0xc5, 0x35, 0x90, 0xd1, 0x07, 0xeb, 0xc1, 0x86, 0xac, 0x89, 0x13, 0x22, 0x92, 0x83,
9247
--	0x63, 0x67, 0x66, 0xd1, 0x7c, 0xf5, 0xba, 0x29, 0xca, 0xb1, 0xc2, 0x40, 0x57, 0x61, 0xd4, 0x0f,
9248
--	0x9a, 0xdc, 0x7a, 0x86, 0xdf, 0x7e, 0x6c, 0xc9, 0xae, 0x8b, 0x32, 0xac, 0xa0, 0xf6, 0x0f, 0x5b,
9249
--	0x30, 0x2e, 0xbf, 0x6c, 0x40, 0x66, 0x92, 0x6e, 0xad, 0x84, 0x91, 0x4c, 0xb6, 0x16, 0x65, 0x06,
9250
--	0x19, 0xc4, 0xe0, 0x01, 0x8b, 0xc7, 0xe1, 0x01, 0xed, 0x1f, 0x2f, 0xc0, 0xa4, 0xec, 0x4e, 0xbd,
9251
--	0xb3, 0x19, 0x91, 0x18, 0x6d, 0x40, 0xd9, 0xe1, 0x43, 0x4e, 0xe4, 0x8a, 0x7d, 0x2a, 0x5b, 0xf8,
9252
--	0x30, 0xe6, 0x27, 0xb9, 0x96, 0x17, 0x64, 0x6d, 0x9c, 0x10, 0x42, 0x1e, 0xcc, 0xf8, 0x41, 0xcc,
9253
--	0x8e, 0x68, 0x05, 0xef, 0xf5, 0x04, 0x92, 0xa6, 0x7e, 0x41, 0x50, 0x9f, 0x59, 0x4f, 0x53, 0xc1,
9254
--	0xdd, 0x84, 0xd1, 0xb2, 0x54, 0x78, 0x14, 0xf3, 0xc5, 0x0d, 0x7d, 0x16, 0xb2, 0xf5, 0x1d, 0xf6,
9255
--	0xaf, 0x59, 0x50, 0x96, 0x68, 0xa7, 0xf1, 0xda, 0xb5, 0x06, 0x23, 0x11, 0x9b, 0x04, 0x39, 0x34,
9256
--	0x76, 0xaf, 0x8e, 0xf3, 0xf9, 0x4a, 0x6e, 0x1e, 0xfe, 0x3f, 0xc2, 0x92, 0x06, 0xd3, 0x77, 0xab,
9257
--	0xee, 0x7f, 0x44, 0xf4, 0xdd, 0xaa, 0x3f, 0x39, 0x37, 0xcc, 0x7f, 0x65, 0x7d, 0xd6, 0xc4, 0x5a,
9258
--	0xca, 0x20, 0xb5, 0x43, 0xb2, 0xe5, 0x3e, 0x48, 0x33, 0x48, 0x35, 0x56, 0x8a, 0x05, 0x14, 0xbd,
9259
--	0x03, 0xe3, 0x0d, 0xa9, 0xe8, 0x4c, 0x8e, 0x81, 0x2b, 0x3d, 0x95, 0xee, 0xea, 0x7d, 0x86, 0x5b,
9260
--	0xd6, 0x2e, 0x69, 0xf5, 0xb1, 0x41, 0xcd, 0x7c, 0x6e, 0x2f, 0xf6, 0x7b, 0x6e, 0x4f, 0xe8, 0xe6,
9261
--	0x3f, 0x3e, 0xff, 0xa4, 0x05, 0xc3, 0x5c, 0x5d, 0x36, 0x98, 0x7e, 0x51, 0x7b, 0xae, 0x4a, 0xc6,
9262
--	0xee, 0x1e, 0x2d, 0x14, 0xcf, 0x4f, 0x68, 0x0d, 0xca, 0xec, 0x07, 0x53, 0x1b, 0x14, 0xf3, 0x4d,
9263
--	0x8a, 0x79, 0xab, 0x7a, 0x07, 0xef, 0xc9, 0x6a, 0x38, 0xa1, 0x60, 0xff, 0x68, 0x91, 0x1e, 0x55,
9264
--	0x09, 0xaa, 0x71, 0x83, 0x5b, 0x8f, 0xee, 0x06, 0x2f, 0x3c, 0xaa, 0x1b, 0xbc, 0x05, 0x53, 0x0d,
9265
--	0xed, 0x71, 0x2b, 0x99, 0xc9, 0xab, 0x3d, 0x17, 0x89, 0xf6, 0x0e, 0xc6, 0x55, 0x46, 0x4b, 0x26,
9266
--	0x11, 0x9c, 0xa6, 0x8a, 0xbe, 0x13, 0xc6, 0xf9, 0x3c, 0x8b, 0x56, 0xb8, 0xc5, 0xc2, 0x27, 0xf2,
9267
--	0xd7, 0x8b, 0xde, 0x04, 0x5b, 0x89, 0x75, 0xad, 0x3a, 0x36, 0x88, 0xd9, 0xbf, 0x32, 0x0a, 0x43,
9268
--	0xcb, 0x7b, 0xc4, 0x8f, 0x4f, 0xe1, 0x40, 0x6a, 0xc0, 0xa4, 0xeb, 0xef, 0x05, 0xde, 0x1e, 0x69,
9269
--	0x72, 0xf8, 0x71, 0x2e, 0xd7, 0xf3, 0x82, 0xf4, 0xe4, 0xaa, 0x41, 0x02, 0xa7, 0x48, 0x3e, 0x0a,
9270
--	0x09, 0xf3, 0x06, 0x0c, 0xf3, 0xb9, 0x17, 0xe2, 0x65, 0xa6, 0x32, 0x98, 0x0d, 0xa2, 0xd8, 0x05,
9271
--	0x89, 0xf4, 0xcb, 0xb5, 0xcf, 0xa2, 0x3a, 0x7a, 0x17, 0x26, 0xb7, 0xdc, 0x30, 0x8a, 0xa9, 0x68,
9272
--	0x18, 0xc5, 0xce, 0x6e, 0xfb, 0x21, 0x24, 0x4a, 0x35, 0x0e, 0x2b, 0x06, 0x25, 0x9c, 0xa2, 0x8c,
9273
--	0x5a, 0x30, 0x41, 0x85, 0x9c, 0xa4, 0xa9, 0x91, 0x63, 0x37, 0xa5, 0x54, 0x46, 0xb7, 0x75, 0x42,
9274
--	0xd8, 0xa4, 0x4b, 0x0f, 0x93, 0x06, 0x13, 0x8a, 0x46, 0x19, 0x47, 0xa1, 0x0e, 0x13, 0x2e, 0x0d,
9275
--	0x71, 0x18, 0x3d, 0x93, 0x98, 0xd9, 0x4a, 0xd9, 0x3c, 0x93, 0x34, 0xe3, 0x94, 0x2f, 0x43, 0x99,
9276
--	0xd0, 0x21, 0xa4, 0x84, 0x85, 0x62, 0xfc, 0xda, 0x60, 0x7d, 0x5d, 0x73, 0x1b, 0x61, 0x60, 0xca,
9277
--	0xf2, 0xcb, 0x92, 0x12, 0x4e, 0x88, 0xa2, 0x25, 0x18, 0x8e, 0x48, 0xe8, 0x92, 0x48, 0xa8, 0xc8,
9278
--	0x7b, 0x4c, 0x23, 0x43, 0xe3, 0xb6, 0xe7, 0xfc, 0x37, 0x16, 0x55, 0xe9, 0xf2, 0x72, 0x98, 0x34,
9279
--	0xc4, 0xb4, 0xe2, 0xda, 0xf2, 0x5a, 0x60, 0xa5, 0x58, 0x40, 0xd1, 0x1b, 0x30, 0x12, 0x12, 0x8f,
9280
--	0x29, 0x8b, 0x26, 0x06, 0x5f, 0xe4, 0x5c, 0xf7, 0xc4, 0xeb, 0x61, 0x49, 0x00, 0xdd, 0x02, 0x14,
9281
--	0x12, 0xca, 0x43, 0xb8, 0x7e, 0x4b, 0x19, 0x73, 0x08, 0x5d, 0xf7, 0xe3, 0xa2, 0xfd, 0x33, 0x38,
9282
--	0xc1, 0x90, 0x56, 0xa9, 0x38, 0xa3, 0x1a, 0xba, 0x01, 0x33, 0xaa, 0x74, 0xd5, 0x8f, 0x62, 0xc7,
9283
--	0x6f, 0x10, 0xa6, 0xe6, 0x2e, 0x27, 0x5c, 0x11, 0x4e, 0x23, 0xe0, 0xee, 0x3a, 0xf6, 0xcf, 0x51,
9284
--	0x76, 0x86, 0x8e, 0xd6, 0x29, 0xf0, 0x02, 0xaf, 0x9b, 0xbc, 0xc0, 0x85, 0xdc, 0x99, 0xcb, 0xe1,
9285
--	0x03, 0x0e, 0x2d, 0x18, 0xd3, 0x66, 0x36, 0x59, 0xb3, 0x56, 0x8f, 0x35, 0xdb, 0x81, 0x69, 0xba,
9286
--	0xd2, 0xef, 0x6c, 0x46, 0x24, 0xdc, 0x23, 0x4d, 0xb6, 0x30, 0x0b, 0x0f, 0xb7, 0x30, 0xd5, 0x2b,
9287
--	0xf3, 0xed, 0x14, 0x41, 0xdc, 0xd5, 0x04, 0x7a, 0x45, 0x6a, 0x4e, 0x8a, 0x86, 0x91, 0x16, 0xd7,
9288
--	0x8a, 0x1c, 0x1d, 0x54, 0xa6, 0xb5, 0x0f, 0xd1, 0x35, 0x25, 0xf6, 0x97, 0xe5, 0x37, 0xaa, 0xd7,
9289
--	0xfc, 0x86, 0x5a, 0x2c, 0xa9, 0xd7, 0x7c, 0xb5, 0x1c, 0x70, 0x82, 0x43, 0xf7, 0x28, 0x15, 0x41,
9290
--	0xd2, 0xaf, 0xf9, 0x54, 0x40, 0xc1, 0x0c, 0x62, 0xbf, 0x08, 0xb0, 0xfc, 0x80, 0x34, 0xf8, 0x52,
9291
--	0xd7, 0x1f, 0x20, 0xad, 0xfc, 0x07, 0x48, 0xfb, 0xdf, 0x5b, 0x30, 0xb9, 0xb2, 0x64, 0x88, 0x89,
9292
--	0xf3, 0x00, 0x5c, 0x36, 0x7a, 0xeb, 0xad, 0x75, 0xa9, 0x5b, 0xe7, 0xea, 0x51, 0x55, 0x8a, 0x35,
9293
--	0x0c, 0x74, 0x01, 0x8a, 0x5e, 0xc7, 0x17, 0x22, 0xcb, 0xc8, 0xe1, 0x41, 0xa5, 0x78, 0xbb, 0xe3,
9294
--	0x63, 0x5a, 0xa6, 0x59, 0x08, 0x16, 0x07, 0xb6, 0x10, 0xec, 0xeb, 0x5e, 0x85, 0x2a, 0x30, 0x74,
9295
--	0xff, 0xbe, 0xdb, 0xe4, 0x46, 0xec, 0x42, 0xef, 0xff, 0xd6, 0x5b, 0xab, 0xd5, 0x08, 0xf3, 0x72,
9296
--	0xfb, 0xab, 0x45, 0x98, 0x5b, 0xf1, 0xc8, 0x83, 0x0f, 0x68, 0xc8, 0x3f, 0xa8, 0x7d, 0xe3, 0xf1,
9297
--	0xf8, 0xc5, 0xe3, 0xda, 0xb0, 0xf6, 0x1f, 0x8f, 0x2d, 0x18, 0xe1, 0x8f, 0xd9, 0xd2, 0xac, 0xff,
9298
--	0xb5, 0xac, 0xd6, 0xf3, 0x07, 0x64, 0x9e, 0x3f, 0x8a, 0x0b, 0x73, 0x7e, 0x75, 0xd3, 0x8a, 0x52,
9299
--	0x2c, 0x89, 0xcf, 0x7d, 0x06, 0xc6, 0x75, 0xcc, 0x63, 0x59, 0x93, 0xff, 0xa5, 0x22, 0x4c, 0xd3,
9300
--	0x1e, 0x3c, 0xd2, 0x89, 0xb8, 0xdb, 0x3d, 0x11, 0x27, 0x6d, 0x51, 0xdc, 0x7f, 0x36, 0xde, 0x49,
9301
--	0xcf, 0xc6, 0x0b, 0x79, 0xb3, 0x71, 0xda, 0x73, 0xf0, 0xbd, 0x16, 0x9c, 0x59, 0xf1, 0x82, 0xc6,
9302
--	0x4e, 0xca, 0xea, 0xf7, 0x65, 0x18, 0xa3, 0xe7, 0x78, 0x64, 0x78, 0x11, 0x19, 0x7e, 0x65, 0x02,
9303
--	0x84, 0x75, 0x3c, 0xad, 0xda, 0xdd, 0xbb, 0xab, 0xd5, 0x2c, 0x77, 0x34, 0x01, 0xc2, 0x3a, 0x9e,
9304
--	0xfd, 0x0d, 0x0b, 0x2e, 0xde, 0x58, 0x5a, 0x4e, 0x96, 0x62, 0x97, 0x47, 0x1c, 0x95, 0x02, 0x9b,
9305
--	0x5a, 0x57, 0x12, 0x29, 0xb0, 0xca, 0x7a, 0x21, 0xa0, 0x1f, 0x15, 0x6f, 0xcf, 0x9f, 0xb5, 0xe0,
9306
--	0xcc, 0x0d, 0x37, 0xa6, 0xd7, 0x72, 0xda, 0x37, 0x8b, 0xde, 0xcb, 0x91, 0x1b, 0x07, 0xe1, 0x7e,
9307
--	0xda, 0x37, 0x0b, 0x2b, 0x08, 0xd6, 0xb0, 0x78, 0xcb, 0x7b, 0x2e, 0x33, 0xa3, 0x2a, 0x98, 0xaa,
9308
--	0x28, 0x2c, 0xca, 0xb1, 0xc2, 0xa0, 0x1f, 0xd6, 0x74, 0x43, 0x26, 0x4a, 0xec, 0x8b, 0x13, 0x56,
9309
--	0x7d, 0x58, 0x55, 0x02, 0x70, 0x82, 0x63, 0xff, 0x84, 0x05, 0xe7, 0x6e, 0x78, 0x9d, 0x28, 0x26,
9310
--	0xe1, 0x56, 0x64, 0x74, 0xf6, 0x45, 0x28, 0x13, 0x29, 0xae, 0x8b, 0xbe, 0x2a, 0x06, 0x53, 0xc9,
9311
--	0xf1, 0xdc, 0x31, 0x4c, 0xe1, 0x0d, 0xe0, 0x39, 0x70, 0x3c, 0xd7, 0xb1, 0x5f, 0x2c, 0xc0, 0xc4,
9312
--	0xcd, 0x8d, 0x8d, 0xda, 0x0d, 0x12, 0x8b, 0x5b, 0xac, 0xbf, 0xaa, 0x19, 0x6b, 0x1a, 0xb3, 0x5e,
9313
--	0x42, 0x51, 0x27, 0x76, 0xbd, 0x79, 0xee, 0x89, 0x3c, 0xbf, 0xea, 0xc7, 0x77, 0xc2, 0x7a, 0x1c,
9314
--	0xba, 0x7e, 0x2b, 0x53, 0xc7, 0x26, 0xef, 0xda, 0x62, 0xde, 0x5d, 0x8b, 0x5e, 0x84, 0x61, 0xe6,
9315
--	0x0a, 0x2d, 0xc5, 0x93, 0xc7, 0x95, 0x4c, 0xc1, 0x4a, 0x8f, 0x0e, 0x2a, 0xe5, 0xbb, 0x78, 0x95,
9316
--	0xff, 0xc1, 0x02, 0x15, 0xdd, 0x85, 0xb1, 0xed, 0x38, 0x6e, 0xdf, 0x24, 0x4e, 0x93, 0x84, 0xf2,
9317
--	0x74, 0xb8, 0x94, 0x75, 0x3a, 0xd0, 0x41, 0xe0, 0x68, 0xc9, 0x86, 0x4a, 0xca, 0x22, 0xac, 0xd3,
9318
--	0xb1, 0xeb, 0x00, 0x09, 0xec, 0x84, 0xf4, 0x0b, 0xf6, 0x1f, 0x58, 0x30, 0xc2, 0xbd, 0xd2, 0x42,
9319
--	0xf4, 0x59, 0x28, 0x91, 0x07, 0xa4, 0x21, 0x38, 0xc7, 0xcc, 0x0e, 0x27, 0x8c, 0x07, 0xd7, 0x96,
9320
--	0xd3, 0xff, 0x98, 0xd5, 0x42, 0x37, 0x61, 0x84, 0xf6, 0xf6, 0x86, 0x72, 0xd1, 0x7b, 0x32, 0xef,
9321
--	0x8b, 0xd5, 0xb4, 0x73, 0x5e, 0x45, 0x14, 0x61, 0x59, 0x9d, 0x69, 0x7e, 0x1b, 0xed, 0x3a, 0x3d,
9322
--	0xc0, 0xe2, 0x5e, 0xf7, 0xec, 0xc6, 0x52, 0x8d, 0x23, 0x09, 0x6a, 0x5c, 0xf3, 0x2b, 0x0b, 0x71,
9323
--	0x42, 0xc4, 0xde, 0x80, 0x32, 0x9d, 0xd4, 0x05, 0xcf, 0x75, 0x7a, 0x2b, 0x9d, 0x9f, 0x85, 0xb2,
9324
--	0x54, 0x00, 0x47, 0xc2, 0xb1, 0x89, 0x51, 0x95, 0xfa, 0xe1, 0x08, 0x27, 0x70, 0x7b, 0x0b, 0xce,
9325
--	0xb2, 0x97, 0x7f, 0x27, 0xde, 0x36, 0xf6, 0x58, 0xff, 0xc5, 0xfc, 0x9c, 0x10, 0xc4, 0xf8, 0xcc,
9326
--	0xcc, 0x6a, 0xbe, 0x03, 0xe3, 0x92, 0x62, 0x22, 0x94, 0xd9, 0x7f, 0x54, 0x82, 0xc7, 0x57, 0xeb,
9327
--	0xf9, 0x0e, 0x8b, 0xaf, 0xc2, 0x38, 0x67, 0xd3, 0xe8, 0xd2, 0x76, 0x3c, 0xd1, 0xae, 0x7a, 0x17,
9328
--	0xdb, 0xd0, 0x60, 0xd8, 0xc0, 0x44, 0x17, 0xa1, 0xe8, 0xbe, 0xe7, 0xa7, 0xcd, 0x70, 0x57, 0xdf,
9329
--	0x5c, 0xc7, 0xb4, 0x9c, 0x82, 0x29, 0xc7, 0xc7, 0x8f, 0x52, 0x05, 0x56, 0x5c, 0xdf, 0xeb, 0x30,
9330
--	0xe9, 0x46, 0x8d, 0xc8, 0x5d, 0xf5, 0xe9, 0x39, 0x93, 0x38, 0xbb, 0x26, 0x4a, 0x02, 0xda, 0x69,
9331
--	0x05, 0xc5, 0x29, 0x6c, 0xed, 0x5c, 0x1f, 0x1a, 0x98, 0x6b, 0xec, 0xeb, 0xe9, 0x43, 0x19, 0xe2,
9332
--	0x36, 0xfb, 0xba, 0x88, 0x19, 0xb5, 0x09, 0x86, 0x98, 0x7f, 0x70, 0x84, 0x25, 0x8c, 0x4a, 0x60,
9333
--	0x8d, 0x6d, 0xa7, 0xbd, 0xd0, 0x89, 0xb7, 0xab, 0x6e, 0xd4, 0x08, 0xf6, 0x48, 0xb8, 0xcf, 0x84,
9334
--	0xe7, 0xd1, 0x44, 0x02, 0x53, 0x80, 0xa5, 0x9b, 0x0b, 0x35, 0x8a, 0x89, 0xbb, 0xeb, 0x98, 0x5c,
9335
--	0x21, 0x9c, 0x04, 0x57, 0xb8, 0x00, 0x53, 0xb2, 0x99, 0x3a, 0x89, 0xd8, 0x1d, 0x31, 0xc6, 0x3a,
9336
--	0xa6, 0x4c, 0x6d, 0x45, 0xb1, 0xea, 0x56, 0x1a, 0x1f, 0xbd, 0x02, 0x13, 0xae, 0xef, 0xc6, 0xae,
9337
--	0x13, 0x07, 0x21, 0xbb, 0x61, 0xb9, 0x9c, 0xcc, 0x2c, 0xd9, 0x56, 0x75, 0x00, 0x36, 0xf1, 0xec,
9338
--	0x3f, 0x2c, 0xc1, 0x0c, 0x9b, 0xb6, 0x6f, 0xad, 0xb0, 0x8f, 0xcc, 0x0a, 0xbb, 0xdb, 0xbd, 0xc2,
9339
--	0x4e, 0x82, 0xdd, 0xfd, 0x30, 0x97, 0xd9, 0xbb, 0x50, 0x56, 0xb6, 0xc0, 0xd2, 0x19, 0xc0, 0xca,
9340
--	0x71, 0x06, 0xe8, 0xcf, 0x7d, 0xc8, 0x67, 0xdc, 0x62, 0xe6, 0x33, 0xee, 0xdf, 0xb6, 0x20, 0x31,
9341
--	0x89, 0x44, 0x37, 0xa1, 0xdc, 0x0e, 0x98, 0xd9, 0x41, 0x28, 0x6d, 0x79, 0x1e, 0xcf, 0xbc, 0xa8,
9342
--	0xf8, 0xa5, 0xc8, 0xc7, 0xaf, 0x26, 0x6b, 0xe0, 0xa4, 0x32, 0x5a, 0x84, 0x91, 0x76, 0x48, 0xea,
9343
--	0x31, 0x73, 0x81, 0xed, 0x4b, 0x87, 0xaf, 0x11, 0x8e, 0x8f, 0x65, 0x45, 0xfb, 0x97, 0x2c, 0x00,
9344
--	0xfe, 0x52, 0xea, 0xf8, 0x2d, 0x72, 0x0a, 0xda, 0xdf, 0x2a, 0x94, 0xa2, 0x36, 0x69, 0xf4, 0x32,
9345
--	0x08, 0x49, 0xfa, 0x53, 0x6f, 0x93, 0x46, 0x32, 0xe0, 0xf4, 0x1f, 0x66, 0xb5, 0xed, 0xef, 0x03,
9346
--	0x98, 0x4c, 0xd0, 0x56, 0x63, 0xb2, 0x8b, 0x9e, 0x37, 0x5c, 0xe2, 0x2e, 0xa4, 0x5c, 0xe2, 0xca,
9347
--	0x0c, 0x5b, 0x53, 0x34, 0xbe, 0x0b, 0xc5, 0x5d, 0xe7, 0x81, 0xd0, 0x24, 0x3d, 0xdb, 0xbb, 0x1b,
9348
--	0x94, 0xfe, 0xfc, 0x9a, 0xf3, 0x80, 0xcb, 0x4c, 0xcf, 0xca, 0x05, 0xb2, 0xe6, 0x3c, 0x38, 0xe2,
9349
--	0x66, 0x1f, 0xec, 0x90, 0xba, 0xed, 0x46, 0xf1, 0x57, 0xfe, 0x53, 0xf2, 0x9f, 0x2d, 0x3b, 0xda,
9350
--	0x08, 0x6b, 0xcb, 0xf5, 0xc5, 0xbb, 0xe1, 0x40, 0x6d, 0xb9, 0x7e, 0xba, 0x2d, 0xd7, 0x1f, 0xa0,
9351
--	0x2d, 0xd7, 0x47, 0xef, 0xc3, 0x88, 0x78, 0xa3, 0x67, 0xb6, 0xde, 0xa6, 0x96, 0x2a, 0xaf, 0x3d,
9352
--	0xf1, 0xc4, 0xcf, 0xdb, 0xbc, 0x26, 0x65, 0x42, 0x51, 0xda, 0xb7, 0x5d, 0xd9, 0x20, 0xfa, 0x1b,
9353
--	0x16, 0x4c, 0x8a, 0xdf, 0x98, 0xbc, 0xd7, 0x21, 0x51, 0x2c, 0x78, 0xcf, 0x4f, 0x0f, 0xde, 0x07,
9354
--	0x51, 0x91, 0x77, 0xe5, 0xd3, 0xf2, 0x98, 0x35, 0x81, 0x7d, 0x7b, 0x94, 0xea, 0x05, 0xfa, 0x47,
9355
--	0x16, 0x9c, 0xdd, 0x75, 0x1e, 0xf0, 0x16, 0x79, 0x19, 0x76, 0x62, 0x37, 0x10, 0xb6, 0xeb, 0x9f,
9356
--	0x1d, 0x6c, 0xfa, 0xbb, 0xaa, 0xf3, 0x4e, 0x4a, 0x33, 0xd7, 0xb3, 0x59, 0x28, 0x7d, 0xbb, 0x9a,
9357
--	0xd9, 0xaf, 0xb9, 0x2d, 0x18, 0x95, 0xeb, 0x2d, 0x43, 0xf2, 0xae, 0xea, 0x8c, 0xf5, 0xb1, 0x4d,
9358
--	0x24, 0x74, 0xbf, 0x34, 0xda, 0x8e, 0x58, 0x6b, 0x8f, 0xb4, 0x9d, 0x77, 0x61, 0x5c, 0x5f, 0x63,
9359
--	0x8f, 0xb4, 0xad, 0xf7, 0xe0, 0x4c, 0xc6, 0x5a, 0x7a, 0xa4, 0x4d, 0xde, 0x87, 0x0b, 0xb9, 0xeb,
9360
--	0xe3, 0x51, 0x36, 0x6c, 0xff, 0xa2, 0xa5, 0x9f, 0x83, 0xa7, 0xa0, 0x82, 0x5f, 0x32, 0x55, 0xf0,
9361
--	0x97, 0x7a, 0xef, 0x9c, 0x1c, 0x3d, 0xfc, 0x3b, 0x7a, 0xa7, 0xe9, 0xa9, 0x8e, 0xde, 0x80, 0x61,
9362
--	0x8f, 0x96, 0x48, 0xe3, 0x10, 0xbb, 0xff, 0x8e, 0x4c, 0x78, 0x29, 0x56, 0x1e, 0x61, 0x41, 0xc1,
9363
--	0xfe, 0x55, 0x0b, 0x4a, 0xa7, 0x30, 0x12, 0xd8, 0x1c, 0x89, 0xe7, 0x73, 0x49, 0x8b, 0x90, 0x66,
9364
--	0xf3, 0xd8, 0xb9, 0xbf, 0xfc, 0x20, 0x26, 0x7e, 0xc4, 0x44, 0xc5, 0xcc, 0x81, 0xf9, 0x2e, 0x38,
9365
--	0x73, 0x3b, 0x70, 0x9a, 0x8b, 0x8e, 0xe7, 0xf8, 0x0d, 0x12, 0xae, 0xfa, 0xad, 0xbe, 0x56, 0x4a,
9366
--	0xba, 0x4d, 0x51, 0xa1, 0x9f, 0x4d, 0x91, 0xbd, 0x0d, 0x48, 0x6f, 0x40, 0xd8, 0x71, 0x62, 0x18,
9367
--	0x71, 0x79, 0x53, 0x62, 0xf8, 0x9f, 0xce, 0xe6, 0xee, 0xba, 0x7a, 0xa6, 0x59, 0x28, 0xf2, 0x02,
9368
--	0x2c, 0x09, 0xd9, 0xaf, 0x42, 0xa6, 0xef, 0x56, 0x7f, 0xb5, 0x81, 0xfd, 0x32, 0xcc, 0xb0, 0x9a,
9369
--	0xc7, 0x13, 0x69, 0xed, 0x1f, 0xb0, 0x60, 0x6a, 0x3d, 0x15, 0x9b, 0xe2, 0x0a, 0x7b, 0xeb, 0xcb,
9370
--	0xd0, 0xfb, 0xd6, 0x59, 0x29, 0x16, 0xd0, 0x13, 0xd7, 0x2f, 0xfd, 0x99, 0x05, 0x89, 0xab, 0xe4,
9371
--	0x29, 0x30, 0x55, 0x4b, 0x06, 0x53, 0x95, 0xa9, 0xf7, 0x50, 0xdd, 0xc9, 0xe3, 0xa9, 0xd0, 0x2d,
9372
--	0x15, 0x17, 0xa0, 0x87, 0xca, 0x23, 0x21, 0xc3, 0xbd, 0xc8, 0x27, 0xcd, 0xe0, 0x01, 0x32, 0x52,
9373
--	0x00, 0x33, 0x13, 0x52, 0xb8, 0x1f, 0x11, 0x33, 0x21, 0xd5, 0x9f, 0x9c, 0xdd, 0x57, 0xd3, 0xba,
9374
--	0xcc, 0x4e, 0xa5, 0x6f, 0x67, 0x66, 0xdf, 0x8e, 0xe7, 0xbe, 0x4f, 0x54, 0x70, 0x93, 0x8a, 0x30,
9375
--	0xe3, 0x16, 0xa5, 0x47, 0x07, 0x95, 0x09, 0xf5, 0x8f, 0x47, 0xc0, 0x4a, 0xaa, 0xd8, 0x37, 0x61,
9376
--	0x2a, 0x35, 0x60, 0xe8, 0x65, 0x18, 0x6a, 0x6f, 0x3b, 0x11, 0x49, 0x99, 0x46, 0x0e, 0xd5, 0x68,
9377
--	0xe1, 0xd1, 0x41, 0x65, 0x52, 0x55, 0x60, 0x25, 0x98, 0x63, 0xdb, 0xff, 0xd3, 0x82, 0xd2, 0x7a,
9378
--	0xd0, 0x3c, 0x8d, 0xc5, 0xf4, 0xba, 0xb1, 0x98, 0x9e, 0xc8, 0x8b, 0x1f, 0x98, 0xbb, 0x8e, 0x56,
9379
--	0x52, 0xeb, 0xe8, 0x52, 0x2e, 0x85, 0xde, 0x4b, 0x68, 0x17, 0xc6, 0x58, 0x54, 0x42, 0x61, 0xaa,
9380
--	0xf9, 0xa2, 0xc1, 0xdf, 0x57, 0x52, 0xfc, 0xfd, 0x94, 0x86, 0xaa, 0x71, 0xf9, 0xcf, 0xc0, 0x88,
9381
--	0x30, 0x17, 0x4c, 0x1b, 0xb8, 0x0b, 0x5c, 0x2c, 0xe1, 0xf6, 0x4f, 0x16, 0xc1, 0x88, 0x82, 0x88,
9382
--	0x7e, 0xcd, 0x82, 0xf9, 0x90, 0x7b, 0x0c, 0x36, 0xab, 0x9d, 0xd0, 0xf5, 0x5b, 0xf5, 0xc6, 0x36,
9383
--	0x69, 0x76, 0x3c, 0xd7, 0x6f, 0xad, 0xb6, 0xfc, 0x40, 0x15, 0x2f, 0x3f, 0x20, 0x8d, 0x0e, 0xd3,
9384
--	0xf9, 0xf7, 0x09, 0xb9, 0xa8, 0xcc, 0x71, 0xae, 0x1f, 0x1e, 0x54, 0xe6, 0xf1, 0xb1, 0x68, 0xe3,
9385
--	0x63, 0xf6, 0x05, 0x7d, 0xc3, 0x82, 0x6b, 0x3c, 0x38, 0xe0, 0xe0, 0xfd, 0xef, 0x21, 0x0d, 0xd5,
9386
--	0x24, 0xa9, 0x84, 0xc8, 0x06, 0x09, 0x77, 0x17, 0x5f, 0x11, 0x03, 0x7a, 0xad, 0x76, 0xbc, 0xb6,
9387
--	0xf0, 0x71, 0x3b, 0x67, 0xff, 0xcb, 0x22, 0x4c, 0x08, 0x67, 0x75, 0x11, 0x05, 0xe5, 0x65, 0x63,
9388
--	0x49, 0x3c, 0x99, 0x5a, 0x12, 0x33, 0x06, 0xf2, 0xc9, 0x04, 0x40, 0x89, 0x60, 0xc6, 0x73, 0xa2,
9389
--	0xf8, 0x26, 0x71, 0xc2, 0x78, 0x93, 0x38, 0xdc, 0x4c, 0xa5, 0x78, 0x6c, 0x93, 0x1a, 0xa5, 0x7e,
9390
--	0xb9, 0x9d, 0x26, 0x86, 0xbb, 0xe9, 0xa3, 0x3d, 0x40, 0xcc, 0xd6, 0x26, 0x74, 0xfc, 0x88, 0x7f,
9391
--	0x8b, 0x2b, 0xde, 0x03, 0x8e, 0xd7, 0xea, 0x9c, 0x68, 0x15, 0xdd, 0xee, 0xa2, 0x86, 0x33, 0x5a,
9392
--	0xd0, 0x6c, 0xa8, 0x86, 0x06, 0xb5, 0xa1, 0x1a, 0xee, 0xe3, 0x45, 0xe2, 0xc3, 0x74, 0x57, 0xbc,
9393
--	0x81, 0xb7, 0xa1, 0xac, 0x6c, 0xdd, 0xc4, 0xa1, 0xd3, 0x3b, 0x6c, 0x47, 0x9a, 0x02, 0x57, 0x91,
9394
--	0x24, 0x76, 0x96, 0x09, 0x39, 0xfb, 0x1f, 0x17, 0x8c, 0x06, 0xf9, 0x24, 0xae, 0xc3, 0xa8, 0x13,
9395
--	0x45, 0x6e, 0xcb, 0x27, 0x4d, 0xb1, 0x63, 0x3f, 0x9e, 0xb7, 0x63, 0x8d, 0x66, 0x98, 0xbd, 0xe1,
9396
--	0x82, 0xa8, 0x89, 0x15, 0x0d, 0x74, 0x93, 0x1b, 0x03, 0xed, 0x49, 0x7e, 0x7e, 0x30, 0x6a, 0x20,
9397
--	0xcd, 0x85, 0xf6, 0x08, 0x16, 0xf5, 0xd1, 0x17, 0xb9, 0xb5, 0xd6, 0x2d, 0x3f, 0xb8, 0xef, 0xdf,
9398
--	0x08, 0x02, 0xe9, 0x61, 0x36, 0x18, 0xc1, 0x19, 0x69, 0xa3, 0xa5, 0xaa, 0x63, 0x93, 0xda, 0x60,
9399
--	0x31, 0x79, 0xbe, 0x1b, 0xce, 0x50, 0xd2, 0xa6, 0x9f, 0x48, 0x84, 0x08, 0x4c, 0x89, 0x48, 0x08,
9400
--	0xb2, 0x4c, 0x8c, 0x5d, 0x26, 0xab, 0x6e, 0xd6, 0x4e, 0x14, 0x7a, 0xb7, 0x4c, 0x12, 0x38, 0x4d,
9401
--	0xd3, 0xfe, 0x19, 0x0b, 0x98, 0x85, 0xfb, 0x29, 0xb0, 0x0c, 0x9f, 0x33, 0x59, 0x86, 0xd9, 0xbc,
9402
--	0x41, 0xce, 0xe1, 0x16, 0x5e, 0xe2, 0x2b, 0xab, 0x16, 0x06, 0x0f, 0xf6, 0xc5, 0x4b, 0xf9, 0x00,
9403
--	0x5c, 0xea, 0xff, 0xb1, 0xf8, 0x21, 0xa6, 0x9c, 0xce, 0xd1, 0xf7, 0xc0, 0x68, 0xc3, 0x69, 0x3b,
9404
--	0x0d, 0x1e, 0xb2, 0x37, 0x57, 0x63, 0x63, 0x54, 0x9a, 0x5f, 0x12, 0x35, 0xb8, 0x06, 0x42, 0x46,
9405
--	0xd4, 0x18, 0x95, 0xc5, 0x7d, 0xb5, 0x0e, 0xaa, 0xc9, 0xb9, 0x1d, 0x98, 0x30, 0x88, 0x3d, 0x52,
9406
--	0x71, 0xf5, 0x7b, 0xf8, 0x15, 0xab, 0x22, 0xc0, 0xec, 0xc2, 0x8c, 0xaf, 0xfd, 0xa7, 0x17, 0x8a,
9407
--	0x14, 0x41, 0x3e, 0xde, 0xef, 0x12, 0x65, 0xb7, 0x8f, 0x66, 0xc1, 0x9f, 0x22, 0x83, 0xbb, 0x29,
9408
--	0xdb, 0x3f, 0x65, 0xc1, 0x63, 0x3a, 0xa2, 0x16, 0x0f, 0xa0, 0x9f, 0x0e, 0xb8, 0x0a, 0xa3, 0x41,
9409
--	0x9b, 0x84, 0x4e, 0x1c, 0x84, 0xe2, 0xd6, 0xb8, 0x2a, 0x07, 0xfd, 0x8e, 0x28, 0x3f, 0x12, 0xb1,
9410
--	0x13, 0x25, 0x75, 0x59, 0x8e, 0x55, 0x4d, 0x64, 0xc3, 0x30, 0x1b, 0x8c, 0x48, 0xc4, 0x6a, 0x60,
9411
--	0x67, 0x00, 0x7b, 0x0e, 0x8d, 0xb0, 0x80, 0xd8, 0x7f, 0x64, 0xf1, 0x85, 0xa5, 0x77, 0x1d, 0xbd,
9412
--	0x07, 0xd3, 0xbb, 0x4e, 0xdc, 0xd8, 0x5e, 0x7e, 0xd0, 0x0e, 0xb9, 0xea, 0x5b, 0x8e, 0xd3, 0xb3,
9413
--	0xfd, 0xc6, 0x49, 0xfb, 0xc8, 0xc4, 0x00, 0x6d, 0x2d, 0x45, 0x0c, 0x77, 0x91, 0x47, 0x9b, 0x30,
9414
--	0xc6, 0xca, 0x98, 0xa5, 0x73, 0xd4, 0x8b, 0x35, 0xc8, 0x6b, 0x4d, 0xbd, 0x28, 0xaf, 0x25, 0x74,
9415
--	0xb0, 0x4e, 0xd4, 0xfe, 0x4a, 0x91, 0xef, 0x76, 0xc6, 0x6d, 0x3f, 0x03, 0x23, 0xed, 0xa0, 0xb9,
9416
--	0xb4, 0x5a, 0xc5, 0x62, 0x16, 0xd4, 0x35, 0x52, 0xe3, 0xc5, 0x58, 0xc2, 0xd1, 0x6b, 0x00, 0xe4,
9417
--	0x41, 0x4c, 0x42, 0xdf, 0xf1, 0x94, 0x41, 0x88, 0x32, 0x81, 0xac, 0x06, 0xeb, 0x41, 0x7c, 0x37,
9418
--	0x22, 0xdf, 0xb5, 0xac, 0x50, 0xb0, 0x86, 0x8e, 0xae, 0x03, 0xb4, 0xc3, 0x60, 0xcf, 0x6d, 0x32,
9419
--	0xd7, 0xb9, 0xa2, 0x69, 0x2e, 0x51, 0x53, 0x10, 0xac, 0x61, 0xa1, 0xd7, 0x60, 0xa2, 0xe3, 0x47,
9420
--	0x9c, 0x43, 0x71, 0x36, 0x45, 0xe4, 0xc1, 0xd1, 0xc4, 0x72, 0xe1, 0xae, 0x0e, 0xc4, 0x26, 0x2e,
9421
--	0x5a, 0x80, 0xe1, 0xd8, 0x61, 0xf6, 0x0e, 0x43, 0xf9, 0x76, 0x8b, 0x1b, 0x14, 0x43, 0x0f, 0x18,
9422
--	0x4b, 0x2b, 0x60, 0x51, 0x11, 0xbd, 0x2d, 0xfd, 0x10, 0xf8, 0x59, 0x2f, 0x0c, 0x86, 0x07, 0xbb,
9423
--	0x17, 0x34, 0x2f, 0x04, 0x61, 0x88, 0x6c, 0xd0, 0xb2, 0xbf, 0x51, 0x06, 0x48, 0xd8, 0x71, 0xf4,
9424
--	0x7e, 0xd7, 0x79, 0xf4, 0x5c, 0x6f, 0x06, 0xfe, 0xe4, 0x0e, 0x23, 0xf4, 0xfd, 0x16, 0x8c, 0x39,
9425
--	0x9e, 0x17, 0x34, 0x9c, 0x98, 0x8d, 0x72, 0xa1, 0xf7, 0x79, 0x28, 0xda, 0x5f, 0x48, 0x6a, 0xf0,
9426
--	0x2e, 0xbc, 0x28, 0x17, 0x9e, 0x06, 0xe9, 0xdb, 0x0b, 0xbd, 0x61, 0xf4, 0x29, 0x29, 0xa5, 0xf1,
9427
--	0xe5, 0x31, 0x97, 0x96, 0xd2, 0xca, 0xec, 0xe8, 0xd7, 0x04, 0x34, 0x74, 0xd7, 0x08, 0x2a, 0x57,
9428
--	0xca, 0x8f, 0xaf, 0x60, 0x70, 0xa5, 0xfd, 0xe2, 0xc9, 0xa1, 0x9a, 0xee, 0x38, 0x35, 0x94, 0x1f,
9429
--	0x84, 0x44, 0x13, 0x7f, 0xfa, 0x38, 0x4d, 0xbd, 0x0b, 0x53, 0x4d, 0xf3, 0x6e, 0x17, 0xab, 0xe9,
9430
--	0xe9, 0x3c, 0xba, 0x29, 0x56, 0x20, 0xb9, 0xcd, 0x53, 0x00, 0x9c, 0x26, 0x8c, 0x6a, 0xdc, 0x85,
9431
--	0x6d, 0xd5, 0xdf, 0x0a, 0x84, 0xe1, 0xb9, 0x9d, 0x3b, 0x97, 0xfb, 0x51, 0x4c, 0x76, 0x29, 0x66,
9432
--	0x72, 0x69, 0xaf, 0x8b, 0xba, 0x58, 0x51, 0x41, 0x6f, 0xc0, 0x30, 0xf3, 0x81, 0x8d, 0x66, 0x47,
9433
--	0xf3, 0x15, 0x85, 0x66, 0xf8, 0x86, 0x64, 0x53, 0xb1, 0xbf, 0x11, 0x16, 0x14, 0xd0, 0x4d, 0x19,
9434
--	0xe3, 0x25, 0x5a, 0xf5, 0xef, 0x46, 0x84, 0xc5, 0x78, 0x29, 0x2f, 0x7e, 0x3c, 0x09, 0xdf, 0xc2,
9435
--	0xcb, 0x33, 0x43, 0xc3, 0x1b, 0x35, 0x29, 0x73, 0x24, 0xfe, 0xcb, 0x88, 0xf3, 0xb3, 0x90, 0xdf,
9436
--	0x3d, 0x33, 0x2a, 0x7d, 0x32, 0x9c, 0xf7, 0x4c, 0x12, 0x38, 0x4d, 0x93, 0x32, 0x9a, 0x7c, 0xe7,
9437
--	0x0a, 0xd3, 0xf5, 0x7e, 0xfb, 0x9f, 0xcb, 0xd7, 0xec, 0x92, 0xe1, 0x25, 0x58, 0xd4, 0x3f, 0xd5,
9438
--	0x5b, 0x7f, 0xce, 0x87, 0xe9, 0xf4, 0x16, 0x7d, 0xa4, 0x5c, 0xc6, 0x1f, 0x94, 0x60, 0xd2, 0x5c,
9439
--	0x52, 0xe8, 0x1a, 0x94, 0x05, 0x11, 0x15, 0x70, 0x54, 0xed, 0x92, 0x35, 0x09, 0xc0, 0x09, 0x0e,
9440
--	0x8b, 0x33, 0xcb, 0xaa, 0x6b, 0x26, 0x87, 0x49, 0x9c, 0x59, 0x05, 0xc1, 0x1a, 0x16, 0x95, 0x97,
9441
--	0x36, 0x83, 0x20, 0x56, 0x97, 0x8a, 0x5a, 0x77, 0x8b, 0xac, 0x14, 0x0b, 0x28, 0xbd, 0x4c, 0x76,
9442
--	0x48, 0xe8, 0x13, 0xcf, 0x8c, 0x63, 0xa6, 0x2e, 0x93, 0x5b, 0x3a, 0x10, 0x9b, 0xb8, 0xf4, 0x96,
9443
--	0x0c, 0x22, 0xb6, 0x90, 0x85, 0x54, 0x96, 0x98, 0x70, 0xd6, 0xb9, 0x37, 0xb9, 0x84, 0xa3, 0x2f,
9444
--	0xc0, 0x63, 0xca, 0xf9, 0x1b, 0x73, 0x25, 0xb4, 0x6c, 0x71, 0xd8, 0x50, 0xa2, 0x3c, 0xb6, 0x94,
9445
--	0x8d, 0x86, 0xf3, 0xea, 0xa3, 0xd7, 0x61, 0x52, 0x70, 0xee, 0x92, 0xe2, 0x88, 0x69, 0x17, 0x71,
9446
--	0xcb, 0x80, 0xe2, 0x14, 0xb6, 0x8c, 0xc4, 0xc6, 0x98, 0x67, 0x49, 0x61, 0xb4, 0x3b, 0x12, 0x9b,
9447
--	0x0e, 0xc7, 0x5d, 0x35, 0xd0, 0x02, 0x4c, 0x71, 0xd6, 0xca, 0xf5, 0x5b, 0x7c, 0x4e, 0x84, 0x67,
9448
--	0x89, 0xda, 0x52, 0x77, 0x4c, 0x30, 0x4e, 0xe3, 0xa3, 0x57, 0x61, 0xdc, 0x09, 0x1b, 0xdb, 0x6e,
9449
--	0x4c, 0x1a, 0x71, 0x27, 0xe4, 0x2e, 0x27, 0x9a, 0x61, 0xc9, 0x82, 0x06, 0xc3, 0x06, 0xa6, 0xfd,
9450
--	0x3e, 0x9c, 0xc9, 0x70, 0x4a, 0xa3, 0x0b, 0xc7, 0x69, 0xbb, 0xf2, 0x9b, 0x52, 0xc6, 0x98, 0x0b,
9451
--	0xb5, 0x55, 0xf9, 0x35, 0x1a, 0x16, 0x5d, 0x9d, 0xcc, 0x79, 0x4d, 0x4b, 0x30, 0xa1, 0x56, 0xe7,
9452
--	0x8a, 0x04, 0xe0, 0x04, 0xc7, 0xfe, 0x5f, 0x05, 0x98, 0xca, 0x50, 0xac, 0xb3, 0x24, 0x07, 0x29,
9453
--	0xd9, 0x23, 0xc9, 0x69, 0x60, 0x06, 0xf6, 0x2b, 0x1c, 0x23, 0xb0, 0x5f, 0xb1, 0x5f, 0x60, 0xbf,
9454
--	0xd2, 0x07, 0x09, 0xec, 0x67, 0x8e, 0xd8, 0xd0, 0x40, 0x23, 0x96, 0x11, 0x0c, 0x70, 0xf8, 0x98,
9455
--	0xc1, 0x00, 0x8d, 0x41, 0x1f, 0x19, 0x60, 0xd0, 0x7f, 0xb4, 0x00, 0xd3, 0x69, 0x03, 0xb8, 0x53,
9456
--	0x50, 0xc7, 0xbe, 0x61, 0xa8, 0x63, 0xb3, 0x53, 0x86, 0xa4, 0xcd, 0xf2, 0xf2, 0x54, 0xb3, 0x38,
9457
--	0xa5, 0x9a, 0xfd, 0xe4, 0x40, 0xd4, 0x7a, 0xab, 0x69, 0xff, 0x6e, 0x01, 0xce, 0xa5, 0xab, 0x2c,
9458
--	0x79, 0x8e, 0xbb, 0x7b, 0x0a, 0x63, 0x73, 0xc7, 0x18, 0x9b, 0xe7, 0x07, 0xf9, 0x1a, 0xd6, 0xb5,
9459
--	0xdc, 0x01, 0x7a, 0x2b, 0x35, 0x40, 0xd7, 0x06, 0x27, 0xd9, 0x7b, 0x94, 0xbe, 0x59, 0x84, 0x4b,
9460
--	0x99, 0xf5, 0x12, 0x6d, 0xe6, 0x8a, 0xa1, 0xcd, 0xbc, 0x9e, 0xd2, 0x66, 0xda, 0xbd, 0x6b, 0x9f,
9461
--	0x8c, 0x7a, 0x53, 0x78, 0x0b, 0xb2, 0xe0, 0x6f, 0x0f, 0xa9, 0xda, 0x34, 0xbc, 0x05, 0x15, 0x21,
9462
--	0x6c, 0xd2, 0xfd, 0x8b, 0xa4, 0xd2, 0xfc, 0x37, 0x16, 0x5c, 0xc8, 0x9c, 0x9b, 0x53, 0x50, 0x61,
9463
--	0xad, 0x9b, 0x2a, 0xac, 0x67, 0x06, 0x5e, 0xad, 0x39, 0x3a, 0xad, 0x3f, 0x2c, 0xe6, 0x7c, 0x0b,
9464
--	0x13, 0xd0, 0xef, 0xc0, 0x98, 0xd3, 0x68, 0x90, 0x28, 0x5a, 0x0b, 0x9a, 0x2a, 0x18, 0xda, 0xf3,
9465
--	0x4c, 0xce, 0x4a, 0x8a, 0x8f, 0x0e, 0x2a, 0x73, 0x69, 0x12, 0x09, 0x18, 0xeb, 0x14, 0xcc, 0xf8,
9466
--	0x8d, 0x85, 0x13, 0x8d, 0xdf, 0x78, 0x1d, 0x60, 0x4f, 0x71, 0xeb, 0x69, 0x21, 0x5f, 0xe3, 0xe3,
9467
--	0x35, 0x2c, 0xf4, 0x45, 0x18, 0x8d, 0xc4, 0x35, 0x2e, 0x96, 0xe2, 0x8b, 0x03, 0xce, 0x95, 0xb3,
9468
--	0x49, 0x3c, 0xd3, 0x2d, 0x5d, 0xe9, 0x43, 0x14, 0x49, 0xf4, 0x1d, 0x30, 0x1d, 0xf1, 0xa8, 0x27,
9469
--	0x4b, 0x9e, 0x13, 0x31, 0x1f, 0x07, 0xb1, 0x0a, 0x99, 0xaf, 0x79, 0x3d, 0x05, 0xc3, 0x5d, 0xd8,
9470
--	0x68, 0x45, 0x7e, 0x14, 0x0b, 0xd1, 0xc2, 0x17, 0xe6, 0x95, 0xe4, 0x83, 0x44, 0x8a, 0xa5, 0xb3,
9471
--	0xe9, 0xe1, 0x67, 0x03, 0xaf, 0xd5, 0xb4, 0x7f, 0xb4, 0x04, 0x8f, 0xf7, 0x38, 0xc4, 0xd0, 0x82,
9472
--	0xf9, 0x46, 0xf9, 0x6c, 0x5a, 0xfa, 0x9d, 0xcb, 0xac, 0x6c, 0x88, 0xc3, 0xa9, 0xb5, 0x52, 0xf8,
9473
--	0xc0, 0x6b, 0xe5, 0x87, 0x2c, 0x4d, 0x2f, 0xc1, 0x2d, 0xe9, 0x3e, 0x77, 0xcc, 0xc3, 0xf9, 0x04,
9474
--	0x15, 0x15, 0x5b, 0x19, 0xd2, 0xfe, 0xf5, 0x81, 0xbb, 0x33, 0xb0, 0xf8, 0x7f, 0xba, 0xda, 0xd9,
9475
--	0xaf, 0x58, 0xf0, 0x64, 0x66, 0x7f, 0x0d, 0x9b, 0x8a, 0x6b, 0x50, 0x6e, 0xd0, 0x42, 0xcd, 0x6f,
9476
--	0x2a, 0x71, 0x28, 0x95, 0x00, 0x9c, 0xe0, 0x18, 0xa6, 0x13, 0x85, 0xbe, 0xa6, 0x13, 0xff, 0xc2,
9477
--	0x82, 0xae, 0x05, 0x7c, 0x0a, 0x27, 0xe9, 0xaa, 0x79, 0x92, 0x7e, 0x7c, 0x90, 0xb9, 0xcc, 0x39,
9478
--	0x44, 0xff, 0xf3, 0x14, 0x9c, 0xcf, 0x71, 0x94, 0xd8, 0x83, 0x99, 0x56, 0x83, 0x98, 0x1e, 0x69,
9479
--	0xe2, 0x63, 0x32, 0x9d, 0xf7, 0x7a, 0xba, 0xaf, 0xb1, 0xdc, 0x38, 0x33, 0x5d, 0x28, 0xb8, 0xbb,
9480
--	0x09, 0xf4, 0x15, 0x0b, 0xce, 0x3a, 0xf7, 0xa3, 0xae, 0x0c, 0x88, 0x62, 0xcd, 0xbc, 0x94, 0xa9,
9481
--	0xa5, 0xe8, 0x93, 0x31, 0x91, 0x27, 0x0b, 0xca, 0xc2, 0xc2, 0x99, 0x6d, 0x21, 0x2c, 0xe2, 0x57,
9482
--	0x52, 0x7e, 0xbb, 0x87, 0xcf, 0x64, 0x96, 0x47, 0x0b, 0x3f, 0x53, 0x25, 0x04, 0x2b, 0x3a, 0xe8,
9483
--	0x1e, 0x94, 0x5b, 0xd2, 0xcd, 0x4c, 0x9c, 0xd9, 0x99, 0x97, 0x60, 0xa6, 0x2f, 0x1a, 0x7f, 0x37,
9484
--	0x54, 0x20, 0x9c, 0x90, 0x42, 0xaf, 0x43, 0xd1, 0xdf, 0x8a, 0x7a, 0x65, 0xd9, 0x49, 0x99, 0x1a,
9485
--	0x71, 0x7f, 0xe4, 0xf5, 0x95, 0x3a, 0xa6, 0x15, 0xd1, 0x4d, 0x28, 0x86, 0x9b, 0x4d, 0xa1, 0x58,
9486
--	0xcb, 0xe4, 0x4b, 0xf1, 0x62, 0x35, 0x7b, 0x91, 0x70, 0x4a, 0x78, 0xb1, 0x8a, 0x29, 0x09, 0x54,
9487
--	0x83, 0x21, 0xe6, 0x53, 0x20, 0xf4, 0x67, 0x99, 0x0c, 0x69, 0x0f, 0xdf, 0x1c, 0xee, 0xb4, 0xcc,
9488
--	0x10, 0x30, 0x27, 0x84, 0x36, 0x60, 0xb8, 0xc1, 0x32, 0xb2, 0x88, 0x90, 0xc9, 0x9f, 0xca, 0x54,
9489
--	0xa1, 0xf5, 0x48, 0x55, 0x23, 0x34, 0x4a, 0x0c, 0x03, 0x0b, 0x5a, 0x8c, 0x2a, 0x69, 0x6f, 0x6f,
9490
--	0x45, 0x4c, 0x04, 0xcf, 0xa3, 0xda, 0x23, 0x03, 0x93, 0xa0, 0xca, 0x30, 0xb0, 0xa0, 0x85, 0x3e,
9491
--	0x03, 0x85, 0xad, 0x86, 0x70, 0x39, 0xc8, 0xd4, 0xa5, 0x99, 0x2e, 0xe5, 0x8b, 0xc3, 0x87, 0x07,
9492
--	0x95, 0xc2, 0xca, 0x12, 0x2e, 0x6c, 0x35, 0xd0, 0x3a, 0x8c, 0x6c, 0x71, 0x27, 0x54, 0xa1, 0x2e,
9493
--	0x7b, 0x3a, 0xdb, 0x3f, 0xb6, 0xcb, 0x4f, 0x95, 0x9b, 0xca, 0x0b, 0x00, 0x96, 0x44, 0x58, 0x10,
9494
--	0x48, 0xe5, 0x4c, 0x2b, 0xa2, 0x21, 0xcf, 0x1f, 0xcf, 0x01, 0x9a, 0xbb, 0xb7, 0x27, 0x2e, 0xb9,
9495
--	0x58, 0xa3, 0x88, 0xbe, 0x0c, 0x65, 0x47, 0xe6, 0xde, 0x13, 0xd1, 0x22, 0x5e, 0xcc, 0xdc, 0x98,
9496
--	0xbd, 0xd3, 0x12, 0xf2, 0x55, 0xad, 0x90, 0x70, 0x42, 0x14, 0xed, 0xc0, 0xc4, 0x5e, 0xd4, 0xde,
9497
--	0x26, 0x72, 0x23, 0xb3, 0xe0, 0x11, 0x39, 0x17, 0xd7, 0x3d, 0x81, 0xe8, 0x86, 0x71, 0xc7, 0xf1,
9498
--	0xba, 0xce, 0x1e, 0xf6, 0xd8, 0x7c, 0x4f, 0x27, 0x86, 0x4d, 0xda, 0x74, 0xf8, 0xdf, 0xeb, 0x04,
9499
--	0x9b, 0xfb, 0x31, 0x11, 0xe1, 0x93, 0x33, 0x87, 0xff, 0x4d, 0x8e, 0xd2, 0x3d, 0xfc, 0x02, 0x80,
9500
--	0x25, 0x11, 0xba, 0xd5, 0x1d, 0x99, 0xd7, 0x92, 0x85, 0x4d, 0xce, 0xd9, 0xea, 0x99, 0xc9, 0x2f,
9501
--	0xb5, 0x41, 0x61, 0x67, 0x64, 0x42, 0x8a, 0x9d, 0x8d, 0xed, 0xed, 0x20, 0x0e, 0xfc, 0xd4, 0xb9,
9502
--	0x3c, 0x93, 0x7f, 0x36, 0xd6, 0x32, 0xf0, 0xbb, 0xcf, 0xc6, 0x2c, 0x2c, 0x9c, 0xd9, 0x16, 0x6a,
9503
--	0xc2, 0x64, 0x3b, 0x08, 0xe3, 0xfb, 0x41, 0x28, 0xd7, 0x17, 0xea, 0x21, 0xee, 0x1b, 0x98, 0xa2,
9504
--	0x45, 0x16, 0xce, 0xdb, 0x84, 0xe0, 0x14, 0x4d, 0xf4, 0x79, 0x18, 0x89, 0x1a, 0x8e, 0x47, 0x56,
9505
--	0xef, 0xcc, 0x9e, 0xc9, 0xbf, 0x74, 0xea, 0x1c, 0x25, 0x67, 0x75, 0xb1, 0xc9, 0x11, 0x28, 0x58,
9506
--	0x92, 0x43, 0x2b, 0x30, 0xc4, 0x62, 0xf2, 0xb3, 0xc8, 0xcf, 0x39, 0x51, 0x89, 0xba, 0x8c, 0x3a,
9507
--	0xf9, 0xd9, 0xc4, 0x8a, 0x31, 0xaf, 0x4e, 0xf7, 0x80, 0xe0, 0x7a, 0x83, 0x68, 0xf6, 0x5c, 0xfe,
9508
--	0x1e, 0x10, 0xcc, 0xf2, 0x9d, 0x7a, 0xaf, 0x3d, 0xa0, 0x90, 0x70, 0x42, 0x94, 0x9e, 0xcc, 0xf4,
9509
--	0x34, 0x3d, 0xdf, 0xc3, 0xce, 0x24, 0xf7, 0x2c, 0x65, 0x27, 0x33, 0x3d, 0x49, 0x29, 0x09, 0xfb,
9510
--	0xf7, 0x46, 0xba, 0x39, 0x15, 0x26, 0x27, 0xfd, 0x65, 0xab, 0xeb, 0x09, 0xed, 0xd3, 0x83, 0xaa,
9511
--	0x6d, 0x4e, 0x90, 0x47, 0xfd, 0x8a, 0x05, 0xe7, 0xdb, 0x99, 0x1f, 0x22, 0xae, 0xfd, 0xc1, 0xb4,
9512
--	0x3f, 0xfc, 0xd3, 0x55, 0x74, 0xf6, 0x6c, 0x38, 0xce, 0x69, 0x29, 0x2d, 0x07, 0x14, 0x3f, 0xb0,
9513
--	0x1c, 0xb0, 0x06, 0xa3, 0x8c, 0xb5, 0xec, 0x93, 0xa1, 0x2c, 0xed, 0x85, 0xc6, 0x18, 0x88, 0x25,
9514
--	0x51, 0x11, 0x2b, 0x12, 0xe8, 0x87, 0x2d, 0xb8, 0x98, 0xee, 0x3a, 0x26, 0x0c, 0x2c, 0x62, 0x99,
9515
--	0x73, 0x11, 0x6d, 0x45, 0x7c, 0xff, 0xc5, 0x5a, 0x2f, 0xe4, 0xa3, 0x7e, 0x08, 0xb8, 0x77, 0x63,
9516
--	0xa8, 0x9a, 0x21, 0x23, 0x0e, 0x9b, 0x7a, 0xf1, 0x01, 0xe4, 0xc4, 0x97, 0x60, 0x7c, 0x37, 0xe8,
9517
--	0xf8, 0xb1, 0x30, 0x4b, 0x11, 0x4e, 0x82, 0xec, 0x1d, 0x78, 0x4d, 0x2b, 0xc7, 0x06, 0x56, 0x4a,
9518
--	0xba, 0x1c, 0x7d, 0x58, 0xe9, 0x12, 0xbd, 0x93, 0xca, 0x43, 0x5d, 0xce, 0x8f, 0x99, 0x27, 0x04,
9519
--	0xf1, 0x63, 0x64, 0xa3, 0x3e, 0x5d, 0x89, 0xe8, 0xe7, 0xac, 0x0c, 0x56, 0x9e, 0xcb, 0xc8, 0x9f,
9520
--	0x35, 0x65, 0xe4, 0x2b, 0x69, 0x19, 0xb9, 0x4b, 0x27, 0x6a, 0x88, 0xc7, 0x83, 0x07, 0x5e, 0x1e,
9521
--	0x34, 0x92, 0x99, 0xed, 0xc1, 0xe5, 0x7e, 0xd7, 0x12, 0xb3, 0x4f, 0x6a, 0xaa, 0x17, 0xb0, 0xc4,
9522
--	0x3e, 0xa9, 0xb9, 0x5a, 0xc5, 0x0c, 0x32, 0x68, 0xa8, 0x0b, 0xfb, 0xbf, 0x59, 0x50, 0xac, 0x05,
9523
--	0xcd, 0x53, 0xd0, 0xf1, 0x7e, 0xce, 0xd0, 0xf1, 0x3e, 0x9e, 0x93, 0x1f, 0x3c, 0x57, 0xa3, 0xbb,
9524
--	0x9c, 0xd2, 0xe8, 0x5e, 0xcc, 0x23, 0xd0, 0x5b, 0x7f, 0xfb, 0xd3, 0x45, 0xd0, 0xb3, 0x99, 0xa3,
9525
--	0x7f, 0xf5, 0x30, 0xc6, 0xc1, 0xc5, 0x5e, 0x09, 0xce, 0x05, 0x65, 0x66, 0xd6, 0x24, 0xfd, 0xde,
9526
--	0xfe, 0x9c, 0xd9, 0x08, 0xbf, 0x45, 0xdc, 0xd6, 0x76, 0x4c, 0x9a, 0xe9, 0xcf, 0x39, 0x3d, 0x1b,
9527
--	0xe1, 0xff, 0x62, 0xc1, 0x54, 0xaa, 0x75, 0xe4, 0xc1, 0x84, 0xa7, 0x2b, 0xe8, 0xc4, 0x3a, 0x7d,
9528
--	0x28, 0xdd, 0x9e, 0xb0, 0xb1, 0xd4, 0x8a, 0xb0, 0x49, 0x1c, 0xcd, 0x03, 0xa8, 0x07, 0x34, 0xa9,
9529
--	0xf7, 0x62, 0x5c, 0xbf, 0x7a, 0x61, 0x8b, 0xb0, 0x86, 0x81, 0x5e, 0x86, 0xb1, 0x38, 0x68, 0x07,
9530
--	0x5e, 0xd0, 0xda, 0xbf, 0x45, 0x64, 0x70, 0x15, 0x65, 0x39, 0xb5, 0x91, 0x80, 0xb0, 0x8e, 0x67,
9531
--	0xff, 0x6c, 0x11, 0xd2, 0x19, 0xf0, 0xbf, 0xb5, 0x26, 0x3f, 0x9a, 0x6b, 0xf2, 0x9b, 0x16, 0x4c,
9532
--	0xd3, 0xd6, 0x99, 0x15, 0x87, 0xbc, 0x6c, 0x55, 0x02, 0x18, 0xab, 0x47, 0x02, 0x98, 0x2b, 0xf4,
9533
--	0xec, 0x6a, 0x06, 0x9d, 0x58, 0xe8, 0xcd, 0xb4, 0xc3, 0x89, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24,
9534
--	0x0c, 0x85, 0x6b, 0x92, 0x8e, 0x47, 0xc2, 0x10, 0x0b, 0xa8, 0xcc, 0x0f, 0x53, 0xca, 0xc9, 0x0f,
9535
--	0xc3, 0x42, 0xc5, 0x89, 0xf7, 0x7e, 0xc1, 0xf6, 0x68, 0xa1, 0xe2, 0xa4, 0x21, 0x40, 0x82, 0x63,
9536
--	0xff, 0x62, 0x11, 0xc6, 0x6b, 0x41, 0x33, 0x79, 0xc2, 0x7a, 0xc9, 0x78, 0xc2, 0xba, 0x9c, 0x7a,
9537
--	0xc2, 0x9a, 0xd6, 0x71, 0xbf, 0xf5, 0x60, 0xf5, 0x61, 0x3d, 0x58, 0xfd, 0x73, 0x8b, 0xcd, 0x5a,
9538
--	0x75, 0xbd, 0x2e, 0xf2, 0xd3, 0xbe, 0x00, 0x63, 0xec, 0x40, 0x62, 0xbe, 0x70, 0xf2, 0x5d, 0x87,
9539
--	0x85, 0x7e, 0x5f, 0x4f, 0x8a, 0xb1, 0x8e, 0x83, 0xae, 0xc2, 0x68, 0x44, 0x9c, 0xb0, 0xb1, 0xad,
9540
--	0xce, 0x38, 0xf1, 0xea, 0xc1, 0xcb, 0xb0, 0x82, 0xa2, 0x37, 0x93, 0x28, 0x65, 0xc5, 0xfc, 0x4c,
9541
--	0xab, 0x7a, 0x7f, 0xf8, 0x16, 0xc9, 0x0f, 0x4d, 0x66, 0xbf, 0x05, 0xa8, 0x1b, 0x7f, 0x80, 0x78,
9542
--	0x44, 0x15, 0x33, 0x1e, 0x51, 0xb9, 0x2b, 0x16, 0xd1, 0x9f, 0x5a, 0x30, 0x59, 0x0b, 0x9a, 0x74,
9543
--	0xeb, 0xfe, 0x45, 0xda, 0xa7, 0x7a, 0x88, 0xc6, 0xe1, 0x1e, 0x21, 0x1a, 0xff, 0x9e, 0x05, 0x23,
9544
--	0xb5, 0xa0, 0x79, 0x0a, 0xda, 0xf6, 0xcf, 0x9a, 0xda, 0xf6, 0xc7, 0x72, 0x96, 0x44, 0x8e, 0x82,
9545
--	0xfd, 0x97, 0x8b, 0x30, 0x41, 0xfb, 0x19, 0xb4, 0xe4, 0x2c, 0x19, 0x23, 0x62, 0x0d, 0x30, 0x22,
9546
--	0x94, 0xcd, 0x0d, 0x3c, 0x2f, 0xb8, 0x9f, 0x9e, 0xb1, 0x15, 0x56, 0x8a, 0x05, 0x14, 0x3d, 0x07,
9547
--	0xa3, 0xed, 0x90, 0xec, 0xb9, 0x81, 0xe0, 0x1f, 0xb5, 0xb7, 0x8b, 0x9a, 0x28, 0xc7, 0x0a, 0x83,
9548
--	0xca, 0x5d, 0x91, 0xeb, 0x37, 0x88, 0x4c, 0xf3, 0x5c, 0x62, 0x99, 0xa0, 0x78, 0xec, 0x65, 0xad,
9549
--	0x1c, 0x1b, 0x58, 0xe8, 0x2d, 0x28, 0xb3, 0xff, 0xec, 0x44, 0x39, 0x7e, 0xe6, 0x1a, 0x91, 0xf0,
9550
--	0x40, 0x10, 0xc0, 0x09, 0x2d, 0x74, 0x1d, 0x20, 0x96, 0xf1, 0x79, 0x23, 0x11, 0x56, 0x46, 0xf1,
9551
--	0xda, 0x2a, 0x72, 0x6f, 0x84, 0x35, 0x2c, 0xf4, 0x2c, 0x94, 0x63, 0xc7, 0xf5, 0x6e, 0xbb, 0x3e,
9552
--	0x89, 0x98, 0xca, 0xb9, 0x28, 0xf3, 0x19, 0x88, 0x42, 0x9c, 0xc0, 0x29, 0xaf, 0xc3, 0x7c, 0xae,
9553
--	0x79, 0xde, 0xab, 0x51, 0x86, 0xcd, 0x78, 0x9d, 0xdb, 0xaa, 0x14, 0x6b, 0x18, 0xf6, 0xab, 0x70,
9554
--	0xae, 0x16, 0x34, 0x6b, 0x41, 0x18, 0xaf, 0x04, 0xe1, 0x7d, 0x27, 0x6c, 0xca, 0xf9, 0xab, 0xc8,
9555
--	0xd0, 0xfa, 0xf4, 0xec, 0x19, 0xe2, 0x3b, 0xd3, 0x08, 0x9a, 0xff, 0x22, 0xe3, 0x76, 0x8e, 0xe9,
9556
--	0x6b, 0xd1, 0x60, 0xf7, 0xae, 0x4a, 0x71, 0x77, 0xc3, 0x89, 0x09, 0xba, 0xc3, 0xd2, 0x62, 0x25,
9557
--	0x57, 0x90, 0xa8, 0xfe, 0x8c, 0x96, 0x16, 0x2b, 0x01, 0x66, 0xde, 0x59, 0x66, 0x7d, 0xfb, 0xd7,
9558
--	0x8b, 0xec, 0x34, 0x4a, 0x65, 0x7c, 0x43, 0x5f, 0x82, 0xc9, 0x88, 0xdc, 0x76, 0xfd, 0xce, 0x03,
9559
--	0x29, 0x84, 0xf7, 0xf0, 0x96, 0xa9, 0x2f, 0xeb, 0x98, 0x5c, 0x95, 0x67, 0x96, 0xe1, 0x14, 0x35,
9560
--	0x3a, 0x4f, 0x61, 0xc7, 0x5f, 0x88, 0xee, 0x46, 0x24, 0x14, 0x19, 0xc7, 0xd8, 0x3c, 0x61, 0x59,
9561
--	0x88, 0x13, 0x38, 0x5d, 0x97, 0xec, 0xcf, 0x7a, 0xe0, 0xe3, 0x20, 0x88, 0xe5, 0x4a, 0x66, 0x39,
9562
--	0x6b, 0xb4, 0x72, 0x6c, 0x60, 0xa1, 0x15, 0x40, 0x51, 0xa7, 0xdd, 0xf6, 0xd8, 0x7b, 0xbb, 0xe3,
9563
--	0xdd, 0x08, 0x83, 0x4e, 0x9b, 0xbf, 0x75, 0x16, 0x17, 0xcf, 0xd3, 0x2b, 0xac, 0xde, 0x05, 0xc5,
9564
--	0x19, 0x35, 0xe8, 0xe9, 0xb3, 0x15, 0xb1, 0xdf, 0x6c, 0x75, 0x17, 0x85, 0x7a, 0xbd, 0xce, 0x8a,
9565
--	0xb0, 0x84, 0xd1, 0xc5, 0xc4, 0x9a, 0xe7, 0x98, 0xc3, 0xc9, 0x62, 0xc2, 0xaa, 0x14, 0x6b, 0x18,
9566
--	0x68, 0x19, 0x46, 0xa2, 0xfd, 0xa8, 0x11, 0x8b, 0x20, 0x48, 0x39, 0xb9, 0x23, 0xeb, 0x0c, 0x45,
9567
--	0xcb, 0x67, 0xc0, 0xab, 0x60, 0x59, 0xd7, 0xfe, 0x1e, 0x76, 0x19, 0xb2, 0xfc, 0x54, 0x71, 0x27,
9568
--	0x24, 0x68, 0x17, 0x26, 0xda, 0x6c, 0xca, 0x45, 0xf4, 0x64, 0x31, 0x6f, 0x2f, 0x0d, 0x28, 0xd5,
9569
--	0xde, 0xa7, 0x07, 0x8d, 0xd2, 0x3a, 0x31, 0x71, 0xa1, 0xa6, 0x93, 0xc3, 0x26, 0x75, 0xfb, 0x07,
9570
--	0x67, 0xd8, 0x99, 0x5b, 0xe7, 0xa2, 0xea, 0x88, 0xb0, 0xf8, 0x15, 0x7c, 0xf9, 0x5c, 0xbe, 0xce,
9571
--	0x24, 0xf9, 0x22, 0x61, 0x35, 0x8c, 0x65, 0x5d, 0xf4, 0x26, 0x7b, 0x9b, 0xe6, 0x07, 0x5d, 0xbf,
9572
--	0x34, 0xc1, 0x1c, 0xcb, 0x78, 0x86, 0x16, 0x15, 0xb1, 0x46, 0x04, 0xdd, 0x86, 0x09, 0x91, 0xce,
9573
--	0x48, 0x28, 0xc5, 0x8a, 0x86, 0xd2, 0x63, 0x02, 0xeb, 0xc0, 0xa3, 0x74, 0x01, 0x36, 0x2b, 0xa3,
9574
--	0x16, 0x5c, 0xd4, 0x72, 0xfb, 0xdd, 0x08, 0x1d, 0xf6, 0x5e, 0xe9, 0xb2, 0x4d, 0xa4, 0x9d, 0x9b,
9575
--	0x4f, 0x1e, 0x1e, 0x54, 0x2e, 0x6e, 0xf4, 0x42, 0xc4, 0xbd, 0xe9, 0xa0, 0x3b, 0x70, 0x8e, 0x3b,
9576
--	0xd6, 0x55, 0x89, 0xd3, 0xf4, 0x5c, 0x5f, 0x1d, 0xcc, 0x7c, 0x1d, 0x5e, 0x38, 0x3c, 0xa8, 0x9c,
9577
--	0x5b, 0xc8, 0x42, 0xc0, 0xd9, 0xf5, 0xd0, 0x67, 0xa1, 0xdc, 0xf4, 0x23, 0x31, 0x06, 0xc3, 0x46,
9578
--	0xda, 0xca, 0x72, 0x75, 0xbd, 0xae, 0xbe, 0x3f, 0xf9, 0x83, 0x93, 0x0a, 0xa8, 0xc5, 0x15, 0x63,
9579
--	0x4a, 0x0e, 0x1d, 0xc9, 0x4f, 0x51, 0x2e, 0x96, 0x84, 0xe1, 0x5a, 0xc3, 0x35, 0xc2, 0xca, 0x34,
9580
--	0xd5, 0xf0, 0xba, 0x31, 0x08, 0xa3, 0x37, 0x00, 0x51, 0x46, 0xcd, 0x6d, 0x90, 0x85, 0x06, 0x0b,
9581
--	0x62, 0xcd, 0xf4, 0x88, 0xa3, 0x86, 0x2b, 0x03, 0xaa, 0x77, 0x61, 0xe0, 0x8c, 0x5a, 0xe8, 0x26,
9582
--	0x3d, 0xc8, 0xf4, 0x52, 0x61, 0x62, 0x2b, 0x99, 0xfb, 0xd9, 0x2a, 0x69, 0x87, 0xa4, 0xe1, 0xc4,
9583
--	0xa4, 0x69, 0x52, 0xc4, 0xa9, 0x7a, 0xf4, 0x2e, 0x55, 0xf9, 0x6c, 0xc0, 0x8c, 0x54, 0xd1, 0x9d,
9584
--	0xd3, 0x86, 0xca, 0xc5, 0xdb, 0x41, 0x14, 0xaf, 0x93, 0xf8, 0x7e, 0x10, 0xee, 0x88, 0xc0, 0x60,
9585
--	0x49, 0x8c, 0xca, 0x04, 0x84, 0x75, 0x3c, 0xca, 0x07, 0xb3, 0xc7, 0xe1, 0xd5, 0x2a, 0x7b, 0xa1,
9586
--	0x1b, 0x4d, 0xf6, 0xc9, 0x4d, 0x5e, 0x8c, 0x25, 0x5c, 0xa2, 0xae, 0xd6, 0x96, 0xd8, 0x6b, 0x5b,
9587
--	0x0a, 0x75, 0xb5, 0xb6, 0x84, 0x25, 0x1c, 0x91, 0xee, 0x94, 0xa0, 0x93, 0xf9, 0x5a, 0xcd, 0xee,
9588
--	0xeb, 0x60, 0xc0, 0xac, 0xa0, 0x3e, 0x4c, 0xab, 0x64, 0xa4, 0x3c, 0x62, 0x5a, 0x34, 0x3b, 0xc5,
9589
--	0x16, 0xc9, 0xe0, 0xe1, 0xd6, 0x94, 0x9e, 0x78, 0x35, 0x45, 0x09, 0x77, 0xd1, 0x36, 0x62, 0x87,
9590
--	0x4c, 0xf7, 0xcd, 0x47, 0x74, 0x0d, 0xca, 0x51, 0x67, 0xb3, 0x19, 0xec, 0x3a, 0xae, 0xcf, 0x1e,
9591
--	0xc7, 0x34, 0x26, 0xab, 0x2e, 0x01, 0x38, 0xc1, 0x41, 0x2b, 0x30, 0xea, 0x48, 0x25, 0x30, 0xca,
9592
--	0x0f, 0x26, 0xa0, 0x54, 0xbf, 0xdc, 0xbf, 0x56, 0xaa, 0x7d, 0x55, 0x5d, 0xf4, 0x1a, 0x4c, 0x08,
9593
--	0x77, 0x2a, 0x1e, 0x62, 0x81, 0x3d, 0x5e, 0x69, 0xf6, 0xf2, 0x75, 0x1d, 0x88, 0x4d, 0x5c, 0xf4,
9594
--	0x45, 0x98, 0xa4, 0x54, 0x92, 0x83, 0x6d, 0xf6, 0xec, 0x20, 0x27, 0xa2, 0x96, 0x67, 0x42, 0xaf,
9595
--	0x8c, 0x53, 0xc4, 0x50, 0x13, 0x9e, 0x70, 0x3a, 0x71, 0xc0, 0x14, 0xe9, 0xe6, 0xfa, 0xdf, 0x08,
9596
--	0x76, 0x88, 0xcf, 0xde, 0xb0, 0x46, 0x17, 0x2f, 0x1f, 0x1e, 0x54, 0x9e, 0x58, 0xe8, 0x81, 0x87,
9597
--	0x7b, 0x52, 0x41, 0x77, 0x61, 0x2c, 0x0e, 0x3c, 0x66, 0xb9, 0x4e, 0x59, 0x89, 0xf3, 0xf9, 0xb1,
9598
--	0x77, 0x36, 0x14, 0x9a, 0xae, 0x44, 0x52, 0x55, 0xb1, 0x4e, 0x07, 0x6d, 0xf0, 0x3d, 0xc6, 0xa2,
9599
--	0x92, 0x92, 0x68, 0xf6, 0xb1, 0xfc, 0x81, 0x51, 0xc1, 0x4b, 0xcd, 0x2d, 0x28, 0x6a, 0x62, 0x9d,
9600
--	0x0c, 0xba, 0x01, 0x33, 0xed, 0xd0, 0x0d, 0xd8, 0xc2, 0x56, 0x8f, 0x18, 0xb3, 0x66, 0x6a, 0x81,
9601
--	0x5a, 0x1a, 0x01, 0x77, 0xd7, 0xa1, 0x42, 0xa6, 0x2c, 0x9c, 0xbd, 0xc0, 0xf3, 0x54, 0x71, 0xc6,
9602
--	0x9b, 0x97, 0x61, 0x05, 0x45, 0x6b, 0xec, 0x5c, 0xe6, 0xe2, 0xe0, 0xec, 0x5c, 0x7e, 0x10, 0x06,
9603
--	0x5d, 0x6c, 0xe4, 0xfc, 0x92, 0xfa, 0x8b, 0x13, 0x0a, 0xf4, 0xde, 0x88, 0xb6, 0x9d, 0x90, 0xd4,
9604
--	0xc2, 0xa0, 0x41, 0x78, 0x67, 0xb8, 0xd1, 0xfc, 0xe3, 0x3c, 0x78, 0x22, 0xbd, 0x37, 0xea, 0x59,
9605
--	0x08, 0x38, 0xbb, 0x1e, 0x6a, 0x6a, 0xe9, 0x99, 0x29, 0x1b, 0x1a, 0xcd, 0x3e, 0xd1, 0xc3, 0xcc,
9606
--	0x28, 0xc5, 0xb3, 0x26, 0x6b, 0xd1, 0x28, 0x8e, 0x70, 0x8a, 0xe6, 0xdc, 0xb7, 0xc3, 0x4c, 0xd7,
9607
--	0x7d, 0x71, 0xac, 0xb8, 0xdd, 0x7f, 0x32, 0x04, 0x65, 0xa5, 0x0a, 0x47, 0xd7, 0xcc, 0x17, 0x8e,
9608
--	0x0b, 0xe9, 0x17, 0x8e, 0x51, 0xca, 0x91, 0xeb, 0x8f, 0x1a, 0x1b, 0x86, 0x51, 0x5c, 0x21, 0x3f,
9609
--	0x4b, 0x96, 0xce, 0x53, 0xf7, 0xf5, 0x80, 0xd3, 0x34, 0x1b, 0xc5, 0x81, 0x9f, 0x4a, 0x4a, 0x3d,
9610
--	0x95, 0x25, 0x03, 0x26, 0xa9, 0xa5, 0xc2, 0x7f, 0x3b, 0x68, 0xae, 0xd6, 0xd2, 0x59, 0x1b, 0x6b,
9611
--	0xb4, 0x10, 0x73, 0x18, 0x13, 0xdf, 0x28, 0x73, 0xc3, 0xc4, 0xb7, 0x91, 0x87, 0x14, 0xdf, 0x24,
9612
--	0x01, 0x9c, 0xd0, 0x42, 0x1e, 0xcc, 0x34, 0xcc, 0x84, 0x9b, 0xca, 0xeb, 0xed, 0xa9, 0xbe, 0xa9,
9613
--	0x2f, 0x3b, 0x5a, 0x76, 0xb3, 0xa5, 0x34, 0x15, 0xdc, 0x4d, 0x18, 0xbd, 0x06, 0xa3, 0xef, 0x05,
9614
--	0x11, 0xdb, 0x7c, 0xe2, 0x86, 0x97, 0xde, 0x41, 0xa3, 0x6f, 0xde, 0xa9, 0xb3, 0xf2, 0xa3, 0x83,
9615
--	0xca, 0x58, 0x2d, 0x68, 0xca, 0xbf, 0x58, 0x55, 0x40, 0x0f, 0xe0, 0x9c, 0x71, 0x2e, 0xaa, 0xee,
9616
--	0xc2, 0xe0, 0xdd, 0xbd, 0x28, 0x9a, 0x3b, 0xb7, 0x9a, 0x45, 0x09, 0x67, 0x37, 0x40, 0x0f, 0x1b,
9617
--	0x3f, 0x10, 0xc9, 0x6a, 0x25, 0x17, 0xc1, 0x98, 0x85, 0xb2, 0xee, 0x1b, 0x9e, 0x42, 0xc0, 0xdd,
9618
--	0x75, 0xec, 0xaf, 0xf1, 0x97, 0x03, 0xa1, 0x5f, 0x24, 0x51, 0xc7, 0x3b, 0x8d, 0x5c, 0x48, 0xcb,
9619
--	0x86, 0xea, 0xf3, 0xa1, 0x5f, 0xa7, 0x7e, 0xd3, 0x62, 0xaf, 0x53, 0x1b, 0x64, 0xb7, 0xed, 0x51,
9620
--	0x29, 0xf7, 0xd1, 0x77, 0xfc, 0x4d, 0x18, 0x8d, 0x45, 0x6b, 0xbd, 0xd2, 0x37, 0x69, 0x9d, 0x62,
9621
--	0x2f, 0x74, 0x8a, 0xbf, 0x90, 0xa5, 0x58, 0x91, 0xb1, 0xff, 0x29, 0x9f, 0x01, 0x09, 0x39, 0x05,
9622
--	0x35, 0x54, 0xd5, 0x54, 0x43, 0x55, 0xfa, 0x7c, 0x41, 0x8e, 0x3a, 0xea, 0x9f, 0x98, 0xfd, 0x66,
9623
--	0xa2, 0xdc, 0x47, 0xfd, 0x59, 0xd4, 0xfe, 0x31, 0x0b, 0xce, 0x66, 0xd9, 0x11, 0x51, 0x9e, 0x90,
9624
--	0x0b, 0x92, 0xea, 0x99, 0x58, 0x8d, 0xe0, 0x3d, 0x51, 0x8e, 0x15, 0xc6, 0xc0, 0x99, 0x11, 0x8e,
9625
--	0x17, 0x3e, 0xed, 0x0e, 0x4c, 0xd4, 0x42, 0xa2, 0xdd, 0x01, 0xaf, 0x73, 0x37, 0x33, 0xde, 0x9f,
9626
--	0xe7, 0x8e, 0xed, 0x62, 0x66, 0xff, 0x7c, 0x01, 0xce, 0xf2, 0x77, 0x9e, 0x85, 0xbd, 0xc0, 0x6d,
9627
--	0xd6, 0x82, 0xa6, 0xc8, 0x6a, 0xf1, 0x36, 0x8c, 0xb7, 0x35, 0xe9, 0xbf, 0x57, 0x00, 0x27, 0x5d,
9628
--	0x4b, 0x90, 0x48, 0x61, 0x7a, 0x29, 0x36, 0x68, 0xa1, 0x26, 0x8c, 0x93, 0x3d, 0xb7, 0xa1, 0x1e,
9629
--	0x0b, 0x0a, 0xc7, 0xbe, 0x1b, 0x54, 0x2b, 0xcb, 0x1a, 0x1d, 0x6c, 0x50, 0x7d, 0x04, 0x89, 0xce,
9630
--	0xec, 0x1f, 0xb7, 0xe0, 0xb1, 0x9c, 0x70, 0x4f, 0xb4, 0xb9, 0xfb, 0xec, 0x45, 0x4d, 0xe4, 0x4c,
9631
--	0x52, 0xcd, 0xf1, 0x77, 0x36, 0x2c, 0xa0, 0xe8, 0xf3, 0x00, 0xfc, 0x9d, 0x8c, 0x0a, 0x25, 0xfd,
9632
--	0xe2, 0xe2, 0x18, 0x21, 0x3d, 0xb4, 0x50, 0x0c, 0xb2, 0x3e, 0xd6, 0x68, 0xd9, 0x3f, 0x53, 0x84,
9633
--	0x21, 0xf6, 0x2e, 0x83, 0x56, 0x60, 0x64, 0x9b, 0x07, 0x37, 0x1e, 0x24, 0x8e, 0x72, 0x22, 0xdd,
9634
--	0xf1, 0x02, 0x2c, 0x2b, 0xa3, 0x35, 0x38, 0xc3, 0x83, 0x43, 0x7b, 0x55, 0xe2, 0x39, 0xfb, 0x52,
9635
--	0x49, 0xc0, 0xf3, 0x0c, 0xa9, 0xb0, 0x12, 0xab, 0xdd, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x1d, 0x26,
9636
--	0x63, 0x77, 0x97, 0x04, 0x9d, 0x58, 0x52, 0xe2, 0x61, 0xa1, 0x15, 0x1b, 0xb7, 0x61, 0x40, 0x71,
9637
--	0x0a, 0x9b, 0x8a, 0x3b, 0xed, 0x2e, 0x75, 0x88, 0x96, 0xb9, 0xdf, 0x54, 0x81, 0x98, 0xb8, 0xcc,
9638
--	0x80, 0xa8, 0xc3, 0xcc, 0xa5, 0x36, 0xb6, 0x43, 0x12, 0x6d, 0x07, 0x5e, 0x53, 0xa4, 0xa9, 0x4e,
9639
--	0x0c, 0x88, 0x52, 0x70, 0xdc, 0x55, 0x83, 0x52, 0xd9, 0x72, 0x5c, 0xaf, 0x13, 0x92, 0x84, 0xca,
9640
--	0xb0, 0x49, 0x65, 0x25, 0x05, 0xc7, 0x5d, 0x35, 0xe8, 0x3a, 0x3a, 0x27, 0xf2, 0x46, 0x4b, 0x67,
9641
--	0x77, 0x65, 0x15, 0x36, 0x22, 0xdd, 0x7e, 0x7a, 0x44, 0x7b, 0x11, 0x76, 0x33, 0x2a, 0xf3, 0xb4,
9642
--	0xa6, 0xc5, 0x13, 0x0e, 0x3f, 0x92, 0xca, 0xc3, 0x64, 0x2f, 0xfe, 0x3d, 0x0b, 0xce, 0x64, 0x58,
9643
--	0x9f, 0xf2, 0xa3, 0xaa, 0xe5, 0x46, 0xb1, 0xca, 0xa5, 0xa2, 0x1d, 0x55, 0xbc, 0x1c, 0x2b, 0x0c,
9644
--	0xba, 0x1f, 0xf8, 0x61, 0x98, 0x3e, 0x00, 0x85, 0x75, 0x97, 0x80, 0x1e, 0xef, 0x00, 0x44, 0x97,
9645
--	0xa1, 0xd4, 0x89, 0x88, 0x8c, 0xd3, 0xa4, 0xce, 0x6f, 0xa6, 0xd7, 0x65, 0x10, 0xca, 0x9a, 0xb6,
9646
--	0x94, 0x4a, 0x55, 0x63, 0x4d, 0xb9, 0x9e, 0x94, 0xc3, 0xec, 0xaf, 0x16, 0xe1, 0x42, 0xae, 0x9d,
9647
--	0x39, 0xed, 0xd2, 0x6e, 0xe0, 0xbb, 0x71, 0xa0, 0xde, 0xfc, 0x78, 0xa4, 0x10, 0xd2, 0xde, 0x5e,
9648
--	0x13, 0xe5, 0x58, 0x61, 0xa0, 0x2b, 0x32, 0x83, 0x79, 0x3a, 0x5b, 0xcc, 0x62, 0xd5, 0x48, 0x62,
9649
--	0x3e, 0x68, 0x26, 0xae, 0xa7, 0xa0, 0xd4, 0x0e, 0x02, 0x2f, 0x7d, 0x18, 0xd1, 0xee, 0x06, 0x81,
9650
--	0x87, 0x19, 0x10, 0x7d, 0x42, 0x8c, 0x43, 0xea, 0x91, 0x0b, 0x3b, 0xcd, 0x20, 0xd2, 0x06, 0xe3,
9651
--	0x19, 0x18, 0xd9, 0x21, 0xfb, 0xa1, 0xeb, 0xb7, 0xd2, 0x8f, 0x9f, 0xb7, 0x78, 0x31, 0x96, 0x70,
9652
--	0x33, 0x59, 0xc2, 0xc8, 0x49, 0xa7, 0xd0, 0x1a, 0xed, 0x7b, 0xb5, 0xfd, 0x50, 0x11, 0xa6, 0xf0,
9653
--	0x62, 0xf5, 0x5b, 0x13, 0x71, 0xb7, 0x7b, 0x22, 0x4e, 0x3a, 0x85, 0x56, 0xff, 0xd9, 0xf8, 0x65,
9654
--	0x0b, 0xa6, 0x58, 0x40, 0x61, 0x11, 0x9f, 0xc2, 0x0d, 0xfc, 0x53, 0x60, 0xdd, 0x9e, 0x82, 0xa1,
9655
--	0x90, 0x36, 0x9a, 0xce, 0x8b, 0xc3, 0x7a, 0x82, 0x39, 0x0c, 0x3d, 0x01, 0x25, 0xd6, 0x05, 0x3a,
9656
--	0x79, 0xe3, 0x3c, 0xa5, 0x40, 0xd5, 0x89, 0x1d, 0xcc, 0x4a, 0x99, 0xd3, 0x35, 0x26, 0x6d, 0xcf,
9657
--	0xe5, 0x9d, 0x4e, 0x1e, 0x14, 0x3e, 0x1a, 0x4e, 0xd7, 0x99, 0x5d, 0xfb, 0x60, 0x4e, 0xd7, 0xd9,
9658
--	0x24, 0x7b, 0x8b, 0x45, 0xff, 0xbd, 0x00, 0x97, 0x32, 0xeb, 0x0d, 0xec, 0x74, 0xdd, 0xbb, 0xf6,
9659
--	0xc9, 0xd8, 0xb0, 0x64, 0x9b, 0x96, 0x14, 0x4f, 0xd1, 0xb4, 0xa4, 0x34, 0x28, 0xe7, 0x38, 0x34,
9660
--	0x80, 0x2f, 0x74, 0xe6, 0x90, 0x7d, 0x44, 0x7c, 0xa1, 0x33, 0xfb, 0x96, 0x23, 0xd6, 0xfd, 0x59,
9661
--	0x21, 0xe7, 0x5b, 0x98, 0x80, 0x77, 0x95, 0x9e, 0x33, 0x0c, 0x18, 0x09, 0x4e, 0x78, 0x9c, 0x9f,
9662
--	0x31, 0xbc, 0x0c, 0x2b, 0x28, 0x72, 0x35, 0xaf, 0xe2, 0x42, 0x7e, 0xd6, 0xc4, 0xdc, 0xa6, 0xe6,
9663
--	0xcd, 0xf7, 0x1f, 0x35, 0x04, 0x19, 0x1e, 0xc6, 0x6b, 0x9a, 0x50, 0x5e, 0x1c, 0x5c, 0x28, 0x1f,
9664
--	0xcf, 0x16, 0xc8, 0xd1, 0x02, 0x4c, 0xed, 0xba, 0x3e, 0xcb, 0x82, 0x6f, 0xb2, 0xa2, 0x2a, 0xc8,
9665
--	0xc6, 0x9a, 0x09, 0xc6, 0x69, 0xfc, 0xb9, 0xd7, 0x60, 0xe2, 0xe1, 0xd5, 0x91, 0xdf, 0x2c, 0xc2,
9666
--	0xe3, 0x3d, 0xb6, 0x3d, 0x3f, 0xeb, 0x8d, 0x39, 0xd0, 0xce, 0xfa, 0xae, 0x79, 0xa8, 0xc1, 0xd9,
9667
--	0xad, 0x8e, 0xe7, 0xed, 0x33, 0xeb, 0x4d, 0xd2, 0x94, 0x18, 0x82, 0x57, 0x7c, 0x42, 0x26, 0x71,
9668
--	0x58, 0xc9, 0xc0, 0xc1, 0x99, 0x35, 0xd1, 0x1b, 0x80, 0x02, 0x91, 0xb2, 0xf5, 0x06, 0xf1, 0x85,
9669
--	0x56, 0x9d, 0x0d, 0x7c, 0x31, 0xd9, 0x8c, 0x77, 0xba, 0x30, 0x70, 0x46, 0x2d, 0xca, 0xf4, 0xd3,
9670
--	0x5b, 0x69, 0x5f, 0x75, 0x2b, 0xc5, 0xf4, 0x63, 0x1d, 0x88, 0x4d, 0x5c, 0x74, 0x03, 0x66, 0x9c,
9671
--	0x3d, 0xc7, 0xe5, 0xc1, 0xe7, 0x24, 0x01, 0xce, 0xf5, 0x2b, 0x25, 0xd8, 0x42, 0x1a, 0x01, 0x77,
9672
--	0xd7, 0x49, 0xb9, 0x35, 0x0f, 0xe7, 0xbb, 0x35, 0xf7, 0x3e, 0x17, 0xfb, 0xe9, 0x74, 0xed, 0xff,
9673
--	0x68, 0xd1, 0xeb, 0x2b, 0x23, 0xed, 0x3a, 0x1d, 0x07, 0xa5, 0x9b, 0xd4, 0x3c, 0x8c, 0xcf, 0x69,
9674
--	0xf6, 0x19, 0x09, 0x10, 0x9b, 0xb8, 0x7c, 0x41, 0x44, 0x89, 0x8b, 0x8b, 0xc1, 0xba, 0x8b, 0x10,
9675
--	0x02, 0x0a, 0x03, 0x7d, 0x01, 0x46, 0x9a, 0xee, 0x9e, 0x1b, 0x05, 0xa1, 0xd8, 0x2c, 0xc7, 0x74,
9676
--	0x14, 0x48, 0xce, 0xc1, 0x2a, 0x27, 0x83, 0x25, 0x3d, 0xfb, 0x87, 0x0a, 0x30, 0x21, 0x5b, 0x7c,
9677
--	0xb3, 0x13, 0xc4, 0xce, 0x29, 0x5c, 0xcb, 0x37, 0x8c, 0x6b, 0xf9, 0x13, 0xbd, 0xe2, 0x28, 0xb0,
9678
--	0x2e, 0xe5, 0x5e, 0xc7, 0x77, 0x52, 0xd7, 0xf1, 0xd3, 0xfd, 0x49, 0xf5, 0xbe, 0x86, 0xff, 0x99,
9679
--	0x05, 0x33, 0x06, 0xfe, 0x29, 0xdc, 0x06, 0x2b, 0xe6, 0x6d, 0xf0, 0x64, 0xdf, 0x6f, 0xc8, 0xb9,
9680
--	0x05, 0xbe, 0xaf, 0x98, 0xea, 0x3b, 0x3b, 0xfd, 0xdf, 0x83, 0xd2, 0xb6, 0x13, 0x36, 0x7b, 0xc5,
9681
--	0x6b, 0xed, 0xaa, 0x34, 0x7f, 0xd3, 0x09, 0x9b, 0xfc, 0x0c, 0x7f, 0x4e, 0x25, 0x7a, 0x74, 0xc2,
9682
--	0x66, 0x5f, 0x8f, 0x2e, 0xd6, 0x14, 0x7a, 0x15, 0x86, 0xa3, 0x46, 0xd0, 0x56, 0xf6, 0x96, 0x97,
9683
--	0x79, 0x12, 0x48, 0x5a, 0x72, 0x74, 0x50, 0x41, 0x66, 0x73, 0xb4, 0x18, 0x0b, 0x7c, 0xf4, 0x36,
9684
--	0x4c, 0xb0, 0x5f, 0xca, 0xee, 0xa0, 0x98, 0x9f, 0x25, 0xa0, 0xae, 0x23, 0x72, 0xf3, 0x15, 0xa3,
9685
--	0x08, 0x9b, 0xa4, 0xe6, 0x5a, 0x50, 0x56, 0x9f, 0xf5, 0x48, 0x3d, 0x71, 0xfe, 0x5d, 0x11, 0xce,
9686
--	0x64, 0xac, 0x39, 0x14, 0x19, 0x33, 0xf1, 0xc2, 0x80, 0x4b, 0xf5, 0x03, 0xce, 0x45, 0xc4, 0xa4,
9687
--	0xa1, 0xa6, 0x58, 0x5b, 0x03, 0x37, 0x7a, 0x37, 0x22, 0xe9, 0x46, 0x69, 0x51, 0xff, 0x46, 0x69,
9688
--	0x63, 0xa7, 0x36, 0xd4, 0xb4, 0x21, 0xd5, 0xd3, 0x47, 0x3a, 0xa7, 0x7f, 0x5c, 0x84, 0xb3, 0x59,
9689
--	0xa1, 0x5d, 0xd0, 0x77, 0xa7, 0xb2, 0xc1, 0xbc, 0x34, 0x68, 0x50, 0x18, 0x9e, 0x22, 0x46, 0xe4,
9690
--	0x36, 0x9e, 0x37, 0xf3, 0xc3, 0xf4, 0x1d, 0x66, 0xd1, 0x26, 0x73, 0xdf, 0x0c, 0x79, 0x16, 0x1f,
9691
--	0x79, 0x7c, 0x7c, 0x7a, 0xe0, 0x0e, 0x88, 0xf4, 0x3f, 0x51, 0xca, 0x7d, 0x53, 0x16, 0xf7, 0x77,
9692
--	0xdf, 0x94, 0x2d, 0xcf, 0xb9, 0x30, 0xa6, 0x7d, 0xcd, 0x23, 0x9d, 0xf1, 0x1d, 0x7a, 0x5b, 0x69,
9693
--	0xfd, 0x7e, 0xa4, 0xb3, 0xfe, 0xe3, 0x16, 0xa4, 0x8c, 0x1b, 0x95, 0xba, 0xcb, 0xca, 0x55, 0x77,
9694
--	0x5d, 0x86, 0x52, 0x18, 0x78, 0x24, 0x9d, 0xa0, 0x05, 0x07, 0x1e, 0xc1, 0x0c, 0x42, 0x31, 0xe2,
9695
--	0x44, 0xd9, 0x31, 0xae, 0x0b, 0x72, 0x42, 0x44, 0x7b, 0x0a, 0x86, 0x3c, 0xb2, 0x47, 0xbc, 0x74,
9696
--	0xf4, 0xf3, 0xdb, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0xcb, 0x25, 0xb8, 0xd8, 0xd3, 0x01, 0x9a, 0x8a,
9697
--	0x43, 0x2d, 0x27, 0x26, 0xf7, 0x9d, 0xfd, 0x74, 0x98, 0xe2, 0x1b, 0xbc, 0x18, 0x4b, 0x38, 0xb3,
9698
--	0xf7, 0xe6, 0x61, 0x09, 0x53, 0xca, 0x41, 0x11, 0x8d, 0x50, 0x40, 0x1f, 0x41, 0x5e, 0xf7, 0xeb,
9699
--	0x00, 0x51, 0xe4, 0x2d, 0xfb, 0x94, 0xbb, 0x6b, 0x0a, 0x43, 0xf2, 0x24, 0x7c, 0x65, 0xfd, 0xb6,
9700
--	0x80, 0x60, 0x0d, 0x0b, 0x55, 0x61, 0xba, 0x1d, 0x06, 0x31, 0xd7, 0xb5, 0x56, 0xb9, 0x99, 0xcf,
9701
--	0x90, 0xe9, 0x7b, 0x5a, 0x4b, 0xc1, 0x71, 0x57, 0x0d, 0xf4, 0x32, 0x8c, 0x09, 0x7f, 0xd4, 0x5a,
9702
--	0x10, 0x78, 0x42, 0x0d, 0xa4, 0x8c, 0x46, 0xea, 0x09, 0x08, 0xeb, 0x78, 0x5a, 0x35, 0xa6, 0xc0,
9703
--	0x1d, 0xc9, 0xac, 0xc6, 0x95, 0xb8, 0x1a, 0x5e, 0x2a, 0xcc, 0xd3, 0xe8, 0x40, 0x61, 0x9e, 0x12,
9704
--	0xc5, 0x58, 0x79, 0xe0, 0x37, 0x2b, 0xe8, 0xab, 0x4a, 0xfa, 0x85, 0x12, 0x9c, 0x11, 0x0b, 0xe7,
9705
--	0x51, 0x2f, 0x97, 0x47, 0x94, 0x7d, 0xfe, 0x5b, 0x6b, 0xe6, 0xb4, 0xd7, 0xcc, 0x0f, 0x5b, 0x60,
9706
--	0xb2, 0x57, 0xe8, 0xff, 0xcb, 0x8d, 0xf3, 0xfe, 0x72, 0x2e, 0xbb, 0xd6, 0x94, 0x17, 0xc8, 0x07,
9707
--	0x8c, 0xf8, 0x6e, 0xff, 0x07, 0x0b, 0x9e, 0xec, 0x4b, 0x11, 0x2d, 0x43, 0x99, 0xf1, 0x80, 0x9a,
9708
--	0x74, 0xf6, 0xb4, 0x32, 0x03, 0x94, 0x80, 0x1c, 0x96, 0x34, 0xa9, 0x89, 0x96, 0xbb, 0x02, 0xea,
9709
--	0x3f, 0x93, 0x11, 0x50, 0xff, 0x9c, 0x31, 0x3c, 0x0f, 0x19, 0x51, 0xff, 0x6b, 0x45, 0x18, 0xe6,
9710
--	0x2b, 0xfe, 0x14, 0xc4, 0xb0, 0x15, 0xa1, 0xb7, 0xed, 0x11, 0x47, 0x8a, 0xf7, 0x65, 0xbe, 0xea,
9711
--	0xc4, 0x0e, 0x67, 0x13, 0xd4, 0x6d, 0x95, 0x68, 0x78, 0xd1, 0xbc, 0x71, 0x9f, 0xcd, 0xa5, 0x14,
9712
--	0x93, 0xc0, 0x69, 0x68, 0xb7, 0xdb, 0x97, 0x00, 0x22, 0x96, 0x68, 0x9e, 0xd2, 0x10, 0x11, 0xc9,
9713
--	0x3e, 0xd9, 0xa3, 0xf5, 0xba, 0x42, 0xe6, 0x7d, 0x48, 0x76, 0xba, 0x02, 0x60, 0x8d, 0xe2, 0xdc,
9714
--	0x2b, 0x50, 0x56, 0xc8, 0xfd, 0xb4, 0x38, 0xe3, 0x3a, 0x73, 0xf1, 0x39, 0x98, 0x4a, 0xb5, 0x75,
9715
--	0x2c, 0x25, 0xd0, 0xaf, 0x58, 0x30, 0xc5, 0xbb, 0xbc, 0xec, 0xef, 0x89, 0x33, 0xf5, 0x7d, 0x38,
9716
--	0xeb, 0x65, 0x9c, 0x6d, 0x62, 0x46, 0x07, 0x3f, 0x0b, 0x95, 0xd2, 0x27, 0x0b, 0x8a, 0x33, 0xdb,
9717
--	0x40, 0x57, 0xe9, 0xba, 0xa5, 0x67, 0x97, 0xe3, 0x09, 0xdf, 0xa1, 0x71, 0xbe, 0x66, 0x79, 0x19,
9718
--	0x56, 0x50, 0xfb, 0x77, 0x2c, 0x98, 0xe1, 0x3d, 0xbf, 0x45, 0xf6, 0xd5, 0x0e, 0xff, 0x30, 0xfb,
9719
--	0x2e, 0x72, 0x5c, 0x14, 0x72, 0x72, 0x5c, 0xe8, 0x9f, 0x56, 0xec, 0xf9, 0x69, 0x3f, 0x6f, 0x81,
9720
--	0x58, 0x81, 0xa7, 0x20, 0xca, 0x7f, 0xbb, 0x29, 0xca, 0xcf, 0xe5, 0x2f, 0xea, 0x1c, 0x19, 0xfe,
9721
--	0x4f, 0x2d, 0x98, 0xe6, 0x08, 0xc9, 0x5b, 0xf2, 0x87, 0x3a, 0x0f, 0x83, 0x24, 0xab, 0x53, 0xd9,
9722
--	0xa9, 0xb3, 0x3f, 0xca, 0x98, 0xac, 0x52, 0xcf, 0xc9, 0x6a, 0xca, 0x0d, 0x74, 0x8c, 0x24, 0x8c,
9723
--	0xc7, 0x8e, 0x15, 0x6d, 0xff, 0x91, 0x05, 0x88, 0x37, 0x63, 0xb0, 0x3f, 0x94, 0xa9, 0x60, 0xa5,
9724
--	0xda, 0x75, 0x91, 0x1c, 0x35, 0x0a, 0x82, 0x35, 0xac, 0x13, 0x19, 0x9e, 0x94, 0x41, 0x40, 0xb1,
9725
--	0xbf, 0x41, 0xc0, 0x31, 0x46, 0xf4, 0x6b, 0x25, 0x48, 0x1b, 0xf3, 0xa3, 0x7b, 0x30, 0xde, 0x70,
9726
--	0xda, 0xce, 0xa6, 0xeb, 0xb9, 0xb1, 0x4b, 0xa2, 0x5e, 0x96, 0x44, 0x4b, 0x1a, 0x9e, 0x78, 0xea,
9727
--	0xd5, 0x4a, 0xb0, 0x41, 0x07, 0xcd, 0x03, 0xb4, 0x43, 0x77, 0xcf, 0xf5, 0x48, 0x8b, 0x69, 0x1c,
9728
--	0x98, 0xb7, 0x22, 0x37, 0x8f, 0x91, 0xa5, 0x58, 0xc3, 0xc8, 0x70, 0x3c, 0x2b, 0x3e, 0x3a, 0xc7,
9729
--	0xb3, 0xd2, 0x31, 0x1d, 0xcf, 0x86, 0x06, 0x72, 0x3c, 0xc3, 0x70, 0x5e, 0xb2, 0x48, 0xf4, 0xff,
9730
--	0x8a, 0xeb, 0x11, 0xc1, 0x17, 0x73, 0x1f, 0xc6, 0xb9, 0xc3, 0x83, 0xca, 0x79, 0x9c, 0x89, 0x81,
9731
--	0x73, 0x6a, 0xa2, 0xcf, 0xc3, 0xac, 0xe3, 0x79, 0xc1, 0x7d, 0x35, 0x6a, 0xcb, 0x51, 0xc3, 0xf1,
9732
--	0xb8, 0xc6, 0x7e, 0x84, 0x51, 0x7d, 0xe2, 0xf0, 0xa0, 0x32, 0xbb, 0x90, 0x83, 0x83, 0x73, 0x6b,
9733
--	0xa7, 0xfc, 0xd6, 0x46, 0xfb, 0xf9, 0xad, 0xd9, 0x3b, 0x70, 0xa6, 0x4e, 0x42, 0x97, 0xa5, 0x88,
9734
--	0x6c, 0x26, 0x5b, 0x72, 0x03, 0xca, 0x61, 0xea, 0x10, 0x1a, 0x28, 0xb0, 0x91, 0x16, 0x06, 0x57,
9735
--	0x1e, 0x3a, 0x09, 0x21, 0xfb, 0x4f, 0x2c, 0x18, 0x11, 0x0e, 0x05, 0xa7, 0xc0, 0xfb, 0x2c, 0x18,
9736
--	0x2a, 0xe8, 0x4a, 0xf6, 0x41, 0xcd, 0x3a, 0x93, 0xab, 0x7c, 0x5e, 0x4d, 0x29, 0x9f, 0x9f, 0xec,
9737
--	0x45, 0xa4, 0xb7, 0xda, 0xf9, 0x6f, 0x15, 0x61, 0xd2, 0x74, 0xa6, 0x38, 0x85, 0x21, 0x58, 0x87,
9738
--	0x91, 0x48, 0x78, 0xee, 0x14, 0xf2, 0x6d, 0x9f, 0xd3, 0x93, 0x98, 0x18, 0x36, 0x09, 0x5f, 0x1d,
9739
--	0x49, 0x24, 0xd3, 0x25, 0xa8, 0xf8, 0x08, 0x5d, 0x82, 0xfa, 0xf9, 0xb3, 0x94, 0x4e, 0xc2, 0x9f,
9740
--	0xc5, 0xfe, 0x3a, 0xbb, 0x2c, 0xf4, 0xf2, 0x53, 0xe0, 0x23, 0x6e, 0x98, 0xd7, 0x8a, 0xdd, 0x63,
9741
--	0x65, 0x89, 0x4e, 0xe5, 0xf0, 0x13, 0xbf, 0x64, 0xc1, 0xc5, 0x8c, 0xaf, 0xd2, 0x98, 0x8b, 0xe7,
9742
--	0x60, 0xd4, 0xe9, 0x34, 0x5d, 0xb5, 0x97, 0xb5, 0x87, 0xa8, 0x05, 0x51, 0x8e, 0x15, 0x06, 0x5a,
9743
--	0x82, 0x19, 0xf2, 0xa0, 0xed, 0xf2, 0x97, 0x40, 0xdd, 0xfa, 0xb0, 0xc8, 0x43, 0xbc, 0x2e, 0xa7,
9744
--	0x81, 0xb8, 0x1b, 0x5f, 0xb9, 0x43, 0x17, 0x73, 0xdd, 0xa1, 0xff, 0xa1, 0x05, 0x63, 0xa2, 0xdb,
9745
--	0xa7, 0x30, 0xda, 0xdf, 0x61, 0x8e, 0xf6, 0xe3, 0x3d, 0x46, 0x3b, 0x67, 0x98, 0xff, 0x4e, 0x41,
9746
--	0xf5, 0xb7, 0x16, 0x84, 0xf1, 0x00, 0x4c, 0xcb, 0xab, 0x30, 0xda, 0x0e, 0x83, 0x38, 0x68, 0x04,
9747
--	0x9e, 0xe0, 0x59, 0x9e, 0x48, 0xbc, 0xf5, 0x79, 0xf9, 0x91, 0xf6, 0x1b, 0x2b, 0x6c, 0x36, 0x7a,
9748
--	0x41, 0x18, 0x0b, 0x3e, 0x21, 0x19, 0xbd, 0x20, 0x8c, 0x31, 0x83, 0xa0, 0x26, 0x40, 0xec, 0x84,
9749
--	0x2d, 0x12, 0xd3, 0x32, 0x11, 0xf8, 0x23, 0xff, 0xf0, 0xe8, 0xc4, 0xae, 0x37, 0xef, 0xfa, 0x71,
9750
--	0x14, 0x87, 0xf3, 0xab, 0x7e, 0x7c, 0x27, 0xe4, 0x22, 0x90, 0xe6, 0x7e, 0xaf, 0x68, 0x61, 0x8d,
9751
--	0xae, 0xf4, 0x91, 0x64, 0x6d, 0x0c, 0x99, 0x4f, 0xda, 0xeb, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x15,
9752
--	0x76, 0x95, 0xb0, 0x01, 0x3a, 0x9e, 0x67, 0xfc, 0x37, 0x46, 0xd5, 0xd0, 0xb2, 0xf7, 0xac, 0xaa,
9753
--	0xee, 0x7f, 0xdf, 0xfb, 0xe4, 0xa6, 0x0d, 0xeb, 0x9e, 0x30, 0x89, 0x93, 0x3e, 0xfa, 0xce, 0x2e,
9754
--	0x4b, 0x87, 0xe7, 0xfb, 0x5c, 0x01, 0xc7, 0xb0, 0x6d, 0x60, 0x61, 0xa7, 0x59, 0x78, 0xde, 0xd5,
9755
--	0x9a, 0x58, 0xe4, 0x5a, 0xd8, 0x69, 0x01, 0xc0, 0x09, 0x0e, 0xba, 0x26, 0x04, 0xe8, 0x92, 0x91,
9756
--	0x1d, 0x4e, 0x0a, 0xd0, 0xf2, 0xf3, 0x35, 0x09, 0xfa, 0x05, 0x18, 0x53, 0x59, 0xe2, 0x6a, 0x3c,
9757
--	0xd9, 0x96, 0x08, 0x83, 0xb2, 0x9c, 0x14, 0x63, 0x1d, 0x07, 0x6d, 0xc0, 0x54, 0xc4, 0xb5, 0x27,
9758
--	0x2a, 0xda, 0x1d, 0xd7, 0x42, 0x7d, 0x52, 0x5a, 0x48, 0xd4, 0x4d, 0xf0, 0x11, 0x2b, 0xe2, 0x47,
9759
--	0x87, 0x74, 0x74, 0x4c, 0x93, 0x40, 0xaf, 0xc3, 0xa4, 0xa7, 0xe7, 0x5a, 0xaf, 0x09, 0x25, 0x95,
9760
--	0x32, 0x20, 0x36, 0x32, 0xb1, 0xd7, 0x70, 0x0a, 0x9b, 0xf2, 0x3a, 0x7a, 0x89, 0x88, 0xd0, 0xe8,
9761
--	0xf8, 0x2d, 0x12, 0x89, 0x1c, 0x57, 0x8c, 0xd7, 0xb9, 0x9d, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0x57,
9762
--	0x61, 0x5c, 0x7e, 0xbe, 0xe6, 0xc6, 0x9b, 0x98, 0xa9, 0x6b, 0x30, 0x6c, 0x60, 0xa2, 0xfb, 0x70,
9763
--	0x4e, 0xfe, 0xdf, 0x08, 0x9d, 0xad, 0x2d, 0xb7, 0x21, 0xbc, 0xa8, 0xb9, 0xaf, 0xce, 0x82, 0x74,
9764
--	0xfe, 0x59, 0xce, 0x42, 0x3a, 0x3a, 0xa8, 0x5c, 0x16, 0xa3, 0x96, 0x09, 0x67, 0x93, 0x98, 0x4d,
9765
--	0x1f, 0xad, 0xc1, 0x99, 0x6d, 0xe2, 0x78, 0xf1, 0xf6, 0xd2, 0x36, 0x69, 0xec, 0xc8, 0x4d, 0xc4,
9766
--	0x9c, 0x83, 0x35, 0xe3, 0xee, 0x9b, 0xdd, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x07, 0x66, 0xdb, 0x9d,
9767
--	0x4d, 0xcf, 0x8d, 0xb6, 0xd7, 0x83, 0x98, 0x19, 0x65, 0xa8, 0x24, 0x6b, 0xc2, 0x8b, 0x58, 0x39,
9768
--	0x46, 0xd7, 0x72, 0xf0, 0x70, 0x2e, 0x05, 0xf4, 0x3e, 0x9c, 0x4b, 0x2d, 0x06, 0xe1, 0xd3, 0x38,
9769
--	0x99, 0x1f, 0xef, 0xb6, 0x9e, 0x55, 0x41, 0xf8, 0x28, 0x66, 0x81, 0x70, 0x76, 0x13, 0x1f, 0xcc,
9770
--	0x54, 0xe7, 0x3d, 0x5a, 0x59, 0x63, 0xca, 0xd0, 0x97, 0x61, 0x5c, 0x5f, 0x45, 0xe2, 0x82, 0xb9,
9771
--	0x92, 0xcd, 0xb3, 0x68, 0xab, 0x8d, 0xb3, 0x74, 0x6a, 0x45, 0xe9, 0x30, 0x6c, 0x50, 0xb4, 0x09,
9772
--	0x64, 0x7f, 0x1f, 0xba, 0x0d, 0xa3, 0x0d, 0xcf, 0x25, 0x7e, 0xbc, 0x5a, 0xeb, 0x15, 0x74, 0x63,
9773
--	0x49, 0xe0, 0x88, 0x01, 0x13, 0x01, 0x42, 0x79, 0x19, 0x56, 0x14, 0xec, 0xdf, 0x28, 0x40, 0xa5,
9774
--	0x4f, 0xb4, 0xd9, 0x94, 0x46, 0xd9, 0x1a, 0x48, 0xa3, 0xbc, 0x20, 0x53, 0xc6, 0xad, 0xa7, 0xc4,
9775
--	0xec, 0x54, 0x3a, 0xb8, 0x44, 0xd8, 0x4e, 0xe3, 0x0f, 0x6c, 0xe1, 0xab, 0x2b, 0xa5, 0x4b, 0x7d,
9776
--	0x6d, 0xcf, 0x8d, 0xc7, 0xa8, 0xa1, 0xc1, 0x05, 0x91, 0xdc, 0x87, 0x05, 0xfb, 0xeb, 0x05, 0x38,
9777
--	0xa7, 0x86, 0xf0, 0x2f, 0xee, 0xc0, 0xdd, 0xed, 0x1e, 0xb8, 0x13, 0x78, 0x96, 0xb1, 0xef, 0xc0,
9778
--	0x30, 0x0f, 0x5a, 0x32, 0x00, 0x03, 0xf4, 0x94, 0x19, 0xe1, 0x4a, 0x5d, 0xd3, 0x46, 0x94, 0xab,
9779
--	0xbf, 0x62, 0xc1, 0xd4, 0xc6, 0x52, 0xad, 0x1e, 0x34, 0x76, 0x48, 0xbc, 0xc0, 0x19, 0x56, 0x2c,
9780
--	0xf8, 0x1f, 0xeb, 0x21, 0xf9, 0x9a, 0x2c, 0x8e, 0xe9, 0x32, 0x94, 0xb6, 0x83, 0x28, 0x4e, 0xbf,
9781
--	0xd9, 0xde, 0x0c, 0xa2, 0x18, 0x33, 0x88, 0xfd, 0xbb, 0x16, 0x0c, 0xb1, 0x44, 0xa7, 0xfd, 0xb2,
9782
--	0xef, 0x0e, 0xf2, 0x5d, 0xe8, 0x65, 0x18, 0x26, 0x5b, 0x5b, 0xa4, 0x11, 0x8b, 0x59, 0x95, 0x0e,
9783
--	0xa5, 0xc3, 0xcb, 0xac, 0x94, 0x5e, 0xfa, 0xac, 0x31, 0xfe, 0x17, 0x0b, 0x64, 0xf4, 0x16, 0x94,
9784
--	0x63, 0x77, 0x97, 0x2c, 0x34, 0x9b, 0xe2, 0xd5, 0xeb, 0x21, 0xfc, 0x77, 0x37, 0x24, 0x01, 0x9c,
9785
--	0xd0, 0xb2, 0xbf, 0x5a, 0x00, 0x48, 0x5c, 0xef, 0xfb, 0x7d, 0xe2, 0x62, 0xd7, 0x7b, 0xc8, 0x95,
9786
--	0x8c, 0xf7, 0x10, 0x94, 0x10, 0xcc, 0x78, 0x0c, 0x51, 0xc3, 0x54, 0x1c, 0x68, 0x98, 0x4a, 0xc7,
9787
--	0x19, 0xa6, 0x25, 0x98, 0x49, 0x42, 0x07, 0x98, 0x71, 0x54, 0x98, 0x90, 0xb2, 0x91, 0x06, 0xe2,
9788
--	0x6e, 0x7c, 0x9b, 0xc0, 0x65, 0x19, 0xd1, 0x52, 0xde, 0x35, 0xcc, 0xa8, 0xf2, 0x18, 0x89, 0x98,
9789
--	0x93, 0x07, 0x9f, 0x42, 0xee, 0x83, 0xcf, 0x4f, 0x59, 0x70, 0x36, 0xdd, 0x0e, 0xf3, 0x5e, 0xfb,
9790
--	0x01, 0x0b, 0xce, 0xb1, 0x67, 0x2f, 0xd6, 0x6a, 0xf7, 0x23, 0xdb, 0x4b, 0xd9, 0x21, 0x15, 0x7a,
9791
--	0xf7, 0x38, 0xf1, 0x5c, 0x5e, 0xcb, 0x22, 0x8d, 0xb3, 0x5b, 0xb4, 0xbf, 0xdf, 0x02, 0xe1, 0x24,
9792
--	0x34, 0xc0, 0xc6, 0x7e, 0x5b, 0xa6, 0x2a, 0x35, 0x02, 0x78, 0x5f, 0xce, 0xf7, 0x9a, 0x12, 0x61,
9793
--	0xbb, 0xd5, 0x45, 0x6a, 0x04, 0xeb, 0x36, 0x68, 0xd9, 0x4d, 0x10, 0xd0, 0x2a, 0x61, 0x7a, 0xa2,
9794
--	0xfe, 0xbd, 0xb9, 0x0e, 0xd0, 0x64, 0xb8, 0x5a, 0xc2, 0x42, 0x75, 0x6c, 0x57, 0x15, 0x04, 0x6b,
9795
--	0x58, 0xf6, 0x8f, 0x14, 0x60, 0x4c, 0x06, 0x8c, 0xee, 0xf8, 0x83, 0x48, 0x73, 0xc7, 0xca, 0x1b,
9796
--	0xc3, 0x32, 0x7c, 0x52, 0xc2, 0xb5, 0x44, 0x08, 0x4e, 0x32, 0x7c, 0x4a, 0x00, 0x4e, 0x70, 0xd0,
9797
--	0x33, 0x30, 0x12, 0x75, 0x36, 0x19, 0x7a, 0xca, 0xf5, 0xa5, 0xce, 0x8b, 0xb1, 0x84, 0xa3, 0xcf,
9798
--	0xc3, 0x34, 0xaf, 0x17, 0x06, 0x6d, 0xa7, 0xc5, 0x95, 0x86, 0x43, 0xca, 0x17, 0x75, 0x7a, 0x2d,
9799
--	0x05, 0x3b, 0x3a, 0xa8, 0x9c, 0x4d, 0x97, 0x31, 0x75, 0x73, 0x17, 0x15, 0xfb, 0xcb, 0x80, 0xba,
9800
--	0x63, 0x60, 0xa3, 0x37, 0xb8, 0x01, 0x92, 0x1b, 0x92, 0x66, 0x2f, 0x3d, 0xb2, 0xee, 0x3a, 0x29,
9801
--	0xcd, 0xcf, 0x79, 0x2d, 0xac, 0xea, 0xdb, 0x7f, 0xad, 0x08, 0xd3, 0x69, 0x47, 0x3a, 0x74, 0x13,
9802
--	0x86, 0xf9, 0x05, 0x23, 0xc8, 0xf7, 0x78, 0xa6, 0xd4, 0xdc, 0xef, 0xd8, 0x56, 0x13, 0x77, 0x94,
9803
--	0xa8, 0x8f, 0xde, 0x81, 0xb1, 0x66, 0x70, 0xdf, 0xbf, 0xef, 0x84, 0xcd, 0x85, 0xda, 0xaa, 0x58,
9804
--	0x97, 0x99, 0x7c, 0x6a, 0x35, 0x41, 0xd3, 0x5d, 0xfa, 0x98, 0x4a, 0x3e, 0x01, 0x61, 0x9d, 0x1c,
9805
--	0xda, 0x60, 0x71, 0xfd, 0xb6, 0xdc, 0xd6, 0x9a, 0xd3, 0xee, 0x65, 0x8d, 0xba, 0x24, 0x91, 0x34,
9806
--	0xca, 0x13, 0x22, 0xf8, 0x1f, 0x07, 0xe0, 0x84, 0x10, 0xfa, 0x6e, 0x38, 0x13, 0xe5, 0xa8, 0xb6,
9807
--	0xf2, 0x52, 0x22, 0xf4, 0xd2, 0xf6, 0x2c, 0x3e, 0x46, 0x25, 0x88, 0x2c, 0x25, 0x58, 0x56, 0x33,
9808
--	0xf6, 0x57, 0xce, 0x80, 0xb1, 0x1b, 0x8d, 0xbc, 0x38, 0xd6, 0x09, 0xe5, 0xc5, 0xc1, 0x30, 0x4a,
9809
--	0x76, 0xdb, 0xf1, 0x7e, 0xd5, 0x0d, 0x7b, 0x25, 0x56, 0x5b, 0x16, 0x38, 0xdd, 0x34, 0x25, 0x04,
9810
--	0x2b, 0x3a, 0xd9, 0xc9, 0x8b, 0x8a, 0x1f, 0x62, 0xf2, 0xa2, 0xd2, 0x29, 0x26, 0x2f, 0x5a, 0x87,
9811
--	0x91, 0x96, 0x1b, 0x63, 0xd2, 0x0e, 0x04, 0x6b, 0x97, 0xb9, 0x0e, 0x6f, 0x70, 0x94, 0xee, 0x84,
9812
--	0x19, 0x02, 0x80, 0x25, 0x11, 0xf4, 0x86, 0xda, 0x81, 0xc3, 0xf9, 0x92, 0x51, 0xf7, 0x7b, 0x5a,
9813
--	0xe6, 0x1e, 0x14, 0xc9, 0x8a, 0x46, 0x1e, 0x36, 0x59, 0xd1, 0x8a, 0x4c, 0x31, 0x34, 0x9a, 0x6f,
9814
--	0x3a, 0xce, 0x32, 0x08, 0xf5, 0x49, 0x2c, 0x64, 0x24, 0x63, 0x2a, 0x9f, 0x5c, 0x32, 0xa6, 0xef,
9815
--	0xb7, 0xe0, 0x5c, 0x3b, 0x2b, 0x2f, 0x99, 0x48, 0x0c, 0xf4, 0xf2, 0xc0, 0x89, 0xd7, 0x8c, 0x06,
9816
--	0x99, 0x88, 0x9c, 0x89, 0x86, 0xb3, 0x9b, 0xa3, 0x03, 0x1d, 0x6e, 0x36, 0x45, 0x36, 0xa1, 0xa7,
9817
--	0x72, 0xb2, 0x3a, 0xf5, 0xc8, 0xe5, 0xb4, 0x91, 0x91, 0x41, 0xe8, 0xe3, 0x79, 0x19, 0x84, 0x06,
9818
--	0xce, 0x1b, 0xf4, 0x86, 0xca, 0xe7, 0x34, 0x91, 0xbf, 0x94, 0x78, 0xb6, 0xa6, 0xbe, 0x59, 0x9c,
9819
--	0xde, 0x50, 0x59, 0x9c, 0x7a, 0xc4, 0x37, 0xe3, 0x39, 0x9a, 0xfa, 0xe6, 0x6e, 0xd2, 0xf2, 0x2f,
9820
--	0x4d, 0x9d, 0x4c, 0xfe, 0x25, 0xe3, 0xaa, 0xe1, 0x29, 0x80, 0x9e, 0xed, 0x73, 0xd5, 0x18, 0x74,
9821
--	0x7b, 0x5f, 0x36, 0x3c, 0xd7, 0xd4, 0xcc, 0x43, 0xe5, 0x9a, 0xba, 0xa7, 0xe7, 0x6e, 0x42, 0x7d,
9822
--	0x92, 0x13, 0x51, 0xa4, 0x01, 0x33, 0x36, 0xdd, 0xd3, 0x2f, 0xc0, 0x33, 0xf9, 0x74, 0xd5, 0x3d,
9823
--	0xd7, 0x4d, 0x37, 0xf3, 0x0a, 0xec, 0xca, 0x04, 0x75, 0xf6, 0x74, 0x32, 0x41, 0x9d, 0x3b, 0xf1,
9824
--	0x4c, 0x50, 0xe7, 0x4f, 0x21, 0x13, 0xd4, 0x63, 0x1f, 0x6a, 0x26, 0xa8, 0xd9, 0x47, 0x90, 0x09,
9825
--	0x6a, 0x3d, 0xc9, 0x04, 0x75, 0x21, 0x7f, 0x4a, 0x32, 0xec, 0x59, 0x73, 0xf2, 0x3f, 0xdd, 0x83,
9826
--	0x72, 0x5b, 0x46, 0x7a, 0x10, 0x01, 0xd8, 0xb2, 0x93, 0xd1, 0x66, 0x85, 0x83, 0xe0, 0x53, 0xa2,
9827
--	0x40, 0x38, 0x21, 0x45, 0xe9, 0x26, 0xf9, 0xa0, 0x1e, 0xef, 0xa1, 0x04, 0xcd, 0x52, 0x2f, 0xe5,
9828
--	0x67, 0x81, 0xb2, 0xff, 0x6a, 0x01, 0x2e, 0xf5, 0x5e, 0xd7, 0x89, 0x6e, 0xaa, 0x96, 0xbc, 0xa5,
9829
--	0xa4, 0x74, 0x53, 0x5c, 0xc8, 0x49, 0xb0, 0x06, 0x0e, 0x87, 0x73, 0x03, 0x66, 0x94, 0x21, 0xab,
9830
--	0xe7, 0x36, 0xf6, 0xb5, 0x24, 0xb5, 0xca, 0x61, 0xaf, 0x9e, 0x46, 0xc0, 0xdd, 0x75, 0xd0, 0x02,
9831
--	0x4c, 0x19, 0x85, 0xab, 0x55, 0x21, 0xcc, 0x28, 0x65, 0x58, 0xdd, 0x04, 0xe3, 0x34, 0xbe, 0xfd,
9832
--	0x73, 0x16, 0x3c, 0x96, 0x93, 0x24, 0x61, 0xe0, 0x68, 0x2f, 0x5b, 0x30, 0xd5, 0x36, 0xab, 0xf6,
9833
--	0x09, 0x0a, 0x65, 0xa4, 0x62, 0x50, 0x7d, 0x4d, 0x01, 0x70, 0x9a, 0xe8, 0xe2, 0xd5, 0xdf, 0xfa,
9834
--	0xfd, 0x4b, 0x1f, 0xfb, 0xed, 0xdf, 0xbf, 0xf4, 0xb1, 0xdf, 0xf9, 0xfd, 0x4b, 0x1f, 0xfb, 0xff,
9835
--	0x0f, 0x2f, 0x59, 0xbf, 0x75, 0x78, 0xc9, 0xfa, 0xed, 0xc3, 0x4b, 0xd6, 0xef, 0x1c, 0x5e, 0xb2,
9836
--	0x7e, 0xef, 0xf0, 0x92, 0xf5, 0xd5, 0x3f, 0xb8, 0xf4, 0xb1, 0xb7, 0x0b, 0x7b, 0x2f, 0xfc, 0xbf,
9837
--	0x00, 0x00, 0x00, 0xff, 0xff, 0x41, 0x99, 0x07, 0x31, 0x7e, 0xe5, 0x00, 0x00,
9838
-+	0x76, 0x18, 0xbc, 0xd5, 0xdd, 0x7c, 0xf4, 0xe1, 0xfb, 0xce, 0x8b, 0x43, 0xcd, 0x4c, 0x8f, 0x4a,
9839
-+	0xbb, 0xa3, 0xd1, 0x4a, 0x22, 0x57, 0x23, 0x69, 0x25, 0xaf, 0x76, 0x65, 0x93, 0x6c, 0x72, 0x86,
9840
-+	0x9a, 0x21, 0xa7, 0x75, 0x9b, 0x33, 0xda, 0x95, 0xb5, 0xeb, 0x2d, 0x76, 0x5f, 0x92, 0x25, 0x16,
9841
-+	0xab, 0x5a, 0x55, 0xd5, 0x9c, 0xa1, 0x3e, 0x1b, 0xf8, 0xb2, 0x8e, 0x9d, 0xf8, 0x81, 0x60, 0x11,
9842
-+	0x1b, 0x79, 0xd8, 0x86, 0x03, 0x38, 0x0e, 0x6c, 0xc7, 0x49, 0x10, 0xc7, 0x8e, 0xed, 0xec, 0xda,
9843
-+	0x89, 0xe3, 0x24, 0x80, 0xf3, 0x67, 0xe3, 0x04, 0x08, 0xd6, 0x80, 0x11, 0xc6, 0xa6, 0x8d, 0x04,
9844
-+	0xfe, 0x91, 0x07, 0xe2, 0xfc, 0x31, 0x63, 0xc4, 0xc1, 0x7d, 0xd6, 0xbd, 0xd5, 0x55, 0xdd, 0xcd,
9845
-+	0x11, 0x87, 0x92, 0x8d, 0xfd, 0xd7, 0x7d, 0xcf, 0xb9, 0xe7, 0xde, 0xba, 0xcf, 0x73, 0xce, 0x3d,
9846
-+	0x0f, 0x78, 0x6d, 0xe7, 0xd5, 0x68, 0xd6, 0x0d, 0xe6, 0x76, 0xda, 0x1b, 0x24, 0xf4, 0x49, 0x4c,
9847
-+	0xa2, 0xb9, 0x3d, 0xe2, 0x37, 0x83, 0x70, 0x4e, 0x00, 0x9c, 0x96, 0x3b, 0xd7, 0x08, 0x42, 0x32,
9848
-+	0xb7, 0xf7, 0xc2, 0xdc, 0x16, 0xf1, 0x49, 0xe8, 0xc4, 0xa4, 0x39, 0xdb, 0x0a, 0x83, 0x38, 0x40,
9849
-+	0x88, 0xe3, 0xcc, 0x3a, 0x2d, 0x77, 0x96, 0xe2, 0xcc, 0xee, 0xbd, 0x30, 0xf3, 0xfc, 0x96, 0x1b,
9850
-+	0x6f, 0xb7, 0x37, 0x66, 0x1b, 0xc1, 0xee, 0xdc, 0x56, 0xb0, 0x15, 0xcc, 0x31, 0xd4, 0x8d, 0xf6,
9851
-+	0x26, 0xfb, 0xc7, 0xfe, 0xb0, 0x5f, 0x9c, 0xc4, 0xcc, 0x6a, 0xd2, 0x0c, 0x79, 0x18, 0x13, 0x3f,
9852
-+	0x72, 0x03, 0x3f, 0x7a, 0xde, 0x69, 0xb9, 0x11, 0x09, 0xf7, 0x48, 0x38, 0xd7, 0xda, 0xd9, 0xa2,
9853
-+	0xb0, 0xc8, 0x44, 0x98, 0xdb, 0x7b, 0x61, 0x83, 0xc4, 0x4e, 0x47, 0x8f, 0x66, 0x5e, 0x4a, 0xc8,
9854
-+	0xed, 0x3a, 0x8d, 0x6d, 0xd7, 0x27, 0xe1, 0xbe, 0xa4, 0x31, 0x17, 0x92, 0x28, 0x68, 0x87, 0x0d,
9855
-+	0x72, 0xac, 0x5a, 0xd1, 0xdc, 0x2e, 0x89, 0x9d, 0x8c, 0xaf, 0x9f, 0x99, 0xcb, 0xab, 0x15, 0xb6,
9856
-+	0xfd, 0xd8, 0xdd, 0xed, 0x6c, 0xe6, 0xd3, 0xbd, 0x2a, 0x44, 0x8d, 0x6d, 0xb2, 0xeb, 0x74, 0xd4,
9857
-+	0x7b, 0x31, 0xaf, 0x5e, 0x3b, 0x76, 0xbd, 0x39, 0xd7, 0x8f, 0xa3, 0x38, 0x4c, 0x57, 0xb2, 0xbf,
9858
-+	0x69, 0xc1, 0xd5, 0xf9, 0xb7, 0xea, 0x4b, 0x9e, 0x13, 0xc5, 0x6e, 0x63, 0xc1, 0x0b, 0x1a, 0x3b,
9859
-+	0xf5, 0x38, 0x08, 0xc9, 0xfd, 0xc0, 0x6b, 0xef, 0x92, 0x3a, 0x1b, 0x08, 0xf4, 0x1c, 0x0c, 0xef,
9860
-+	0xb1, 0xff, 0x2b, 0xd5, 0x69, 0xeb, 0xaa, 0x75, 0xbd, 0xbc, 0x30, 0xf9, 0x5b, 0x07, 0x95, 0x8f,
9861
-+	0x1d, 0x1e, 0x54, 0x86, 0xef, 0x8b, 0x72, 0xac, 0x30, 0xd0, 0x35, 0x18, 0xdc, 0x8c, 0xd6, 0xf7,
9862
-+	0x5b, 0x64, 0xba, 0xc0, 0x70, 0xc7, 0x05, 0xee, 0xe0, 0x72, 0x9d, 0x96, 0x62, 0x01, 0x45, 0x73,
9863
-+	0x50, 0x6e, 0x39, 0x61, 0xec, 0xc6, 0x6e, 0xe0, 0x4f, 0x17, 0xaf, 0x5a, 0xd7, 0x07, 0x16, 0xa6,
9864
-+	0x04, 0x6a, 0xb9, 0x26, 0x01, 0x38, 0xc1, 0xa1, 0xdd, 0x08, 0x89, 0xd3, 0xbc, 0xeb, 0x7b, 0xfb,
9865
-+	0xd3, 0xa5, 0xab, 0xd6, 0xf5, 0xe1, 0xa4, 0x1b, 0x58, 0x94, 0x63, 0x85, 0x61, 0xff, 0x58, 0x01,
9866
-+	0x86, 0xe7, 0x37, 0x37, 0x5d, 0xdf, 0x8d, 0xf7, 0xd1, 0x7d, 0x18, 0xf5, 0x83, 0x26, 0x91, 0xff,
9867
-+	0xd9, 0x57, 0x8c, 0xdc, 0xb8, 0x3a, 0xdb, 0xb9, 0x32, 0x67, 0xd7, 0x34, 0xbc, 0x85, 0xc9, 0xc3,
9868
-+	0x83, 0xca, 0xa8, 0x5e, 0x82, 0x0d, 0x3a, 0x08, 0xc3, 0x48, 0x2b, 0x68, 0x2a, 0xb2, 0x05, 0x46,
9869
-+	0xb6, 0x92, 0x45, 0xb6, 0x96, 0xa0, 0x2d, 0x4c, 0x1c, 0x1e, 0x54, 0x46, 0xb4, 0x02, 0xac, 0x13,
9870
-+	0x41, 0x1b, 0x30, 0x41, 0xff, 0xfa, 0xb1, 0xab, 0xe8, 0x16, 0x19, 0xdd, 0xa7, 0xf2, 0xe8, 0x6a,
9871
-+	0xa8, 0x0b, 0x67, 0x0e, 0x0f, 0x2a, 0x13, 0xa9, 0x42, 0x9c, 0x26, 0x68, 0xbf, 0x0f, 0xe3, 0xf3,
9872
-+	0x71, 0xec, 0x34, 0xb6, 0x49, 0x93, 0xcf, 0x20, 0x7a, 0x09, 0x4a, 0xbe, 0xb3, 0x4b, 0xc4, 0xfc,
9873
-+	0x5e, 0x15, 0x03, 0x5b, 0x5a, 0x73, 0x76, 0xc9, 0xd1, 0x41, 0x65, 0xf2, 0x9e, 0xef, 0xbe, 0xd7,
9874
-+	0x16, 0xab, 0x82, 0x96, 0x61, 0x86, 0x8d, 0x6e, 0x00, 0x34, 0xc9, 0x9e, 0xdb, 0x20, 0x35, 0x27,
9875
-+	0xde, 0x16, 0xf3, 0x8d, 0x44, 0x5d, 0xa8, 0x2a, 0x08, 0xd6, 0xb0, 0xec, 0x87, 0x50, 0x9e, 0xdf,
9876
-+	0x0b, 0xdc, 0x66, 0x2d, 0x68, 0x46, 0x68, 0x07, 0x26, 0x5a, 0x21, 0xd9, 0x24, 0xa1, 0x2a, 0x9a,
9877
-+	0xb6, 0xae, 0x16, 0xaf, 0x8f, 0xdc, 0xb8, 0x9e, 0xf9, 0xb1, 0x26, 0xea, 0x92, 0x1f, 0x87, 0xfb,
9878
-+	0x0b, 0x17, 0x44, 0x7b, 0x13, 0x29, 0x28, 0x4e, 0x53, 0xb6, 0xff, 0x75, 0x01, 0xce, 0xcd, 0xbf,
9879
-+	0xdf, 0x0e, 0x49, 0xd5, 0x8d, 0x76, 0xd2, 0x2b, 0xbc, 0xe9, 0x46, 0x3b, 0x6b, 0xc9, 0x08, 0xa8,
9880
-+	0xa5, 0x55, 0x15, 0xe5, 0x58, 0x61, 0xa0, 0xe7, 0x61, 0x88, 0xfe, 0xbe, 0x87, 0x57, 0xc4, 0x27,
9881
-+	0x9f, 0x11, 0xc8, 0x23, 0x55, 0x27, 0x76, 0xaa, 0x1c, 0x84, 0x25, 0x0e, 0x5a, 0x85, 0x91, 0x06,
9882
-+	0xdb, 0x90, 0x5b, 0xab, 0x41, 0x93, 0xb0, 0xc9, 0x2c, 0x2f, 0x3c, 0x4b, 0xd1, 0x17, 0x93, 0xe2,
9883
-+	0xa3, 0x83, 0xca, 0x34, 0xef, 0x9b, 0x20, 0xa1, 0xc1, 0xb0, 0x5e, 0x1f, 0xd9, 0x6a, 0x7f, 0x95,
9884
-+	0x18, 0x25, 0xc8, 0xd8, 0x5b, 0xd7, 0xb5, 0xad, 0x32, 0xc0, 0xb6, 0xca, 0x68, 0xf6, 0x36, 0x41,
9885
-+	0x2f, 0x40, 0x69, 0xc7, 0xf5, 0x9b, 0xd3, 0x83, 0x8c, 0xd6, 0x65, 0x3a, 0xe7, 0xb7, 0x5d, 0xbf,
9886
-+	0x79, 0x74, 0x50, 0x99, 0x32, 0xba, 0x43, 0x0b, 0x31, 0x43, 0xb5, 0xff, 0xd8, 0x82, 0x0a, 0x83,
9887
-+	0x2d, 0xbb, 0x1e, 0xa9, 0x91, 0x30, 0x72, 0xa3, 0x98, 0xf8, 0xb1, 0x31, 0xa0, 0x37, 0x00, 0x22,
9888
-+	0xd2, 0x08, 0x49, 0xac, 0x0d, 0xa9, 0x5a, 0x18, 0x75, 0x05, 0xc1, 0x1a, 0x16, 0x3d, 0x10, 0xa2,
9889
-+	0x6d, 0x27, 0x64, 0xeb, 0x4b, 0x0c, 0xac, 0x3a, 0x10, 0xea, 0x12, 0x80, 0x13, 0x1c, 0xe3, 0x40,
9890
-+	0x28, 0xf6, 0x3a, 0x10, 0xd0, 0xe7, 0x60, 0x22, 0x69, 0x2c, 0x6a, 0x39, 0x0d, 0x39, 0x80, 0x6c,
9891
-+	0xcb, 0xd4, 0x4d, 0x10, 0x4e, 0xe3, 0xda, 0x7f, 0xdf, 0x12, 0x8b, 0x87, 0x7e, 0xf5, 0x47, 0xfc,
9892
-+	0x5b, 0xed, 0x5f, 0xb5, 0x60, 0x68, 0xc1, 0xf5, 0x9b, 0xae, 0xbf, 0x85, 0xbe, 0x0c, 0xc3, 0xf4,
9893
-+	0x6e, 0x6a, 0x3a, 0xb1, 0x23, 0xce, 0xbd, 0x4f, 0x69, 0x7b, 0x4b, 0x5d, 0x15, 0xb3, 0xad, 0x9d,
9894
-+	0x2d, 0x5a, 0x10, 0xcd, 0x52, 0x6c, 0xba, 0xdb, 0xee, 0x6e, 0xbc, 0x4b, 0x1a, 0xf1, 0x2a, 0x89,
9895
-+	0x9d, 0xe4, 0x73, 0x92, 0x32, 0xac, 0xa8, 0xa2, 0xdb, 0x30, 0x18, 0x3b, 0xe1, 0x16, 0x89, 0xc5,
9896
-+	0x01, 0x98, 0x79, 0x50, 0xf1, 0x9a, 0x98, 0xee, 0x48, 0xe2, 0x37, 0x48, 0x72, 0x2d, 0xac, 0xb3,
9897
-+	0xaa, 0x58, 0x90, 0xb0, 0x7f, 0x70, 0x10, 0x2e, 0x2e, 0xd6, 0x57, 0x72, 0xd6, 0xd5, 0x35, 0x18,
9898
-+	0x6c, 0x86, 0xee, 0x1e, 0x09, 0xc5, 0x38, 0x2b, 0x2a, 0x55, 0x56, 0x8a, 0x05, 0x14, 0xbd, 0x0a,
9899
-+	0xa3, 0xfc, 0x42, 0xba, 0xe5, 0xf8, 0x4d, 0x4f, 0x0e, 0xf1, 0x59, 0x81, 0x3d, 0x7a, 0x5f, 0x83,
9900
-+	0x61, 0x03, 0xf3, 0x98, 0x8b, 0xea, 0x5a, 0x6a, 0x33, 0xe6, 0x5d, 0x76, 0x3f, 0x60, 0xc1, 0x24,
9901
-+	0x6f, 0x66, 0x3e, 0x8e, 0x43, 0x77, 0xa3, 0x1d, 0x93, 0x68, 0x7a, 0x80, 0x9d, 0x74, 0x8b, 0x59,
9902
-+	0xa3, 0x95, 0x3b, 0x02, 0xb3, 0xf7, 0x53, 0x54, 0xf8, 0x21, 0x38, 0x2d, 0xda, 0x9d, 0x4c, 0x83,
9903
-+	0x71, 0x47, 0xb3, 0xe8, 0x7b, 0x2d, 0x98, 0x69, 0x04, 0x7e, 0x1c, 0x06, 0x9e, 0x47, 0xc2, 0x5a,
9904
-+	0x7b, 0xc3, 0x73, 0xa3, 0x6d, 0xbe, 0x4e, 0x31, 0xd9, 0x64, 0x27, 0x41, 0xce, 0x1c, 0x2a, 0x24,
9905
-+	0x31, 0x87, 0x57, 0x0e, 0x0f, 0x2a, 0x33, 0x8b, 0xb9, 0xa4, 0x70, 0x97, 0x66, 0xd0, 0x0e, 0x20,
9906
-+	0x7a, 0x95, 0xd6, 0x63, 0x67, 0x8b, 0x24, 0x8d, 0x0f, 0xf5, 0xdf, 0xf8, 0xf9, 0xc3, 0x83, 0x0a,
9907
-+	0x5a, 0xeb, 0x20, 0x81, 0x33, 0xc8, 0xa2, 0xf7, 0xe0, 0x2c, 0x2d, 0xed, 0xf8, 0xd6, 0xe1, 0xfe,
9908
-+	0x9b, 0x9b, 0x3e, 0x3c, 0xa8, 0x9c, 0x5d, 0xcb, 0x20, 0x82, 0x33, 0x49, 0xcf, 0x2c, 0xc2, 0xb9,
9909
-+	0xcc, 0xa9, 0x42, 0x93, 0x50, 0xdc, 0x21, 0x9c, 0x05, 0x29, 0x63, 0xfa, 0x13, 0x9d, 0x85, 0x81,
9910
-+	0x3d, 0xc7, 0x6b, 0x8b, 0x55, 0x8a, 0xf9, 0x9f, 0xcf, 0x14, 0x5e, 0xb5, 0xec, 0x06, 0x8c, 0x2e,
9911
-+	0x3a, 0x2d, 0x67, 0xc3, 0xf5, 0xdc, 0xd8, 0x25, 0x11, 0x7a, 0x1a, 0x8a, 0x4e, 0xb3, 0xc9, 0xae,
9912
-+	0xc8, 0xf2, 0xc2, 0xb9, 0xc3, 0x83, 0x4a, 0x71, 0xbe, 0x49, 0xcf, 0x6a, 0x50, 0x58, 0xfb, 0x98,
9913
-+	0x62, 0xa0, 0x4f, 0x42, 0xa9, 0x19, 0x06, 0xad, 0xe9, 0x02, 0xc3, 0xa4, 0x43, 0x55, 0xaa, 0x86,
9914
-+	0x41, 0x2b, 0x85, 0xca, 0x70, 0x6c, 0x17, 0x2e, 0x2c, 0x3a, 0x51, 0xc3, 0x69, 0x76, 0xde, 0x8b,
9915
-+	0x74, 0xbb, 0xb9, 0xd1, 0x8e, 0xe2, 0xfb, 0x92, 0xed, 0xc6, 0x4a, 0xb1, 0x80, 0xf6, 0xcb, 0xf3,
9916
-+	0xd9, 0xbf, 0x51, 0x80, 0x4b, 0x8b, 0xa4, 0xb5, 0xbd, 0x5c, 0xcf, 0xd9, 0xdf, 0xd7, 0x61, 0x78,
9917
-+	0x37, 0xf0, 0xdd, 0x38, 0x08, 0x23, 0xf1, 0x95, 0xec, 0xe2, 0x5a, 0x15, 0x65, 0x58, 0x41, 0xd1,
9918
-+	0x55, 0x28, 0xb5, 0x12, 0xa6, 0x63, 0x54, 0x32, 0x2c, 0x8c, 0xdd, 0x60, 0x10, 0x8a, 0xd1, 0x8e,
9919
-+	0x48, 0x28, 0x2e, 0x5c, 0x85, 0x71, 0x2f, 0x22, 0x21, 0x66, 0x90, 0xe4, 0xe4, 0xa6, 0x67, 0xba,
9920
-+	0xd8, 0xc1, 0xa9, 0x93, 0x9b, 0x42, 0xb0, 0x86, 0x85, 0x6a, 0x50, 0x8e, 0xd4, 0xfa, 0x19, 0xe8,
9921
-+	0x7f, 0xfd, 0x8c, 0xb1, 0xa3, 0x5d, 0x2d, 0x9a, 0x84, 0x88, 0x71, 0xe2, 0x0c, 0xf6, 0x3c, 0xda,
9922
-+	0xbf, 0x5e, 0x00, 0xc4, 0x87, 0xf0, 0xcf, 0xd9, 0xc0, 0xdd, 0xeb, 0x1c, 0xb8, 0x4c, 0x26, 0xef,
9923
-+	0x4e, 0xd0, 0x70, 0xbc, 0xf4, 0x6d, 0x71, 0x52, 0xa3, 0xf7, 0xbf, 0x2d, 0xb8, 0xb4, 0xe8, 0xfa,
9924
-+	0x4d, 0x12, 0xe6, 0x2c, 0xc0, 0xc7, 0x23, 0xeb, 0x1c, 0xef, 0x52, 0x31, 0x96, 0x58, 0xe9, 0x04,
9925
-+	0x96, 0x98, 0xfd, 0x3f, 0x2c, 0x40, 0xfc, 0xb3, 0x3f, 0x72, 0x1f, 0x7b, 0xaf, 0xf3, 0x63, 0x4f,
9926
-+	0x60, 0x59, 0xd8, 0x77, 0x60, 0x7c, 0xd1, 0x73, 0x89, 0x1f, 0xaf, 0xd4, 0x16, 0x03, 0x7f, 0xd3,
9927
-+	0xdd, 0x42, 0x9f, 0x81, 0x71, 0x2a, 0x3e, 0x07, 0xed, 0xb8, 0x4e, 0x1a, 0x81, 0xcf, 0x24, 0x0d,
9928
-+	0x2a, 0x74, 0xa2, 0xc3, 0x83, 0xca, 0xf8, 0xba, 0x01, 0xc1, 0x29, 0x4c, 0xfb, 0x77, 0xe9, 0xf8,
9929
-+	0x05, 0xbb, 0xad, 0xc0, 0x27, 0x7e, 0xbc, 0x18, 0xf8, 0x4d, 0x2e, 0x91, 0x7e, 0x06, 0x4a, 0x31,
9930
-+	0x1d, 0x0f, 0x3e, 0x76, 0xd7, 0xe4, 0x46, 0xa1, 0xa3, 0x70, 0x74, 0x50, 0x39, 0xdf, 0x59, 0x83,
9931
-+	0x8d, 0x13, 0xab, 0x83, 0xbe, 0x0d, 0x06, 0xa3, 0xd8, 0x89, 0xdb, 0x91, 0x18, 0xcd, 0x27, 0xe5,
9932
-+	0x68, 0xd6, 0x59, 0xe9, 0xd1, 0x41, 0x65, 0x42, 0x55, 0xe3, 0x45, 0x58, 0x54, 0x40, 0xcf, 0xc0,
9933
-+	0xd0, 0x2e, 0x89, 0x22, 0x67, 0x4b, 0x0a, 0x13, 0x13, 0xa2, 0xee, 0xd0, 0x2a, 0x2f, 0xc6, 0x12,
9934
-+	0x8e, 0x9e, 0x82, 0x01, 0x12, 0x86, 0x41, 0x28, 0xf6, 0xe8, 0x98, 0x40, 0x1c, 0x58, 0xa2, 0x85,
9935
-+	0x98, 0xc3, 0xec, 0x7f, 0x67, 0xc1, 0x84, 0xea, 0x2b, 0x6f, 0xeb, 0x14, 0xb8, 0xc6, 0xb7, 0x01,
9936
-+	0x1a, 0xf2, 0x03, 0x23, 0x76, 0x51, 0x8d, 0xdc, 0xb8, 0x96, 0xc9, 0x0b, 0x75, 0x0c, 0x63, 0x42,
9937
-+	0x59, 0x15, 0x45, 0x58, 0xa3, 0x66, 0xff, 0xba, 0x05, 0x67, 0x52, 0x5f, 0x74, 0xc7, 0x8d, 0x62,
9938
-+	0xf4, 0x4e, 0xc7, 0x57, 0xcd, 0xf6, 0xf7, 0x55, 0xb4, 0x36, 0xfb, 0x26, 0xb5, 0x94, 0x65, 0x89,
9939
-+	0xf6, 0x45, 0xb7, 0x60, 0xc0, 0x8d, 0xc9, 0xae, 0xfc, 0x98, 0xa7, 0xba, 0x7e, 0x0c, 0xef, 0x55,
9940
-+	0x32, 0x23, 0x2b, 0xb4, 0x26, 0xe6, 0x04, 0xec, 0x1f, 0x29, 0x42, 0x99, 0x2f, 0xdb, 0x55, 0xa7,
9941
-+	0x75, 0x0a, 0x73, 0xb1, 0x02, 0x25, 0x46, 0x9d, 0x77, 0xfc, 0xe9, 0xec, 0x8e, 0x8b, 0xee, 0xcc,
9942
-+	0x52, 0x91, 0x90, 0x73, 0x9d, 0xea, 0x6a, 0xa0, 0x45, 0x98, 0x91, 0x40, 0x0e, 0xc0, 0x86, 0xeb,
9943
-+	0x3b, 0xe1, 0x3e, 0x2d, 0x9b, 0x2e, 0x32, 0x82, 0xcf, 0x77, 0x27, 0xb8, 0xa0, 0xf0, 0x39, 0x59,
9944
-+	0xd5, 0xd7, 0x04, 0x80, 0x35, 0xa2, 0x33, 0xaf, 0x40, 0x59, 0x21, 0x1f, 0x87, 0x9d, 0x9a, 0xf9,
9945
-+	0x1c, 0x4c, 0xa4, 0xda, 0xea, 0x55, 0x7d, 0x54, 0xe7, 0xc6, 0xbe, 0xc6, 0x4e, 0x01, 0xd1, 0xeb,
9946
-+	0x25, 0x7f, 0x4f, 0x9c, 0xa2, 0xef, 0xc3, 0x59, 0x2f, 0xe3, 0x70, 0x12, 0x53, 0xd5, 0xff, 0x61,
9947
-+	0x76, 0x49, 0x7c, 0xf6, 0xd9, 0x2c, 0x28, 0xce, 0x6c, 0x83, 0x5e, 0xfb, 0x41, 0x8b, 0xae, 0x79,
9948
-+	0xc7, 0x63, 0xfd, 0x15, 0x82, 0xfe, 0x5d, 0x51, 0x86, 0x15, 0x94, 0x1e, 0x61, 0x67, 0x55, 0xe7,
9949
-+	0x6f, 0x93, 0xfd, 0x3a, 0xf1, 0x48, 0x23, 0x0e, 0xc2, 0x0f, 0xb5, 0xfb, 0x97, 0xf9, 0xe8, 0xf3,
9950
-+	0x13, 0x70, 0x44, 0x10, 0x28, 0xde, 0x26, 0xfb, 0x7c, 0x2a, 0xf4, 0xaf, 0x2b, 0x76, 0xfd, 0xba,
9951
-+	0x5f, 0xb0, 0x60, 0x4c, 0x7d, 0xdd, 0x29, 0x6c, 0xf5, 0x05, 0x73, 0xab, 0x5f, 0xee, 0xba, 0xc0,
9952
-+	0x73, 0x36, 0xf9, 0xd7, 0x0b, 0x70, 0x51, 0xe1, 0x50, 0xc9, 0x82, 0xff, 0x11, 0xab, 0x6a, 0x0e,
9953
-+	0xca, 0xbe, 0x52, 0x54, 0x58, 0xa6, 0x86, 0x20, 0x51, 0x53, 0x24, 0x38, 0x94, 0x6b, 0xf3, 0x13,
9954
-+	0x6d, 0xc2, 0xa8, 0xae, 0xc1, 0x13, 0xda, 0xba, 0x05, 0x28, 0xb6, 0xdd, 0xa6, 0xb8, 0x33, 0x3e,
9955
-+	0x25, 0x47, 0xfb, 0xde, 0x4a, 0xf5, 0xe8, 0xa0, 0xf2, 0x64, 0x9e, 0xf6, 0x98, 0x5e, 0x56, 0xd1,
9956
-+	0xec, 0xbd, 0x95, 0x2a, 0xa6, 0x95, 0xd1, 0x3c, 0x4c, 0x48, 0x05, 0xf9, 0x7d, 0xca, 0x41, 0x05,
9957
-+	0xbe, 0xb8, 0x5a, 0x94, 0x1a, 0x0e, 0x9b, 0x60, 0x9c, 0xc6, 0x47, 0x55, 0x98, 0xdc, 0x69, 0x6f,
9958
-+	0x10, 0x8f, 0xc4, 0xfc, 0x83, 0x6f, 0x13, 0xae, 0xa4, 0x2a, 0x27, 0x52, 0xec, 0xed, 0x14, 0x1c,
9959
-+	0x77, 0xd4, 0xb0, 0xff, 0x8c, 0x1d, 0xf1, 0x62, 0xf4, 0x6a, 0x61, 0x40, 0x17, 0x16, 0xa5, 0xfe,
9960
-+	0x61, 0x2e, 0xe7, 0x7e, 0x56, 0xc5, 0x6d, 0xb2, 0xbf, 0x1e, 0x50, 0x66, 0x3b, 0x7b, 0x55, 0x18,
9961
-+	0x6b, 0xbe, 0xd4, 0x75, 0xcd, 0xff, 0x52, 0x01, 0xce, 0xa9, 0x11, 0x30, 0xf8, 0xba, 0x3f, 0xef,
9962
-+	0x63, 0xf0, 0x02, 0x8c, 0x34, 0xc9, 0xa6, 0xd3, 0xf6, 0x62, 0xa5, 0x31, 0x1d, 0xe0, 0x5a, 0xf3,
9963
-+	0x6a, 0x52, 0x8c, 0x75, 0x9c, 0x63, 0x0c, 0xdb, 0x4f, 0x8f, 0xb0, 0xbb, 0x35, 0x76, 0xe8, 0x1a,
9964
-+	0x57, 0xbb, 0xc6, 0xca, 0xdd, 0x35, 0x4f, 0xc1, 0x80, 0xbb, 0x4b, 0x79, 0xad, 0x82, 0xc9, 0x42,
9965
-+	0xad, 0xd0, 0x42, 0xcc, 0x61, 0xe8, 0x13, 0x30, 0xd4, 0x08, 0x76, 0x77, 0x1d, 0xbf, 0xc9, 0xae,
9966
-+	0xbc, 0xf2, 0xc2, 0x08, 0x65, 0xc7, 0x16, 0x79, 0x11, 0x96, 0x30, 0x74, 0x09, 0x4a, 0x4e, 0xb8,
9967
-+	0x15, 0x4d, 0x97, 0x18, 0xce, 0x30, 0x6d, 0x69, 0x3e, 0xdc, 0x8a, 0x30, 0x2b, 0xa5, 0x52, 0xd5,
9968
-+	0x83, 0x20, 0xdc, 0x71, 0xfd, 0xad, 0xaa, 0x1b, 0x8a, 0x2d, 0xa1, 0xee, 0xc2, 0xb7, 0x14, 0x04,
9969
-+	0x6b, 0x58, 0x68, 0x19, 0x06, 0x5a, 0x41, 0x18, 0x47, 0xd3, 0x83, 0x6c, 0xb8, 0x9f, 0xcc, 0x39,
9970
-+	0x88, 0xf8, 0xd7, 0xd6, 0x82, 0x30, 0x4e, 0x3e, 0x80, 0xfe, 0x8b, 0x30, 0xaf, 0x8e, 0xbe, 0x0d,
9971
-+	0x8a, 0xc4, 0xdf, 0x9b, 0x1e, 0x62, 0x54, 0x66, 0xb2, 0xa8, 0x2c, 0xf9, 0x7b, 0xf7, 0x9d, 0x30,
9972
-+	0x39, 0xa5, 0x97, 0xfc, 0x3d, 0x4c, 0xeb, 0xa0, 0x2f, 0x40, 0x59, 0x6e, 0xf1, 0x48, 0x68, 0x54,
9973
-+	0x32, 0x97, 0x98, 0x3c, 0x18, 0x30, 0x79, 0xaf, 0xed, 0x86, 0x64, 0x97, 0xf8, 0x71, 0x94, 0x9c,
9974
-+	0x69, 0x12, 0x1a, 0xe1, 0x84, 0x1a, 0xfa, 0x82, 0x54, 0xe3, 0xad, 0x06, 0x6d, 0x3f, 0x8e, 0xa6,
9975
-+	0xcb, 0xac, 0x7b, 0x99, 0x0f, 0x2c, 0xf7, 0x13, 0xbc, 0xb4, 0x9e, 0x8f, 0x57, 0xc6, 0x06, 0x29,
9976
-+	0x84, 0x61, 0xcc, 0x73, 0xf7, 0x88, 0x4f, 0xa2, 0xa8, 0x16, 0x06, 0x1b, 0x64, 0x1a, 0x58, 0xcf,
9977
-+	0x2f, 0x66, 0xbf, 0x3b, 0x04, 0x1b, 0x64, 0x61, 0xea, 0xf0, 0xa0, 0x32, 0x76, 0x47, 0xaf, 0x83,
9978
-+	0x4d, 0x12, 0xe8, 0x1e, 0x8c, 0x53, 0xb9, 0xc6, 0x4d, 0x88, 0x8e, 0xf4, 0x22, 0xca, 0xa4, 0x0f,
9979
-+	0x6c, 0x54, 0xc2, 0x29, 0x22, 0xe8, 0x0d, 0x28, 0x7b, 0xee, 0x26, 0x69, 0xec, 0x37, 0x3c, 0x32,
9980
-+	0x3d, 0xca, 0x28, 0x66, 0x6e, 0xab, 0x3b, 0x12, 0x89, 0xcb, 0x45, 0xea, 0x2f, 0x4e, 0xaa, 0xa3,
9981
-+	0xfb, 0x70, 0x3e, 0x26, 0xe1, 0xae, 0xeb, 0x3b, 0x74, 0x3b, 0x08, 0x79, 0x81, 0xbd, 0xde, 0x8c,
9982
-+	0xb1, 0xf5, 0x76, 0x45, 0x0c, 0xdd, 0xf9, 0xf5, 0x4c, 0x2c, 0x9c, 0x53, 0x1b, 0xdd, 0x85, 0x09,
9983
-+	0xb6, 0x13, 0x6a, 0x6d, 0xcf, 0xab, 0x05, 0x9e, 0xdb, 0xd8, 0x9f, 0x1e, 0x67, 0x04, 0x3f, 0x21,
9984
-+	0xef, 0x85, 0x15, 0x13, 0x7c, 0x74, 0x50, 0x81, 0xe4, 0x1f, 0x4e, 0xd7, 0x46, 0x1b, 0x4c, 0x5d,
9985
-+	0xdf, 0x0e, 0xdd, 0x78, 0x9f, 0xae, 0x5f, 0xf2, 0x30, 0x9e, 0x9e, 0xe8, 0x2a, 0x0a, 0xeb, 0xa8,
9986
-+	0x4a, 0xa7, 0xaf, 0x17, 0xe2, 0x34, 0x41, 0xba, 0xb5, 0xa3, 0xb8, 0xe9, 0xfa, 0xd3, 0x93, 0xec,
9987
-+	0xc4, 0x50, 0x3b, 0xa3, 0x4e, 0x0b, 0x31, 0x87, 0x31, 0x55, 0x3d, 0xfd, 0x71, 0x97, 0x9e, 0xa0,
9988
-+	0x53, 0x0c, 0x31, 0x51, 0xd5, 0x4b, 0x00, 0x4e, 0x70, 0x28, 0x53, 0x13, 0xc7, 0xfb, 0xd3, 0x88,
9989
-+	0xa1, 0xaa, 0xed, 0xb2, 0xbe, 0xfe, 0x05, 0x4c, 0xcb, 0xd1, 0x1d, 0x18, 0x22, 0xfe, 0xde, 0x72,
9990
-+	0x18, 0xec, 0x4e, 0x9f, 0xc9, 0xdf, 0xb3, 0x4b, 0x1c, 0x85, 0x1f, 0xe8, 0x89, 0x80, 0x27, 0x8a,
9991
-+	0xb1, 0x24, 0x81, 0x1e, 0xc2, 0x74, 0xc6, 0x8c, 0xf0, 0x09, 0x38, 0xcb, 0x26, 0xe0, 0xb3, 0xa2,
9992
-+	0xee, 0xf4, 0x7a, 0x0e, 0xde, 0x51, 0x17, 0x18, 0xce, 0xa5, 0x8e, 0xbe, 0x08, 0x63, 0x7c, 0x43,
9993
-+	0xf1, 0x77, 0xbe, 0x68, 0xfa, 0x1c, 0xfb, 0x9a, 0xab, 0xf9, 0x9b, 0x93, 0x23, 0x2e, 0x9c, 0x13,
9994
-+	0x1d, 0x1a, 0xd3, 0x4b, 0x23, 0x6c, 0x52, 0xb3, 0x37, 0x60, 0x5c, 0x9d, 0x5b, 0x6c, 0xe9, 0xa0,
9995
-+	0x0a, 0x0c, 0x30, 0x6e, 0x47, 0xe8, 0xb7, 0xca, 0x74, 0xa6, 0x18, 0x27, 0x84, 0x79, 0x39, 0x9b,
9996
-+	0x29, 0xf7, 0x7d, 0xb2, 0xb0, 0x1f, 0x13, 0x2e, 0x55, 0x17, 0xb5, 0x99, 0x92, 0x00, 0x9c, 0xe0,
9997
-+	0xd8, 0xff, 0x97, 0x73, 0x8d, 0xc9, 0xe1, 0xd8, 0xc7, 0x75, 0xf0, 0x1c, 0x0c, 0x6f, 0x07, 0x51,
9998
-+	0x4c, 0xb1, 0x59, 0x1b, 0x03, 0x09, 0x9f, 0x78, 0x4b, 0x94, 0x63, 0x85, 0x81, 0x5e, 0x83, 0xb1,
9999
-+	0x86, 0xde, 0x80, 0xb8, 0xcb, 0xd4, 0x10, 0x18, 0xad, 0x63, 0x13, 0x17, 0xbd, 0x0a, 0xc3, 0xec,
10000
-+	0x95, 0xbe, 0x11, 0x78, 0x82, 0xc9, 0x92, 0x17, 0xf2, 0x70, 0x4d, 0x94, 0x1f, 0x69, 0xbf, 0xb1,
10001
-+	0xc2, 0x46, 0xd7, 0x60, 0x90, 0x76, 0x61, 0xa5, 0x26, 0x6e, 0x11, 0xa5, 0xaa, 0xb9, 0xc5, 0x4a,
10002
-+	0xb1, 0x80, 0xda, 0x7f, 0xbd, 0xa0, 0x8d, 0x32, 0x95, 0x48, 0x09, 0xaa, 0xc1, 0xd0, 0x03, 0xc7,
10003
-+	0x8d, 0x5d, 0x7f, 0x4b, 0xb0, 0x0b, 0xcf, 0x74, 0xbd, 0x52, 0x58, 0xa5, 0xb7, 0x78, 0x05, 0x7e,
10004
-+	0xe9, 0x89, 0x3f, 0x58, 0x92, 0xa1, 0x14, 0xc3, 0xb6, 0xef, 0x53, 0x8a, 0x85, 0x7e, 0x29, 0x62,
10005
-+	0x5e, 0x81, 0x53, 0x14, 0x7f, 0xb0, 0x24, 0x83, 0xde, 0x01, 0x90, 0xcb, 0x92, 0x34, 0xc5, 0xeb,
10006
-+	0xf8, 0x73, 0xbd, 0x89, 0xae, 0xab, 0x3a, 0x0b, 0xe3, 0xf4, 0x4a, 0x4d, 0xfe, 0x63, 0x8d, 0x9e,
10007
-+	0x1d, 0x33, 0xb6, 0xaa, 0xb3, 0x33, 0xe8, 0x3b, 0xe9, 0x49, 0xe0, 0x84, 0x31, 0x69, 0xce, 0xc7,
10008
-+	0x62, 0x70, 0x3e, 0xd9, 0x9f, 0x4c, 0xb1, 0xee, 0xee, 0x12, 0xfd, 0xd4, 0x10, 0x44, 0x70, 0x42,
10009
-+	0xcf, 0xfe, 0x95, 0x22, 0x4c, 0xe7, 0x75, 0x97, 0x2e, 0x3a, 0xf2, 0xd0, 0x8d, 0x17, 0x29, 0x37,
10010
-+	0x64, 0x99, 0x8b, 0x6e, 0x49, 0x94, 0x63, 0x85, 0x41, 0x67, 0x3f, 0x72, 0xb7, 0xa4, 0x48, 0x38,
10011
-+	0x90, 0xcc, 0x7e, 0x9d, 0x95, 0x62, 0x01, 0xa5, 0x78, 0x21, 0x71, 0x22, 0x61, 0x7e, 0xa1, 0xad,
10012
-+	0x12, 0xcc, 0x4a, 0xb1, 0x80, 0xea, 0xfa, 0xa6, 0x52, 0x0f, 0x7d, 0x93, 0x31, 0x44, 0x03, 0x27,
10013
-+	0x3b, 0x44, 0xe8, 0x4b, 0x00, 0x9b, 0xae, 0xef, 0x46, 0xdb, 0x8c, 0xfa, 0xe0, 0xb1, 0xa9, 0x2b,
10014
-+	0x5e, 0x6a, 0x59, 0x51, 0xc1, 0x1a, 0x45, 0xf4, 0x32, 0x8c, 0xa8, 0x0d, 0xb8, 0x52, 0x65, 0x6f,
10015
-+	0x51, 0xda, 0xdb, 0x7e, 0x72, 0x1a, 0x55, 0xb1, 0x8e, 0x67, 0xbf, 0x9b, 0x5e, 0x2f, 0x62, 0x07,
10016
-+	0x68, 0xe3, 0x6b, 0xf5, 0x3b, 0xbe, 0x85, 0xee, 0xe3, 0x6b, 0xff, 0x66, 0x11, 0x26, 0x8c, 0xc6,
10017
-+	0xda, 0x51, 0x1f, 0x67, 0xd6, 0x4d, 0x7a, 0xcf, 0x39, 0x31, 0x11, 0xfb, 0xcf, 0xee, 0xbd, 0x55,
10018
-+	0xf4, 0xbb, 0x90, 0xee, 0x00, 0x5e, 0x1f, 0x7d, 0x09, 0xca, 0x9e, 0x13, 0x31, 0xdd, 0x15, 0x11,
10019
-+	0xfb, 0xae, 0x1f, 0x62, 0x89, 0x1c, 0xe1, 0x44, 0xb1, 0x76, 0xd5, 0x70, 0xda, 0x09, 0x49, 0x7a,
10020
-+	0x21, 0x53, 0xde, 0x47, 0xda, 0xf7, 0xa8, 0x4e, 0x50, 0x06, 0x69, 0x1f, 0x73, 0x18, 0x7a, 0x15,
10021
-+	0x46, 0x43, 0xc2, 0x56, 0xc5, 0x22, 0x65, 0xe5, 0xd8, 0x32, 0x1b, 0x48, 0x78, 0x3e, 0xac, 0xc1,
10022
-+	0xb0, 0x81, 0x99, 0xb0, 0xf2, 0x83, 0x5d, 0x58, 0xf9, 0x67, 0x60, 0x88, 0xfd, 0x50, 0x2b, 0x40,
10023
-+	0xcd, 0xc6, 0x0a, 0x2f, 0xc6, 0x12, 0x9e, 0x5e, 0x30, 0xc3, 0x7d, 0x2e, 0x98, 0x4f, 0xc2, 0x78,
10024
-+	0xd5, 0x21, 0xbb, 0x81, 0xbf, 0xe4, 0x37, 0x5b, 0x81, 0xeb, 0xc7, 0x68, 0x1a, 0x4a, 0xec, 0x76,
10025
-+	0xe0, 0x7b, 0xbb, 0x44, 0x29, 0xe0, 0x12, 0x65, 0xcc, 0xed, 0x2d, 0x38, 0x57, 0x0d, 0x1e, 0xf8,
10026
-+	0x0f, 0x9c, 0xb0, 0x39, 0x5f, 0x5b, 0xd1, 0xe4, 0xdc, 0x35, 0x29, 0x67, 0x71, 0x7b, 0x99, 0xcc,
10027
-+	0x33, 0x55, 0xab, 0xc9, 0xef, 0xda, 0x65, 0xd7, 0x23, 0x39, 0xda, 0x88, 0xbf, 0x59, 0x30, 0x5a,
10028
-+	0x4a, 0xf0, 0xd5, 0x83, 0x91, 0x95, 0xfb, 0x60, 0xf4, 0x26, 0x0c, 0x6f, 0xba, 0xc4, 0x6b, 0x62,
10029
-+	0xb2, 0x29, 0x96, 0xd8, 0xd3, 0xf9, 0x26, 0x00, 0xcb, 0x14, 0x53, 0x6a, 0x9f, 0xb8, 0x94, 0xb6,
10030
-+	0x2c, 0x2a, 0x63, 0x45, 0x06, 0xed, 0xc0, 0xa4, 0x14, 0x03, 0x24, 0x54, 0x2c, 0xb8, 0x67, 0xba,
10031
-+	0xc9, 0x16, 0x26, 0xf1, 0xb3, 0x87, 0x07, 0x95, 0x49, 0x9c, 0x22, 0x83, 0x3b, 0x08, 0x53, 0xb1,
10032
-+	0x6c, 0x97, 0x1e, 0xad, 0x25, 0x36, 0xfc, 0x4c, 0x2c, 0x63, 0x12, 0x26, 0x2b, 0xb5, 0x7f, 0xc2,
10033
-+	0x82, 0x0b, 0x1d, 0x23, 0x23, 0x24, 0xed, 0x13, 0x9e, 0x85, 0xb4, 0xe4, 0x5b, 0xe8, 0x2d, 0xf9,
10034
-+	0xda, 0xff, 0xc0, 0x82, 0xb3, 0x4b, 0xbb, 0xad, 0x78, 0xbf, 0xea, 0x9a, 0xaf, 0x3b, 0xaf, 0xc0,
10035
-+	0xe0, 0x2e, 0x69, 0xba, 0xed, 0x5d, 0x31, 0x73, 0x15, 0x79, 0xfc, 0xac, 0xb2, 0xd2, 0xa3, 0x83,
10036
-+	0xca, 0x58, 0x3d, 0x0e, 0x42, 0x67, 0x8b, 0xf0, 0x02, 0x2c, 0xd0, 0xd9, 0x21, 0xee, 0xbe, 0x4f,
10037
-+	0xee, 0xb8, 0xbb, 0xae, 0x34, 0xe9, 0xe8, 0xaa, 0x3b, 0x9b, 0x95, 0x03, 0x3a, 0xfb, 0x66, 0xdb,
10038
-+	0xf1, 0x63, 0x37, 0xde, 0x17, 0x0f, 0x33, 0x92, 0x08, 0x4e, 0xe8, 0xd9, 0xdf, 0xb4, 0x60, 0x42,
10039
-+	0xae, 0xfb, 0xf9, 0x66, 0x33, 0x24, 0x51, 0x84, 0x66, 0xa0, 0xe0, 0xb6, 0x44, 0x2f, 0x41, 0xf4,
10040
-+	0xb2, 0xb0, 0x52, 0xc3, 0x05, 0xb7, 0x85, 0x6a, 0x50, 0xe6, 0x96, 0x21, 0xc9, 0xe2, 0xea, 0xcb,
10041
-+	0xbe, 0x84, 0xf5, 0x60, 0x5d, 0xd6, 0xc4, 0x09, 0x11, 0xc9, 0xc1, 0xb1, 0x33, 0xb3, 0x68, 0xbe,
10042
-+	0x7a, 0xdd, 0x12, 0xe5, 0x58, 0x61, 0xa0, 0xeb, 0x30, 0xec, 0x07, 0x4d, 0x6e, 0xa8, 0xc3, 0x6f,
10043
-+	0x3f, 0xb6, 0x64, 0xd7, 0x44, 0x19, 0x56, 0x50, 0xfb, 0x87, 0x2d, 0x18, 0x95, 0x5f, 0xd6, 0x27,
10044
-+	0x33, 0x49, 0xb7, 0x56, 0xc2, 0x48, 0x26, 0x5b, 0x8b, 0x32, 0x83, 0x0c, 0x62, 0xf0, 0x80, 0xc5,
10045
-+	0xe3, 0xf0, 0x80, 0xf6, 0x8f, 0x17, 0x60, 0x5c, 0x76, 0xa7, 0xde, 0xde, 0x88, 0x48, 0x8c, 0xd6,
10046
-+	0xa1, 0xec, 0xf0, 0x21, 0x27, 0x72, 0xc5, 0x3e, 0x95, 0x2d, 0x7c, 0x18, 0xf3, 0x93, 0x5c, 0xcb,
10047
-+	0xf3, 0xb2, 0x36, 0x4e, 0x08, 0x21, 0x0f, 0xa6, 0xfc, 0x20, 0x66, 0x47, 0xb4, 0x82, 0x77, 0x7b,
10048
-+	0x02, 0x49, 0x53, 0xbf, 0x28, 0xa8, 0x4f, 0xad, 0xa5, 0xa9, 0xe0, 0x4e, 0xc2, 0x68, 0x49, 0x2a,
10049
-+	0x3c, 0x8a, 0xf9, 0xe2, 0x86, 0x3e, 0x0b, 0xd9, 0xfa, 0x0e, 0xfb, 0xd7, 0x2c, 0x28, 0x4b, 0xb4,
10050
-+	0xd3, 0x78, 0xed, 0x5a, 0x85, 0xa1, 0x88, 0x4d, 0x82, 0x1c, 0x1a, 0xbb, 0x5b, 0xc7, 0xf9, 0x7c,
10051
-+	0x25, 0x37, 0x0f, 0xff, 0x1f, 0x61, 0x49, 0x83, 0xe9, 0xbb, 0x55, 0xf7, 0x3f, 0x22, 0xfa, 0x6e,
10052
-+	0xd5, 0x9f, 0x9c, 0x1b, 0xe6, 0xbf, 0xb2, 0x3e, 0x6b, 0x62, 0x2d, 0x65, 0x90, 0x5a, 0x21, 0xd9,
10053
-+	0x74, 0x1f, 0xa6, 0x19, 0xa4, 0x1a, 0x2b, 0xc5, 0x02, 0x8a, 0xde, 0x81, 0xd1, 0x86, 0x54, 0x74,
10054
-+	0x26, 0xc7, 0xc0, 0xb5, 0xae, 0x4a, 0x77, 0xf5, 0x3e, 0xc3, 0x8d, 0x78, 0x17, 0xb5, 0xfa, 0xd8,
10055
-+	0xa0, 0x66, 0x3e, 0xb7, 0x17, 0x7b, 0x3d, 0xb7, 0x27, 0x74, 0xf3, 0x1f, 0x9f, 0x7f, 0xd2, 0x82,
10056
-+	0x41, 0xae, 0x2e, 0xeb, 0x4f, 0xbf, 0xa8, 0x3d, 0x57, 0x25, 0x63, 0x77, 0x9f, 0x16, 0x8a, 0xe7,
10057
-+	0x27, 0xb4, 0x0a, 0x65, 0xf6, 0x83, 0xa9, 0x0d, 0x8a, 0xf9, 0xd6, 0xcb, 0xbc, 0x55, 0xbd, 0x83,
10058
-+	0xf7, 0x65, 0x35, 0x9c, 0x50, 0xb0, 0x7f, 0xb4, 0x48, 0x8f, 0xaa, 0x04, 0xd5, 0xb8, 0xc1, 0xad,
10059
-+	0xc7, 0x77, 0x83, 0x17, 0x1e, 0xd7, 0x0d, 0xbe, 0x05, 0x13, 0x0d, 0xed, 0x71, 0x2b, 0x99, 0xc9,
10060
-+	0xeb, 0x5d, 0x17, 0x89, 0xf6, 0x0e, 0xc6, 0x55, 0x46, 0x8b, 0x26, 0x11, 0x9c, 0xa6, 0x8a, 0xbe,
10061
-+	0x13, 0x46, 0xf9, 0x3c, 0x8b, 0x56, 0xb8, 0xc5, 0xc2, 0x27, 0xf2, 0xd7, 0x8b, 0xde, 0x04, 0x5b,
10062
-+	0x89, 0x75, 0xad, 0x3a, 0x36, 0x88, 0xd9, 0xbf, 0x32, 0x0c, 0x03, 0x4b, 0x7b, 0xc4, 0x8f, 0x4f,
10063
-+	0xe1, 0x40, 0x6a, 0xc0, 0xb8, 0xeb, 0xef, 0x05, 0xde, 0x1e, 0x69, 0x72, 0xf8, 0x71, 0x2e, 0xd7,
10064
-+	0xf3, 0x82, 0xf4, 0xf8, 0x8a, 0x41, 0x02, 0xa7, 0x48, 0x3e, 0x0e, 0x09, 0xf3, 0x26, 0x0c, 0xf2,
10065
-+	0xb9, 0x17, 0xe2, 0x65, 0xa6, 0x32, 0x98, 0x0d, 0xa2, 0xd8, 0x05, 0x89, 0xf4, 0xcb, 0xb5, 0xcf,
10066
-+	0xa2, 0x3a, 0x7a, 0x17, 0xc6, 0x37, 0xdd, 0x30, 0x8a, 0xa9, 0x68, 0x18, 0xc5, 0xce, 0x6e, 0xeb,
10067
-+	0x11, 0x24, 0x4a, 0x35, 0x0e, 0xcb, 0x06, 0x25, 0x9c, 0xa2, 0x8c, 0xb6, 0x60, 0x8c, 0x0a, 0x39,
10068
-+	0x49, 0x53, 0x43, 0xc7, 0x6e, 0x4a, 0xa9, 0x8c, 0xee, 0xe8, 0x84, 0xb0, 0x49, 0x97, 0x1e, 0x26,
10069
-+	0x0d, 0x26, 0x14, 0x0d, 0x33, 0x8e, 0x42, 0x1d, 0x26, 0x5c, 0x1a, 0xe2, 0x30, 0x7a, 0x26, 0x31,
10070
-+	0xb3, 0x95, 0xb2, 0x79, 0x26, 0x69, 0xc6, 0x29, 0x5f, 0x86, 0x32, 0xa1, 0x43, 0x48, 0x09, 0x0b,
10071
-+	0xc5, 0xf8, 0x5c, 0x7f, 0x7d, 0x5d, 0x75, 0x1b, 0x61, 0x60, 0xca, 0xf2, 0x4b, 0x92, 0x12, 0x4e,
10072
-+	0x88, 0xa2, 0x45, 0x18, 0x8c, 0x48, 0xe8, 0x92, 0x48, 0xa8, 0xc8, 0xbb, 0x4c, 0x23, 0x43, 0xe3,
10073
-+	0x66, 0xee, 0xfc, 0x37, 0x16, 0x55, 0xe9, 0xf2, 0x72, 0x98, 0x34, 0xc4, 0xb4, 0xe2, 0xda, 0xf2,
10074
-+	0x9a, 0x67, 0xa5, 0x58, 0x40, 0xd1, 0x1b, 0x30, 0x14, 0x12, 0x8f, 0x29, 0x8b, 0xc6, 0xfa, 0x5f,
10075
-+	0xe4, 0x5c, 0xf7, 0xc4, 0xeb, 0x61, 0x49, 0x00, 0xdd, 0x06, 0x14, 0x12, 0xca, 0x43, 0xb8, 0xfe,
10076
-+	0x96, 0x32, 0xe6, 0x10, 0xba, 0xee, 0x27, 0x44, 0xfb, 0x67, 0x70, 0x82, 0x21, 0x0d, 0x60, 0x71,
10077
-+	0x46, 0x35, 0x74, 0x13, 0xa6, 0x54, 0xe9, 0x8a, 0x1f, 0xc5, 0x8e, 0xdf, 0x20, 0x4c, 0xcd, 0x5d,
10078
-+	0x4e, 0xb8, 0x22, 0x9c, 0x46, 0xc0, 0x9d, 0x75, 0xec, 0x9f, 0xa3, 0xec, 0x0c, 0x1d, 0xad, 0x53,
10079
-+	0xe0, 0x05, 0x5e, 0x37, 0x79, 0x81, 0x8b, 0xb9, 0x33, 0x97, 0xc3, 0x07, 0x1c, 0x5a, 0x30, 0xa2,
10080
-+	0xcd, 0x6c, 0xb2, 0x66, 0xad, 0x2e, 0x6b, 0xb6, 0x0d, 0x93, 0x74, 0xa5, 0xdf, 0xdd, 0x60, 0x1e,
10081
-+	0x5f, 0x4d, 0xb6, 0x30, 0x0b, 0x8f, 0xb6, 0x30, 0xd5, 0x2b, 0xf3, 0x9d, 0x14, 0x41, 0xdc, 0xd1,
10082
-+	0x04, 0x7a, 0x45, 0x6a, 0x4e, 0x8a, 0x86, 0x91, 0x16, 0xd7, 0x8a, 0x1c, 0x1d, 0x54, 0x26, 0xb5,
10083
-+	0x0f, 0xd1, 0x35, 0x25, 0xf6, 0x97, 0xe5, 0x37, 0xaa, 0xd7, 0xfc, 0x86, 0x5a, 0x2c, 0xa9, 0xd7,
10084
-+	0x7c, 0xb5, 0x1c, 0x70, 0x82, 0x43, 0xf7, 0x28, 0x15, 0x41, 0xd2, 0xaf, 0xf9, 0x54, 0x40, 0xc1,
10085
-+	0x0c, 0x62, 0xbf, 0x08, 0xb0, 0xf4, 0x90, 0x34, 0xf8, 0x52, 0xd7, 0x1f, 0x20, 0xad, 0xfc, 0x07,
10086
-+	0x48, 0xfb, 0x3f, 0x58, 0x30, 0xbe, 0xbc, 0x68, 0x88, 0x89, 0xb3, 0x00, 0x5c, 0x36, 0x7a, 0xeb,
10087
-+	0xad, 0x35, 0xa9, 0x5b, 0xe7, 0xea, 0x51, 0x55, 0x8a, 0x35, 0x0c, 0x74, 0x11, 0x8a, 0x5e, 0xdb,
10088
-+	0x17, 0x22, 0xcb, 0xd0, 0xe1, 0x41, 0xa5, 0x78, 0xa7, 0xed, 0x63, 0x5a, 0xa6, 0x59, 0x08, 0x16,
10089
-+	0xfb, 0xb6, 0x10, 0xec, 0xe9, 0xc9, 0x85, 0x2a, 0x30, 0xf0, 0xe0, 0x81, 0xdb, 0xe4, 0xf6, 0xf2,
10090
-+	0x42, 0xef, 0xff, 0xd6, 0x5b, 0x2b, 0xd5, 0x08, 0xf3, 0x72, 0xfb, 0xab, 0x45, 0x98, 0x59, 0xf6,
10091
-+	0xc8, 0xc3, 0x0f, 0xe8, 0x33, 0xd0, 0xaf, 0x7d, 0xe3, 0xf1, 0xf8, 0xc5, 0xe3, 0xda, 0xb0, 0xf6,
10092
-+	0x1e, 0x8f, 0x4d, 0x18, 0xe2, 0x8f, 0xd9, 0xd2, 0x83, 0xe0, 0xb5, 0xac, 0xd6, 0xf3, 0x07, 0x64,
10093
-+	0x96, 0x3f, 0x8a, 0x0b, 0xcf, 0x01, 0x75, 0xd3, 0x8a, 0x52, 0x2c, 0x89, 0xcf, 0x7c, 0x06, 0x46,
10094
-+	0x75, 0xcc, 0x63, 0x19, 0xae, 0xff, 0xa5, 0x22, 0x4c, 0xd2, 0x1e, 0x3c, 0xd6, 0x89, 0xb8, 0xd7,
10095
-+	0x39, 0x11, 0x27, 0x6d, 0x51, 0xdc, 0x7b, 0x36, 0xde, 0x49, 0xcf, 0xc6, 0x0b, 0x79, 0xb3, 0x71,
10096
-+	0xda, 0x73, 0xf0, 0xbd, 0x16, 0x9c, 0x59, 0xf6, 0x82, 0xc6, 0x4e, 0xca, 0xea, 0xf7, 0x65, 0x18,
10097
-+	0xa1, 0xe7, 0x78, 0x64, 0x38, 0x2c, 0x19, 0x2e, 0x6c, 0x02, 0x84, 0x75, 0x3c, 0xad, 0xda, 0xbd,
10098
-+	0x7b, 0x2b, 0xd5, 0x2c, 0xcf, 0x37, 0x01, 0xc2, 0x3a, 0x9e, 0xfd, 0x0d, 0x0b, 0x2e, 0xdf, 0x5c,
10099
-+	0x5c, 0x4a, 0x96, 0x62, 0x96, 0x93, 0x41, 0xab, 0xa9, 0x75, 0x25, 0x91, 0x02, 0xab, 0xac, 0x17,
10100
-+	0x02, 0xfa, 0x51, 0x71, 0x2c, 0xfd, 0x59, 0x0b, 0xce, 0xdc, 0x74, 0x63, 0x7a, 0x2d, 0xa7, 0xdd,
10101
-+	0xc0, 0xe8, 0xbd, 0x1c, 0xb9, 0x71, 0x10, 0xee, 0xa7, 0xdd, 0xc0, 0xb0, 0x82, 0x60, 0x0d, 0x8b,
10102
-+	0xb7, 0xbc, 0xe7, 0x32, 0x33, 0xaa, 0x82, 0xa9, 0x8a, 0xc2, 0xa2, 0x1c, 0x2b, 0x0c, 0xfa, 0x61,
10103
-+	0x4d, 0x37, 0x64, 0xa2, 0xc4, 0xbe, 0x38, 0x61, 0xd5, 0x87, 0x55, 0x25, 0x00, 0x27, 0x38, 0xf6,
10104
-+	0x4f, 0x58, 0x70, 0xee, 0xa6, 0xd7, 0x8e, 0x62, 0x12, 0x6e, 0x46, 0x46, 0x67, 0x5f, 0x84, 0x32,
10105
-+	0x91, 0xe2, 0xba, 0xe8, 0xab, 0x62, 0x30, 0x95, 0x1c, 0xcf, 0x7d, 0xd0, 0x14, 0x5e, 0x1f, 0x9e,
10106
-+	0x03, 0xc7, 0xf3, 0x52, 0xfb, 0xc5, 0x02, 0x8c, 0xdd, 0x5a, 0x5f, 0xaf, 0xdd, 0x24, 0xb1, 0xb8,
10107
-+	0xc5, 0x7a, 0xab, 0x9a, 0xb1, 0xa6, 0x31, 0xeb, 0x26, 0x14, 0xb5, 0x63, 0xd7, 0x9b, 0xe5, 0x4e,
10108
-+	0xcf, 0xb3, 0x2b, 0x7e, 0x7c, 0x37, 0xac, 0xc7, 0xa1, 0xeb, 0x6f, 0x65, 0xea, 0xd8, 0xe4, 0x5d,
10109
-+	0x5b, 0xcc, 0xbb, 0x6b, 0xd1, 0x8b, 0x30, 0xc8, 0xbc, 0xae, 0xa5, 0x78, 0xf2, 0x84, 0x92, 0x29,
10110
-+	0x58, 0xe9, 0xd1, 0x41, 0xa5, 0x7c, 0x0f, 0xaf, 0xf0, 0x3f, 0x58, 0xa0, 0xa2, 0x7b, 0x30, 0xb2,
10111
-+	0x1d, 0xc7, 0xad, 0x5b, 0xc4, 0x69, 0x92, 0x50, 0x9e, 0x0e, 0x57, 0xb2, 0x4e, 0x07, 0x3a, 0x08,
10112
-+	0x1c, 0x2d, 0xd9, 0x50, 0x49, 0x59, 0x84, 0x75, 0x3a, 0x76, 0x1d, 0x20, 0x81, 0x9d, 0x90, 0x7e,
10113
-+	0xc1, 0xfe, 0x03, 0x0b, 0x86, 0xb8, 0x03, 0x5c, 0x88, 0x3e, 0x0b, 0x25, 0xf2, 0x90, 0x34, 0x04,
10114
-+	0xe7, 0x98, 0xd9, 0xe1, 0x84, 0xf1, 0xe0, 0xda, 0x72, 0xfa, 0x1f, 0xb3, 0x5a, 0xe8, 0x16, 0x0c,
10115
-+	0xd1, 0xde, 0xde, 0x54, 0xde, 0x80, 0x4f, 0xe6, 0x7d, 0xb1, 0x9a, 0x76, 0xce, 0xab, 0x88, 0x22,
10116
-+	0x2c, 0xab, 0x33, 0xcd, 0x6f, 0xa3, 0x55, 0xa7, 0x07, 0x58, 0xdc, 0xed, 0x9e, 0x5d, 0x5f, 0xac,
10117
-+	0x71, 0x24, 0x41, 0x8d, 0x6b, 0x7e, 0x65, 0x21, 0x4e, 0x88, 0xd8, 0xeb, 0x50, 0xa6, 0x93, 0x3a,
10118
-+	0xef, 0xb9, 0x4e, 0x77, 0xa5, 0xf3, 0xb3, 0x50, 0x96, 0x0a, 0xe0, 0x48, 0xf8, 0x50, 0x31, 0xaa,
10119
-+	0x52, 0x3f, 0x1c, 0xe1, 0x04, 0x6e, 0x6f, 0xc2, 0x59, 0xf6, 0xf2, 0xef, 0xc4, 0xdb, 0xc6, 0x1e,
10120
-+	0xeb, 0xbd, 0x98, 0x9f, 0x13, 0x82, 0x18, 0x9f, 0x99, 0x69, 0xcd, 0x77, 0x60, 0x54, 0x52, 0x4c,
10121
-+	0x84, 0x32, 0xfb, 0x8f, 0x4a, 0xf0, 0xc4, 0x4a, 0x3d, 0xdf, 0x37, 0xf2, 0x55, 0x18, 0xe5, 0x6c,
10122
-+	0x1a, 0x5d, 0xda, 0x8e, 0x27, 0xda, 0x55, 0xef, 0x62, 0xeb, 0x1a, 0x0c, 0x1b, 0x98, 0xe8, 0x32,
10123
-+	0x14, 0xdd, 0xf7, 0xfc, 0xb4, 0x19, 0xee, 0xca, 0x9b, 0x6b, 0x98, 0x96, 0x53, 0x30, 0xe5, 0xf8,
10124
-+	0xf8, 0x51, 0xaa, 0xc0, 0x8a, 0xeb, 0x7b, 0x1d, 0xc6, 0xdd, 0xa8, 0x11, 0xb9, 0x2b, 0x3e, 0x3d,
10125
-+	0x67, 0x12, 0xbf, 0xda, 0x44, 0x49, 0x40, 0x3b, 0xad, 0xa0, 0x38, 0x85, 0xad, 0x9d, 0xeb, 0x03,
10126
-+	0x7d, 0x73, 0x8d, 0x3d, 0x3d, 0x7d, 0x28, 0x43, 0xdc, 0x62, 0x5f, 0x17, 0x31, 0xa3, 0x36, 0xc1,
10127
-+	0x10, 0xf3, 0x0f, 0x8e, 0xb0, 0x84, 0x51, 0x09, 0xac, 0xb1, 0xed, 0xb4, 0xe6, 0xdb, 0xf1, 0x76,
10128
-+	0xd5, 0x8d, 0x1a, 0xc1, 0x1e, 0x09, 0xf7, 0x99, 0xf0, 0x3c, 0x9c, 0x48, 0x60, 0x0a, 0xb0, 0x78,
10129
-+	0x6b, 0xbe, 0x46, 0x31, 0x71, 0x67, 0x1d, 0x93, 0x2b, 0x84, 0x93, 0xe0, 0x0a, 0xe7, 0x61, 0x42,
10130
-+	0x36, 0x53, 0x27, 0x11, 0xbb, 0x23, 0x46, 0x58, 0xc7, 0x94, 0xa9, 0xad, 0x28, 0x56, 0xdd, 0x4a,
10131
-+	0xe3, 0xa3, 0x57, 0x60, 0xcc, 0xf5, 0xdd, 0xd8, 0x75, 0xe2, 0x20, 0x64, 0x37, 0x2c, 0x97, 0x93,
10132
-+	0x99, 0x25, 0xdb, 0x8a, 0x0e, 0xc0, 0x26, 0x9e, 0xfd, 0x87, 0x25, 0x98, 0x62, 0xd3, 0xf6, 0xad,
10133
-+	0x15, 0xf6, 0x91, 0x59, 0x61, 0xf7, 0x3a, 0x57, 0xd8, 0x49, 0xb0, 0xbb, 0x1f, 0xe6, 0x32, 0x7b,
10134
-+	0x17, 0xca, 0xca, 0x16, 0x58, 0x3a, 0x03, 0x58, 0x39, 0xce, 0x00, 0xbd, 0xb9, 0x0f, 0xf9, 0x8c,
10135
-+	0x5b, 0xcc, 0x7c, 0xc6, 0xfd, 0xdb, 0x16, 0x24, 0x26, 0x91, 0xe8, 0x16, 0x94, 0x5b, 0x01, 0x33,
10136
-+	0x3b, 0x08, 0xa5, 0x2d, 0xcf, 0x13, 0x99, 0x17, 0x15, 0xbf, 0x14, 0xf9, 0xf8, 0xd5, 0x64, 0x0d,
10137
-+	0x9c, 0x54, 0x46, 0x0b, 0x30, 0xd4, 0x0a, 0x49, 0x3d, 0x66, 0xde, 0xb6, 0x3d, 0xe9, 0xf0, 0x35,
10138
-+	0xc2, 0xf1, 0xb1, 0xac, 0x68, 0xff, 0x92, 0x05, 0xc0, 0x5f, 0x4a, 0x1d, 0x7f, 0x8b, 0x9c, 0x82,
10139
-+	0xf6, 0xb7, 0x0a, 0xa5, 0xa8, 0x45, 0x1a, 0xdd, 0x0c, 0x42, 0x92, 0xfe, 0xd4, 0x5b, 0xa4, 0x91,
10140
-+	0x0c, 0x38, 0xfd, 0x87, 0x59, 0x6d, 0xfb, 0xfb, 0x00, 0xc6, 0x13, 0xb4, 0x95, 0x98, 0xec, 0xa2,
10141
-+	0xe7, 0x0d, 0x97, 0xb8, 0x8b, 0x29, 0x97, 0xb8, 0x32, 0xc3, 0xd6, 0x14, 0x8d, 0xef, 0x42, 0x71,
10142
-+	0xd7, 0x79, 0x28, 0x34, 0x49, 0xcf, 0x76, 0xef, 0x06, 0xa5, 0x3f, 0xbb, 0xea, 0x3c, 0xe4, 0x32,
10143
-+	0xd3, 0xb3, 0x72, 0x81, 0xac, 0x3a, 0x0f, 0x8f, 0xb8, 0xd9, 0x07, 0x3b, 0xa4, 0xee, 0xb8, 0x51,
10144
-+	0xfc, 0x95, 0xff, 0x9c, 0xfc, 0x67, 0xcb, 0x8e, 0x36, 0xc2, 0xda, 0x72, 0x7d, 0xf1, 0x6e, 0xd8,
10145
-+	0x57, 0x5b, 0xae, 0x9f, 0x6e, 0xcb, 0xf5, 0xfb, 0x68, 0xcb, 0xf5, 0xd1, 0xfb, 0x30, 0x24, 0xde,
10146
-+	0xe8, 0x99, 0xad, 0xb7, 0xa9, 0xa5, 0xca, 0x6b, 0x4f, 0x3c, 0xf1, 0xf3, 0x36, 0xe7, 0xa4, 0x4c,
10147
-+	0x28, 0x4a, 0x7b, 0xb6, 0x2b, 0x1b, 0x44, 0x7f, 0xc3, 0x82, 0x71, 0xf1, 0x1b, 0x93, 0xf7, 0xda,
10148
-+	0x24, 0x8a, 0x05, 0xef, 0xf9, 0xe9, 0xfe, 0xfb, 0x20, 0x2a, 0xf2, 0xae, 0x7c, 0x5a, 0x1e, 0xb3,
10149
-+	0x26, 0xb0, 0x67, 0x8f, 0x52, 0xbd, 0x40, 0xff, 0xc8, 0x82, 0xb3, 0xbb, 0xce, 0x43, 0xde, 0x22,
10150
-+	0x2f, 0xc3, 0x4e, 0xec, 0x06, 0xc2, 0x76, 0xfd, 0xb3, 0xfd, 0x4d, 0x7f, 0x47, 0x75, 0xde, 0x49,
10151
-+	0x69, 0xe6, 0x7a, 0x36, 0x0b, 0xa5, 0x67, 0x57, 0x33, 0xfb, 0x35, 0xb3, 0x09, 0xc3, 0x72, 0xbd,
10152
-+	0x65, 0x48, 0xde, 0x55, 0x9d, 0xb1, 0x3e, 0xb6, 0x89, 0x84, 0xee, 0x97, 0x46, 0xdb, 0x11, 0x6b,
10153
-+	0xed, 0xb1, 0xb6, 0xf3, 0x2e, 0x8c, 0xea, 0x6b, 0xec, 0xb1, 0xb6, 0xf5, 0x1e, 0x9c, 0xc9, 0x58,
10154
-+	0x4b, 0x8f, 0xb5, 0xc9, 0x07, 0x70, 0x31, 0x77, 0x7d, 0x3c, 0xce, 0x86, 0xed, 0x5f, 0xb4, 0xf4,
10155
-+	0x73, 0xf0, 0x14, 0x54, 0xf0, 0x8b, 0xa6, 0x0a, 0xfe, 0x4a, 0xf7, 0x9d, 0x93, 0xa3, 0x87, 0x7f,
10156
-+	0x47, 0xef, 0x34, 0x3d, 0xd5, 0xd1, 0x1b, 0x30, 0xe8, 0xd1, 0x12, 0x69, 0x1c, 0x62, 0xf7, 0xde,
10157
-+	0x91, 0x09, 0x2f, 0xc5, 0xca, 0x23, 0x2c, 0x28, 0xd8, 0xbf, 0x6a, 0x41, 0xe9, 0x14, 0x46, 0x02,
10158
-+	0x9b, 0x23, 0xf1, 0x7c, 0x2e, 0x69, 0x11, 0x3d, 0x6d, 0x16, 0x3b, 0x0f, 0x96, 0x64, 0x84, 0xb8,
10159
-+	0x9c, 0x81, 0xf9, 0x2e, 0x38, 0x73, 0x27, 0x70, 0x9a, 0x0b, 0x8e, 0xe7, 0xf8, 0x0d, 0x12, 0xae,
10160
-+	0xf8, 0x5b, 0x3d, 0xad, 0x94, 0x74, 0x9b, 0xa2, 0x42, 0x2f, 0x9b, 0x22, 0x7b, 0x1b, 0x90, 0xde,
10161
-+	0x80, 0xb0, 0xe3, 0xc4, 0x30, 0xe4, 0xf2, 0xa6, 0xc4, 0xf0, 0x3f, 0x9d, 0xcd, 0xdd, 0x75, 0xf4,
10162
-+	0x4c, 0xb3, 0x50, 0xe4, 0x05, 0x58, 0x12, 0xb2, 0x5f, 0x85, 0x4c, 0xdf, 0xad, 0xde, 0x6a, 0x03,
10163
-+	0xfb, 0x65, 0x98, 0x62, 0x35, 0x8f, 0x27, 0xd2, 0xda, 0x3f, 0x60, 0xc1, 0xc4, 0x5a, 0x2a, 0x36,
10164
-+	0xc5, 0x35, 0xf6, 0xd6, 0x97, 0xa1, 0xf7, 0xad, 0xb3, 0x52, 0x2c, 0xa0, 0x27, 0xae, 0x5f, 0xfa,
10165
-+	0x33, 0x0b, 0x12, 0x57, 0xc9, 0x53, 0x60, 0xaa, 0x16, 0x0d, 0xa6, 0x2a, 0x53, 0xef, 0xa1, 0xba,
10166
-+	0x93, 0xc7, 0x53, 0xa1, 0xdb, 0x2a, 0x2e, 0x40, 0x17, 0x95, 0x47, 0x42, 0x86, 0x7b, 0x91, 0x8f,
10167
-+	0x9b, 0xc1, 0x03, 0x64, 0xa4, 0x00, 0x66, 0x26, 0xa4, 0x70, 0x3f, 0x22, 0x66, 0x42, 0xaa, 0x3f,
10168
-+	0x39, 0xbb, 0xaf, 0xa6, 0x75, 0x99, 0x9d, 0x4a, 0xdf, 0xce, 0xcc, 0xbe, 0x1d, 0xcf, 0x7d, 0x9f,
10169
-+	0xa8, 0xe0, 0x26, 0x15, 0x61, 0xc6, 0x2d, 0x4a, 0x8f, 0x0e, 0x2a, 0x63, 0xea, 0x1f, 0x0f, 0xb6,
10170
-+	0x95, 0x54, 0xb1, 0x6f, 0xc1, 0x44, 0x6a, 0xc0, 0xd0, 0xcb, 0x30, 0xd0, 0xda, 0x76, 0x22, 0x92,
10171
-+	0x32, 0x8d, 0x1c, 0xa8, 0xd1, 0xc2, 0xa3, 0x83, 0xca, 0xb8, 0xaa, 0xc0, 0x4a, 0x30, 0xc7, 0xb6,
10172
-+	0xff, 0xa7, 0x05, 0xa5, 0xb5, 0xa0, 0x79, 0x1a, 0x8b, 0xe9, 0x75, 0x63, 0x31, 0x5d, 0xca, 0x0b,
10173
-+	0x55, 0x98, 0xbb, 0x8e, 0x96, 0x53, 0xeb, 0xe8, 0x4a, 0x2e, 0x85, 0xee, 0x4b, 0x68, 0x17, 0x46,
10174
-+	0x58, 0x00, 0x44, 0x61, 0xaa, 0xf9, 0xa2, 0xc1, 0xdf, 0x57, 0x52, 0xfc, 0xfd, 0x84, 0x86, 0xaa,
10175
-+	0x71, 0xf9, 0xcf, 0xc0, 0x90, 0x30, 0x17, 0x4c, 0x1b, 0xb8, 0x0b, 0x5c, 0x2c, 0xe1, 0xf6, 0x4f,
10176
-+	0x16, 0xc1, 0x08, 0xb8, 0x88, 0x7e, 0xcd, 0x82, 0xd9, 0x90, 0x7b, 0x0c, 0x36, 0xab, 0xed, 0xd0,
10177
-+	0xf5, 0xb7, 0xea, 0x8d, 0x6d, 0xd2, 0x6c, 0x7b, 0xae, 0xbf, 0xb5, 0xb2, 0xe5, 0x07, 0xaa, 0x78,
10178
-+	0xe9, 0x21, 0x69, 0xb4, 0x99, 0xce, 0xbf, 0x47, 0x74, 0x47, 0x65, 0x8e, 0x73, 0xe3, 0xf0, 0xa0,
10179
-+	0x32, 0x8b, 0x8f, 0x45, 0x1b, 0x1f, 0xb3, 0x2f, 0xe8, 0x1b, 0x16, 0xcc, 0xf1, 0x38, 0x84, 0xfd,
10180
-+	0xf7, 0xbf, 0x8b, 0x34, 0x54, 0x93, 0xa4, 0x12, 0x22, 0xeb, 0x24, 0xdc, 0x5d, 0x78, 0x45, 0x0c,
10181
-+	0xe8, 0x5c, 0xed, 0x78, 0x6d, 0xe1, 0xe3, 0x76, 0xce, 0xfe, 0x97, 0x45, 0x18, 0x13, 0xce, 0xea,
10182
-+	0x22, 0x0a, 0xca, 0xcb, 0xc6, 0x92, 0x78, 0x32, 0xb5, 0x24, 0xa6, 0x0c, 0xe4, 0x93, 0x09, 0x80,
10183
-+	0x12, 0xc1, 0x94, 0xe7, 0x44, 0xf1, 0x2d, 0xe2, 0x84, 0xf1, 0x06, 0x71, 0xb8, 0x99, 0x4a, 0xf1,
10184
-+	0xd8, 0x26, 0x35, 0x4a, 0xfd, 0x72, 0x27, 0x4d, 0x0c, 0x77, 0xd2, 0x47, 0x7b, 0x80, 0x98, 0xad,
10185
-+	0x4d, 0xe8, 0xf8, 0x11, 0xff, 0x16, 0x57, 0xbc, 0x07, 0x1c, 0xaf, 0xd5, 0x19, 0xd1, 0x2a, 0xba,
10186
-+	0xd3, 0x41, 0x0d, 0x67, 0xb4, 0xa0, 0xd9, 0x50, 0x0d, 0xf4, 0x6b, 0x43, 0x35, 0xd8, 0xc3, 0x8b,
10187
-+	0xc4, 0x87, 0xc9, 0x8e, 0x78, 0x03, 0x6f, 0x43, 0x59, 0xd9, 0xba, 0x89, 0x43, 0xa7, 0x7b, 0xd8,
10188
-+	0x8e, 0x34, 0x05, 0xae, 0x22, 0x49, 0xec, 0x2c, 0x13, 0x72, 0xf6, 0x3f, 0x2e, 0x18, 0x0d, 0xf2,
10189
-+	0x49, 0x5c, 0x83, 0x61, 0x27, 0x8a, 0xdc, 0x2d, 0x9f, 0x34, 0xc5, 0x8e, 0xfd, 0x78, 0xde, 0x8e,
10190
-+	0x35, 0x9a, 0x61, 0xf6, 0x86, 0xf3, 0xa2, 0x26, 0x56, 0x34, 0xd0, 0x2d, 0x6e, 0x0c, 0xb4, 0x27,
10191
-+	0xf9, 0xf9, 0xfe, 0xa8, 0x81, 0x34, 0x17, 0xda, 0x23, 0x58, 0xd4, 0x47, 0x5f, 0xe4, 0xd6, 0x5a,
10192
-+	0xb7, 0xfd, 0xe0, 0x81, 0x7f, 0x33, 0x08, 0xa4, 0x87, 0x59, 0x7f, 0x04, 0xa7, 0xa4, 0x8d, 0x96,
10193
-+	0xaa, 0x8e, 0x4d, 0x6a, 0xfd, 0xc5, 0xe4, 0xf9, 0x6e, 0x38, 0x43, 0x49, 0x9b, 0x7e, 0x22, 0x11,
10194
-+	0x22, 0x30, 0x21, 0x22, 0x21, 0xc8, 0x32, 0x31, 0x76, 0x99, 0xac, 0xba, 0x59, 0x3b, 0x51, 0xe8,
10195
-+	0xdd, 0x36, 0x49, 0xe0, 0x34, 0x4d, 0xfb, 0x67, 0x2c, 0x60, 0x16, 0xee, 0xa7, 0xc0, 0x32, 0x7c,
10196
-+	0xce, 0x64, 0x19, 0xa6, 0xf3, 0x06, 0x39, 0x87, 0x5b, 0x78, 0x89, 0xaf, 0xac, 0x5a, 0x18, 0x3c,
10197
-+	0xdc, 0x17, 0x2f, 0xe5, 0x7d, 0x70, 0xa9, 0xff, 0xc7, 0xe2, 0x87, 0x98, 0x72, 0x3a, 0x47, 0xdf,
10198
-+	0x03, 0xc3, 0x0d, 0xa7, 0xe5, 0x34, 0x78, 0x74, 0xe0, 0x5c, 0x8d, 0x8d, 0x51, 0x69, 0x76, 0x51,
10199
-+	0xd4, 0xe0, 0x1a, 0x08, 0x19, 0x51, 0x63, 0x58, 0x16, 0xf7, 0xd4, 0x3a, 0xa8, 0x26, 0x67, 0x76,
10200
-+	0x60, 0xcc, 0x20, 0xf6, 0x58, 0xc5, 0xd5, 0xef, 0xe1, 0x57, 0xac, 0x8a, 0x00, 0xb3, 0x0b, 0x53,
10201
-+	0xbe, 0xf6, 0x9f, 0x5e, 0x28, 0x52, 0x04, 0xf9, 0x78, 0xaf, 0x4b, 0x94, 0xdd, 0x3e, 0x9a, 0x05,
10202
-+	0x7f, 0x8a, 0x0c, 0xee, 0xa4, 0x6c, 0xff, 0x94, 0x05, 0x17, 0x74, 0x44, 0x2d, 0x1e, 0x40, 0x2f,
10203
-+	0x1d, 0x70, 0x15, 0x86, 0x83, 0x16, 0x09, 0x9d, 0x38, 0x08, 0xc5, 0xad, 0x71, 0x5d, 0x0e, 0xfa,
10204
-+	0x5d, 0x51, 0x7e, 0x24, 0xc2, 0x34, 0x4a, 0xea, 0xb2, 0x1c, 0xab, 0x9a, 0xc8, 0x86, 0x41, 0x36,
10205
-+	0x18, 0x91, 0x88, 0xd5, 0xc0, 0xce, 0x00, 0xf6, 0x1c, 0x1a, 0x61, 0x01, 0xb1, 0xff, 0xc8, 0xe2,
10206
-+	0x0b, 0x4b, 0xef, 0x3a, 0x7a, 0x0f, 0x26, 0x77, 0x9d, 0xb8, 0xb1, 0xbd, 0xf4, 0xb0, 0x15, 0x72,
10207
-+	0xd5, 0xb7, 0x1c, 0xa7, 0x67, 0x7b, 0x8d, 0x93, 0xf6, 0x91, 0x89, 0x01, 0xda, 0x6a, 0x8a, 0x18,
10208
-+	0xee, 0x20, 0x8f, 0x36, 0x60, 0x84, 0x95, 0x31, 0x4b, 0xe7, 0xa8, 0x1b, 0x6b, 0x90, 0xd7, 0x9a,
10209
-+	0x7a, 0x51, 0x5e, 0x4d, 0xe8, 0x60, 0x9d, 0xa8, 0xfd, 0x95, 0x22, 0xdf, 0xed, 0x8c, 0xdb, 0x7e,
10210
-+	0x06, 0x86, 0x5a, 0x41, 0x73, 0x71, 0xa5, 0x8a, 0xc5, 0x2c, 0xa8, 0x6b, 0xa4, 0xc6, 0x8b, 0xb1,
10211
-+	0x84, 0xa3, 0xd7, 0x00, 0xc8, 0xc3, 0x98, 0x84, 0xbe, 0xe3, 0x29, 0x83, 0x10, 0x65, 0x02, 0x59,
10212
-+	0x0d, 0xd6, 0x82, 0xf8, 0x5e, 0x44, 0xbe, 0x6b, 0x49, 0xa1, 0x60, 0x0d, 0x1d, 0xdd, 0x00, 0x68,
10213
-+	0x85, 0xc1, 0x9e, 0xdb, 0x64, 0xae, 0x73, 0x45, 0xd3, 0x5c, 0xa2, 0xa6, 0x20, 0x58, 0xc3, 0x42,
10214
-+	0xaf, 0xc1, 0x58, 0xdb, 0x8f, 0x38, 0x87, 0xe2, 0x6c, 0x88, 0xc8, 0x83, 0xc3, 0x89, 0xe5, 0xc2,
10215
-+	0x3d, 0x1d, 0x88, 0x4d, 0x5c, 0x34, 0x0f, 0x83, 0xb1, 0xc3, 0xec, 0x1d, 0x06, 0xf2, 0xed, 0x16,
10216
-+	0xd7, 0x29, 0x86, 0x1e, 0x9b, 0x96, 0x56, 0xc0, 0xa2, 0x22, 0x7a, 0x5b, 0xfa, 0x21, 0xf0, 0xb3,
10217
-+	0x5e, 0x18, 0x0c, 0xf7, 0x77, 0x2f, 0x68, 0x5e, 0x08, 0xc2, 0x10, 0xd9, 0xa0, 0x65, 0x7f, 0xa3,
10218
-+	0x0c, 0x90, 0xb0, 0xe3, 0xe8, 0xfd, 0x8e, 0xf3, 0xe8, 0xb9, 0xee, 0x0c, 0xfc, 0xc9, 0x1d, 0x46,
10219
-+	0xe8, 0xfb, 0x2d, 0x18, 0x71, 0x3c, 0x2f, 0x68, 0x38, 0x31, 0x1b, 0xe5, 0x42, 0xf7, 0xf3, 0x50,
10220
-+	0xb4, 0x3f, 0x9f, 0xd4, 0xe0, 0x5d, 0x78, 0x51, 0x2e, 0x3c, 0x0d, 0xd2, 0xb3, 0x17, 0x7a, 0xc3,
10221
-+	0xe8, 0x53, 0x52, 0x4a, 0xe3, 0xcb, 0x63, 0x26, 0x2d, 0xa5, 0x95, 0xd9, 0xd1, 0xaf, 0x09, 0x68,
10222
-+	0xe8, 0x9e, 0x11, 0x54, 0xae, 0x94, 0x1f, 0x5f, 0xc1, 0xe0, 0x4a, 0x7b, 0xc5, 0x93, 0x43, 0x35,
10223
-+	0xdd, 0x71, 0x6a, 0x20, 0x3f, 0x08, 0x89, 0x26, 0xfe, 0xf4, 0x70, 0x9a, 0x7a, 0x17, 0x26, 0x9a,
10224
-+	0xe6, 0xdd, 0x2e, 0x56, 0xd3, 0xd3, 0x79, 0x74, 0x53, 0xac, 0x40, 0x72, 0x9b, 0xa7, 0x00, 0x38,
10225
-+	0x4d, 0x18, 0xd5, 0xb8, 0x0b, 0xdb, 0x8a, 0xbf, 0x19, 0x08, 0xc3, 0x73, 0x3b, 0x77, 0x2e, 0xf7,
10226
-+	0xa3, 0x98, 0xec, 0x52, 0xcc, 0xe4, 0xd2, 0x5e, 0x13, 0x75, 0xb1, 0xa2, 0x82, 0xde, 0x80, 0x41,
10227
-+	0xe6, 0x03, 0x1b, 0x4d, 0x0f, 0xe7, 0x2b, 0x0a, 0xcd, 0xf0, 0x0d, 0xc9, 0xa6, 0x62, 0x7f, 0x23,
10228
-+	0x2c, 0x28, 0xa0, 0x5b, 0x32, 0xc6, 0x4b, 0xb4, 0xe2, 0xdf, 0x8b, 0x08, 0x8b, 0xf1, 0x52, 0x5e,
10229
-+	0xf8, 0x78, 0x12, 0xbe, 0x85, 0x97, 0x67, 0x46, 0xa1, 0x37, 0x6a, 0x52, 0xe6, 0x48, 0xfc, 0x97,
10230
-+	0xc1, 0xed, 0xa7, 0x21, 0xbf, 0x7b, 0x66, 0x00, 0xfc, 0x64, 0x38, 0xef, 0x9b, 0x24, 0x70, 0x9a,
10231
-+	0x26, 0x65, 0x34, 0xf9, 0xce, 0x15, 0xa6, 0xeb, 0xbd, 0xf6, 0x3f, 0x97, 0xaf, 0xd9, 0x25, 0xc3,
10232
-+	0x4b, 0xb0, 0xa8, 0x7f, 0xaa, 0xb7, 0xfe, 0x8c, 0x0f, 0x93, 0xe9, 0x2d, 0xfa, 0x58, 0xb9, 0x8c,
10233
-+	0x3f, 0x28, 0xc1, 0xb8, 0xb9, 0xa4, 0xd0, 0x1c, 0x94, 0x05, 0x11, 0x15, 0x70, 0x54, 0xed, 0x92,
10234
-+	0x55, 0x09, 0xc0, 0x09, 0x0e, 0x8b, 0x33, 0xcb, 0xaa, 0x6b, 0x26, 0x87, 0x49, 0x9c, 0x59, 0x05,
10235
-+	0xc1, 0x1a, 0x16, 0x95, 0x97, 0x36, 0x82, 0x20, 0x56, 0x97, 0x8a, 0x5a, 0x77, 0x0b, 0xac, 0x14,
10236
-+	0x0b, 0x28, 0xbd, 0x4c, 0x76, 0x48, 0xe8, 0x13, 0xcf, 0x8c, 0x63, 0xa6, 0x2e, 0x93, 0xdb, 0x3a,
10237
-+	0x10, 0x9b, 0xb8, 0xf4, 0x96, 0x0c, 0x22, 0xb6, 0x90, 0x85, 0x54, 0x96, 0x98, 0x70, 0xd6, 0xb9,
10238
-+	0x37, 0xb9, 0x84, 0xa3, 0x2f, 0xc0, 0x05, 0xe5, 0xfc, 0x8d, 0xb9, 0x12, 0x5a, 0xb6, 0x38, 0x68,
10239
-+	0x28, 0x51, 0x2e, 0x2c, 0x66, 0xa3, 0xe1, 0xbc, 0xfa, 0xe8, 0x75, 0x18, 0x17, 0x9c, 0xbb, 0xa4,
10240
-+	0x38, 0x64, 0xda, 0x45, 0xdc, 0x36, 0xa0, 0x38, 0x85, 0x2d, 0x23, 0xb1, 0x31, 0xe6, 0x59, 0x52,
10241
-+	0x18, 0xee, 0x8c, 0xc4, 0xa6, 0xc3, 0x71, 0x47, 0x0d, 0x34, 0x0f, 0x13, 0x9c, 0xb5, 0x72, 0xfd,
10242
-+	0x2d, 0x3e, 0x27, 0xc2, 0xb3, 0x44, 0x6d, 0xa9, 0xbb, 0x26, 0x18, 0xa7, 0xf1, 0xd1, 0xab, 0x30,
10243
-+	0xea, 0x84, 0x8d, 0x6d, 0x37, 0x26, 0x8d, 0xb8, 0x1d, 0x72, 0x97, 0x13, 0xcd, 0xb0, 0x64, 0x5e,
10244
-+	0x83, 0x61, 0x03, 0xd3, 0x7e, 0x1f, 0xce, 0x64, 0x38, 0xa5, 0xd1, 0x85, 0xe3, 0xb4, 0x5c, 0xf9,
10245
-+	0x4d, 0x29, 0x63, 0xcc, 0xf9, 0xda, 0x8a, 0xfc, 0x1a, 0x0d, 0x8b, 0xae, 0x4e, 0xe6, 0xbc, 0xa6,
10246
-+	0xe5, 0xb2, 0x50, 0xab, 0x73, 0x59, 0x02, 0x70, 0x82, 0x63, 0xff, 0xaf, 0x02, 0x4c, 0x64, 0x28,
10247
-+	0xd6, 0x59, 0x3e, 0x85, 0x94, 0xec, 0x91, 0xa4, 0x4f, 0x30, 0x03, 0xfb, 0x15, 0x8e, 0x11, 0xd8,
10248
-+	0xaf, 0xd8, 0x2b, 0xb0, 0x5f, 0xe9, 0x83, 0x04, 0xf6, 0x33, 0x47, 0x6c, 0xa0, 0xaf, 0x11, 0xcb,
10249
-+	0x08, 0x06, 0x38, 0x78, 0xcc, 0x60, 0x80, 0xc6, 0xa0, 0x0f, 0xf5, 0x31, 0xe8, 0x3f, 0x5a, 0x80,
10250
-+	0xc9, 0xb4, 0x01, 0xdc, 0x29, 0xa8, 0x63, 0xdf, 0x30, 0xd4, 0xb1, 0xd9, 0xd9, 0x49, 0xd2, 0x66,
10251
-+	0x79, 0x79, 0xaa, 0x59, 0x9c, 0x52, 0xcd, 0x7e, 0xb2, 0x2f, 0x6a, 0xdd, 0xd5, 0xb4, 0x7f, 0xb7,
10252
-+	0x00, 0xe7, 0xd2, 0x55, 0x16, 0x3d, 0xc7, 0xdd, 0x3d, 0x85, 0xb1, 0xb9, 0x6b, 0x8c, 0xcd, 0xf3,
10253
-+	0xfd, 0x7c, 0x0d, 0xeb, 0x5a, 0xee, 0x00, 0xbd, 0x95, 0x1a, 0xa0, 0xb9, 0xfe, 0x49, 0x76, 0x1f,
10254
-+	0xa5, 0x6f, 0x16, 0xe1, 0x4a, 0x66, 0xbd, 0x44, 0x9b, 0xb9, 0x6c, 0x68, 0x33, 0x6f, 0xa4, 0xb4,
10255
-+	0x99, 0x76, 0xf7, 0xda, 0x27, 0xa3, 0xde, 0x14, 0xde, 0x82, 0x2c, 0xf8, 0xdb, 0x23, 0xaa, 0x36,
10256
-+	0x0d, 0x6f, 0x41, 0x45, 0x08, 0x9b, 0x74, 0xff, 0x22, 0xa9, 0x34, 0xff, 0xad, 0x05, 0x17, 0x33,
10257
-+	0xe7, 0xe6, 0x14, 0x54, 0x58, 0x6b, 0xa6, 0x0a, 0xeb, 0x99, 0xbe, 0x57, 0x6b, 0x8e, 0x4e, 0xeb,
10258
-+	0x0f, 0x8b, 0x39, 0xdf, 0xc2, 0x04, 0xf4, 0xbb, 0x30, 0xe2, 0x34, 0x1a, 0x24, 0x8a, 0x56, 0x83,
10259
-+	0xa6, 0x0a, 0x86, 0xf6, 0x3c, 0x93, 0xb3, 0x92, 0xe2, 0xa3, 0x83, 0xca, 0x4c, 0x9a, 0x44, 0x02,
10260
-+	0xc6, 0x3a, 0x05, 0x33, 0x7e, 0x63, 0xe1, 0x44, 0xe3, 0x37, 0xde, 0x00, 0xd8, 0x53, 0xdc, 0x7a,
10261
-+	0x5a, 0xc8, 0xd7, 0xf8, 0x78, 0x0d, 0x0b, 0x7d, 0x11, 0x86, 0x23, 0x71, 0x8d, 0x8b, 0xa5, 0xf8,
10262
-+	0x62, 0x9f, 0x73, 0xe5, 0x6c, 0x10, 0xcf, 0x74, 0x4b, 0x57, 0xfa, 0x10, 0x45, 0x12, 0x7d, 0x07,
10263
-+	0x4c, 0x46, 0x3c, 0xea, 0xc9, 0xa2, 0xe7, 0x44, 0xcc, 0xc7, 0x41, 0xac, 0x42, 0xe6, 0x6b, 0x5e,
10264
-+	0x4f, 0xc1, 0x70, 0x07, 0x36, 0x5a, 0x96, 0x1f, 0xc5, 0x42, 0xb4, 0xf0, 0x85, 0x79, 0x2d, 0xf9,
10265
-+	0x20, 0x91, 0xcd, 0xe9, 0x6c, 0x7a, 0xf8, 0xd9, 0xc0, 0x6b, 0x35, 0xed, 0x1f, 0x2d, 0xc1, 0x13,
10266
-+	0x5d, 0x0e, 0x31, 0x34, 0x6f, 0xbe, 0x51, 0x3e, 0x9b, 0x96, 0x7e, 0x67, 0x32, 0x2b, 0x1b, 0xe2,
10267
-+	0x70, 0x6a, 0xad, 0x14, 0x3e, 0xf0, 0x5a, 0xf9, 0x21, 0x4b, 0xd3, 0x4b, 0x70, 0x4b, 0xba, 0xcf,
10268
-+	0x1d, 0xf3, 0x70, 0x3e, 0x41, 0x45, 0xc5, 0x66, 0x86, 0xb4, 0x7f, 0xa3, 0xef, 0xee, 0xf4, 0x2d,
10269
-+	0xfe, 0x9f, 0xae, 0x76, 0xf6, 0x2b, 0x16, 0x3c, 0x99, 0xd9, 0x5f, 0xc3, 0xa6, 0x62, 0x0e, 0xca,
10270
-+	0x0d, 0x5a, 0xa8, 0xf9, 0x4d, 0x25, 0x0e, 0xa5, 0x12, 0x80, 0x13, 0x1c, 0xc3, 0x74, 0xa2, 0xd0,
10271
-+	0xd3, 0x74, 0xe2, 0x5f, 0x58, 0xd0, 0xb1, 0x80, 0x4f, 0xe1, 0x24, 0x5d, 0x31, 0x4f, 0xd2, 0x8f,
10272
-+	0xf7, 0x33, 0x97, 0x39, 0x87, 0xe8, 0xbf, 0x99, 0x84, 0xf3, 0x39, 0x8e, 0x12, 0x7b, 0x30, 0xb5,
10273
-+	0xd5, 0x20, 0xa6, 0x47, 0x9a, 0xf8, 0x98, 0x4c, 0xe7, 0xbd, 0xae, 0xee, 0x6b, 0x2c, 0x0d, 0xcf,
10274
-+	0x54, 0x07, 0x0a, 0xee, 0x6c, 0x02, 0x7d, 0xc5, 0x82, 0xb3, 0xce, 0x83, 0xa8, 0x23, 0xd9, 0xa2,
10275
-+	0x58, 0x33, 0x2f, 0x65, 0x6a, 0x29, 0x7a, 0x24, 0x67, 0xe4, 0x79, 0x89, 0xb2, 0xb0, 0x70, 0x66,
10276
-+	0x5b, 0x08, 0x8b, 0xf8, 0x95, 0x94, 0xdf, 0xee, 0xe2, 0x33, 0x99, 0xe5, 0xd1, 0xc2, 0xcf, 0x54,
10277
-+	0x09, 0xc1, 0x8a, 0x0e, 0xba, 0x0f, 0xe5, 0x2d, 0xe9, 0x66, 0x26, 0xce, 0xec, 0xcc, 0x4b, 0x30,
10278
-+	0xd3, 0x17, 0x8d, 0xbf, 0x1b, 0x2a, 0x10, 0x4e, 0x48, 0xa1, 0xd7, 0xa1, 0xe8, 0x6f, 0x46, 0xdd,
10279
-+	0xb2, 0xec, 0xa4, 0x4c, 0x8d, 0xb8, 0x3f, 0xf2, 0xda, 0x72, 0x1d, 0xd3, 0x8a, 0xe8, 0x16, 0x14,
10280
-+	0xc3, 0x8d, 0xa6, 0x50, 0xac, 0x65, 0xf2, 0xa5, 0x78, 0xa1, 0x9a, 0xbd, 0x48, 0x38, 0x25, 0xbc,
10281
-+	0x50, 0xc5, 0x94, 0x04, 0xaa, 0xc1, 0x00, 0xf3, 0x29, 0x10, 0xfa, 0xb3, 0x4c, 0x86, 0xb4, 0x8b,
10282
-+	0x6f, 0x0e, 0x77, 0x5a, 0x66, 0x08, 0x98, 0x13, 0x42, 0xeb, 0x30, 0xd8, 0x60, 0x19, 0x59, 0x44,
10283
-+	0xc8, 0xe4, 0x4f, 0x65, 0xaa, 0xd0, 0xba, 0xa4, 0xaa, 0x11, 0x1a, 0x25, 0x86, 0x81, 0x05, 0x2d,
10284
-+	0x46, 0x95, 0xb4, 0xb6, 0x37, 0x23, 0x26, 0x82, 0xe7, 0x51, 0xed, 0x92, 0x81, 0x49, 0x50, 0x65,
10285
-+	0x18, 0x58, 0xd0, 0x42, 0x9f, 0x81, 0xc2, 0x66, 0x43, 0xb8, 0x1c, 0x64, 0xea, 0xd2, 0x4c, 0x97,
10286
-+	0xf2, 0x85, 0xc1, 0xc3, 0x83, 0x4a, 0x61, 0x79, 0x11, 0x17, 0x36, 0x1b, 0x68, 0x0d, 0x86, 0x36,
10287
-+	0xb9, 0x13, 0xaa, 0x50, 0x97, 0x3d, 0x9d, 0xed, 0x1f, 0xdb, 0xe1, 0xa7, 0xca, 0x4d, 0xe5, 0x05,
10288
-+	0x00, 0x4b, 0x22, 0x2c, 0x08, 0xa4, 0x72, 0xa6, 0x15, 0xd1, 0x90, 0x67, 0x8f, 0xe7, 0x00, 0xcd,
10289
-+	0xdd, 0xdb, 0x13, 0x97, 0x5c, 0xac, 0x51, 0x44, 0x5f, 0x86, 0xb2, 0x23, 0xd3, 0xfc, 0x89, 0x68,
10290
-+	0x11, 0x2f, 0x66, 0x6e, 0xcc, 0xee, 0x19, 0x10, 0xf9, 0xaa, 0x56, 0x48, 0x38, 0x21, 0x8a, 0x76,
10291
-+	0x60, 0x6c, 0x2f, 0x6a, 0x6d, 0x13, 0xb9, 0x91, 0x59, 0xf0, 0x88, 0x9c, 0x8b, 0xeb, 0xbe, 0x40,
10292
-+	0x74, 0xc3, 0xb8, 0xed, 0x78, 0x1d, 0x67, 0x0f, 0x7b, 0x6c, 0xbe, 0xaf, 0x13, 0xc3, 0x26, 0x6d,
10293
-+	0x3a, 0xfc, 0xef, 0xb5, 0x83, 0x8d, 0xfd, 0x98, 0x88, 0xf0, 0xc9, 0x99, 0xc3, 0xff, 0x26, 0x47,
10294
-+	0xe9, 0x1c, 0x7e, 0x01, 0xc0, 0x92, 0x08, 0xfa, 0x12, 0x8c, 0x34, 0x92, 0x64, 0x61, 0x2c, 0x70,
10295
-+	0x72, 0xce, 0x7b, 0x54, 0x4e, 0x4e, 0x31, 0x1e, 0xcd, 0x4e, 0x03, 0x62, 0x9d, 0x20, 0x3b, 0x23,
10296
-+	0x5b, 0xdb, 0x41, 0x1c, 0xf8, 0xa9, 0xf3, 0x79, 0x2a, 0xff, 0x8c, 0xac, 0x65, 0xe0, 0x77, 0x9e,
10297
-+	0x91, 0x59, 0x58, 0x38, 0xb3, 0x2d, 0xd4, 0x84, 0xf1, 0x56, 0x10, 0xc6, 0x0f, 0x82, 0x50, 0xae,
10298
-+	0x33, 0xd4, 0x45, 0xec, 0x37, 0x30, 0x45, 0x8b, 0x2c, 0xac, 0xb7, 0x09, 0xc1, 0x29, 0x9a, 0xe8,
10299
-+	0xf3, 0x30, 0x14, 0x35, 0x1c, 0x8f, 0xac, 0xdc, 0x9d, 0x3e, 0x93, 0x7f, 0xf9, 0xd4, 0x39, 0x4a,
10300
-+	0xce, 0x2a, 0x63, 0x93, 0x24, 0x50, 0xb0, 0x24, 0x87, 0x96, 0x61, 0x80, 0xc5, 0xe6, 0x67, 0x11,
10301
-+	0xa0, 0x73, 0xa2, 0x13, 0x75, 0x18, 0x77, 0xf2, 0x33, 0x8a, 0x15, 0x63, 0x5e, 0x9d, 0xee, 0x05,
10302
-+	0xc1, 0xfd, 0x06, 0xd1, 0xf4, 0xb9, 0xfc, 0xbd, 0x20, 0x98, 0xe6, 0xbb, 0xf5, 0x6e, 0x7b, 0x41,
10303
-+	0x21, 0xe1, 0x84, 0x28, 0x3d, 0xa1, 0xe9, 0xa9, 0x7a, 0xbe, 0x8b, 0xbd, 0x49, 0xee, 0x99, 0xca,
10304
-+	0x4e, 0x68, 0x7a, 0xa2, 0x52, 0x12, 0xf4, 0x0e, 0x72, 0x64, 0x6e, 0xd7, 0xe9, 0x0b, 0xf9, 0x77,
10305
-+	0x50, 0x66, 0x02, 0x58, 0x6d, 0xb7, 0xb2, 0x65, 0x91, 0x90, 0xb2, 0x7f, 0x6f, 0xa8, 0x93, 0x13,
10306
-+	0x62, 0x72, 0xd8, 0x5f, 0xb6, 0x3a, 0x9e, 0xe8, 0x3e, 0xdd, 0xaf, 0x5a, 0xe8, 0x04, 0x79, 0xe0,
10307
-+	0xaf, 0x58, 0x70, 0xbe, 0x95, 0x39, 0x40, 0x82, 0xad, 0xe8, 0x4f, 0xbb, 0xc4, 0x87, 0x41, 0x45,
10308
-+	0x7f, 0xcf, 0x86, 0xe3, 0x9c, 0x96, 0xd2, 0x72, 0x46, 0xf1, 0x03, 0xcb, 0x19, 0xab, 0x30, 0xcc,
10309
-+	0x58, 0xd7, 0x1e, 0x19, 0xd0, 0xd2, 0x5e, 0x6e, 0x8c, 0x41, 0x59, 0x14, 0x15, 0xb1, 0x22, 0x81,
10310
-+	0x7e, 0xd8, 0x82, 0xcb, 0xe9, 0xae, 0x63, 0xc2, 0xc0, 0x22, 0x56, 0x3a, 0x17, 0x01, 0x97, 0xc5,
10311
-+	0xf7, 0x5f, 0xae, 0x75, 0x43, 0x3e, 0xea, 0x85, 0x80, 0xbb, 0x37, 0x86, 0xaa, 0x19, 0x32, 0xe8,
10312
-+	0xa0, 0xa9, 0x77, 0xef, 0x43, 0x0e, 0x7d, 0x09, 0x46, 0x77, 0x83, 0xb6, 0x1f, 0x0b, 0xb3, 0x17,
10313
-+	0xe1, 0x84, 0xc8, 0xde, 0x99, 0x57, 0xb5, 0x72, 0x6c, 0x60, 0xa5, 0xa4, 0xd7, 0xe1, 0x47, 0x95,
10314
-+	0x5e, 0xd1, 0x3b, 0xa9, 0x94, 0xda, 0xe5, 0xfc, 0x98, 0x7c, 0x42, 0xd0, 0x3f, 0x46, 0x62, 0xed,
10315
-+	0xd3, 0x95, 0xb8, 0x7e, 0xce, 0xca, 0x10, 0x15, 0xb8, 0x0c, 0xfe, 0x59, 0x53, 0x06, 0xbf, 0x96,
10316
-+	0x96, 0xc1, 0x3b, 0x74, 0xae, 0x86, 0xf8, 0xdd, 0x7f, 0x60, 0xe7, 0x7e, 0x23, 0xa5, 0xd9, 0x1e,
10317
-+	0x5c, 0xed, 0x75, 0xdd, 0x31, 0xfb, 0xa7, 0xa6, 0x7a, 0x61, 0x4b, 0xec, 0x9f, 0x9a, 0x2b, 0x55,
10318
-+	0xcc, 0x20, 0x7d, 0xe7, 0xeb, 0xfc, 0x6f, 0x16, 0x14, 0x6b, 0x41, 0xf3, 0x14, 0x74, 0xc8, 0x9f,
10319
-+	0x33, 0x74, 0xc8, 0x4f, 0xe4, 0xa4, 0x3a, 0xcf, 0xd5, 0x18, 0x2f, 0xa5, 0x34, 0xc6, 0x97, 0xf3,
10320
-+	0x08, 0x74, 0xd7, 0x0f, 0xff, 0x74, 0x11, 0xf4, 0xc4, 0xec, 0xe8, 0x5f, 0x3d, 0x8a, 0xf1, 0x71,
10321
-+	0xb1, 0x5b, 0xae, 0x76, 0x41, 0x99, 0x99, 0x4d, 0x49, 0xbf, 0xba, 0x3f, 0x67, 0x36, 0xc8, 0x6f,
10322
-+	0x11, 0x77, 0x6b, 0x3b, 0x26, 0xcd, 0xf4, 0xe7, 0x9c, 0x9e, 0x0d, 0xf2, 0x7f, 0xb1, 0x60, 0x22,
10323
-+	0xd5, 0x3a, 0xf2, 0x60, 0xcc, 0xd3, 0x15, 0x80, 0x62, 0x9d, 0x3e, 0x92, 0xee, 0x50, 0xd8, 0x70,
10324
-+	0x6a, 0x45, 0xd8, 0x24, 0x8e, 0x66, 0x01, 0xd4, 0x03, 0x9d, 0xd4, 0xab, 0x31, 0xa9, 0x42, 0xbd,
10325
-+	0xe0, 0x45, 0x58, 0xc3, 0x40, 0x2f, 0xc3, 0x48, 0x1c, 0xb4, 0x02, 0x2f, 0xd8, 0xda, 0xbf, 0x4d,
10326
-+	0x64, 0xf0, 0x16, 0x65, 0x99, 0xb5, 0x9e, 0x80, 0xb0, 0x8e, 0x67, 0xff, 0x6c, 0x11, 0xd2, 0xc9,
10327
-+	0xfc, 0xbf, 0xb5, 0x26, 0x3f, 0x9a, 0x6b, 0xf2, 0x9b, 0x16, 0x4c, 0xd2, 0xd6, 0x99, 0x95, 0x88,
10328
-+	0xbc, 0x6c, 0x55, 0x82, 0x19, 0xab, 0x4b, 0x82, 0x99, 0x6b, 0xf4, 0xec, 0x6a, 0x06, 0xed, 0x58,
10329
-+	0xe8, 0xe5, 0xb4, 0xc3, 0x89, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x0c, 0x85, 0xeb, 0x93, 0x8e,
10330
-+	0x47, 0xc2, 0x10, 0x0b, 0xa8, 0xcc, 0x3f, 0x53, 0xca, 0xc9, 0x3f, 0xc3, 0x42, 0xd1, 0x09, 0x7b,
10331
-+	0x02, 0xc1, 0xf6, 0x68, 0xa1, 0xe8, 0xa4, 0xa1, 0x41, 0x82, 0x63, 0xff, 0x62, 0x11, 0x46, 0x6b,
10332
-+	0x41, 0x33, 0x79, 0x22, 0x7b, 0xc9, 0x78, 0x22, 0xbb, 0x9a, 0x7a, 0x22, 0x9b, 0xd4, 0x71, 0xbf,
10333
-+	0xf5, 0x20, 0xf6, 0x61, 0x3d, 0x88, 0xfd, 0x73, 0x8b, 0xcd, 0x5a, 0x75, 0xad, 0x2e, 0xf2, 0xdf,
10334
-+	0xbe, 0x00, 0x23, 0xec, 0x40, 0x62, 0xbe, 0x76, 0xf2, 0xdd, 0x88, 0x09, 0xe3, 0x6b, 0x49, 0x31,
10335
-+	0xd6, 0x71, 0xd0, 0x75, 0x18, 0x8e, 0x88, 0x13, 0x36, 0xb6, 0xd5, 0x19, 0x27, 0x5e, 0x55, 0x78,
10336
-+	0x19, 0x56, 0x50, 0xf4, 0x66, 0x12, 0x05, 0xad, 0x98, 0x9f, 0xc9, 0x55, 0xef, 0x0f, 0xdf, 0x22,
10337
-+	0xf9, 0xa1, 0xcf, 0xec, 0xb7, 0x00, 0x75, 0xe2, 0xf7, 0x11, 0xef, 0xa8, 0x62, 0xc6, 0x3b, 0x2a,
10338
-+	0x77, 0xc4, 0x3a, 0xfa, 0x53, 0x0b, 0xc6, 0x6b, 0x41, 0x93, 0x6e, 0xdd, 0xbf, 0x48, 0xfb, 0x54,
10339
-+	0x0f, 0x01, 0x39, 0xd8, 0x25, 0x04, 0xe4, 0xdf, 0xb3, 0x60, 0xa8, 0x16, 0x34, 0x4f, 0x41, 0x9b,
10340
-+	0xff, 0x59, 0x53, 0x9b, 0x7f, 0x21, 0x67, 0x49, 0xe4, 0x28, 0xf0, 0x7f, 0xb9, 0x08, 0x63, 0xb4,
10341
-+	0x9f, 0xc1, 0x96, 0x9c, 0x25, 0x63, 0x44, 0xac, 0x3e, 0x46, 0x84, 0xb2, 0xb9, 0x81, 0xe7, 0x05,
10342
-+	0x0f, 0xd2, 0x33, 0xb6, 0xcc, 0x4a, 0xb1, 0x80, 0xa2, 0xe7, 0x60, 0xb8, 0x15, 0x92, 0x3d, 0x37,
10343
-+	0x10, 0xfc, 0xa3, 0xf6, 0x36, 0x52, 0x13, 0xe5, 0x58, 0x61, 0x50, 0xb9, 0x2b, 0x72, 0xfd, 0x06,
10344
-+	0x91, 0x69, 0xa4, 0x4b, 0x2c, 0xd3, 0x14, 0x8f, 0xed, 0xac, 0x95, 0x63, 0x03, 0x0b, 0xbd, 0x05,
10345
-+	0x65, 0xf6, 0x9f, 0x9d, 0x28, 0xc7, 0xcf, 0x8c, 0x23, 0x12, 0x2a, 0x08, 0x02, 0x38, 0xa1, 0x85,
10346
-+	0x6e, 0x00, 0xc4, 0x32, 0xfe, 0x6f, 0x24, 0xc2, 0xd6, 0x28, 0x5e, 0x5b, 0x45, 0x06, 0x8e, 0xb0,
10347
-+	0x86, 0x85, 0x9e, 0x85, 0x72, 0xec, 0xb8, 0xde, 0x1d, 0xd7, 0x27, 0x11, 0x53, 0x69, 0x17, 0x65,
10348
-+	0xbe, 0x04, 0x51, 0x88, 0x13, 0x38, 0xe5, 0x75, 0x98, 0x4f, 0x37, 0xcf, 0xab, 0x35, 0xcc, 0xb0,
10349
-+	0x19, 0xaf, 0x73, 0x47, 0x95, 0x62, 0x0d, 0xc3, 0x7e, 0x15, 0xce, 0xd5, 0x82, 0x66, 0x2d, 0x08,
10350
-+	0xe3, 0xe5, 0x20, 0x7c, 0xe0, 0x84, 0x4d, 0x39, 0x7f, 0x15, 0x19, 0xba, 0x9f, 0x9e, 0x3d, 0x03,
10351
-+	0x7c, 0x67, 0x1a, 0x41, 0xf9, 0x5f, 0x64, 0xdc, 0xce, 0x31, 0x7d, 0x39, 0x1a, 0xec, 0xde, 0x55,
10352
-+	0x29, 0xf4, 0x6e, 0x3a, 0x31, 0x41, 0x77, 0x59, 0xda, 0xad, 0xe4, 0x0a, 0x12, 0xd5, 0x9f, 0xd1,
10353
-+	0xd2, 0x6e, 0x25, 0xc0, 0xcc, 0x3b, 0xcb, 0xac, 0x6f, 0xff, 0x7a, 0x91, 0x9d, 0x46, 0xa9, 0x8c,
10354
-+	0x72, 0xe8, 0x4b, 0x30, 0x1e, 0x91, 0x3b, 0xae, 0xdf, 0x7e, 0x28, 0x85, 0xf0, 0x2e, 0xde, 0x38,
10355
-+	0xf5, 0x25, 0x1d, 0x93, 0xab, 0x08, 0xcd, 0x32, 0x9c, 0xa2, 0x46, 0xe7, 0x29, 0x6c, 0xfb, 0xf3,
10356
-+	0xd1, 0xbd, 0x88, 0x84, 0x22, 0xa3, 0x19, 0x9b, 0x27, 0x2c, 0x0b, 0x71, 0x02, 0xa7, 0xeb, 0x92,
10357
-+	0xfd, 0x59, 0x0b, 0x7c, 0x1c, 0x04, 0xb1, 0x5c, 0xc9, 0x2c, 0x27, 0x8e, 0x56, 0x8e, 0x0d, 0x2c,
10358
-+	0xb4, 0x0c, 0x28, 0x6a, 0xb7, 0x5a, 0x1e, 0x7b, 0xcf, 0x77, 0xbc, 0x9b, 0x61, 0xd0, 0x6e, 0xf1,
10359
-+	0xb7, 0xd4, 0xe2, 0xc2, 0x79, 0x7a, 0x85, 0xd5, 0x3b, 0xa0, 0x38, 0xa3, 0x06, 0x3d, 0x7d, 0x36,
10360
-+	0x23, 0xf6, 0x9b, 0xad, 0xee, 0xa2, 0x50, 0xdf, 0xd7, 0x59, 0x11, 0x96, 0x30, 0xba, 0x98, 0x58,
10361
-+	0xf3, 0x1c, 0x73, 0x30, 0x59, 0x4c, 0x58, 0x95, 0x62, 0x0d, 0x03, 0x2d, 0xc1, 0x50, 0xb4, 0x1f,
10362
-+	0x35, 0x62, 0x11, 0x64, 0x29, 0x27, 0x37, 0x65, 0x9d, 0xa1, 0x68, 0xf9, 0x12, 0x78, 0x15, 0x2c,
10363
-+	0xeb, 0xda, 0xdf, 0xc3, 0x2e, 0x43, 0x96, 0xff, 0x2a, 0x6e, 0x87, 0x04, 0xed, 0xc2, 0x58, 0x8b,
10364
-+	0x4d, 0xb9, 0x88, 0xce, 0x2c, 0xe6, 0xed, 0xa5, 0x3e, 0xa5, 0xda, 0x07, 0xf4, 0xa0, 0x51, 0x5a,
10365
-+	0x27, 0x26, 0x2e, 0xd4, 0x74, 0x72, 0xd8, 0xa4, 0x6e, 0xff, 0xe0, 0x14, 0x3b, 0x73, 0xeb, 0x5c,
10366
-+	0x54, 0x1d, 0x12, 0x16, 0xc5, 0x82, 0x2f, 0x9f, 0xc9, 0xd7, 0x99, 0x24, 0x5f, 0x24, 0xac, 0x92,
10367
-+	0xb1, 0xac, 0x8b, 0xde, 0x64, 0x6f, 0xdf, 0xfc, 0xa0, 0xeb, 0x95, 0x86, 0x98, 0x63, 0x19, 0xcf,
10368
-+	0xdc, 0xa2, 0x22, 0xd6, 0x88, 0xa0, 0x3b, 0x30, 0x26, 0xd2, 0x25, 0x09, 0xa5, 0x58, 0xd1, 0x50,
10369
-+	0x7a, 0x8c, 0x61, 0x1d, 0x78, 0x94, 0x2e, 0xc0, 0x66, 0x65, 0xb4, 0x05, 0x97, 0xb5, 0xdc, 0x81,
10370
-+	0x37, 0x43, 0x87, 0xbd, 0x87, 0xba, 0x6c, 0x13, 0x69, 0xe7, 0xe6, 0x93, 0x87, 0x07, 0x95, 0xcb,
10371
-+	0xeb, 0xdd, 0x10, 0x71, 0x77, 0x3a, 0xe8, 0x2e, 0x9c, 0xe3, 0x8e, 0x7b, 0x55, 0xe2, 0x34, 0x3d,
10372
-+	0xd7, 0x57, 0x07, 0x33, 0x5f, 0x87, 0x17, 0x0f, 0x0f, 0x2a, 0xe7, 0xe6, 0xb3, 0x10, 0x70, 0x76,
10373
-+	0x3d, 0xf4, 0x59, 0x28, 0x37, 0xfd, 0x48, 0x8c, 0xc1, 0xa0, 0x91, 0x16, 0xb3, 0x5c, 0x5d, 0xab,
10374
-+	0xab, 0xef, 0x4f, 0xfe, 0xe0, 0xa4, 0x02, 0xda, 0xe2, 0x8a, 0x31, 0x25, 0x87, 0x0e, 0xe5, 0xa7,
10375
-+	0x40, 0x17, 0x4b, 0xc2, 0x70, 0xdd, 0xe1, 0x1a, 0x61, 0x65, 0xfa, 0x6a, 0x78, 0xf5, 0x18, 0x84,
10376
-+	0xd1, 0x1b, 0x80, 0x28, 0xa3, 0xe6, 0x36, 0xc8, 0x7c, 0x83, 0x05, 0xc9, 0x66, 0x7a, 0xc4, 0x61,
10377
-+	0xc3, 0x55, 0x02, 0xd5, 0x3b, 0x30, 0x70, 0x46, 0x2d, 0x74, 0x8b, 0x1e, 0x64, 0x7a, 0xa9, 0x30,
10378
-+	0xe1, 0x95, 0xcc, 0xfd, 0x74, 0x95, 0xb4, 0x42, 0xd2, 0x70, 0x62, 0xd2, 0x34, 0x29, 0xe2, 0x54,
10379
-+	0x3d, 0x7a, 0x97, 0xaa, 0x7c, 0x39, 0x60, 0x46, 0xc2, 0xe8, 0xcc, 0x99, 0x43, 0xe5, 0xe2, 0xed,
10380
-+	0x20, 0x8a, 0xd7, 0x48, 0xfc, 0x20, 0x08, 0x77, 0x44, 0xe0, 0xb1, 0x24, 0x06, 0x66, 0x02, 0xc2,
10381
-+	0x3a, 0x1e, 0xe5, 0x83, 0xd9, 0xe3, 0xf3, 0x4a, 0x95, 0xbd, 0x00, 0x0e, 0x27, 0xfb, 0xe4, 0x16,
10382
-+	0x2f, 0xc6, 0x12, 0x2e, 0x51, 0x57, 0x6a, 0x8b, 0xec, 0x35, 0x2f, 0x85, 0xba, 0x52, 0x5b, 0xc4,
10383
-+	0x12, 0x8e, 0x48, 0x67, 0xca, 0xd1, 0xf1, 0x7c, 0xad, 0x66, 0xe7, 0x75, 0xd0, 0x67, 0xd6, 0x51,
10384
-+	0x1f, 0x26, 0x55, 0xb2, 0x53, 0x1e, 0x91, 0x2d, 0x9a, 0x9e, 0x60, 0x8b, 0xa4, 0xff, 0x70, 0x6e,
10385
-+	0x4a, 0x4f, 0xbc, 0x92, 0xa2, 0x84, 0x3b, 0x68, 0x1b, 0xb1, 0x49, 0x26, 0x7b, 0xe6, 0x3b, 0x9a,
10386
-+	0x83, 0x72, 0xd4, 0xde, 0x68, 0x06, 0xbb, 0x8e, 0xeb, 0xb3, 0x47, 0x37, 0x8d, 0xc9, 0xaa, 0x4b,
10387
-+	0x00, 0x4e, 0x70, 0xd0, 0x32, 0x0c, 0x3b, 0x52, 0x09, 0x8c, 0xf2, 0x83, 0x15, 0x28, 0xd5, 0x2f,
10388
-+	0xf7, 0xdf, 0x95, 0x6a, 0x5f, 0x55, 0x17, 0xbd, 0x06, 0x63, 0xc2, 0x5d, 0x8b, 0x87, 0x70, 0x60,
10389
-+	0x8f, 0x62, 0x9a, 0x3d, 0x7e, 0x5d, 0x07, 0x62, 0x13, 0x17, 0x7d, 0x11, 0xc6, 0x29, 0x95, 0xe4,
10390
-+	0x60, 0x9b, 0x3e, 0xdb, 0xcf, 0x89, 0xa8, 0xe5, 0xb1, 0xd0, 0x2b, 0xe3, 0x14, 0x31, 0xd4, 0x84,
10391
-+	0x4b, 0x4e, 0x3b, 0x0e, 0x98, 0x22, 0xdd, 0x5c, 0xff, 0xeb, 0xc1, 0x0e, 0xf1, 0xd9, 0xdb, 0xd8,
10392
-+	0xf0, 0xc2, 0xd5, 0xc3, 0x83, 0xca, 0xa5, 0xf9, 0x2e, 0x78, 0xb8, 0x2b, 0x15, 0x74, 0x0f, 0x46,
10393
-+	0xe2, 0xc0, 0x63, 0x96, 0xf1, 0x94, 0x95, 0x38, 0x9f, 0x1f, 0xdb, 0x67, 0x5d, 0xa1, 0xe9, 0x4a,
10394
-+	0x24, 0x55, 0x15, 0xeb, 0x74, 0xd0, 0x3a, 0xdf, 0x63, 0x2c, 0xea, 0x29, 0x89, 0xa6, 0x2f, 0xe4,
10395
-+	0x0f, 0x8c, 0x0a, 0x8e, 0x6a, 0x6e, 0x41, 0x51, 0x13, 0xeb, 0x64, 0xd0, 0x4d, 0x98, 0x6a, 0x85,
10396
-+	0x6e, 0xc0, 0x16, 0xb6, 0x7a, 0xc4, 0x98, 0x36, 0x53, 0x17, 0xd4, 0xd2, 0x08, 0xb8, 0xb3, 0x0e,
10397
-+	0x15, 0x32, 0x65, 0xe1, 0xf4, 0x45, 0x9e, 0x07, 0x8b, 0x33, 0xde, 0xbc, 0x0c, 0x2b, 0x28, 0x5a,
10398
-+	0x65, 0xe7, 0x32, 0x17, 0x07, 0xa7, 0x67, 0xf2, 0x83, 0x3c, 0xe8, 0x62, 0x23, 0xe7, 0x97, 0xd4,
10399
-+	0x5f, 0x9c, 0x50, 0xa0, 0xf7, 0x46, 0xb4, 0xed, 0x84, 0xa4, 0x16, 0x06, 0x0d, 0xc2, 0x3b, 0xc3,
10400
-+	0x8d, 0xf2, 0x9f, 0xe0, 0xc1, 0x19, 0xe9, 0xbd, 0x51, 0xcf, 0x42, 0xc0, 0xd9, 0xf5, 0x50, 0x53,
10401
-+	0x4b, 0xff, 0x4c, 0xd9, 0xd0, 0x68, 0xfa, 0x52, 0x17, 0x33, 0xa6, 0x14, 0xcf, 0x9a, 0xac, 0x45,
10402
-+	0xa3, 0x38, 0xc2, 0x29, 0x9a, 0x33, 0xdf, 0x0e, 0x53, 0x1d, 0xf7, 0xc5, 0xb1, 0xe2, 0x82, 0xff,
10403
-+	0xc9, 0x00, 0x94, 0x95, 0x2a, 0x1c, 0xcd, 0x99, 0x2f, 0x1c, 0x17, 0xd3, 0x2f, 0x1c, 0xc3, 0x94,
10404
-+	0x23, 0xd7, 0x1f, 0x35, 0xd6, 0x0d, 0xa3, 0xbb, 0x42, 0x7e, 0x16, 0x2e, 0x9d, 0xa7, 0xee, 0xe9,
10405
-+	0x61, 0xa7, 0x69, 0x36, 0x8a, 0x7d, 0x3f, 0x95, 0x94, 0xba, 0x2a, 0x4b, 0xfa, 0x4c, 0x82, 0x4b,
10406
-+	0x85, 0xff, 0x56, 0xd0, 0x5c, 0xa9, 0xa5, 0xb3, 0x42, 0xd6, 0x68, 0x21, 0xe6, 0x30, 0x26, 0xbe,
10407
-+	0x51, 0xe6, 0x86, 0x89, 0x6f, 0x43, 0x8f, 0x28, 0xbe, 0x49, 0x02, 0x38, 0xa1, 0x85, 0x3c, 0x98,
10408
-+	0x6a, 0x98, 0x09, 0x3d, 0x95, 0x57, 0xdd, 0x53, 0x3d, 0x53, 0x6b, 0xb6, 0xb5, 0xec, 0x69, 0x8b,
10409
-+	0x69, 0x2a, 0xb8, 0x93, 0x30, 0x7a, 0x0d, 0x86, 0xdf, 0x0b, 0x22, 0xb6, 0xf9, 0xc4, 0x0d, 0x2f,
10410
-+	0xbd, 0x8f, 0x86, 0xdf, 0xbc, 0x5b, 0x67, 0xe5, 0x47, 0x07, 0x95, 0x91, 0x5a, 0xd0, 0x94, 0x7f,
10411
-+	0xb1, 0xaa, 0x80, 0x1e, 0xc2, 0x39, 0xe3, 0x5c, 0x54, 0xdd, 0x85, 0xfe, 0xbb, 0x7b, 0x59, 0x34,
10412
-+	0x77, 0x6e, 0x25, 0x8b, 0x12, 0xce, 0x6e, 0x80, 0x1e, 0x36, 0x7e, 0x20, 0x92, 0xe1, 0x4a, 0x2e,
10413
-+	0x82, 0x31, 0x0b, 0x65, 0xdd, 0xf7, 0x3c, 0x85, 0x80, 0x3b, 0xeb, 0xd8, 0x5f, 0xe3, 0x2f, 0x07,
10414
-+	0x42, 0xbf, 0x48, 0xa2, 0xb6, 0x77, 0x1a, 0xb9, 0x96, 0x96, 0x0c, 0xd5, 0xe7, 0x23, 0xbf, 0x4e,
10415
-+	0xfd, 0xa6, 0xc5, 0x5e, 0xa7, 0xd6, 0xc9, 0x6e, 0xcb, 0xa3, 0x52, 0xee, 0xe3, 0xef, 0xf8, 0x9b,
10416
-+	0x30, 0x1c, 0x8b, 0xd6, 0xba, 0xa5, 0x87, 0xd2, 0x3a, 0xc5, 0x5e, 0xe8, 0x14, 0x7f, 0x21, 0x4b,
10417
-+	0xb1, 0x22, 0x63, 0xff, 0x53, 0x3e, 0x03, 0x12, 0x72, 0x0a, 0x6a, 0xa8, 0xaa, 0xa9, 0x86, 0xaa,
10418
-+	0xf4, 0xf8, 0x82, 0x1c, 0x75, 0xd4, 0x3f, 0x31, 0xfb, 0xcd, 0x44, 0xb9, 0x8f, 0xfa, 0xb3, 0xa8,
10419
-+	0xfd, 0x63, 0x16, 0x9c, 0xcd, 0xb2, 0x4f, 0xa2, 0x3c, 0x21, 0x17, 0x24, 0xd5, 0x33, 0xb1, 0x1a,
10420
-+	0xc1, 0xfb, 0xa2, 0x1c, 0x2b, 0x8c, 0xbe, 0x33, 0x2f, 0x1c, 0x2f, 0x3c, 0xdb, 0x5d, 0x18, 0xab,
10421
-+	0x85, 0x44, 0xbb, 0x03, 0x5e, 0xe7, 0x6e, 0x6c, 0xbc, 0x3f, 0xcf, 0x1d, 0xdb, 0x85, 0xcd, 0xfe,
10422
-+	0xf9, 0x02, 0x9c, 0xe5, 0xef, 0x3c, 0xf3, 0x7b, 0x81, 0xdb, 0xac, 0x05, 0x4d, 0x91, 0x35, 0xe3,
10423
-+	0x6d, 0x18, 0x6d, 0x69, 0xd2, 0x7f, 0xb7, 0x00, 0x51, 0xba, 0x96, 0x20, 0x91, 0xc2, 0xf4, 0x52,
10424
-+	0x6c, 0xd0, 0x42, 0x4d, 0x18, 0x25, 0x7b, 0x6e, 0x43, 0x3d, 0x16, 0x14, 0x8e, 0x7d, 0x37, 0xa8,
10425
-+	0x56, 0x96, 0x34, 0x3a, 0xd8, 0xa0, 0xfa, 0x18, 0x12, 0xa9, 0xd9, 0x3f, 0x6e, 0xc1, 0x85, 0x9c,
10426
-+	0x70, 0x52, 0xb4, 0xb9, 0x07, 0xec, 0x45, 0x4d, 0xe4, 0x64, 0x52, 0xcd, 0xf1, 0x77, 0x36, 0x2c,
10427
-+	0xa0, 0xe8, 0xf3, 0x00, 0xfc, 0x9d, 0x8c, 0x0a, 0x25, 0xbd, 0xe2, 0xee, 0x18, 0x21, 0x43, 0xb4,
10428
-+	0x50, 0x0f, 0xb2, 0x3e, 0xd6, 0x68, 0xd9, 0x3f, 0x53, 0x84, 0x01, 0xf6, 0x2e, 0x83, 0x96, 0x61,
10429
-+	0x68, 0x9b, 0x07, 0x4f, 0xee, 0x27, 0x4e, 0x73, 0x22, 0xdd, 0xf1, 0x02, 0x2c, 0x2b, 0xa3, 0x55,
10430
-+	0x38, 0xc3, 0x83, 0x4f, 0x7b, 0x55, 0xe2, 0x39, 0xfb, 0x52, 0x49, 0xc0, 0xf3, 0x18, 0xa9, 0xb0,
10431
-+	0x15, 0x2b, 0x9d, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x1d, 0xc6, 0x63, 0x77, 0x97, 0x04, 0xed, 0x58,
10432
-+	0x52, 0xe2, 0x61, 0xa7, 0x15, 0x1b, 0xb7, 0x6e, 0x40, 0x71, 0x0a, 0x9b, 0x8a, 0x3b, 0xad, 0x0e,
10433
-+	0x75, 0xc8, 0x40, 0x22, 0xee, 0x98, 0x2a, 0x10, 0x13, 0x97, 0x19, 0x10, 0xb5, 0x99, 0xb9, 0xd4,
10434
-+	0xfa, 0x76, 0x48, 0xa2, 0xed, 0xc0, 0x6b, 0x8a, 0x34, 0xd8, 0x89, 0x01, 0x51, 0x0a, 0x8e, 0x3b,
10435
-+	0x6a, 0x50, 0x2a, 0x9b, 0x8e, 0xeb, 0xb5, 0x43, 0x92, 0x50, 0x19, 0x34, 0xa9, 0x2c, 0xa7, 0xe0,
10436
-+	0xb8, 0xa3, 0x06, 0x5d, 0x47, 0xe7, 0x44, 0x5e, 0x6a, 0xe9, 0x4c, 0xaf, 0xac, 0xc2, 0x86, 0xa4,
10437
-+	0x5b, 0x51, 0x97, 0x68, 0x32, 0xc2, 0x6e, 0x46, 0x65, 0xb6, 0xd6, 0xb4, 0x78, 0xc2, 0xa1, 0x48,
10438
-+	0x52, 0x79, 0x94, 0xec, 0xc8, 0xbf, 0x67, 0xc1, 0x99, 0x0c, 0xeb, 0x56, 0x7e, 0x54, 0x6d, 0xb9,
10439
-+	0x51, 0xac, 0x72, 0xb5, 0x68, 0x47, 0x15, 0x2f, 0xc7, 0x0a, 0x83, 0xee, 0x07, 0x7e, 0x18, 0xa6,
10440
-+	0x0f, 0x40, 0x61, 0xdd, 0x25, 0xa0, 0xc7, 0x3b, 0x00, 0xd1, 0x55, 0x28, 0xb5, 0x23, 0x22, 0xe3,
10441
-+	0x40, 0xa9, 0xf3, 0x9b, 0xe9, 0x75, 0x19, 0x84, 0xb2, 0xa6, 0x5b, 0x4a, 0xa5, 0xaa, 0xb1, 0xa6,
10442
-+	0x5c, 0x4f, 0xca, 0x61, 0xf6, 0x57, 0x8b, 0x70, 0x31, 0xd7, 0x8e, 0x9d, 0x76, 0x69, 0x37, 0xf0,
10443
-+	0xdd, 0x38, 0x50, 0x6f, 0x7e, 0x3c, 0x12, 0x09, 0x69, 0x6d, 0xaf, 0x8a, 0x72, 0xac, 0x30, 0xd0,
10444
-+	0x35, 0x99, 0x21, 0x3d, 0x9d, 0x8d, 0x66, 0xa1, 0x6a, 0x24, 0x49, 0xef, 0x37, 0xd3, 0xd7, 0x53,
10445
-+	0x50, 0x6a, 0x05, 0x81, 0x97, 0x3e, 0x8c, 0x68, 0x77, 0x83, 0xc0, 0xc3, 0x0c, 0x88, 0x3e, 0x21,
10446
-+	0xc6, 0x21, 0xf5, 0xc8, 0x85, 0x9d, 0x66, 0x10, 0x69, 0x83, 0xf1, 0x0c, 0x0c, 0xed, 0x90, 0xfd,
10447
-+	0xd0, 0xf5, 0xb7, 0xd2, 0x8f, 0x9f, 0xb7, 0x79, 0x31, 0x96, 0x70, 0x33, 0x19, 0xc3, 0xd0, 0x49,
10448
-+	0xa7, 0xe8, 0x1a, 0xee, 0x79, 0xb5, 0xfd, 0x50, 0x11, 0x26, 0xf0, 0x42, 0xf5, 0x5b, 0x13, 0x71,
10449
-+	0xaf, 0x73, 0x22, 0x4e, 0x3a, 0x45, 0x57, 0xef, 0xd9, 0xf8, 0x65, 0x0b, 0x26, 0x58, 0xc0, 0x62,
10450
-+	0x11, 0xff, 0xc2, 0x0d, 0xfc, 0x53, 0x60, 0xdd, 0x9e, 0x82, 0x81, 0x90, 0x36, 0x9a, 0xce, 0xbb,
10451
-+	0xc3, 0x7a, 0x82, 0x39, 0x0c, 0x5d, 0x82, 0x12, 0xeb, 0x02, 0x9d, 0xbc, 0x51, 0x9e, 0xb2, 0xa0,
10452
-+	0xea, 0xc4, 0x0e, 0x66, 0xa5, 0xcc, 0xa9, 0x1b, 0x93, 0x96, 0xe7, 0xf2, 0x4e, 0x27, 0x0f, 0x0a,
10453
-+	0x1f, 0x0d, 0xa7, 0xee, 0xcc, 0xae, 0x7d, 0x30, 0xa7, 0xee, 0x6c, 0x92, 0xdd, 0xc5, 0xa2, 0xff,
10454
-+	0x5e, 0x80, 0x2b, 0x99, 0xf5, 0xfa, 0x76, 0xea, 0xee, 0x5e, 0xfb, 0x64, 0x6c, 0x58, 0xb2, 0x4d,
10455
-+	0x4b, 0x8a, 0xa7, 0x68, 0x5a, 0x52, 0xea, 0x97, 0x73, 0x1c, 0xe8, 0xc3, 0xd7, 0x3a, 0x73, 0xc8,
10456
-+	0x3e, 0x22, 0xbe, 0xd6, 0x99, 0x7d, 0xcb, 0x11, 0xeb, 0xfe, 0xac, 0x90, 0xf3, 0x2d, 0x4c, 0xc0,
10457
-+	0xbb, 0x4e, 0xcf, 0x19, 0x06, 0x8c, 0x04, 0x27, 0x3c, 0xca, 0xcf, 0x18, 0x5e, 0x86, 0x15, 0x14,
10458
-+	0xb9, 0x9a, 0xd7, 0x72, 0x21, 0x3f, 0x2b, 0x63, 0x6e, 0x53, 0xb3, 0xe6, 0xfb, 0x8f, 0x1a, 0x82,
10459
-+	0x0c, 0x0f, 0xe6, 0x55, 0x4d, 0x28, 0x2f, 0xf6, 0x2f, 0x94, 0x8f, 0x66, 0x0b, 0xe4, 0x68, 0x1e,
10460
-+	0x26, 0x76, 0x5d, 0x9f, 0x65, 0xd9, 0x37, 0x59, 0x51, 0x15, 0xc4, 0x63, 0xd5, 0x04, 0xe3, 0x34,
10461
-+	0xfe, 0xcc, 0x6b, 0x30, 0xf6, 0xe8, 0xea, 0xc8, 0x6f, 0x16, 0xe1, 0x89, 0x2e, 0xdb, 0x9e, 0x9f,
10462
-+	0xf5, 0xc6, 0x1c, 0x68, 0x67, 0x7d, 0xc7, 0x3c, 0xd4, 0xe0, 0xec, 0x66, 0xdb, 0xf3, 0xf6, 0x99,
10463
-+	0xf5, 0x26, 0x69, 0x4a, 0x0c, 0xc1, 0x2b, 0x5e, 0x92, 0x49, 0x22, 0x96, 0x33, 0x70, 0x70, 0x66,
10464
-+	0x4d, 0xf4, 0x06, 0xa0, 0x40, 0xa4, 0x84, 0xbd, 0x49, 0x7c, 0xa1, 0x55, 0x67, 0x03, 0x5f, 0x4c,
10465
-+	0x36, 0xe3, 0xdd, 0x0e, 0x0c, 0x9c, 0x51, 0x8b, 0x32, 0xfd, 0xf4, 0x56, 0xda, 0x57, 0xdd, 0x4a,
10466
-+	0x31, 0xfd, 0x58, 0x07, 0x62, 0x13, 0x17, 0xdd, 0x84, 0x29, 0x67, 0xcf, 0x71, 0x79, 0x70, 0x3b,
10467
-+	0x49, 0x80, 0x73, 0xfd, 0x4a, 0x09, 0x36, 0x9f, 0x46, 0xc0, 0x9d, 0x75, 0x52, 0x6e, 0xd3, 0x83,
10468
-+	0xf9, 0x6e, 0xd3, 0xdd, 0xcf, 0xc5, 0x5e, 0x3a, 0x5d, 0xfb, 0x3f, 0x59, 0xf4, 0xfa, 0xca, 0x48,
10469
-+	0xeb, 0x4e, 0xc7, 0x41, 0xe9, 0x26, 0x35, 0x0f, 0xe6, 0x73, 0x9a, 0x7d, 0x46, 0x02, 0xc4, 0x26,
10470
-+	0x2e, 0x5f, 0x10, 0x51, 0xe2, 0xe2, 0x62, 0xb0, 0xee, 0x22, 0x44, 0x81, 0xc2, 0x40, 0x5f, 0x80,
10471
-+	0xa1, 0xa6, 0xbb, 0xe7, 0x46, 0x41, 0x28, 0x36, 0xcb, 0x31, 0x1d, 0x05, 0x92, 0x73, 0xb0, 0xca,
10472
-+	0xc9, 0x60, 0x49, 0xcf, 0xfe, 0xa1, 0x02, 0x8c, 0xc9, 0x16, 0xdf, 0x6c, 0x07, 0xb1, 0x73, 0x0a,
10473
-+	0xd7, 0xf2, 0x4d, 0xe3, 0x5a, 0xfe, 0x44, 0xb7, 0x38, 0x0d, 0xac, 0x4b, 0xb9, 0xd7, 0xf1, 0xdd,
10474
-+	0xd4, 0x75, 0xfc, 0x74, 0x6f, 0x52, 0xdd, 0xaf, 0xe1, 0x7f, 0x66, 0xc1, 0x94, 0x81, 0x7f, 0x0a,
10475
-+	0xb7, 0xc1, 0xb2, 0x79, 0x1b, 0x3c, 0xd9, 0xf3, 0x1b, 0x72, 0x6e, 0x81, 0xef, 0x2b, 0xa6, 0xfa,
10476
-+	0xce, 0x4e, 0xff, 0xf7, 0xa0, 0xb4, 0xed, 0x84, 0xcd, 0x6e, 0xf1, 0x60, 0x3b, 0x2a, 0xcd, 0xde,
10477
-+	0x72, 0xc2, 0x26, 0x3f, 0xc3, 0x9f, 0x53, 0x89, 0x24, 0x9d, 0xb0, 0xd9, 0xd3, 0xa3, 0x8b, 0x35,
10478
-+	0x85, 0x5e, 0x85, 0xc1, 0xa8, 0x11, 0xb4, 0x94, 0xbd, 0xe5, 0x55, 0x9e, 0x64, 0x92, 0x96, 0x1c,
10479
-+	0x1d, 0x54, 0x90, 0xd9, 0x1c, 0x2d, 0xc6, 0x02, 0x1f, 0xbd, 0x0d, 0x63, 0xec, 0x97, 0xb2, 0x3b,
10480
-+	0x28, 0xe6, 0x67, 0x21, 0xa8, 0xeb, 0x88, 0xdc, 0x7c, 0xc5, 0x28, 0xc2, 0x26, 0xa9, 0x99, 0x2d,
10481
-+	0x28, 0xab, 0xcf, 0x7a, 0xac, 0x9e, 0x38, 0xff, 0xbe, 0x08, 0x67, 0x32, 0xd6, 0x1c, 0x8a, 0x8c,
10482
-+	0x99, 0x78, 0xa1, 0xcf, 0xa5, 0xfa, 0x01, 0xe7, 0x22, 0x62, 0xd2, 0x50, 0x53, 0xac, 0xad, 0xbe,
10483
-+	0x1b, 0xbd, 0x17, 0x91, 0x74, 0xa3, 0xb4, 0xa8, 0x77, 0xa3, 0xb4, 0xb1, 0x53, 0x1b, 0x6a, 0xda,
10484
-+	0x90, 0xea, 0xe9, 0x63, 0x9d, 0xd3, 0x3f, 0x2e, 0xc2, 0xd9, 0xac, 0xd0, 0x31, 0xe8, 0xbb, 0x53,
10485
-+	0xd9, 0x66, 0x5e, 0xea, 0x37, 0xe8, 0x0c, 0x4f, 0x41, 0x23, 0x72, 0x27, 0xcf, 0x9a, 0xf9, 0x67,
10486
-+	0x7a, 0x0e, 0xb3, 0x68, 0x93, 0xb9, 0x6f, 0x86, 0x3c, 0x4b, 0x90, 0x3c, 0x3e, 0x3e, 0xdd, 0x77,
10487
-+	0x07, 0x44, 0x7a, 0xa1, 0x28, 0xe5, 0xbe, 0x29, 0x8b, 0x7b, 0xbb, 0x6f, 0xca, 0x96, 0x67, 0x5c,
10488
-+	0x18, 0xd1, 0xbe, 0xe6, 0xb1, 0xce, 0xf8, 0x0e, 0xbd, 0xad, 0xb4, 0x7e, 0x3f, 0xd6, 0x59, 0xff,
10489
-+	0x71, 0x0b, 0x52, 0xc6, 0x8d, 0x4a, 0xdd, 0x65, 0xe5, 0xaa, 0xbb, 0xae, 0x42, 0x29, 0x0c, 0x3c,
10490
-+	0x92, 0x4e, 0x00, 0x83, 0x03, 0x8f, 0x60, 0x06, 0xa1, 0x18, 0x71, 0xa2, 0xec, 0x18, 0xd5, 0x05,
10491
-+	0x39, 0x21, 0xa2, 0x3d, 0x05, 0x03, 0x1e, 0xd9, 0x23, 0x5e, 0x3a, 0xba, 0xfa, 0x1d, 0x5a, 0x88,
10492
-+	0x39, 0xcc, 0xfe, 0xe5, 0x12, 0x5c, 0xee, 0xea, 0x58, 0x4d, 0xc5, 0xa1, 0x2d, 0x27, 0x26, 0x0f,
10493
-+	0x9c, 0xfd, 0x74, 0x18, 0xe4, 0x9b, 0xbc, 0x18, 0x4b, 0x38, 0xb3, 0xf7, 0xe6, 0x61, 0x0f, 0x53,
10494
-+	0xca, 0x41, 0x11, 0xed, 0x50, 0x40, 0x1f, 0x43, 0xde, 0xf8, 0x1b, 0x00, 0x51, 0xe4, 0x2d, 0xf9,
10495
-+	0x94, 0xbb, 0x6b, 0x0a, 0x43, 0xf2, 0x24, 0x3c, 0x66, 0xfd, 0x8e, 0x80, 0x60, 0x0d, 0x0b, 0x55,
10496
-+	0x61, 0xb2, 0x15, 0x06, 0x31, 0xd7, 0xb5, 0x56, 0xb9, 0x99, 0xcf, 0x80, 0xe9, 0x7b, 0x5a, 0x4b,
10497
-+	0xc1, 0x71, 0x47, 0x0d, 0xf4, 0x32, 0x8c, 0x08, 0x7f, 0xd4, 0x5a, 0x10, 0x78, 0x42, 0x0d, 0xa4,
10498
-+	0x8c, 0x46, 0xea, 0x09, 0x08, 0xeb, 0x78, 0x5a, 0x35, 0xa6, 0xc0, 0x1d, 0xca, 0xac, 0xc6, 0x95,
10499
-+	0xb8, 0x1a, 0x5e, 0x2a, 0x8c, 0xd4, 0x70, 0x5f, 0x61, 0xa4, 0x12, 0xc5, 0x58, 0xb9, 0xef, 0x37,
10500
-+	0x2b, 0xe8, 0xa9, 0x4a, 0xfa, 0x85, 0x12, 0x9c, 0x11, 0x0b, 0xe7, 0x71, 0x2f, 0x97, 0xc7, 0x94,
10501
-+	0xdd, 0xfe, 0x5b, 0x6b, 0xe6, 0xb4, 0xd7, 0xcc, 0x0f, 0x5b, 0x60, 0xb2, 0x57, 0xe8, 0xff, 0xcb,
10502
-+	0x8d, 0x23, 0xff, 0x72, 0x2e, 0xbb, 0xd6, 0x94, 0x17, 0xc8, 0x07, 0x8c, 0x28, 0x6f, 0xff, 0x47,
10503
-+	0x0b, 0x9e, 0xec, 0x49, 0x11, 0x2d, 0x41, 0x99, 0xf1, 0x80, 0x9a, 0x74, 0xf6, 0xb4, 0x32, 0x03,
10504
-+	0x94, 0x80, 0x1c, 0x96, 0x34, 0xa9, 0x89, 0x96, 0x3a, 0x02, 0xf6, 0x3f, 0x93, 0x11, 0xb0, 0xff,
10505
-+	0x9c, 0x31, 0x3c, 0x8f, 0x18, 0xb1, 0xff, 0x6b, 0x45, 0x18, 0xe4, 0x2b, 0xfe, 0x14, 0xc4, 0xb0,
10506
-+	0x65, 0xa1, 0xb7, 0xed, 0x12, 0xa7, 0x8a, 0xf7, 0x65, 0xb6, 0xea, 0xc4, 0x0e, 0x67, 0x13, 0xd4,
10507
-+	0x6d, 0x95, 0x68, 0x78, 0xd1, 0xac, 0x71, 0x9f, 0xcd, 0xa4, 0x14, 0x93, 0xc0, 0x69, 0x68, 0xb7,
10508
-+	0xdb, 0x97, 0x00, 0x22, 0x96, 0xc8, 0x9e, 0xd2, 0x10, 0x11, 0xcf, 0x3e, 0xd9, 0xa5, 0xf5, 0xba,
10509
-+	0x42, 0xe6, 0x7d, 0x48, 0x76, 0xba, 0x02, 0x60, 0x8d, 0xe2, 0xcc, 0x2b, 0x50, 0x56, 0xc8, 0xbd,
10510
-+	0xb4, 0x38, 0xa3, 0x3a, 0x73, 0xf1, 0x39, 0x98, 0x48, 0xb5, 0x75, 0x2c, 0x25, 0xd0, 0xaf, 0x58,
10511
-+	0x30, 0xc1, 0xbb, 0xbc, 0xe4, 0xef, 0x89, 0x33, 0xf5, 0x7d, 0x38, 0xeb, 0x65, 0x9c, 0x6d, 0x62,
10512
-+	0x46, 0xfb, 0x3f, 0x0b, 0x95, 0xd2, 0x27, 0x0b, 0x8a, 0x33, 0xdb, 0x40, 0xd7, 0xe9, 0xba, 0xa5,
10513
-+	0x67, 0x97, 0xe3, 0x09, 0xdf, 0xa1, 0x51, 0xbe, 0x66, 0x79, 0x19, 0x56, 0x50, 0xfb, 0x77, 0x2c,
10514
-+	0x98, 0xe2, 0x3d, 0xbf, 0x4d, 0xf6, 0xd5, 0x0e, 0xff, 0x30, 0xfb, 0x2e, 0x72, 0x68, 0x14, 0x72,
10515
-+	0x72, 0x68, 0xe8, 0x9f, 0x56, 0xec, 0xfa, 0x69, 0x3f, 0x6f, 0x81, 0x58, 0x81, 0xa7, 0x20, 0xca,
10516
-+	0x7f, 0xbb, 0x29, 0xca, 0xcf, 0xe4, 0x2f, 0xea, 0x1c, 0x19, 0xfe, 0x4f, 0x2d, 0x98, 0xe4, 0x08,
10517
-+	0xc9, 0x5b, 0xf2, 0x87, 0x3a, 0x0f, 0xfd, 0x24, 0xc3, 0x53, 0xd9, 0xaf, 0xb3, 0x3f, 0xca, 0x98,
10518
-+	0xac, 0x52, 0xd7, 0xc9, 0x6a, 0xca, 0x0d, 0x74, 0x8c, 0x24, 0x8f, 0xc7, 0x8e, 0x45, 0x6d, 0xff,
10519
-+	0x91, 0x05, 0x88, 0x37, 0x63, 0xb0, 0x3f, 0x94, 0xa9, 0x60, 0xa5, 0xda, 0x75, 0x91, 0x1c, 0x35,
10520
-+	0x0a, 0x82, 0x35, 0xac, 0x13, 0x19, 0x9e, 0x94, 0x41, 0x40, 0xb1, 0xb7, 0x41, 0xc0, 0x31, 0x46,
10521
-+	0xf4, 0x6b, 0x25, 0x48, 0x1b, 0xf3, 0xa3, 0xfb, 0x30, 0xda, 0x70, 0x5a, 0xce, 0x86, 0xeb, 0xb9,
10522
-+	0xb1, 0x4b, 0xa2, 0x6e, 0x96, 0x44, 0x8b, 0x1a, 0x9e, 0x78, 0xea, 0xd5, 0x4a, 0xb0, 0x41, 0x07,
10523
-+	0xcd, 0x02, 0xb4, 0x42, 0x77, 0xcf, 0xf5, 0xc8, 0x16, 0xd3, 0x38, 0x30, 0x6f, 0x45, 0x6e, 0x1e,
10524
-+	0x23, 0x4b, 0xb1, 0x86, 0x91, 0xe1, 0x78, 0x56, 0x7c, 0x7c, 0x8e, 0x67, 0xa5, 0x63, 0x3a, 0x9e,
10525
-+	0x0d, 0xf4, 0xe5, 0x78, 0x86, 0xe1, 0xbc, 0x64, 0x91, 0xe8, 0xff, 0x65, 0xd7, 0x23, 0x82, 0x2f,
10526
-+	0xe6, 0x3e, 0x8c, 0x33, 0x87, 0x07, 0x95, 0xf3, 0x38, 0x13, 0x03, 0xe7, 0xd4, 0x44, 0x9f, 0x87,
10527
-+	0x69, 0xc7, 0xf3, 0x82, 0x07, 0x6a, 0xd4, 0x96, 0xa2, 0x86, 0xe3, 0x71, 0x8d, 0xfd, 0x10, 0xa3,
10528
-+	0x7a, 0xe9, 0xf0, 0xa0, 0x32, 0x3d, 0x9f, 0x83, 0x83, 0x73, 0x6b, 0xa7, 0xfc, 0xd6, 0x86, 0x7b,
10529
-+	0xf9, 0xad, 0xd9, 0x3b, 0x70, 0xa6, 0x4e, 0x42, 0x97, 0xa5, 0xa0, 0x6c, 0x26, 0x5b, 0x72, 0x1d,
10530
-+	0xca, 0x61, 0xea, 0x10, 0xea, 0x2b, 0xb0, 0x91, 0x16, 0x66, 0x57, 0x1e, 0x3a, 0x09, 0x21, 0xfb,
10531
-+	0x4f, 0x2c, 0x18, 0x12, 0x0e, 0x05, 0xa7, 0xc0, 0xfb, 0xcc, 0x1b, 0x2a, 0xe8, 0x4a, 0xf6, 0x41,
10532
-+	0xcd, 0x3a, 0x93, 0xab, 0x7c, 0x5e, 0x49, 0x29, 0x9f, 0x9f, 0xec, 0x46, 0xa4, 0xbb, 0xda, 0xf9,
10533
-+	0x6f, 0x15, 0x61, 0xdc, 0x74, 0xa6, 0x38, 0x85, 0x21, 0x58, 0x83, 0xa1, 0x48, 0x78, 0xee, 0x14,
10534
-+	0xf2, 0x6d, 0x9f, 0xd3, 0x93, 0x98, 0x18, 0x36, 0x09, 0x5f, 0x1d, 0x49, 0x24, 0xd3, 0x25, 0xa8,
10535
-+	0xf8, 0x18, 0x5d, 0x82, 0x7a, 0xf9, 0xb3, 0x94, 0x4e, 0xc2, 0x9f, 0xc5, 0xfe, 0x3a, 0xbb, 0x2c,
10536
-+	0xf4, 0xf2, 0x53, 0xe0, 0x23, 0x6e, 0x9a, 0xd7, 0x8a, 0xdd, 0x65, 0x65, 0x89, 0x4e, 0xe5, 0xf0,
10537
-+	0x13, 0xbf, 0x64, 0xc1, 0xe5, 0x8c, 0xaf, 0xd2, 0x98, 0x8b, 0xe7, 0x60, 0xd8, 0x69, 0x37, 0x5d,
10538
-+	0xb5, 0x97, 0xb5, 0x87, 0xa8, 0x79, 0x51, 0x8e, 0x15, 0x06, 0x5a, 0x84, 0x29, 0xf2, 0xb0, 0xe5,
10539
-+	0xf2, 0x97, 0x40, 0xdd, 0xfa, 0xb0, 0xc8, 0x43, 0xc8, 0x2e, 0xa5, 0x81, 0xb8, 0x13, 0x5f, 0xb9,
10540
-+	0x43, 0x17, 0x73, 0xdd, 0xa1, 0xff, 0xa1, 0x05, 0x23, 0xa2, 0xdb, 0xa7, 0x30, 0xda, 0xdf, 0x61,
10541
-+	0x8e, 0xf6, 0x13, 0x5d, 0x46, 0x3b, 0x67, 0x98, 0xff, 0x4e, 0x41, 0xf5, 0xb7, 0x16, 0x84, 0x71,
10542
-+	0x1f, 0x4c, 0xcb, 0xab, 0x30, 0xdc, 0x0a, 0x83, 0x38, 0x68, 0x04, 0x9e, 0xe0, 0x59, 0x2e, 0x25,
10543
-+	0xde, 0xfa, 0xbc, 0xfc, 0x48, 0xfb, 0x8d, 0x15, 0x36, 0x1b, 0xbd, 0x20, 0x8c, 0x05, 0x9f, 0x90,
10544
-+	0x8c, 0x5e, 0x10, 0xc6, 0x98, 0x41, 0x50, 0x13, 0x20, 0x76, 0xc2, 0x2d, 0x12, 0xd3, 0x32, 0x11,
10545
-+	0xf8, 0x23, 0xff, 0xf0, 0x68, 0xc7, 0xae, 0x37, 0xeb, 0xfa, 0x71, 0x14, 0x87, 0xb3, 0x2b, 0x7e,
10546
-+	0x7c, 0x37, 0xe4, 0x22, 0x90, 0xe6, 0x7e, 0xaf, 0x68, 0x61, 0x8d, 0xae, 0xf4, 0x91, 0x64, 0x6d,
10547
-+	0x0c, 0x98, 0x4f, 0xda, 0x6b, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x15, 0x76, 0x95, 0xb0, 0x01, 0x3a,
10548
-+	0x9e, 0x67, 0xfc, 0x37, 0x86, 0xd5, 0xd0, 0xb2, 0xf7, 0xac, 0xaa, 0xee, 0x7f, 0xdf, 0xfd, 0xe4,
10549
-+	0xa6, 0x0d, 0xeb, 0x9e, 0x30, 0x89, 0x93, 0x3e, 0xfa, 0xce, 0x0e, 0x4b, 0x87, 0xe7, 0x7b, 0x5c,
10550
-+	0x01, 0xc7, 0xb0, 0x6d, 0x60, 0x61, 0xad, 0x59, 0xf8, 0xdf, 0x95, 0x9a, 0x58, 0xe4, 0x5a, 0x58,
10551
-+	0x6b, 0x01, 0xc0, 0x09, 0x0e, 0x9a, 0x13, 0x02, 0x74, 0xc9, 0xc8, 0x3e, 0x27, 0x05, 0x68, 0xf9,
10552
-+	0xf9, 0x9a, 0x04, 0xfd, 0x02, 0x8c, 0xa8, 0x2c, 0x74, 0x35, 0x9e, 0xcc, 0x4b, 0x84, 0x41, 0x59,
10553
-+	0x4a, 0x8a, 0xb1, 0x8e, 0x83, 0xd6, 0x61, 0x22, 0xe2, 0xda, 0x13, 0x15, 0xed, 0x8e, 0x6b, 0xa1,
10554
-+	0x3e, 0x29, 0x2d, 0x24, 0xea, 0x26, 0xf8, 0x88, 0x15, 0xf1, 0xa3, 0x43, 0x3a, 0x3a, 0xa6, 0x49,
10555
-+	0xa0, 0xd7, 0x61, 0xdc, 0xd3, 0x73, 0xb9, 0xd7, 0x84, 0x92, 0x4a, 0x19, 0x10, 0x1b, 0x99, 0xde,
10556
-+	0x6b, 0x38, 0x85, 0x4d, 0x79, 0x1d, 0xbd, 0x44, 0x44, 0x68, 0x74, 0xfc, 0x2d, 0x12, 0x89, 0x1c,
10557
-+	0x5a, 0x8c, 0xd7, 0xb9, 0x93, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0x57, 0x61, 0x54, 0x7e, 0xbe, 0xe6,
10558
-+	0xc6, 0x9b, 0x98, 0xa9, 0x6b, 0x30, 0x6c, 0x60, 0xa2, 0x07, 0x70, 0x4e, 0xfe, 0x5f, 0x0f, 0x9d,
10559
-+	0xcd, 0x4d, 0xb7, 0x21, 0xbc, 0xa8, 0xb9, 0xaf, 0xce, 0xbc, 0x74, 0xfe, 0x59, 0xca, 0x42, 0x3a,
10560
-+	0x3a, 0xa8, 0x5c, 0x15, 0xa3, 0x96, 0x09, 0x67, 0x93, 0x98, 0x4d, 0x1f, 0xad, 0xc2, 0x99, 0x6d,
10561
-+	0xe2, 0x78, 0xf1, 0xf6, 0xe2, 0x36, 0x69, 0xec, 0xc8, 0x4d, 0xc4, 0x9c, 0x83, 0x35, 0xe3, 0xee,
10562
-+	0x5b, 0x9d, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x07, 0xa6, 0x5b, 0xed, 0x0d, 0xcf, 0x8d, 0xb6, 0xd7,
10563
-+	0x82, 0x98, 0x19, 0x65, 0xa8, 0x24, 0x6e, 0xc2, 0x8b, 0x58, 0x39, 0x46, 0xd7, 0x72, 0xf0, 0x70,
10564
-+	0x2e, 0x05, 0xf4, 0x3e, 0x9c, 0x4b, 0x2d, 0x06, 0xe1, 0xd3, 0x38, 0x9e, 0x1f, 0xb6, 0xb4, 0x9e,
10565
-+	0x55, 0x41, 0xf8, 0x28, 0x66, 0x81, 0x70, 0x76, 0x13, 0x1f, 0xcc, 0x54, 0xe7, 0x3d, 0x5a, 0x59,
10566
-+	0x63, 0xca, 0xd0, 0x97, 0x61, 0x54, 0x5f, 0x45, 0xe2, 0x82, 0xb9, 0x96, 0xcd, 0xb3, 0x68, 0xab,
10567
-+	0x8d, 0xb3, 0x74, 0x6a, 0x45, 0xe9, 0x30, 0x6c, 0x50, 0xb4, 0x09, 0x64, 0x7f, 0x1f, 0xba, 0x03,
10568
-+	0xc3, 0x0d, 0xcf, 0x25, 0x7e, 0xbc, 0x52, 0xeb, 0x16, 0x74, 0x63, 0x51, 0xe0, 0x88, 0x01, 0x13,
10569
-+	0x01, 0x42, 0x79, 0x19, 0x56, 0x14, 0xec, 0xdf, 0x28, 0x40, 0xa5, 0x47, 0x14, 0xdb, 0x94, 0x46,
10570
-+	0xd9, 0xea, 0x4b, 0xa3, 0x3c, 0x2f, 0x53, 0xd2, 0xad, 0xa5, 0xc4, 0xec, 0x54, 0xba, 0xb9, 0x44,
10571
-+	0xd8, 0x4e, 0xe3, 0xf7, 0x6d, 0xe1, 0xab, 0x2b, 0xa5, 0x4b, 0x3d, 0x6d, 0xcf, 0x8d, 0xc7, 0xa8,
10572
-+	0x81, 0xfe, 0x05, 0x91, 0xdc, 0x87, 0x05, 0xfb, 0xeb, 0x05, 0x38, 0xa7, 0x86, 0xf0, 0x2f, 0xee,
10573
-+	0xc0, 0xdd, 0xeb, 0x1c, 0xb8, 0x13, 0x78, 0x96, 0xb1, 0xef, 0xc2, 0x20, 0x0f, 0x5a, 0xd2, 0x07,
10574
-+	0x03, 0xf4, 0x94, 0x19, 0xe1, 0x4a, 0x5d, 0xd3, 0x46, 0x94, 0xab, 0xbf, 0x62, 0xc1, 0xc4, 0xfa,
10575
-+	0x62, 0xad, 0x1e, 0x34, 0x76, 0x48, 0x3c, 0xcf, 0x19, 0x56, 0x2c, 0xf8, 0x1f, 0xeb, 0x11, 0xf9,
10576
-+	0x9a, 0x2c, 0x8e, 0xe9, 0x2a, 0x94, 0xb6, 0x83, 0x28, 0x4e, 0xbf, 0xd9, 0xde, 0x0a, 0xa2, 0x18,
10577
-+	0x33, 0x88, 0xfd, 0xbb, 0x16, 0x0c, 0xb0, 0x44, 0xaa, 0xbd, 0xb2, 0xfb, 0xf6, 0xf3, 0x5d, 0xe8,
10578
-+	0x65, 0x18, 0x24, 0x9b, 0x9b, 0xa4, 0x11, 0x8b, 0x59, 0x95, 0x0e, 0xa5, 0x83, 0x4b, 0xac, 0x94,
10579
-+	0x5e, 0xfa, 0xac, 0x31, 0xfe, 0x17, 0x0b, 0x64, 0xf4, 0x16, 0x94, 0x63, 0x77, 0x97, 0xcc, 0x37,
10580
-+	0x9b, 0xe2, 0xd5, 0xeb, 0x11, 0xfc, 0x77, 0xd7, 0x25, 0x01, 0x9c, 0xd0, 0xb2, 0xbf, 0x5a, 0x00,
10581
-+	0x48, 0x5c, 0xef, 0x7b, 0x7d, 0xe2, 0x42, 0xc7, 0x7b, 0xc8, 0xb5, 0x8c, 0xf7, 0x10, 0x94, 0x10,
10582
-+	0xcc, 0x78, 0x0c, 0x51, 0xc3, 0x54, 0xec, 0x6b, 0x98, 0x4a, 0xc7, 0x19, 0xa6, 0x45, 0x98, 0x4a,
10583
-+	0x42, 0x07, 0x98, 0x71, 0x54, 0x98, 0x90, 0xb2, 0x9e, 0x06, 0xe2, 0x4e, 0x7c, 0x9b, 0xc0, 0x55,
10584
-+	0x19, 0xd1, 0x52, 0xde, 0x35, 0xcc, 0xa8, 0xf2, 0x18, 0x89, 0x9e, 0x93, 0x07, 0x9f, 0x42, 0xee,
10585
-+	0x83, 0xcf, 0x4f, 0x59, 0x70, 0x36, 0xdd, 0x0e, 0xf3, 0x5e, 0xfb, 0x01, 0x0b, 0xce, 0xb1, 0x67,
10586
-+	0x2f, 0xd6, 0x6a, 0xe7, 0x23, 0xdb, 0x4b, 0xd9, 0x21, 0x15, 0xba, 0xf7, 0x38, 0xf1, 0x5c, 0x5e,
10587
-+	0xcd, 0x22, 0x8d, 0xb3, 0x5b, 0xb4, 0xbf, 0xdf, 0x02, 0xe1, 0x24, 0xd4, 0xc7, 0xc6, 0x7e, 0x5b,
10588
-+	0xa6, 0x42, 0x35, 0x02, 0x78, 0x5f, 0xcd, 0xf7, 0x9a, 0x12, 0x61, 0xbb, 0xd5, 0x45, 0x6a, 0x04,
10589
-+	0xeb, 0x36, 0x68, 0xd9, 0x4d, 0x10, 0xd0, 0x2a, 0x61, 0x7a, 0xa2, 0xde, 0xbd, 0xb9, 0x01, 0xd0,
10590
-+	0x64, 0xb8, 0x5a, 0x42, 0x44, 0x75, 0x6c, 0x57, 0x15, 0x04, 0x6b, 0x58, 0xf6, 0x8f, 0x14, 0x60,
10591
-+	0x44, 0x06, 0x8c, 0x6e, 0xfb, 0xfd, 0x48, 0x73, 0xc7, 0xca, 0x4b, 0xc3, 0x32, 0x88, 0x52, 0xc2,
10592
-+	0xb5, 0x44, 0x08, 0x4e, 0x32, 0x88, 0x4a, 0x00, 0x4e, 0x70, 0xd0, 0x33, 0x30, 0x14, 0xb5, 0x37,
10593
-+	0x18, 0x7a, 0xca, 0xf5, 0xa5, 0xce, 0x8b, 0xb1, 0x84, 0xa3, 0xcf, 0xc3, 0x24, 0xaf, 0x17, 0x06,
10594
-+	0x2d, 0x67, 0x8b, 0x2b, 0x0d, 0x07, 0x94, 0x2f, 0xea, 0xe4, 0x6a, 0x0a, 0x76, 0x74, 0x50, 0x39,
10595
-+	0x9b, 0x2e, 0x63, 0xea, 0xe6, 0x0e, 0x2a, 0xf6, 0x97, 0x01, 0x75, 0xc6, 0xc0, 0x46, 0x6f, 0x70,
10596
-+	0x03, 0x24, 0x37, 0x24, 0xcd, 0x6e, 0x7a, 0x64, 0xdd, 0x75, 0x52, 0x9a, 0x9f, 0xf3, 0x5a, 0x58,
10597
-+	0xd5, 0xb7, 0xff, 0x5a, 0x11, 0x26, 0xd3, 0x8e, 0x74, 0xe8, 0x16, 0x0c, 0xf2, 0x0b, 0x46, 0x90,
10598
-+	0xef, 0xf2, 0x4c, 0xa9, 0xb9, 0xdf, 0xb1, 0xad, 0x26, 0xee, 0x28, 0x51, 0x1f, 0xbd, 0x03, 0x23,
10599
-+	0xcd, 0xe0, 0x81, 0xff, 0xc0, 0x09, 0x9b, 0xf3, 0xb5, 0x15, 0xb1, 0x2e, 0x33, 0xf9, 0xd4, 0x6a,
10600
-+	0x82, 0xa6, 0xbb, 0xf4, 0x31, 0x95, 0x7c, 0x02, 0xc2, 0x3a, 0x39, 0xb4, 0xce, 0xe2, 0xfa, 0x6d,
10601
-+	0xba, 0x5b, 0xab, 0x4e, 0xab, 0x9b, 0x35, 0xea, 0xa2, 0x44, 0xd2, 0x28, 0x8f, 0x89, 0xe0, 0x7f,
10602
-+	0x1c, 0x80, 0x13, 0x42, 0xe8, 0xbb, 0xe1, 0x4c, 0x94, 0xa3, 0xda, 0xca, 0x4b, 0xb5, 0xd0, 0x4d,
10603
-+	0xdb, 0xb3, 0x70, 0x81, 0x4a, 0x10, 0x59, 0x4a, 0xb0, 0xac, 0x66, 0xec, 0xc3, 0x33, 0x60, 0xec,
10604
-+	0x46, 0x23, 0xef, 0x8e, 0x75, 0x42, 0x79, 0x77, 0x30, 0x0c, 0x93, 0xdd, 0x56, 0xbc, 0x5f, 0x75,
10605
-+	0xc3, 0x6e, 0x89, 0xdb, 0x96, 0x04, 0x4e, 0x27, 0x4d, 0x09, 0xc1, 0x8a, 0x4e, 0x76, 0x72, 0xa4,
10606
-+	0xe2, 0x87, 0x98, 0x1c, 0xa9, 0x74, 0x8a, 0xc9, 0x91, 0xd6, 0x60, 0x68, 0xcb, 0x8d, 0x31, 0x69,
10607
-+	0x05, 0x82, 0xb5, 0xcb, 0x5c, 0x87, 0x37, 0x39, 0x4a, 0x67, 0x22, 0x0e, 0x01, 0xc0, 0x92, 0x08,
10608
-+	0x7a, 0x43, 0xed, 0xc0, 0xc1, 0x7c, 0xc9, 0xa8, 0xf3, 0x3d, 0x2d, 0x73, 0x0f, 0x8a, 0x64, 0x48,
10609
-+	0x43, 0x8f, 0x9a, 0x0c, 0x69, 0x59, 0xa6, 0x30, 0x1a, 0xce, 0x37, 0x1d, 0x67, 0x19, 0x8a, 0x7a,
10610
-+	0x24, 0x2e, 0x32, 0x92, 0x3d, 0x95, 0x4f, 0x2e, 0xd9, 0xd3, 0xf7, 0x5b, 0x70, 0xae, 0x95, 0x95,
10611
-+	0xf7, 0x4c, 0x24, 0x1e, 0x7a, 0xb9, 0xef, 0xc4, 0x6e, 0x46, 0x83, 0x4c, 0x44, 0xce, 0x44, 0xc3,
10612
-+	0xd9, 0xcd, 0xd1, 0x81, 0x0e, 0x37, 0x9a, 0x22, 0x5b, 0xd1, 0x53, 0x39, 0x59, 0xa3, 0xba, 0xe4,
10613
-+	0x8a, 0x5a, 0xcf, 0xc8, 0x50, 0xf4, 0xf1, 0xbc, 0x0c, 0x45, 0x7d, 0xe7, 0x25, 0x7a, 0x43, 0xe5,
10614
-+	0x8b, 0x1a, 0xcb, 0x5f, 0x4a, 0x3c, 0x1b, 0x54, 0xcf, 0x2c, 0x51, 0x6f, 0xa8, 0x2c, 0x51, 0x5d,
10615
-+	0xe2, 0x9b, 0xf1, 0x1c, 0x50, 0x3d, 0x73, 0x43, 0x69, 0xf9, 0x9d, 0x26, 0x4e, 0x26, 0xbf, 0x93,
10616
-+	0x71, 0xd5, 0x74, 0x49, 0x30, 0xa4, 0xdd, 0x27, 0x9d, 0x09, 0x86, 0x72, 0x2f, 0x1b, 0x9e, 0xcb,
10617
-+	0x6a, 0xea, 0x91, 0x72, 0x59, 0xdd, 0xd7, 0x73, 0x43, 0xa1, 0x1e, 0x39, 0x66, 0x28, 0x52, 0x9f,
10618
-+	0x19, 0xa1, 0xee, 0xeb, 0x17, 0xe0, 0x99, 0x7c, 0xba, 0xea, 0x9e, 0xeb, 0xa4, 0x9b, 0x79, 0x05,
10619
-+	0x76, 0x64, 0x9a, 0x3a, 0x7b, 0x3a, 0x99, 0xa6, 0xce, 0x3d, 0x86, 0x4c, 0x53, 0xe7, 0x4f, 0x2d,
10620
-+	0xd3, 0xd4, 0x85, 0x0f, 0x35, 0xd3, 0xd4, 0xf4, 0x63, 0xc8, 0x34, 0xb5, 0x96, 0x64, 0x9a, 0xba,
10621
-+	0x98, 0x3f, 0x35, 0x19, 0x76, 0xad, 0x39, 0xf9, 0xa5, 0xee, 0x43, 0xb9, 0x25, 0x23, 0x3e, 0x88,
10622
-+	0x40, 0x6c, 0xd9, 0x49, 0x6f, 0xb3, 0xc2, 0x42, 0xf0, 0xf5, 0xaa, 0x40, 0x38, 0x21, 0x45, 0xe9,
10623
-+	0x26, 0xf9, 0xa6, 0x9e, 0xe8, 0xa2, 0x0c, 0xcd, 0x52, 0x33, 0x75, 0xc9, 0x32, 0x65, 0xe4, 0x86,
10624
-+	0xba, 0x74, 0x72, 0xb9, 0xa1, 0xfe, 0x6a, 0x01, 0xae, 0x74, 0xdf, 0x37, 0x89, 0xee, 0xab, 0x96,
10625
-+	0xbc, 0xd5, 0xa4, 0x74, 0x5f, 0x5c, 0x88, 0x4a, 0xb0, 0xfa, 0x0e, 0xb7, 0x73, 0x13, 0xa6, 0x94,
10626
-+	0xa1, 0xac, 0xe7, 0x36, 0xf6, 0xb5, 0x24, 0xbb, 0xca, 0x21, 0xb0, 0x9e, 0x46, 0xc0, 0x9d, 0x75,
10627
-+	0xd0, 0x3c, 0x4c, 0x18, 0x85, 0x2b, 0x55, 0x21, 0x2c, 0x29, 0x65, 0x5b, 0xdd, 0x04, 0xe3, 0x34,
10628
-+	0xbe, 0xfd, 0x73, 0x16, 0x5c, 0xc8, 0x49, 0xc2, 0xd0, 0x77, 0x34, 0x99, 0x4d, 0x98, 0x68, 0x99,
10629
-+	0x55, 0x7b, 0x04, 0x9d, 0x32, 0x52, 0x3d, 0xa8, 0xbe, 0xa6, 0x00, 0x38, 0x4d, 0x74, 0xe1, 0xfa,
10630
-+	0x6f, 0xfd, 0xfe, 0x95, 0x8f, 0xfd, 0xf6, 0xef, 0x5f, 0xf9, 0xd8, 0xef, 0xfc, 0xfe, 0x95, 0x8f,
10631
-+	0xfd, 0xff, 0x87, 0x57, 0xac, 0xdf, 0x3a, 0xbc, 0x62, 0xfd, 0xf6, 0xe1, 0x15, 0xeb, 0x77, 0x0e,
10632
-+	0xaf, 0x58, 0xbf, 0x77, 0x78, 0xc5, 0xfa, 0xea, 0x1f, 0x5c, 0xf9, 0xd8, 0xdb, 0x85, 0xbd, 0x17,
10633
-+	0xfe, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x60, 0x08, 0xf7, 0x9c, 0xf8, 0xe6, 0x00, 0x00,
10634
- }
10635
-diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go
10636
-index d9f4869..5417d75 100644
10637
-+++ b/staging/src/k8s.io/api/core/v1/types.go
10638
-@@ -133,9 +133,9 @@ type VolumeSource struct {
10639
- 	// Quobyte represents a Quobyte mount on the host that shares a pod's lifetime
10640
- 	// +optional
10641
- 	Quobyte *QuobyteVolumeSource `json:"quobyte,omitempty" protobuf:"bytes,21,opt,name=quobyte"`
10642
--	// AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
10643
-+	// CascadeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine
10644
- 	// +optional
10645
--	AzureDisk *AzureDiskVolumeSource `json:"azureDisk,omitempty" protobuf:"bytes,22,opt,name=azureDisk"`
10646
-+	CascadeDisk *CascadeDiskVolumeSource `json:"vkeDisk,omitempty" protobuf:"bytes,22,opt,name=cascadeDisk"`
10647
- 	// PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine
10648
- 	PhotonPersistentDisk *PhotonPersistentDiskVolumeSource `json:"photonPersistentDisk,omitempty" protobuf:"bytes,23,opt,name=photonPersistentDisk"`
10649
- 	// Items for all in one resources secrets, configmaps, and downward API
10650
-@@ -149,6 +149,9 @@ type VolumeSource struct {
10651
- 	// StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes.
10652
- 	// +optional
10653
- 	StorageOS *StorageOSVolumeSource `json:"storageos,omitempty" protobuf:"bytes,27,opt,name=storageos"`
10654
-+	// AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
10655
-+	// +optional
10656
-+	AzureDisk *AzureDiskVolumeSource `json:"azureDisk,omitempty" protobuf:"bytes,28,opt,name=azureDisk"`
10657
- }
10658
- 
10659
- // PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace.
10660
-@@ -228,9 +231,9 @@ type PersistentVolumeSource struct {
10661
- 	// Quobyte represents a Quobyte mount on the host that shares a pod's lifetime
10662
- 	// +optional
10663
- 	Quobyte *QuobyteVolumeSource `json:"quobyte,omitempty" protobuf:"bytes,15,opt,name=quobyte"`
10664
--	// AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
10665
-+	// CascadeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine
10666
- 	// +optional
10667
--	AzureDisk *AzureDiskVolumeSource `json:"azureDisk,omitempty" protobuf:"bytes,16,opt,name=azureDisk"`
10668
-+	CascadeDisk *CascadeDiskVolumeSource `json:"vkeDisk,omitempty" protobuf:"bytes,16,opt,name=cascadeDisk"`
10669
- 	// PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine
10670
- 	PhotonPersistentDisk *PhotonPersistentDiskVolumeSource `json:"photonPersistentDisk,omitempty" protobuf:"bytes,17,opt,name=photonPersistentDisk"`
10671
- 	// PortworxVolume represents a portworx volume attached and mounted on kubelets host machine
10672
-@@ -249,6 +252,9 @@ type PersistentVolumeSource struct {
10673
- 	// CSI represents storage that handled by an external CSI driver (Beta feature).
10674
- 	// +optional
10675
- 	CSI *CSIPersistentVolumeSource `json:"csi,omitempty" protobuf:"bytes,22,opt,name=csi"`
10676
-+	// AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
10677
-+	// +optional
10678
-+	AzureDisk *AzureDiskVolumeSource `json:"azureDisk,omitempty" protobuf:"bytes,23,opt,name=azureDisk"`
10679
- }
10680
- 
10681
- const (
10682
-@@ -1446,6 +1452,16 @@ type StorageOSPersistentVolumeSource struct {
10683
- 	SecretRef *ObjectReference `json:"secretRef,omitempty" protobuf:"bytes,5,opt,name=secretRef"`
10684
- }
10685
- 
10686
-+// Represents a Photon Controller persistent disk resource.
10687
-+type CascadeDiskVolumeSource struct {
10688
-+	// ID that identifies Cascade persistent disk
10689
-+	DiskID string `json:"diskID" protobuf:"bytes,1,opt,name=diskID"`
10690
-+	// Filesystem type to mount.
10691
-+	// Must be a filesystem type supported by the host operating system.
10692
-+	// Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
10693
-+	FSType string `json:"fsType,omitempty" protobuf:"bytes,2,opt,name=fsType"`
10694
-+}
10695
-+
10696
- // Adapts a ConfigMap into a volume.
10697
- //
10698
- // The contents of the target ConfigMap's Data field will be presented in a
10699
-2.7.4
10700
-
10701 1
deleted file mode 100644
... ...
@@ -1,239 +0,0 @@
1
-%ifarch x86_64
2
-%define archname amd64
3
-%endif
4
-%ifarch aarch64
5
-%define archname arm64
6
-%endif
7
-
8
-Summary:        Kubernetes cluster management
9
-Name:           kubernetes
10
-Version:        1.11.3
11
-Release:        3%{?dist}
12
-License:        ASL 2.0
13
-URL:            https://github.com/kubernetes/kubernetes/archive/v%{version}.tar.gz
14
-Source0:        kubernetes-%{version}.tar.gz
15
-%define sha1    kubernetes-%{version}.tar.gz=60914656f6204ad95555b767181648eeef899dc0
16
-Source1:        https://github.com/kubernetes/contrib/archive/contrib-0.7.0.tar.gz
17
-%define sha1    contrib-0.7.0=47a744da3b396f07114e518226b6313ef4b2203c
18
-Patch0:         k8s-1.11-vke.patch
19
-Patch1:         go-27704.patch
20
-Patch2:         go-27842.patch
21
-Group:          Development/Tools
22
-Vendor:         VMware, Inc.
23
-Distribution:   Photon
24
-BuildRequires:  go >= 1.10
25
-BuildRequires:  rsync
26
-BuildRequires:  which
27
-Requires:       cni
28
-Requires:       ebtables
29
-Requires:       etcd >= 3.0.4
30
-Requires:       ethtool
31
-Requires:       iptables
32
-Requires:       iproute2
33
-Requires(pre):  /usr/sbin/useradd /usr/sbin/groupadd
34
-Requires(postun):/usr/sbin/userdel /usr/sbin/groupdel
35
-Requires:       socat
36
-Requires:       (util-linux or toybox)
37
-Requires:       cri-tools
38
-
39
-%description
40
-Kubernetes is an open source implementation of container cluster management.
41
-
42
-%package        kubeadm
43
-Summary:        kubeadm deployment tool
44
-Group:          Development/Tools
45
-Requires:       %{name} = %{version}
46
-%description    kubeadm
47
-kubeadm is a tool that enables quick and easy deployment of a kubernetes cluster.
48
-
49
-%package	kubectl-extras
50
-Summary:	kubectl binaries for extra platforms
51
-Group:		Development/Tools
52
-%description	kubectl-extras
53
-Contains kubectl binaries for additional platforms.
54
-
55
-%package        pause
56
-Summary:        pause binary
57
-Group:          Development/Tools
58
-%description    pause
59
-A pod setup process that holds a pod's namespace.
60
-
61
-%prep -p exit
62
-%setup -qn %{name}-%{version}
63
-cd ..
64
-tar xf %{SOURCE1} --no-same-owner
65
-sed -i -e 's|127.0.0.1:4001|127.0.0.1:2379|g' contrib-0.7.0/init/systemd/environ/apiserver
66
-cd %{name}-%{version}
67
-%patch0 -p1
68
-
69
-pushd vendor/golang.org/x/net
70
-%patch1 -p1
71
-%patch2 -p1
72
-popd
73
-
74
-%build
75
-make
76
-pushd build/pause
77
-mkdir -p bin
78
-gcc -Os -Wall -Werror -static -o bin/pause-%{archname} pause.c
79
-strip bin/pause-%{archname}
80
-popd
81
-
82
-%ifarch x86_64
83
-make WHAT="cmd/kubectl" KUBE_BUILD_PLATFORMS="darwin/%{archname} windows/%{archname}"
84
-%endif
85
-
86
-%install
87
-install -vdm644 %{buildroot}/etc/profile.d
88
-install -m 755 -d %{buildroot}%{_bindir}
89
-install -m 755 -d %{buildroot}/opt/vmware/kubernetes
90
-install -m 755 -d %{buildroot}/opt/vmware/kubernetes/linux/%{archname}
91
-%ifarch x86_64
92
-install -m 755 -d %{buildroot}/opt/vmware/kubernetes/darwin/%{archname}
93
-install -m 755 -d %{buildroot}/opt/vmware/kubernetes/windows/%{archname}
94
-%endif
95
-
96
-binaries=(cloud-controller-manager hyperkube kube-aggregator kube-apiserver kube-controller-manager kubelet kube-proxy kube-scheduler kubectl)
97
-for bin in "${binaries[@]}"; do
98
-  echo "+++ INSTALLING ${bin}"
99
-  install -p -m 755 -t %{buildroot}%{_bindir} _output/local/bin/linux/%{archname}/${bin}
100
-done
101
-install -p -m 755 -t %{buildroot}%{_bindir} build/pause/bin/pause-%{archname}
102
-
103
-# kubectl-extras
104
-install -p -m 755 -t %{buildroot}/opt/vmware/kubernetes/linux/%{archname}/ _output/local/bin/linux/%{archname}/kubectl
105
-%ifarch x86_64
106
-install -p -m 755 -t %{buildroot}/opt/vmware/kubernetes/darwin/%{archname}/ _output/local/bin/darwin/%{archname}/kubectl
107
-install -p -m 755 -t %{buildroot}/opt/vmware/kubernetes/windows/%{archname}/ _output/local/bin/windows/%{archname}/kubectl.exe
108
-%endif
109
-
110
-# kubeadm install
111
-install -vdm644 %{buildroot}/etc/systemd/system/kubelet.service.d
112
-install -p -m 755 -t %{buildroot}%{_bindir} _output/local/bin/linux/%{archname}/kubeadm
113
-install -p -m 755 -t %{buildroot}/etc/systemd/system build/rpms/kubelet.service
114
-install -p -m 755 -t %{buildroot}/etc/systemd/system/kubelet.service.d build/rpms/10-kubeadm.conf
115
-sed -i '/KUBELET_CGROUP_ARGS=--cgroup-driver=systemd/d' %{buildroot}/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
116
-
117
-cd ..
118
-# install config files
119
-install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}
120
-install -m 644 -t %{buildroot}%{_sysconfdir}/%{name} contrib-0.7.0/init/systemd/environ/*
121
-cat << EOF >> %{buildroot}%{_sysconfdir}/%{name}/kubeconfig
122
-apiVersion: v1
123
-clusters:
124
-- cluster:
125
-    server: http://127.0.0.1:8080
126
-EOF
127
-sed -i '/KUBELET_API_SERVER/c\KUBELET_API_SERVER="--kubeconfig=/etc/kubernetes/kubeconfig"' %{buildroot}%{_sysconfdir}/%{name}/kubelet
128
-
129
-# install service files
130
-install -d -m 0755 %{buildroot}/usr/lib/systemd/system
131
-install -m 0644 -t %{buildroot}/usr/lib/systemd/system contrib-0.7.0/init/systemd/*.service
132
-
133
-# install the place the kubelet defaults to put volumes
134
-install -dm755 %{buildroot}/var/lib/kubelet
135
-install -dm755 %{buildroot}/var/run/kubernetes
136
-
137
-mkdir -p %{buildroot}/%{_lib}/tmpfiles.d
138
-cat << EOF >> %{buildroot}/%{_lib}/tmpfiles.d/kubernetes.conf
139
-d /var/run/kubernetes 0755 kube kube -
140
-EOF
141
-
142
-%check
143
-export GOPATH=%{_builddir}
144
-go get golang.org/x/tools/cmd/cover
145
-make %{?_smp_mflags} check
146
-
147
-%clean
148
-rm -rf %{buildroot}/*
149
-
150
-%pre
151
-if [ $1 -eq 1 ]; then
152
-    # Initial installation.
153
-    getent group kube >/dev/null || groupadd -r kube
154
-    getent passwd kube >/dev/null || useradd -r -g kube -d / -s /sbin/nologin \
155
-            -c "Kubernetes user" kube
156
-fi
157
-
158
-%post
159
-chown -R kube:kube /var/lib/kubelet
160
-chown -R kube:kube /var/run/kubernetes
161
-systemctl daemon-reload
162
-
163
-%post kubeadm
164
-systemctl daemon-reload
165
-systemctl stop kubelet
166
-systemctl enable kubelet
167
-
168
-%preun kubeadm
169
-if [ $1 -eq 0 ]; then
170
-    systemctl stop kubelet
171
-fi
172
-
173
-%postun
174
-if [ $1 -eq 0 ]; then
175
-    # Package deletion
176
-    userdel kube
177
-    groupdel kube
178
-    systemctl daemon-reload
179
-fi
180
-
181
-%postun kubeadm
182
-if [ $1 -eq 0 ]; then
183
-    systemctl daemon-reload
184
-fi
185
-
186
-%files
187
-%defattr(-,root,root)
188
-%{_bindir}/cloud-controller-manager
189
-%{_bindir}/hyperkube
190
-%{_bindir}/kube-aggregator
191
-%{_bindir}/kube-apiserver
192
-%{_bindir}/kube-controller-manager
193
-%{_bindir}/kubelet
194
-%{_bindir}/kube-proxy
195
-%{_bindir}/kube-scheduler
196
-%{_bindir}/kubectl
197
-#%{_bindir}/kubefed
198
-%{_lib}/systemd/system/kube-apiserver.service
199
-%{_lib}/systemd/system/kubelet.service
200
-%{_lib}/systemd/system/kube-scheduler.service
201
-%{_lib}/systemd/system/kube-controller-manager.service
202
-%{_lib}/systemd/system/kube-proxy.service
203
-%{_lib}/tmpfiles.d/kubernetes.conf
204
-%dir %{_sysconfdir}/%{name}
205
-%dir /var/lib/kubelet
206
-%dir /var/run/kubernetes
207
-%config(noreplace) %{_sysconfdir}/%{name}/config
208
-%config(noreplace) %{_sysconfdir}/%{name}/apiserver
209
-%config(noreplace) %{_sysconfdir}/%{name}/controller-manager
210
-%config(noreplace) %{_sysconfdir}/%{name}/proxy
211
-%config(noreplace) %{_sysconfdir}/%{name}/kubelet
212
-%config(noreplace) %{_sysconfdir}/%{name}/kubeconfig
213
-%config(noreplace) %{_sysconfdir}/%{name}/scheduler
214
-
215
-%files kubeadm
216
-%defattr(-,root,root)
217
-%{_bindir}/kubeadm
218
-/etc/systemd/system/kubelet.service
219
-/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
220
-
221
-%files pause
222
-%defattr(-,root,root)
223
-%{_bindir}/pause-%{archname}
224
-
225
-%files kubectl-extras
226
-%defattr(-,root,root)
227
-/opt/vmware/kubernetes/linux/%{archname}/kubectl
228
-%ifarch x86_64
229
-/opt/vmware/kubernetes/darwin/%{archname}/kubectl
230
-/opt/vmware/kubernetes/windows/%{archname}/kubectl.exe
231
-%endif
232
-
233
-%changelog
234
-*   Mon Jan 28 2019 Bo Gan <ganb@vmware.com> 1.11.3-3
235
--   Fix CVE-2018-17846 and CVE-2018-17143
236
-*   Fri Oct 26 2018 Ajay Kaher <akaher@vmware.com> 1.11.3-2
237
--   Fix for aarch64
238
-*   Tue Oct 23 2018 Michelle Wang <michellew@vmware.com> 1.11.3-1
239
--   Add k8s version 1.11.3 with vke patch (350444)
240 1
new file mode 100644
... ...
@@ -0,0 +1,236 @@
0
+%ifarch x86_64
1
+%define archname amd64
2
+%endif
3
+%ifarch aarch64
4
+%define archname arm64
5
+%endif
6
+
7
+Summary:        Kubernetes cluster management
8
+Name:           kubernetes
9
+Version:        1.12.7
10
+Release:        1%{?dist}
11
+License:        ASL 2.0
12
+URL:            https://github.com/kubernetes/kubernetes/archive/v%{version}.tar.gz
13
+Source0:        kubernetes-%{version}.tar.gz
14
+%define sha1    kubernetes-%{version}.tar.gz=62cbd12425af750b4134acdfa713a760b2d27438
15
+Source1:        https://github.com/kubernetes/contrib/archive/contrib-0.7.0.tar.gz
16
+%define sha1    contrib-0.7.0=47a744da3b396f07114e518226b6313ef4b2203c
17
+Patch0:         go-27704.patch
18
+Patch1:         go-27842.patch
19
+Group:          Development/Tools
20
+Vendor:         VMware, Inc.
21
+Distribution:   Photon
22
+BuildRequires:  go >= 1.10.2
23
+BuildRequires:  rsync
24
+BuildRequires:  which
25
+Requires:       cni
26
+Requires:       ebtables
27
+Requires:       etcd >= 3.0.4
28
+Requires:       ethtool
29
+Requires:       iptables
30
+Requires:       iproute2
31
+Requires(pre):  /usr/sbin/useradd /usr/sbin/groupadd
32
+Requires(postun):/usr/sbin/userdel /usr/sbin/groupdel
33
+Requires:       socat
34
+Requires:       (util-linux or toybox)
35
+Requires:       cri-tools
36
+
37
+%description
38
+Kubernetes is an open source implementation of container cluster management.
39
+
40
+%package        kubeadm
41
+Summary:        kubeadm deployment tool
42
+Group:          Development/Tools
43
+Requires:       %{name} = %{version}
44
+%description    kubeadm
45
+kubeadm is a tool that enables quick and easy deployment of a kubernetes cluster.
46
+
47
+%package	kubectl-extras
48
+Summary:	kubectl binaries for extra platforms
49
+Group:		Development/Tools
50
+%description	kubectl-extras
51
+Contains kubectl binaries for additional platforms.
52
+
53
+%package        pause
54
+Summary:        pause binary
55
+Group:          Development/Tools
56
+%description    pause
57
+A pod setup process that holds a pod's namespace.
58
+
59
+%prep -p exit
60
+%setup -qn %{name}-%{version}
61
+cd ..
62
+tar xf %{SOURCE1} --no-same-owner
63
+sed -i -e 's|127.0.0.1:4001|127.0.0.1:2379|g' contrib-0.7.0/init/systemd/environ/apiserver
64
+cd %{name}-%{version}
65
+
66
+pushd vendor/golang.org/x/net
67
+%patch0 -p1
68
+%patch1 -p1
69
+popd
70
+
71
+%build
72
+make
73
+pushd build/pause
74
+mkdir -p bin
75
+gcc -Os -Wall -Werror -static -o bin/pause-%{archname} pause.c
76
+strip bin/pause-%{archname}
77
+popd
78
+
79
+%ifarch x86_64
80
+make WHAT="cmd/kubectl" KUBE_BUILD_PLATFORMS="darwin/%{archname} windows/%{archname}"
81
+%endif
82
+
83
+%install
84
+install -vdm644 %{buildroot}/etc/profile.d
85
+install -m 755 -d %{buildroot}%{_bindir}
86
+install -m 755 -d %{buildroot}/opt/vmware/kubernetes
87
+install -m 755 -d %{buildroot}/opt/vmware/kubernetes/linux/%{archname}
88
+%ifarch x86_64
89
+install -m 755 -d %{buildroot}/opt/vmware/kubernetes/darwin/%{archname}
90
+install -m 755 -d %{buildroot}/opt/vmware/kubernetes/windows/%{archname}
91
+%endif
92
+
93
+binaries=(cloud-controller-manager hyperkube kube-apiserver kube-controller-manager kubelet kube-proxy kube-scheduler kubectl)
94
+for bin in "${binaries[@]}"; do
95
+  echo "+++ INSTALLING ${bin}"
96
+  install -p -m 755 -t %{buildroot}%{_bindir} _output/local/bin/linux/%{archname}/${bin}
97
+done
98
+install -p -m 755 -t %{buildroot}%{_bindir} build/pause/bin/pause-%{archname}
99
+
100
+# kubectl-extras
101
+install -p -m 755 -t %{buildroot}/opt/vmware/kubernetes/linux/%{archname}/ _output/local/bin/linux/%{archname}/kubectl
102
+%ifarch x86_64
103
+install -p -m 755 -t %{buildroot}/opt/vmware/kubernetes/darwin/%{archname}/ _output/local/bin/darwin/%{archname}/kubectl
104
+install -p -m 755 -t %{buildroot}/opt/vmware/kubernetes/windows/%{archname}/ _output/local/bin/windows/%{archname}/kubectl.exe
105
+%endif
106
+
107
+# kubeadm install
108
+install -vdm644 %{buildroot}/etc/systemd/system/kubelet.service.d
109
+install -p -m 755 -t %{buildroot}%{_bindir} _output/local/bin/linux/%{archname}/kubeadm
110
+install -p -m 755 -t %{buildroot}/etc/systemd/system build/rpms/kubelet.service
111
+install -p -m 755 -t %{buildroot}/etc/systemd/system/kubelet.service.d build/rpms/10-kubeadm.conf
112
+sed -i '/KUBELET_CGROUP_ARGS=--cgroup-driver=systemd/d' %{buildroot}/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
113
+
114
+cd ..
115
+# install config files
116
+install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}
117
+install -m 644 -t %{buildroot}%{_sysconfdir}/%{name} contrib-0.7.0/init/systemd/environ/*
118
+cat << EOF >> %{buildroot}%{_sysconfdir}/%{name}/kubeconfig
119
+apiVersion: v1
120
+clusters:
121
+- cluster:
122
+    server: http://127.0.0.1:8080
123
+EOF
124
+sed -i '/KUBELET_API_SERVER/c\KUBELET_API_SERVER="--kubeconfig=/etc/kubernetes/kubeconfig"' %{buildroot}%{_sysconfdir}/%{name}/kubelet
125
+
126
+# install service files
127
+install -d -m 0755 %{buildroot}/usr/lib/systemd/system
128
+install -m 0644 -t %{buildroot}/usr/lib/systemd/system contrib-0.7.0/init/systemd/*.service
129
+
130
+# install the place the kubelet defaults to put volumes
131
+install -dm755 %{buildroot}/var/lib/kubelet
132
+install -dm755 %{buildroot}/var/run/kubernetes
133
+
134
+mkdir -p %{buildroot}/%{_lib}/tmpfiles.d
135
+cat << EOF >> %{buildroot}/%{_lib}/tmpfiles.d/kubernetes.conf
136
+d /var/run/kubernetes 0755 kube kube -
137
+EOF
138
+
139
+%check
140
+export GOPATH=%{_builddir}
141
+go get golang.org/x/tools/cmd/cover
142
+make %{?_smp_mflags} check
143
+
144
+%clean
145
+rm -rf %{buildroot}/*
146
+
147
+%pre
148
+if [ $1 -eq 1 ]; then
149
+    # Initial installation.
150
+    getent group kube >/dev/null || groupadd -r kube
151
+    getent passwd kube >/dev/null || useradd -r -g kube -d / -s /sbin/nologin \
152
+            -c "Kubernetes user" kube
153
+fi
154
+
155
+%post
156
+chown -R kube:kube /var/lib/kubelet
157
+chown -R kube:kube /var/run/kubernetes
158
+systemctl daemon-reload
159
+
160
+%post kubeadm
161
+systemctl daemon-reload
162
+systemctl stop kubelet
163
+systemctl enable kubelet
164
+
165
+%preun kubeadm
166
+if [ $1 -eq 0 ]; then
167
+    systemctl stop kubelet
168
+fi
169
+
170
+%postun
171
+if [ $1 -eq 0 ]; then
172
+    # Package deletion
173
+    userdel kube
174
+    groupdel kube
175
+    systemctl daemon-reload
176
+fi
177
+
178
+%postun kubeadm
179
+if [ $1 -eq 0 ]; then
180
+    systemctl daemon-reload
181
+fi
182
+
183
+%files
184
+%defattr(-,root,root)
185
+%{_bindir}/cloud-controller-manager
186
+%{_bindir}/hyperkube
187
+%{_bindir}/kube-apiserver
188
+%{_bindir}/kube-controller-manager
189
+%{_bindir}/kubelet
190
+%{_bindir}/kube-proxy
191
+%{_bindir}/kube-scheduler
192
+%{_bindir}/kubectl
193
+#%{_bindir}/kubefed
194
+%{_lib}/systemd/system/kube-apiserver.service
195
+%{_lib}/systemd/system/kubelet.service
196
+%{_lib}/systemd/system/kube-scheduler.service
197
+%{_lib}/systemd/system/kube-controller-manager.service
198
+%{_lib}/systemd/system/kube-proxy.service
199
+%{_lib}/tmpfiles.d/kubernetes.conf
200
+%dir %{_sysconfdir}/%{name}
201
+%dir /var/lib/kubelet
202
+%dir /var/run/kubernetes
203
+%config(noreplace) %{_sysconfdir}/%{name}/config
204
+%config(noreplace) %{_sysconfdir}/%{name}/apiserver
205
+%config(noreplace) %{_sysconfdir}/%{name}/controller-manager
206
+%config(noreplace) %{_sysconfdir}/%{name}/proxy
207
+%config(noreplace) %{_sysconfdir}/%{name}/kubelet
208
+%config(noreplace) %{_sysconfdir}/%{name}/kubeconfig
209
+%config(noreplace) %{_sysconfdir}/%{name}/scheduler
210
+
211
+%files kubeadm
212
+%defattr(-,root,root)
213
+%{_bindir}/kubeadm
214
+/etc/systemd/system/kubelet.service
215
+/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
216
+
217
+%files pause
218
+%defattr(-,root,root)
219
+%{_bindir}/pause-%{archname}
220
+
221
+%files kubectl-extras
222
+%defattr(-,root,root)
223
+/opt/vmware/kubernetes/linux/%{archname}/kubectl
224
+%ifarch x86_64
225
+/opt/vmware/kubernetes/darwin/%{archname}/kubectl
226
+/opt/vmware/kubernetes/windows/%{archname}/kubectl.exe
227
+%endif
228
+
229
+%changelog
230
+*   Wed May 08 2019 Ashwin H <ashwinh@vmware.com> 1.12.7-1
231
+-   Update to 1.12.7
232
+*   Thu Feb 28 2019 Ashwin H <ashwinh@vmware.com> 1.12.5-2
233
+-   Fix build error for ARM.
234
+*   Thu Feb 21 2019 Ashwin H <ashwinh@vmware.com> 1.12.5-1
235
+-   Update to 1.12.5-1
... ...
@@ -2,6 +2,10 @@ FROM k8s-base-image:3.0
2 2
 
3 3
 MAINTAINER kulkarniv@vmware.com
4 4
 
5
+COPY [ "./stage-rpms-tdnf.conf", "./tmp/stage-rpms.repo", "/tmp/tdnf/" ]
6
+RUN tdnf -c /tmp/tdnf/stage-rpms-tdnf.conf erase -y toybox
7
+RUN tdnf -c /tmp/tdnf/stage-rpms-tdnf.conf install -y coreutils sed --refresh
8
+
5 9
 COPY [ "./tmp/calico/opt/cni/bin/calico", \
6 10
        "./tmp/calico/opt/cni/bin/calico-ipam", \
7 11
        "./tmp/calico/opt/cni/bin/portmap", \
... ...
@@ -16,8 +16,7 @@ COPY [ "./tmp/calico/usr/share/calico/docker/fs/sbin/restart-calico-confd", \
16 16
        "./tmp/calico/usr/share/calico/docker/fs/sbin/start_runit", \
17 17
        "./tmp/calico/usr/share/calico/docker/fs/sbin/versions", \
18 18
        "/usr/sbin/" ]
19
-COPY [ "./tmp/calico/usr/bin/allocate-ipip-addr", \
20
-       "./tmp/calico/usr/bin/startup", \
19
+COPY [ "./tmp/calico/usr/bin/calico-node", \
21 20
        "./tmp/calico/usr/bin/calico-bgp-daemon", \
22 21
        "./tmp/calico/usr/bin/gobgp", \
23 22
        "./tmp/calico/usr/bin/bird", \