Browse code

kubernetes: Remove k8s-1.11-vke.patch as its no longer used

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

ashwin-h authored on 2019/03/07 10:29:11
Showing 1 changed files
1 1
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
-