Merge pull request #44774 from kargakis/uniquifier

Automatic merge from submit-queue

Switch Deployments to new hashing algo w/ collision avoidance mechanism

Implements https://github.com/kubernetes/community/pull/477

@kubernetes/sig-apps-api-reviews @kubernetes/sig-apps-pr-reviews 

Fixes https://github.com/kubernetes/kubernetes/issues/29735
Fixes https://github.com/kubernetes/kubernetes/issues/43948

```release-note
Deployments are updated to use (1) a more stable hashing algorithm (fnv) than the previous one (adler) and (2) a hashing collision avoidance mechanism that will ensure new rollouts will not block on hashing collisions anymore.
```
This commit is contained in:
Kubernetes Submit Queue
2017-05-25 06:09:58 -07:00
committed by GitHub
57 changed files with 1902 additions and 1110 deletions

View File

@@ -47259,6 +47259,11 @@
"type": "integer",
"format": "int32"
},
"collisionCount": {
"description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.",
"type": "integer",
"format": "int64"
},
"conditions": {
"description": "Represents the latest available observations of a deployment's current state.",
"type": "array",
@@ -49477,6 +49482,11 @@
"type": "integer",
"format": "int32"
},
"collisionCount": {
"description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.",
"type": "integer",
"format": "int64"
},
"conditions": {
"description": "Represents the latest available observations of a deployment's current state.",
"type": "array",

View File

@@ -4706,6 +4706,11 @@
"$ref": "v1beta1.DeploymentCondition"
},
"description": "Represents the latest available observations of a deployment's current state."
},
"collisionCount": {
"type": "integer",
"format": "int64",
"description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet."
}
}
},

View File

@@ -9408,6 +9408,11 @@
"$ref": "v1beta1.DeploymentCondition"
},
"description": "Represents the latest available observations of a deployment's current state."
},
"collisionCount": {
"type": "integer",
"format": "int64",
"description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet."
}
}
},

View File

@@ -466,6 +466,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1beta1_deploymentcondition">v1beta1.DeploymentCondition</a> array</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">collisionCount</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody>
</table>
@@ -6470,7 +6477,7 @@ Examples:<br>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2017-05-22 06:32:54 UTC
Last updated 2017-05-25 09:31:33 UTC
</div>
</div>
</body>

View File

@@ -496,6 +496,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1beta1_deploymentcondition">v1beta1.DeploymentCondition</a> array</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">collisionCount</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody>
</table>
@@ -8110,7 +8117,7 @@ Both these may change in the future. Incoming requests are matched against the h
</div>
<div id="footer">
<div id="footer-text">
Last updated 2017-05-22 06:33:43 UTC
Last updated 2017-05-25 09:32:15 UTC
</div>
</div>
</body>

View File

@@ -13315,6 +13315,11 @@
"type": "integer",
"format": "int32"
},
"collisionCount": {
"description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.",
"type": "integer",
"format": "int64"
},
"conditions": {
"description": "Represents the latest available observations of a deployment's current state.",
"type": "array",

View File

@@ -7152,6 +7152,11 @@
"$ref": "v1beta1.DeploymentCondition"
},
"description": "Represents the latest available observations of a deployment's current state."
},
"collisionCount": {
"type": "integer",
"format": "int64",
"description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet."
}
}
},

View File

@@ -478,6 +478,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1beta1_deploymentcondition">v1beta1.DeploymentCondition</a> array</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">collisionCount</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody>
</table>
@@ -7190,7 +7197,7 @@ Both these may change in the future. Incoming requests are matched against the h
</div>
<div id="footer">
<div id="footer-text">
Last updated 2017-05-22 07:30:41 UTC
Last updated 2017-05-25 09:37:16 UTC
</div>
</div>
</body>

View File

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

View File

@@ -170,6 +170,12 @@ message DeploymentStatus {
// +patchMergeKey=type
// +patchStrategy=merge
repeated DeploymentCondition conditions = 6;
// Count of hash collisions for the Deployment. The Deployment controller uses this
// field as a collision avoidance mechanism when it needs to create the name for the
// newest ReplicaSet.
// +optional
optional int64 collisionCount = 8;
}
// DeploymentStrategy describes how to replace existing pods with new ones.

View File

@@ -4672,7 +4672,7 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
} else {
yysep2 := !z.EncBinary()
yy2arr2 := z.EncBasicHandle().StructToArray
var yyq2 [7]bool
var yyq2 [8]bool
_, _, _ = yysep2, yyq2, yy2arr2
const yyr2 bool = false
yyq2[0] = x.ObservedGeneration != 0
@@ -4682,9 +4682,10 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
yyq2[4] = x.AvailableReplicas != 0
yyq2[5] = x.UnavailableReplicas != 0
yyq2[6] = len(x.Conditions) != 0
yyq2[7] = x.CollisionCount != nil
var yynn2 int
if yyr2 || yy2arr2 {
r.EncodeArrayStart(7)
r.EncodeArrayStart(8)
} else {
yynn2 = 0
for _, b := range yyq2 {
@@ -4878,6 +4879,41 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
}
}
}
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
if yyq2[7] {
if x.CollisionCount == nil {
r.EncodeNil()
} else {
yy25 := *x.CollisionCount
yym26 := z.EncBinary()
_ = yym26
if false {
} else {
r.EncodeInt(int64(yy25))
}
}
} else {
r.EncodeNil()
}
} else {
if yyq2[7] {
z.EncSendContainerState(codecSelfer_containerMapKey1234)
r.EncodeString(codecSelferC_UTF81234, string("collisionCount"))
z.EncSendContainerState(codecSelfer_containerMapValue1234)
if x.CollisionCount == nil {
r.EncodeNil()
} else {
yy27 := *x.CollisionCount
yym28 := z.EncBinary()
_ = yym28
if false {
} else {
r.EncodeInt(int64(yy27))
}
}
}
}
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayEnd1234)
} else {
@@ -5023,6 +5059,22 @@ func (x *DeploymentStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) {
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv16), d)
}
}
case "collisionCount":
if r.TryDecodeAsNil() {
if x.CollisionCount != nil {
x.CollisionCount = nil
}
} else {
if x.CollisionCount == nil {
x.CollisionCount = new(int64)
}
yym19 := z.DecBinary()
_ = yym19
if false {
} else {
*((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64))
}
}
default:
z.DecStructFieldNotFound(-1, yys3)
} // end switch yys3
@@ -5034,16 +5086,16 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
var h codecSelfer1234
z, r := codec1978.GenHelperDecoder(d)
_, _, _ = h, z, r
var yyj18 int
var yyb18 bool
var yyhl18 bool = l >= 0
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
var yyj20 int
var yyb20 bool
var yyhl20 bool = l >= 0
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -5051,21 +5103,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.ObservedGeneration = 0
} else {
yyv19 := &x.ObservedGeneration
yym20 := z.DecBinary()
_ = yym20
yyv21 := &x.ObservedGeneration
yym22 := z.DecBinary()
_ = yym22
if false {
} else {
*((*int64)(yyv19)) = int64(r.DecodeInt(64))
*((*int64)(yyv21)) = int64(r.DecodeInt(64))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -5073,29 +5125,7 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.Replicas = 0
} else {
yyv21 := &x.Replicas
yym22 := z.DecBinary()
_ = yym22
if false {
} else {
*((*int32)(yyv21)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
} else {
yyb18 = r.CheckBreak()
}
if yyb18 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UpdatedReplicas = 0
} else {
yyv23 := &x.UpdatedReplicas
yyv23 := &x.Replicas
yym24 := z.DecBinary()
_ = yym24
if false {
@@ -5103,21 +5133,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv23)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.ReadyReplicas = 0
x.UpdatedReplicas = 0
} else {
yyv25 := &x.ReadyReplicas
yyv25 := &x.UpdatedReplicas
yym26 := z.DecBinary()
_ = yym26
if false {
@@ -5125,21 +5155,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv25)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.AvailableReplicas = 0
x.ReadyReplicas = 0
} else {
yyv27 := &x.AvailableReplicas
yyv27 := &x.ReadyReplicas
yym28 := z.DecBinary()
_ = yym28
if false {
@@ -5147,21 +5177,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv27)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UnavailableReplicas = 0
x.AvailableReplicas = 0
} else {
yyv29 := &x.UnavailableReplicas
yyv29 := &x.AvailableReplicas
yym30 := z.DecBinary()
_ = yym30
if false {
@@ -5169,13 +5199,35 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv29)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UnavailableReplicas = 0
} else {
yyv31 := &x.UnavailableReplicas
yym32 := z.DecBinary()
_ = yym32
if false {
} else {
*((*int32)(yyv31)) = int32(r.DecodeInt(32))
}
}
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb20 = r.CheckBreak()
}
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -5183,26 +5235,52 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.Conditions = nil
} else {
yyv31 := &x.Conditions
yym32 := z.DecBinary()
_ = yym32
yyv33 := &x.Conditions
yym34 := z.DecBinary()
_ = yym34
if false {
} else {
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv31), d)
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv33), d)
}
}
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb20 = r.CheckBreak()
}
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
if x.CollisionCount != nil {
x.CollisionCount = nil
}
} else {
if x.CollisionCount == nil {
x.CollisionCount = new(int64)
}
yym36 := z.DecBinary()
_ = yym36
if false {
} else {
*((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64))
}
}
for {
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
break
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
z.DecStructFieldNotFound(yyj18-1, "")
z.DecStructFieldNotFound(yyj20-1, "")
}
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
}
@@ -6470,7 +6548,7 @@ func (x codecSelfer1234) decSliceDeployment(v *[]Deployment, d *codec1978.Decode
yyrg1 := len(yyv1) > 0
yyv21 := yyv1
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 960)
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 968)
if yyrt1 {
if yyrl1 <= cap(yyv1) {
yyv1 = yyv1[:yyrl1]

View File

@@ -356,6 +356,12 @@ type DeploymentStatus struct {
// +patchMergeKey=type
// +patchStrategy=merge
Conditions []DeploymentCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,6,rep,name=conditions"`
// Count of hash collisions for the Deployment. The Deployment controller uses this
// field as a collision avoidance mechanism when it needs to create the name for the
// newest ReplicaSet.
// +optional
CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"`
}
type DeploymentConditionType string

View File

@@ -99,6 +99,7 @@ var map_DeploymentStatus = map[string]string{
"availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.",
"unavailableReplicas": "Total number of unavailable pods targeted by this deployment.",
"conditions": "Represents the latest available observations of a deployment's current state.",
"collisionCount": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.",
}
func (DeploymentStatus) SwaggerDoc() map[string]string {

View File

@@ -184,6 +184,11 @@ func DeepCopy_v1beta1_DeploymentStatus(in interface{}, out interface{}, c *conve
}
}
}
if in.CollisionCount != nil {
in, out := &in.CollisionCount, &out.CollisionCount
*out = new(int64)
**out = **in
}
return nil
}
}

View File

@@ -327,6 +327,12 @@ type DeploymentStatus struct {
// Represents the latest available observations of a deployment's current state.
Conditions []DeploymentCondition
// Count of hash collisions for the Deployment. The Deployment controller uses this
// field as a collision avoidance mechanism when it needs to create the name for the
// newest ReplicaSet.
// +optional
CollisionCount *int64
}
type DeploymentConditionType string

View File

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

View File

@@ -325,6 +325,12 @@ message DeploymentStatus {
// +patchMergeKey=type
// +patchStrategy=merge
repeated DeploymentCondition conditions = 6;
// Count of hash collisions for the Deployment. The Deployment controller uses this
// field as a collision avoidance mechanism when it needs to create the name for the
// newest ReplicaSet.
// +optional
optional int64 collisionCount = 8;
}
// DeploymentStrategy describes how to replace existing pods with new ones.

View File

@@ -5606,7 +5606,7 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
} else {
yysep2 := !z.EncBinary()
yy2arr2 := z.EncBasicHandle().StructToArray
var yyq2 [7]bool
var yyq2 [8]bool
_, _, _ = yysep2, yyq2, yy2arr2
const yyr2 bool = false
yyq2[0] = x.ObservedGeneration != 0
@@ -5616,9 +5616,10 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
yyq2[4] = x.AvailableReplicas != 0
yyq2[5] = x.UnavailableReplicas != 0
yyq2[6] = len(x.Conditions) != 0
yyq2[7] = x.CollisionCount != nil
var yynn2 int
if yyr2 || yy2arr2 {
r.EncodeArrayStart(7)
r.EncodeArrayStart(8)
} else {
yynn2 = 0
for _, b := range yyq2 {
@@ -5812,6 +5813,41 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
}
}
}
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
if yyq2[7] {
if x.CollisionCount == nil {
r.EncodeNil()
} else {
yy25 := *x.CollisionCount
yym26 := z.EncBinary()
_ = yym26
if false {
} else {
r.EncodeInt(int64(yy25))
}
}
} else {
r.EncodeNil()
}
} else {
if yyq2[7] {
z.EncSendContainerState(codecSelfer_containerMapKey1234)
r.EncodeString(codecSelferC_UTF81234, string("collisionCount"))
z.EncSendContainerState(codecSelfer_containerMapValue1234)
if x.CollisionCount == nil {
r.EncodeNil()
} else {
yy27 := *x.CollisionCount
yym28 := z.EncBinary()
_ = yym28
if false {
} else {
r.EncodeInt(int64(yy27))
}
}
}
}
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayEnd1234)
} else {
@@ -5957,6 +5993,22 @@ func (x *DeploymentStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) {
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv16), d)
}
}
case "collisionCount":
if r.TryDecodeAsNil() {
if x.CollisionCount != nil {
x.CollisionCount = nil
}
} else {
if x.CollisionCount == nil {
x.CollisionCount = new(int64)
}
yym19 := z.DecBinary()
_ = yym19
if false {
} else {
*((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64))
}
}
default:
z.DecStructFieldNotFound(-1, yys3)
} // end switch yys3
@@ -5968,16 +6020,16 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
var h codecSelfer1234
z, r := codec1978.GenHelperDecoder(d)
_, _, _ = h, z, r
var yyj18 int
var yyb18 bool
var yyhl18 bool = l >= 0
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
var yyj20 int
var yyb20 bool
var yyhl20 bool = l >= 0
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -5985,21 +6037,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.ObservedGeneration = 0
} else {
yyv19 := &x.ObservedGeneration
yym20 := z.DecBinary()
_ = yym20
yyv21 := &x.ObservedGeneration
yym22 := z.DecBinary()
_ = yym22
if false {
} else {
*((*int64)(yyv19)) = int64(r.DecodeInt(64))
*((*int64)(yyv21)) = int64(r.DecodeInt(64))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -6007,29 +6059,7 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.Replicas = 0
} else {
yyv21 := &x.Replicas
yym22 := z.DecBinary()
_ = yym22
if false {
} else {
*((*int32)(yyv21)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
} else {
yyb18 = r.CheckBreak()
}
if yyb18 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UpdatedReplicas = 0
} else {
yyv23 := &x.UpdatedReplicas
yyv23 := &x.Replicas
yym24 := z.DecBinary()
_ = yym24
if false {
@@ -6037,21 +6067,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv23)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.ReadyReplicas = 0
x.UpdatedReplicas = 0
} else {
yyv25 := &x.ReadyReplicas
yyv25 := &x.UpdatedReplicas
yym26 := z.DecBinary()
_ = yym26
if false {
@@ -6059,21 +6089,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv25)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.AvailableReplicas = 0
x.ReadyReplicas = 0
} else {
yyv27 := &x.AvailableReplicas
yyv27 := &x.ReadyReplicas
yym28 := z.DecBinary()
_ = yym28
if false {
@@ -6081,21 +6111,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv27)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UnavailableReplicas = 0
x.AvailableReplicas = 0
} else {
yyv29 := &x.UnavailableReplicas
yyv29 := &x.AvailableReplicas
yym30 := z.DecBinary()
_ = yym30
if false {
@@ -6103,13 +6133,35 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv29)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UnavailableReplicas = 0
} else {
yyv31 := &x.UnavailableReplicas
yym32 := z.DecBinary()
_ = yym32
if false {
} else {
*((*int32)(yyv31)) = int32(r.DecodeInt(32))
}
}
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb20 = r.CheckBreak()
}
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -6117,26 +6169,52 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.Conditions = nil
} else {
yyv31 := &x.Conditions
yym32 := z.DecBinary()
_ = yym32
yyv33 := &x.Conditions
yym34 := z.DecBinary()
_ = yym34
if false {
} else {
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv31), d)
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv33), d)
}
}
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb20 = r.CheckBreak()
}
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
if x.CollisionCount != nil {
x.CollisionCount = nil
}
} else {
if x.CollisionCount == nil {
x.CollisionCount = new(int64)
}
yym36 := z.DecBinary()
_ = yym36
if false {
} else {
*((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64))
}
}
for {
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
break
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
z.DecStructFieldNotFound(yyj18-1, "")
z.DecStructFieldNotFound(yyj20-1, "")
}
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
}
@@ -19652,7 +19730,7 @@ func (x codecSelfer1234) decSliceDeployment(v *[]Deployment, d *codec1978.Decode
yyrg1 := len(yyv1) > 0
yyv21 := yyv1
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 960)
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 968)
if yyrt1 {
if yyrl1 <= cap(yyv1) {
yyv1 = yyv1[:yyrl1]

View File

@@ -325,6 +325,12 @@ type DeploymentStatus struct {
// +patchMergeKey=type
// +patchStrategy=merge
Conditions []DeploymentCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,6,rep,name=conditions"`
// Count of hash collisions for the Deployment. The Deployment controller uses this
// field as a collision avoidance mechanism when it needs to create the name for the
// newest ReplicaSet.
// +optional
CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"`
}
type DeploymentConditionType string

View File

@@ -186,6 +186,7 @@ var map_DeploymentStatus = map[string]string{
"availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.",
"unavailableReplicas": "Total number of unavailable pods targeted by this deployment.",
"conditions": "Represents the latest available observations of a deployment's current state.",
"collisionCount": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.",
}
func (DeploymentStatus) SwaggerDoc() map[string]string {

View File

@@ -628,6 +628,7 @@ func autoConvert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus(in *Dep
out.AvailableReplicas = in.AvailableReplicas
out.UnavailableReplicas = in.UnavailableReplicas
out.Conditions = *(*[]extensions.DeploymentCondition)(unsafe.Pointer(&in.Conditions))
out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount))
return nil
}
@@ -644,6 +645,7 @@ func autoConvert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus(in *ext
out.AvailableReplicas = in.AvailableReplicas
out.UnavailableReplicas = in.UnavailableReplicas
out.Conditions = *(*[]DeploymentCondition)(unsafe.Pointer(&in.Conditions))
out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount))
return nil
}

View File

@@ -384,6 +384,11 @@ func DeepCopy_v1beta1_DeploymentStatus(in interface{}, out interface{}, c *conve
}
}
}
if in.CollisionCount != nil {
in, out := &in.CollisionCount, &out.CollisionCount
*out = new(int64)
**out = **in
}
return nil
}
}

View File

@@ -41,6 +41,7 @@ go_test(
"//pkg/security/apparmor:go_default_library",
"//pkg/security/podsecuritypolicy/seccomp:go_default_library",
"//pkg/security/podsecuritypolicy/util:go_default_library",
"//vendor/github.com/davecgh/go-spew/spew:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",

View File

@@ -346,6 +346,9 @@ func ValidateDeploymentStatus(status *extensions.DeploymentStatus, fldPath *fiel
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.ReadyReplicas), fldPath.Child("readyReplicas"))...)
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.AvailableReplicas), fldPath.Child("availableReplicas"))...)
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.UnavailableReplicas), fldPath.Child("unavailableReplicas"))...)
if status.CollisionCount != nil {
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(*status.CollisionCount, fldPath.Child("collisionCount"))...)
}
msg := "cannot be greater than status.replicas"
if status.UpdatedReplicas > status.Replicas {
allErrs = append(allErrs, field.Invalid(fldPath.Child("updatedReplicas"), status.UpdatedReplicas, msg))
@@ -372,10 +375,29 @@ func ValidateDeploymentUpdate(update, old *extensions.Deployment) field.ErrorLis
func ValidateDeploymentStatusUpdate(update, old *extensions.Deployment) field.ErrorList {
allErrs := apivalidation.ValidateObjectMetaUpdate(&update.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata"))
allErrs = append(allErrs, ValidateDeploymentStatus(&update.Status, field.NewPath("status"))...)
fldPath := field.NewPath("status")
allErrs = append(allErrs, ValidateDeploymentStatus(&update.Status, fldPath)...)
if isDecremented(update.Status.CollisionCount, old.Status.CollisionCount) {
value := int64(0)
if update.Status.CollisionCount != nil {
value = *update.Status.CollisionCount
}
allErrs = append(allErrs, field.Invalid(fldPath.Child("collisionCount"), value, "cannot be decremented"))
}
return allErrs
}
// TODO: Move in "k8s.io/kubernetes/pkg/api/validation"
func isDecremented(update, old *int64) bool {
if update == nil && old != nil {
return true
}
if update == nil || old == nil {
return false
}
return *update < *old
}
func ValidateDeployment(obj *extensions.Deployment) field.ErrorList {
allErrs := apivalidation.ValidateObjectMeta(&obj.ObjectMeta, true, ValidateDeploymentName, field.NewPath("metadata"))
allErrs = append(allErrs, ValidateDeploymentSpec(&obj.Spec, field.NewPath("spec"))...)

View File

@@ -21,6 +21,8 @@ import (
"strings"
"testing"
"github.com/davecgh/go-spew/spew"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/apimachinery/pkg/util/validation/field"
@@ -1230,6 +1232,11 @@ func TestValidateDeployment(t *testing.T) {
}
}
func int64p(i int) *int64 {
i64 := int64(i)
return &i64
}
func TestValidateDeploymentStatus(t *testing.T) {
tests := []struct {
name string
@@ -1239,6 +1246,7 @@ func TestValidateDeploymentStatus(t *testing.T) {
readyReplicas int32
availableReplicas int32
observedGeneration int64
collisionCount *int64
expectedErr bool
}{
@@ -1335,6 +1343,13 @@ func TestValidateDeploymentStatus(t *testing.T) {
observedGeneration: 1,
expectedErr: false,
},
{
name: "invalid collisionCount",
replicas: 3,
observedGeneration: 1,
collisionCount: int64p(-3),
expectedErr: true,
},
}
for _, test := range tests {
@@ -1344,10 +1359,82 @@ func TestValidateDeploymentStatus(t *testing.T) {
ReadyReplicas: test.readyReplicas,
AvailableReplicas: test.availableReplicas,
ObservedGeneration: test.observedGeneration,
CollisionCount: test.collisionCount,
}
if hasErr := len(ValidateDeploymentStatus(&status, field.NewPath("status"))) > 0; hasErr != test.expectedErr {
t.Errorf("%s: expected error: %t, got error: %t", test.name, test.expectedErr, hasErr)
errs := ValidateDeploymentStatus(&status, field.NewPath("status"))
if hasErr := len(errs) > 0; hasErr != test.expectedErr {
errString := spew.Sprintf("%#v", errs)
t.Errorf("%s: expected error: %t, got error: %t\nerrors: %s", test.name, test.expectedErr, hasErr, errString)
}
}
}
func TestValidateDeploymentStatusUpdate(t *testing.T) {
tests := []struct {
name string
from, to extensions.DeploymentStatus
expectedErr bool
}{
{
name: "increase: valid update",
from: extensions.DeploymentStatus{
CollisionCount: nil,
},
to: extensions.DeploymentStatus{
CollisionCount: int64p(1),
},
expectedErr: false,
},
{
name: "stable: valid update",
from: extensions.DeploymentStatus{
CollisionCount: int64p(1),
},
to: extensions.DeploymentStatus{
CollisionCount: int64p(1),
},
expectedErr: false,
},
{
name: "unset: invalid update",
from: extensions.DeploymentStatus{
CollisionCount: int64p(1),
},
to: extensions.DeploymentStatus{
CollisionCount: nil,
},
expectedErr: true,
},
{
name: "decrease: invalid update",
from: extensions.DeploymentStatus{
CollisionCount: int64p(2),
},
to: extensions.DeploymentStatus{
CollisionCount: int64p(1),
},
expectedErr: true,
},
}
for _, test := range tests {
meta := metav1.ObjectMeta{Name: "foo", Namespace: metav1.NamespaceDefault, ResourceVersion: "1"}
from := &extensions.Deployment{
ObjectMeta: meta,
Status: test.from,
}
to := &extensions.Deployment{
ObjectMeta: meta,
Status: test.to,
}
errs := ValidateDeploymentStatusUpdate(to, from)
if hasErr := len(errs) > 0; hasErr != test.expectedErr {
errString := spew.Sprintf("%#v", errs)
t.Errorf("%s: expected error: %t, got error: %t\nerrors: %s", test.name, test.expectedErr, hasErr, errString)
}
}
}

View File

@@ -378,6 +378,11 @@ func DeepCopy_extensions_DeploymentStatus(in interface{}, out interface{}, c *co
}
}
}
if in.CollisionCount != nil {
in, out := &in.CollisionCount, &out.CollisionCount
*out = new(int64)
**out = **in
}
return nil
}
}

View File

@@ -574,7 +574,6 @@ func (dc *DeploymentController) syncDeployment(key string) error {
return nil
}
if err != nil {
utilruntime.HandleError(fmt.Errorf("Unable to retrieve deployment %v from store: %v", key, err))
return err
}

View File

@@ -73,7 +73,11 @@ func (dc *DeploymentController) rollback(d *extensions.Deployment, rsList []*ext
// cleans up the rollback spec so subsequent requeues of the deployment won't end up in here.
func (dc *DeploymentController) rollbackToTemplate(d *extensions.Deployment, rs *extensions.ReplicaSet) (bool, error) {
performedRollback := false
if !deploymentutil.EqualIgnoreHash(d.Spec.Template, rs.Spec.Template) {
isEqual, err := deploymentutil.EqualIgnoreHash(&d.Spec.Template, &rs.Spec.Template)
if err != nil {
return false, err
}
if !isEqual {
glog.V(4).Infof("Rolling back deployment %q to template spec %+v", d.Name, rs.Spec.Template.Spec)
deploymentutil.SetFromReplicaSetTemplate(d, rs.Spec.Template)
// set RS (the old RS we'll rolling back to) annotations back to the deployment;

View File

@@ -140,7 +140,7 @@ func (dc *DeploymentController) rsAndPodsWithHashKeySynced(d *extensions.Deploym
// Add pod-template-hash information if it's not in the RS.
// Otherwise, new RS produced by Deployment will overlap with pre-existing ones
// that aren't constrained by the pod-template-hash.
syncedRS, err := dc.addHashKeyToRSAndPods(rs, podMap[rs.UID])
syncedRS, err := dc.addHashKeyToRSAndPods(rs, podMap[rs.UID], d.Status.CollisionCount)
if err != nil {
return nil, err
}
@@ -153,12 +153,15 @@ func (dc *DeploymentController) rsAndPodsWithHashKeySynced(d *extensions.Deploym
// 1. Add hash label to the rs's pod template, and make sure the controller sees this update so that no orphaned pods will be created
// 2. Add hash label to all pods this rs owns, wait until replicaset controller reports rs.Status.FullyLabeledReplicas equal to the desired number of replicas
// 3. Add hash label to the rs's label and selector
func (dc *DeploymentController) addHashKeyToRSAndPods(rs *extensions.ReplicaSet, podList *v1.PodList) (*extensions.ReplicaSet, error) {
func (dc *DeploymentController) addHashKeyToRSAndPods(rs *extensions.ReplicaSet, podList *v1.PodList, collisionCount *int64) (*extensions.ReplicaSet, error) {
// If the rs already has the new hash label in its selector, it's done syncing
if labelsutil.SelectorHasLabel(rs.Spec.Selector, extensions.DefaultDeploymentUniqueLabelKey) {
return rs, nil
}
hash := deploymentutil.GetReplicaSetHash(rs)
hash, err := deploymentutil.GetReplicaSetHash(rs, collisionCount)
if err != nil {
return nil, err
}
// 1. Add hash template label to the rs. This ensures that any newly created pods will have the new label.
updatedRS, err := deploymentutil.UpdateRSWithRetries(dc.client.Extensions().ReplicaSets(rs.Namespace), dc.rsLister, rs.Namespace, rs.Name,
func(updated *extensions.ReplicaSet) error {
@@ -224,8 +227,8 @@ func (dc *DeploymentController) addHashKeyToRSAndPods(rs *extensions.ReplicaSet,
// 2. If there's existing new RS, update its revision number if it's smaller than (maxOldRevision + 1), where maxOldRevision is the max revision number among all old RSes.
// 3. If there's no existing new RS and createIfNotExisted is true, create one with appropriate revision number (maxOldRevision + 1) and replicas.
// Note that the pod-template-hash will be added to adopted RSes and pods.
func (dc *DeploymentController) getNewReplicaSet(deployment *extensions.Deployment, rsList, oldRSs []*extensions.ReplicaSet, createIfNotExisted bool) (*extensions.ReplicaSet, error) {
existingNewRS, err := deploymentutil.FindNewReplicaSet(deployment, rsList)
func (dc *DeploymentController) getNewReplicaSet(d *extensions.Deployment, rsList, oldRSs []*extensions.ReplicaSet, createIfNotExisted bool) (*extensions.ReplicaSet, error) {
existingNewRS, err := deploymentutil.FindNewReplicaSet(d, rsList)
if err != nil {
return nil, err
}
@@ -247,28 +250,28 @@ func (dc *DeploymentController) getNewReplicaSet(deployment *extensions.Deployme
rsCopy := objCopy.(*extensions.ReplicaSet)
// Set existing new replica set's annotation
annotationsUpdated := deploymentutil.SetNewReplicaSetAnnotations(deployment, rsCopy, newRevision, true)
minReadySecondsNeedsUpdate := rsCopy.Spec.MinReadySeconds != deployment.Spec.MinReadySeconds
annotationsUpdated := deploymentutil.SetNewReplicaSetAnnotations(d, rsCopy, newRevision, true)
minReadySecondsNeedsUpdate := rsCopy.Spec.MinReadySeconds != d.Spec.MinReadySeconds
if annotationsUpdated || minReadySecondsNeedsUpdate {
rsCopy.Spec.MinReadySeconds = deployment.Spec.MinReadySeconds
rsCopy.Spec.MinReadySeconds = d.Spec.MinReadySeconds
return dc.client.Extensions().ReplicaSets(rsCopy.ObjectMeta.Namespace).Update(rsCopy)
}
// Should use the revision in existingNewRS's annotation, since it set by before
updateConditions := deploymentutil.SetDeploymentRevision(deployment, rsCopy.Annotations[deploymentutil.RevisionAnnotation])
needsUpdate := deploymentutil.SetDeploymentRevision(d, rsCopy.Annotations[deploymentutil.RevisionAnnotation])
// If no other Progressing condition has been recorded and we need to estimate the progress
// of this deployment then it is likely that old users started caring about progress. In that
// case we need to take into account the first time we noticed their new replica set.
cond := deploymentutil.GetDeploymentCondition(deployment.Status, extensions.DeploymentProgressing)
if deployment.Spec.ProgressDeadlineSeconds != nil && cond == nil {
cond := deploymentutil.GetDeploymentCondition(d.Status, extensions.DeploymentProgressing)
if d.Spec.ProgressDeadlineSeconds != nil && cond == nil {
msg := fmt.Sprintf("Found new replica set %q", rsCopy.Name)
condition := deploymentutil.NewDeploymentCondition(extensions.DeploymentProgressing, v1.ConditionTrue, deploymentutil.FoundNewRSReason, msg)
deploymentutil.SetDeploymentCondition(&deployment.Status, *condition)
updateConditions = true
deploymentutil.SetDeploymentCondition(&d.Status, *condition)
needsUpdate = true
}
if updateConditions {
if deployment, err = dc.client.Extensions().Deployments(deployment.Namespace).UpdateStatus(deployment); err != nil {
if needsUpdate {
if d, err = dc.client.Extensions().Deployments(d.Namespace).UpdateStatus(d); err != nil {
return nil, err
}
}
@@ -280,72 +283,107 @@ func (dc *DeploymentController) getNewReplicaSet(deployment *extensions.Deployme
}
// new ReplicaSet does not exist, create one.
namespace := deployment.Namespace
podTemplateSpecHash := fmt.Sprintf("%d", deploymentutil.GetPodTemplateSpecHash(deployment.Spec.Template))
newRSTemplate := deploymentutil.GetNewReplicaSetTemplate(deployment)
newRSTemplate.Labels = labelsutil.CloneAndAddLabel(deployment.Spec.Template.Labels, extensions.DefaultDeploymentUniqueLabelKey, podTemplateSpecHash)
templateCopy, err := api.Scheme.DeepCopy(d.Spec.Template)
if err != nil {
return nil, err
}
newRSTemplate := templateCopy.(v1.PodTemplateSpec)
podTemplateSpecHash := fmt.Sprintf("%d", deploymentutil.GetPodTemplateSpecHash(&newRSTemplate, d.Status.CollisionCount))
newRSTemplate.Labels = labelsutil.CloneAndAddLabel(d.Spec.Template.Labels, extensions.DefaultDeploymentUniqueLabelKey, podTemplateSpecHash)
// Add podTemplateHash label to selector.
newRSSelector := labelsutil.CloneSelectorAndAddLabel(deployment.Spec.Selector, extensions.DefaultDeploymentUniqueLabelKey, podTemplateSpecHash)
newRSSelector := labelsutil.CloneSelectorAndAddLabel(d.Spec.Selector, extensions.DefaultDeploymentUniqueLabelKey, podTemplateSpecHash)
// Create new ReplicaSet
newRS := extensions.ReplicaSet{
ObjectMeta: metav1.ObjectMeta{
// Make the name deterministic, to ensure idempotence
Name: deployment.Name + "-" + podTemplateSpecHash,
Namespace: namespace,
OwnerReferences: []metav1.OwnerReference{*newControllerRef(deployment)},
Name: d.Name + "-" + podTemplateSpecHash,
Namespace: d.Namespace,
OwnerReferences: []metav1.OwnerReference{*newControllerRef(d)},
},
Spec: extensions.ReplicaSetSpec{
Replicas: new(int32),
MinReadySeconds: deployment.Spec.MinReadySeconds,
MinReadySeconds: d.Spec.MinReadySeconds,
Selector: newRSSelector,
Template: newRSTemplate,
},
}
allRSs := append(oldRSs, &newRS)
newReplicasCount, err := deploymentutil.NewRSNewReplicas(deployment, allRSs, &newRS)
newReplicasCount, err := deploymentutil.NewRSNewReplicas(d, allRSs, &newRS)
if err != nil {
return nil, err
}
*(newRS.Spec.Replicas) = newReplicasCount
// Set new replica set's annotation
deploymentutil.SetNewReplicaSetAnnotations(deployment, &newRS, newRevision, false)
createdRS, err := dc.client.Extensions().ReplicaSets(namespace).Create(&newRS)
deploymentutil.SetNewReplicaSetAnnotations(d, &newRS, newRevision, false)
// Create the new ReplicaSet. If it already exists, then we need to check for possible
// hash collisions. If there is any other error, we need to report it in the status of
// the Deployment.
alreadyExists := false
createdRS, err := dc.client.Extensions().ReplicaSets(d.Namespace).Create(&newRS)
switch {
// We may end up hitting this due to a slow cache or a fast resync of the deployment.
// TODO: Restore once https://github.com/kubernetes/kubernetes/issues/29735 is fixed
// ie. we start using a new hashing algorithm.
// We may end up hitting this due to a slow cache or a fast resync of the Deployment.
// Fetch a copy of the ReplicaSet. If its PodTemplateSpec is semantically deep equal
// with the PodTemplateSpec of the Deployment, then that is our new ReplicaSet. Otherwise,
// this is a hash collision and we need to increment the collisionCount field in the
// status of the Deployment and try the creation again.
case errors.IsAlreadyExists(err):
return nil, err
// return dc.rsLister.ReplicaSets(namespace).Get(newRS.Name)
alreadyExists = true
rs, rsErr := dc.rsLister.ReplicaSets(newRS.Namespace).Get(newRS.Name)
if rsErr != nil {
return nil, rsErr
}
isEqual, equalErr := deploymentutil.EqualIgnoreHash(&d.Spec.Template, &rs.Spec.Template)
if equalErr != nil {
return nil, equalErr
}
// Matching ReplicaSet is not equal - increment the collisionCount in the DeploymentStatus
// and requeue the Deployment.
if !isEqual {
if d.Status.CollisionCount == nil {
d.Status.CollisionCount = new(int64)
}
preCollisionCount := *d.Status.CollisionCount
*d.Status.CollisionCount++
// Update the collisionCount for the Deployment and let it requeue by returning the original
// error.
_, dErr := dc.client.Extensions().Deployments(d.Namespace).UpdateStatus(d)
if dErr == nil {
glog.V(2).Infof("Found a hash collision for deployment %q - bumping collisionCount (%d->%d) to resolve it", d.Name, preCollisionCount, *d.Status.CollisionCount)
}
return nil, err
}
// Pass through the matching ReplicaSet as the new ReplicaSet.
createdRS = rs
err = nil
case err != nil:
msg := fmt.Sprintf("Failed to create new replica set %q: %v", newRS.Name, err)
if deployment.Spec.ProgressDeadlineSeconds != nil {
if d.Spec.ProgressDeadlineSeconds != nil {
cond := deploymentutil.NewDeploymentCondition(extensions.DeploymentProgressing, v1.ConditionFalse, deploymentutil.FailedRSCreateReason, msg)
deploymentutil.SetDeploymentCondition(&deployment.Status, *cond)
deploymentutil.SetDeploymentCondition(&d.Status, *cond)
// We don't really care about this error at this point, since we have a bigger issue to report.
// TODO: Update the rest of the Deployment status, too. We may need to do this every time we
// error out in all other places in the controller so that we let users know that their deployments
// have been noticed by the controller, albeit with errors.
// TODO: Identify which errors are permanent and switch DeploymentIsFailed to take into account
// these reasons as well. Related issue: https://github.com/kubernetes/kubernetes/issues/18568
_, _ = dc.client.Extensions().Deployments(deployment.ObjectMeta.Namespace).UpdateStatus(deployment)
_, _ = dc.client.Extensions().Deployments(d.Namespace).UpdateStatus(d)
}
dc.eventRecorder.Eventf(deployment, v1.EventTypeWarning, deploymentutil.FailedRSCreateReason, msg)
dc.eventRecorder.Eventf(d, v1.EventTypeWarning, deploymentutil.FailedRSCreateReason, msg)
return nil, err
}
if newReplicasCount > 0 {
dc.eventRecorder.Eventf(deployment, v1.EventTypeNormal, "ScalingReplicaSet", "Scaled up replica set %s to %d", createdRS.Name, newReplicasCount)
if !alreadyExists && newReplicasCount > 0 {
dc.eventRecorder.Eventf(d, v1.EventTypeNormal, "ScalingReplicaSet", "Scaled up replica set %s to %d", createdRS.Name, newReplicasCount)
}
deploymentutil.SetDeploymentRevision(deployment, newRevision)
if deployment.Spec.ProgressDeadlineSeconds != nil {
needsUpdate := deploymentutil.SetDeploymentRevision(d, newRevision)
if !alreadyExists && d.Spec.ProgressDeadlineSeconds != nil {
msg := fmt.Sprintf("Created new replica set %q", createdRS.Name)
condition := deploymentutil.NewDeploymentCondition(extensions.DeploymentProgressing, v1.ConditionTrue, deploymentutil.NewReplicaSetReason, msg)
deploymentutil.SetDeploymentCondition(&deployment.Status, *condition)
deploymentutil.SetDeploymentCondition(&d.Status, *condition)
needsUpdate = true
}
if needsUpdate {
_, err = dc.client.Extensions().Deployments(d.Namespace).UpdateStatus(d)
}
_, err = dc.client.Extensions().Deployments(deployment.Namespace).UpdateStatus(deployment)
return createdRS, err
}
@@ -564,6 +602,7 @@ func calculateStatus(allRSs []*extensions.ReplicaSet, newRS *extensions.ReplicaS
ReadyReplicas: deploymentutil.GetReadyReplicaCountForReplicaSets(allRSs),
AvailableReplicas: availableReplicas,
UnavailableReplicas: unavailableReplicas,
CollisionCount: deployment.Status.CollisionCount,
}
// Copy conditions one by one so we won't mutate the original object.

View File

@@ -48,6 +48,7 @@ go_test(
srcs = [
"deployment_util_test.go",
"hash_test.go",
"pod_util_test.go",
],
library = ":go_default_library",
tags = ["automanaged"],
@@ -57,6 +58,7 @@ go_test(
"//pkg/apis/extensions/v1beta1:go_default_library",
"//pkg/client/clientset_generated/clientset/fake:go_default_library",
"//pkg/controller:go_default_library",
"//pkg/util/hash:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",

View File

@@ -640,29 +640,42 @@ func ListPods(deployment *extensions.Deployment, rsList []*extensions.ReplicaSet
// We ignore pod-template-hash because the hash result would be different upon podTemplateSpec API changes
// (e.g. the addition of a new field will cause the hash code to change)
// Note that we assume input podTemplateSpecs contain non-empty labels
func EqualIgnoreHash(template1, template2 v1.PodTemplateSpec) bool {
func EqualIgnoreHash(template1, template2 *v1.PodTemplateSpec) (bool, error) {
cp, err := api.Scheme.DeepCopy(template1)
if err != nil {
return false, err
}
t1Copy := cp.(*v1.PodTemplateSpec)
cp, err = api.Scheme.DeepCopy(template2)
if err != nil {
return false, err
}
t2Copy := cp.(*v1.PodTemplateSpec)
// First, compare template.Labels (ignoring hash)
labels1, labels2 := template1.Labels, template2.Labels
labels1, labels2 := t1Copy.Labels, t2Copy.Labels
if len(labels1) > len(labels2) {
labels1, labels2 = labels2, labels1
}
// We make sure len(labels2) >= len(labels1)
for k, v := range labels2 {
if labels1[k] != v && k != extensions.DefaultDeploymentUniqueLabelKey {
return false
return false, nil
}
}
// Then, compare the templates without comparing their labels
template1.Labels, template2.Labels = nil, nil
return apiequality.Semantic.DeepEqual(template1, template2)
t1Copy.Labels, t2Copy.Labels = nil, nil
return apiequality.Semantic.DeepEqual(t1Copy, t2Copy), nil
}
// FindNewReplicaSet returns the new RS this given deployment targets (the one with the same pod template).
func FindNewReplicaSet(deployment *extensions.Deployment, rsList []*extensions.ReplicaSet) (*extensions.ReplicaSet, error) {
newRSTemplate := GetNewReplicaSetTemplate(deployment)
sort.Sort(controller.ReplicaSetsByCreationTimestamp(rsList))
for i := range rsList {
if EqualIgnoreHash(rsList[i].Spec.Template, newRSTemplate) {
equal, err := EqualIgnoreHash(&rsList[i].Spec.Template, &deployment.Spec.Template)
if err != nil {
return nil, err
}
if equal {
// In rare cases, such as after cluster upgrades, Deployment may end up with
// having more than one new ReplicaSets that have the same template as its template,
// see https://github.com/kubernetes/kubernetes/issues/40415
@@ -746,31 +759,6 @@ func LabelPodsWithHash(podList *v1.PodList, c clientset.Interface, podLister cor
return nil
}
// GetNewReplicaSetTemplate returns the desired PodTemplateSpec for the new ReplicaSet corresponding to the given ReplicaSet.
// Callers of this helper need to set the DefaultDeploymentUniqueLabelKey k/v pair.
func GetNewReplicaSetTemplate(deployment *extensions.Deployment) v1.PodTemplateSpec {
// newRS will have the same template as in deployment spec.
return v1.PodTemplateSpec{
ObjectMeta: deployment.Spec.Template.ObjectMeta,
Spec: deployment.Spec.Template.Spec,
}
}
// TODO: remove the duplicate
// GetNewReplicaSetTemplateInternal returns the desired PodTemplateSpec for the new ReplicaSet corresponding to the given ReplicaSet.
func GetNewReplicaSetTemplateInternal(deployment *internalextensions.Deployment) api.PodTemplateSpec {
// newRS will have the same template as in deployment spec, plus a unique label in some cases.
newRSTemplate := api.PodTemplateSpec{
ObjectMeta: deployment.Spec.Template.ObjectMeta,
Spec: deployment.Spec.Template.Spec,
}
newRSTemplate.ObjectMeta.Labels = labelsutil.CloneAndAddLabel(
deployment.Spec.Template.ObjectMeta.Labels,
internalextensions.DefaultDeploymentUniqueLabelKey,
fmt.Sprintf("%d", GetInternalPodTemplateSpecHash(newRSTemplate)))
return newRSTemplate
}
// SetFromReplicaSetTemplate sets the desired PodTemplateSpec from a replica set template to the given deployment.
func SetFromReplicaSetTemplate(deployment *extensions.Deployment, template v1.PodTemplateSpec) *extensions.Deployment {
deployment.Spec.Template.ObjectMeta = template.ObjectMeta

View File

@@ -184,7 +184,8 @@ func newDControllerRef(d *extensions.Deployment) *metav1.OwnerReference {
// generateRS creates a replica set, with the input deployment's template as its template
func generateRS(deployment extensions.Deployment) extensions.ReplicaSet {
template := GetNewReplicaSetTemplate(&deployment)
cp, _ := api.Scheme.DeepCopy(deployment.Spec.Template)
template := cp.(v1.PodTemplateSpec)
return extensions.ReplicaSet{
ObjectMeta: metav1.ObjectMeta{
UID: randomUID(),
@@ -193,7 +194,7 @@ func generateRS(deployment extensions.Deployment) extensions.ReplicaSet {
OwnerReferences: []metav1.OwnerReference{*newDControllerRef(&deployment)},
},
Spec: extensions.ReplicaSetSpec{
Replicas: func() *int32 { i := int32(0); return &i }(),
Replicas: new(int32),
Template: template,
Selector: &metav1.LabelSelector{MatchLabels: template.Labels},
},
@@ -444,29 +445,22 @@ func TestEqualIgnoreHash(t *testing.T) {
for _, test := range tests {
runTest := func(t1, t2 *v1.PodTemplateSpec, reversed bool) {
// Set up
t1Copy, err := api.Scheme.DeepCopy(t1)
if err != nil {
t.Errorf("Failed setting up the test: %v", err)
}
t2Copy, err := api.Scheme.DeepCopy(t2)
if err != nil {
t.Errorf("Failed setting up the test: %v", err)
}
reverseString := ""
if reversed {
reverseString = " (reverse order)"
}
// Run
equal := EqualIgnoreHash(*t1, *t2)
equal, err := EqualIgnoreHash(t1, t2)
if err != nil {
t.Errorf("%s: unexpected error: %v", err, test.test)
return
}
if equal != test.expected {
t.Errorf("In test case %q%s, expected %v", test.test, reverseString, test.expected)
t.Errorf("%q%s: expected %v", test.test, reverseString, test.expected)
return
}
if t1.Labels == nil || t2.Labels == nil {
t.Errorf("In test case %q%s, unexpected labels becomes nil", test.test, reverseString)
}
if !reflect.DeepEqual(t1, t1Copy) || !reflect.DeepEqual(t2, t2Copy) {
t.Errorf("In test case %q%s, unexpected input template modified", test.test, reverseString)
t.Errorf("%q%s: unexpected labels becomes nil", test.test, reverseString)
}
}
runTest(&test.former, &test.latter, false)

View File

@@ -18,11 +18,13 @@ package util
import (
"encoding/json"
"hash/adler32"
"strconv"
"strings"
"testing"
"k8s.io/kubernetes/pkg/api/v1"
hashutil "k8s.io/kubernetes/pkg/util/hash"
)
var podSpec string = `
@@ -103,34 +105,12 @@ var podSpec string = `
func TestPodTemplateSpecHash(t *testing.T) {
seenHashes := make(map[uint32]int)
broken := false
for i := 0; i < 1000; i++ {
specJson := strings.Replace(podSpec, "@@VERSION@@", strconv.Itoa(i), 1)
spec := v1.PodTemplateSpec{}
json.Unmarshal([]byte(specJson), &spec)
hash := GetPodTemplateSpecHash(spec)
if v, ok := seenHashes[hash]; ok {
broken = true
t.Logf("Hash collision, old: %d new: %d", v, i)
break
}
seenHashes[hash] = i
}
if !broken {
t.Errorf("expected adler to break but it didn't")
}
}
func TestPodTemplateSpecHashFnv(t *testing.T) {
seenHashes := make(map[uint32]int)
for i := 0; i < 1000; i++ {
specJson := strings.Replace(podSpec, "@@VERSION@@", strconv.Itoa(i), 1)
spec := v1.PodTemplateSpec{}
json.Unmarshal([]byte(specJson), &spec)
hash := GetPodTemplateSpecHashFnv(spec)
hash := GetPodTemplateSpecHash(&spec, nil)
if v, ok := seenHashes[hash]; ok {
t.Errorf("Hash collision, old: %d new: %d", v, i)
break
@@ -144,15 +124,21 @@ func BenchmarkAdler(b *testing.B) {
json.Unmarshal([]byte(podSpec), &spec)
for i := 0; i < b.N; i++ {
GetPodTemplateSpecHash(spec)
getPodTemplateSpecOldHash(spec)
}
}
func getPodTemplateSpecOldHash(template v1.PodTemplateSpec) uint32 {
podTemplateSpecHasher := adler32.New()
hashutil.DeepHashObject(podTemplateSpecHasher, template)
return podTemplateSpecHasher.Sum32()
}
func BenchmarkFnv(b *testing.B) {
spec := v1.PodTemplateSpec{}
json.Unmarshal([]byte(podSpec), &spec)
for i := 0; i < b.N; i++ {
GetPodTemplateSpecHashFnv(spec)
GetPodTemplateSpecHash(&spec, nil)
}
}

View File

@@ -17,7 +17,7 @@ limitations under the License.
package util
import (
"hash/adler32"
"encoding/binary"
"hash/fnv"
"github.com/golang/glog"
@@ -31,22 +31,17 @@ import (
hashutil "k8s.io/kubernetes/pkg/util/hash"
)
func GetPodTemplateSpecHash(template v1.PodTemplateSpec) uint32 {
podTemplateSpecHasher := adler32.New()
hashutil.DeepHashObject(podTemplateSpecHasher, template)
return podTemplateSpecHasher.Sum32()
}
// TODO: remove the duplicate
func GetInternalPodTemplateSpecHash(template api.PodTemplateSpec) uint32 {
podTemplateSpecHasher := adler32.New()
hashutil.DeepHashObject(podTemplateSpecHasher, template)
return podTemplateSpecHasher.Sum32()
}
func GetPodTemplateSpecHashFnv(template v1.PodTemplateSpec) uint32 {
func GetPodTemplateSpecHash(template *v1.PodTemplateSpec, uniquifier *int64) uint32 {
podTemplateSpecHasher := fnv.New32a()
hashutil.DeepHashObject(podTemplateSpecHasher, template)
hashutil.DeepHashObject(podTemplateSpecHasher, *template)
// Add uniquifier in the hash if it exists.
if uniquifier != nil {
uniquifierBytes := make([]byte, 8)
binary.LittleEndian.PutUint64(uniquifierBytes, uint64(*uniquifier))
podTemplateSpecHasher.Write(uniquifierBytes)
}
return podTemplateSpecHasher.Sum32()
}

View File

@@ -0,0 +1,59 @@
/*
Copyright 2017 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package util
import (
"math"
"testing"
"k8s.io/kubernetes/pkg/api/v1"
)
func int64P(num int64) *int64 {
return &num
}
func TestGetPodTemplateSpecHash(t *testing.T) {
tests := []struct {
name string
template *v1.PodTemplateSpec
collisionCount *int64
otherCollisionCount *int64
}{
{
name: "simple",
template: &v1.PodTemplateSpec{},
collisionCount: int64P(1),
otherCollisionCount: int64P(2),
},
{
name: "using math.MaxInt64",
template: &v1.PodTemplateSpec{},
collisionCount: nil,
otherCollisionCount: int64P(int64(math.MaxInt64)),
},
}
for _, test := range tests {
hash := GetPodTemplateSpecHash(test.template, test.collisionCount)
otherHash := GetPodTemplateSpecHash(test.template, test.otherCollisionCount)
if hash == otherHash {
t.Errorf("expected different hashes but got the same: %d", hash)
}
}
}

View File

@@ -69,21 +69,12 @@ func UpdateRSWithRetries(rsClient unversionedextensions.ReplicaSetInterface, rsL
}
// GetReplicaSetHash returns the pod template hash of a ReplicaSet's pod template space
func GetReplicaSetHash(rs *extensions.ReplicaSet) string {
meta := rs.Spec.Template.ObjectMeta
meta.Labels = labelsutil.CloneAndRemoveLabel(meta.Labels, extensions.DefaultDeploymentUniqueLabelKey)
return fmt.Sprintf("%d", GetPodTemplateSpecHash(v1.PodTemplateSpec{
ObjectMeta: meta,
Spec: rs.Spec.Template.Spec,
}))
}
// GetReplicaSetHashFnv returns the pod template hash of a ReplicaSet's pod template spec.
func GetReplicaSetHashFnv(rs *extensions.ReplicaSet) string {
meta := rs.Spec.Template.ObjectMeta
meta.Labels = labelsutil.CloneAndRemoveLabel(meta.Labels, extensions.DefaultDeploymentUniqueLabelKey)
return fmt.Sprintf("%d", GetPodTemplateSpecHashFnv(v1.PodTemplateSpec{
ObjectMeta: meta,
Spec: rs.Spec.Template.Spec,
}))
func GetReplicaSetHash(rs *extensions.ReplicaSet, uniquifier *int64) (string, error) {
template, err := api.Scheme.DeepCopy(rs.Spec.Template)
if err != nil {
return "", err
}
rsTemplate := template.(v1.PodTemplateSpec)
rsTemplate.Labels = labelsutil.CloneAndRemoveLabel(rsTemplate.Labels, extensions.DefaultDeploymentUniqueLabelKey)
return fmt.Sprintf("%d", GetPodTemplateSpecHash(&rsTemplate, uniquifier)), nil
}

View File

@@ -157,7 +157,6 @@ go_test(
"//pkg/client/clientset_generated/internalclientset/typed/batch/internalversion:go_default_library",
"//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library",
"//pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion:go_default_library",
"//pkg/controller/deployment/util:go_default_library",
"//pkg/kubectl/util:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",

View File

@@ -35,7 +35,6 @@ import (
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
)
func TestReplicationControllerStop(t *testing.T) {
@@ -441,7 +440,6 @@ func TestDeploymentStop(t *testing.T) {
Replicas: 0,
},
}
template := deploymentutil.GetNewReplicaSetTemplateInternal(&deployment)
trueVar := true
tests := []struct {
Name string
@@ -492,9 +490,7 @@ func TestDeploymentStop(t *testing.T) {
},
},
},
Spec: extensions.ReplicaSetSpec{
Template: template,
},
Spec: extensions.ReplicaSetSpec{},
},
// ReplicaSet owned by something else (should be ignored).
{
@@ -512,9 +508,7 @@ func TestDeploymentStop(t *testing.T) {
},
},
},
Spec: extensions.ReplicaSetSpec{
Template: template,
},
Spec: extensions.ReplicaSetSpec{},
},
},
},
@@ -709,7 +703,6 @@ func TestDeploymentNotFoundError(t *testing.T) {
Replicas: 0,
},
}
template := deploymentutil.GetNewReplicaSetTemplateInternal(deployment)
fake := fake.NewSimpleClientset(
deployment,
@@ -719,9 +712,7 @@ func TestDeploymentNotFoundError(t *testing.T) {
Name: name,
Namespace: ns,
},
Spec: extensions.ReplicaSetSpec{
Template: template,
},
Spec: extensions.ReplicaSetSpec{},
},
},
},

View File

@@ -1,6 +1,6 @@
{
"ImportPath": "k8s.io/client-go",
"GoVersion": "go1.7",
"GoVersion": "go1.8",
"GodepVersion": "v79",
"Packages": [
"./..."

View File

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

View File

@@ -170,6 +170,12 @@ message DeploymentStatus {
// +patchMergeKey=type
// +patchStrategy=merge
repeated DeploymentCondition conditions = 6;
// Count of hash collisions for the Deployment. The Deployment controller uses this
// field as a collision avoidance mechanism when it needs to create the name for the
// newest ReplicaSet.
// +optional
optional int64 collisionCount = 8;
}
// DeploymentStrategy describes how to replace existing pods with new ones.

View File

@@ -4672,7 +4672,7 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
} else {
yysep2 := !z.EncBinary()
yy2arr2 := z.EncBasicHandle().StructToArray
var yyq2 [7]bool
var yyq2 [8]bool
_, _, _ = yysep2, yyq2, yy2arr2
const yyr2 bool = false
yyq2[0] = x.ObservedGeneration != 0
@@ -4682,9 +4682,10 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
yyq2[4] = x.AvailableReplicas != 0
yyq2[5] = x.UnavailableReplicas != 0
yyq2[6] = len(x.Conditions) != 0
yyq2[7] = x.CollisionCount != nil
var yynn2 int
if yyr2 || yy2arr2 {
r.EncodeArrayStart(7)
r.EncodeArrayStart(8)
} else {
yynn2 = 0
for _, b := range yyq2 {
@@ -4878,6 +4879,41 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
}
}
}
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
if yyq2[7] {
if x.CollisionCount == nil {
r.EncodeNil()
} else {
yy25 := *x.CollisionCount
yym26 := z.EncBinary()
_ = yym26
if false {
} else {
r.EncodeInt(int64(yy25))
}
}
} else {
r.EncodeNil()
}
} else {
if yyq2[7] {
z.EncSendContainerState(codecSelfer_containerMapKey1234)
r.EncodeString(codecSelferC_UTF81234, string("collisionCount"))
z.EncSendContainerState(codecSelfer_containerMapValue1234)
if x.CollisionCount == nil {
r.EncodeNil()
} else {
yy27 := *x.CollisionCount
yym28 := z.EncBinary()
_ = yym28
if false {
} else {
r.EncodeInt(int64(yy27))
}
}
}
}
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayEnd1234)
} else {
@@ -5023,6 +5059,22 @@ func (x *DeploymentStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) {
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv16), d)
}
}
case "collisionCount":
if r.TryDecodeAsNil() {
if x.CollisionCount != nil {
x.CollisionCount = nil
}
} else {
if x.CollisionCount == nil {
x.CollisionCount = new(int64)
}
yym19 := z.DecBinary()
_ = yym19
if false {
} else {
*((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64))
}
}
default:
z.DecStructFieldNotFound(-1, yys3)
} // end switch yys3
@@ -5034,16 +5086,16 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
var h codecSelfer1234
z, r := codec1978.GenHelperDecoder(d)
_, _, _ = h, z, r
var yyj18 int
var yyb18 bool
var yyhl18 bool = l >= 0
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
var yyj20 int
var yyb20 bool
var yyhl20 bool = l >= 0
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -5051,21 +5103,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.ObservedGeneration = 0
} else {
yyv19 := &x.ObservedGeneration
yym20 := z.DecBinary()
_ = yym20
yyv21 := &x.ObservedGeneration
yym22 := z.DecBinary()
_ = yym22
if false {
} else {
*((*int64)(yyv19)) = int64(r.DecodeInt(64))
*((*int64)(yyv21)) = int64(r.DecodeInt(64))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -5073,29 +5125,7 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.Replicas = 0
} else {
yyv21 := &x.Replicas
yym22 := z.DecBinary()
_ = yym22
if false {
} else {
*((*int32)(yyv21)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
} else {
yyb18 = r.CheckBreak()
}
if yyb18 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UpdatedReplicas = 0
} else {
yyv23 := &x.UpdatedReplicas
yyv23 := &x.Replicas
yym24 := z.DecBinary()
_ = yym24
if false {
@@ -5103,21 +5133,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv23)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.ReadyReplicas = 0
x.UpdatedReplicas = 0
} else {
yyv25 := &x.ReadyReplicas
yyv25 := &x.UpdatedReplicas
yym26 := z.DecBinary()
_ = yym26
if false {
@@ -5125,21 +5155,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv25)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.AvailableReplicas = 0
x.ReadyReplicas = 0
} else {
yyv27 := &x.AvailableReplicas
yyv27 := &x.ReadyReplicas
yym28 := z.DecBinary()
_ = yym28
if false {
@@ -5147,21 +5177,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv27)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UnavailableReplicas = 0
x.AvailableReplicas = 0
} else {
yyv29 := &x.UnavailableReplicas
yyv29 := &x.AvailableReplicas
yym30 := z.DecBinary()
_ = yym30
if false {
@@ -5169,13 +5199,35 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv29)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UnavailableReplicas = 0
} else {
yyv31 := &x.UnavailableReplicas
yym32 := z.DecBinary()
_ = yym32
if false {
} else {
*((*int32)(yyv31)) = int32(r.DecodeInt(32))
}
}
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb20 = r.CheckBreak()
}
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -5183,26 +5235,52 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.Conditions = nil
} else {
yyv31 := &x.Conditions
yym32 := z.DecBinary()
_ = yym32
yyv33 := &x.Conditions
yym34 := z.DecBinary()
_ = yym34
if false {
} else {
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv31), d)
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv33), d)
}
}
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb20 = r.CheckBreak()
}
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
if x.CollisionCount != nil {
x.CollisionCount = nil
}
} else {
if x.CollisionCount == nil {
x.CollisionCount = new(int64)
}
yym36 := z.DecBinary()
_ = yym36
if false {
} else {
*((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64))
}
}
for {
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
break
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
z.DecStructFieldNotFound(yyj18-1, "")
z.DecStructFieldNotFound(yyj20-1, "")
}
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
}
@@ -6470,7 +6548,7 @@ func (x codecSelfer1234) decSliceDeployment(v *[]Deployment, d *codec1978.Decode
yyrg1 := len(yyv1) > 0
yyv21 := yyv1
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 960)
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 968)
if yyrt1 {
if yyrl1 <= cap(yyv1) {
yyv1 = yyv1[:yyrl1]

View File

@@ -356,6 +356,12 @@ type DeploymentStatus struct {
// +patchMergeKey=type
// +patchStrategy=merge
Conditions []DeploymentCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,6,rep,name=conditions"`
// Count of hash collisions for the Deployment. The Deployment controller uses this
// field as a collision avoidance mechanism when it needs to create the name for the
// newest ReplicaSet.
// +optional
CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"`
}
type DeploymentConditionType string

View File

@@ -99,6 +99,7 @@ var map_DeploymentStatus = map[string]string{
"availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.",
"unavailableReplicas": "Total number of unavailable pods targeted by this deployment.",
"conditions": "Represents the latest available observations of a deployment's current state.",
"collisionCount": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.",
}
func (DeploymentStatus) SwaggerDoc() map[string]string {

View File

@@ -184,6 +184,11 @@ func DeepCopy_v1beta1_DeploymentStatus(in interface{}, out interface{}, c *conve
}
}
}
if in.CollisionCount != nil {
in, out := &in.CollisionCount, &out.CollisionCount
*out = new(int64)
**out = **in
}
return nil
}
}

View File

@@ -327,6 +327,12 @@ type DeploymentStatus struct {
// Represents the latest available observations of a deployment's current state.
Conditions []DeploymentCondition
// Count of hash collisions for the Deployment. The Deployment controller uses this
// field as a collision avoidance mechanism when it needs to create the name for the
// newest ReplicaSet.
// +optional
CollisionCount *int64
}
type DeploymentConditionType string

View File

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

View File

@@ -325,6 +325,12 @@ message DeploymentStatus {
// +patchMergeKey=type
// +patchStrategy=merge
repeated DeploymentCondition conditions = 6;
// Count of hash collisions for the Deployment. The Deployment controller uses this
// field as a collision avoidance mechanism when it needs to create the name for the
// newest ReplicaSet.
// +optional
optional int64 collisionCount = 8;
}
// DeploymentStrategy describes how to replace existing pods with new ones.

View File

@@ -5606,7 +5606,7 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
} else {
yysep2 := !z.EncBinary()
yy2arr2 := z.EncBasicHandle().StructToArray
var yyq2 [7]bool
var yyq2 [8]bool
_, _, _ = yysep2, yyq2, yy2arr2
const yyr2 bool = false
yyq2[0] = x.ObservedGeneration != 0
@@ -5616,9 +5616,10 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
yyq2[4] = x.AvailableReplicas != 0
yyq2[5] = x.UnavailableReplicas != 0
yyq2[6] = len(x.Conditions) != 0
yyq2[7] = x.CollisionCount != nil
var yynn2 int
if yyr2 || yy2arr2 {
r.EncodeArrayStart(7)
r.EncodeArrayStart(8)
} else {
yynn2 = 0
for _, b := range yyq2 {
@@ -5812,6 +5813,41 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) {
}
}
}
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
if yyq2[7] {
if x.CollisionCount == nil {
r.EncodeNil()
} else {
yy25 := *x.CollisionCount
yym26 := z.EncBinary()
_ = yym26
if false {
} else {
r.EncodeInt(int64(yy25))
}
}
} else {
r.EncodeNil()
}
} else {
if yyq2[7] {
z.EncSendContainerState(codecSelfer_containerMapKey1234)
r.EncodeString(codecSelferC_UTF81234, string("collisionCount"))
z.EncSendContainerState(codecSelfer_containerMapValue1234)
if x.CollisionCount == nil {
r.EncodeNil()
} else {
yy27 := *x.CollisionCount
yym28 := z.EncBinary()
_ = yym28
if false {
} else {
r.EncodeInt(int64(yy27))
}
}
}
}
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayEnd1234)
} else {
@@ -5957,6 +5993,22 @@ func (x *DeploymentStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) {
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv16), d)
}
}
case "collisionCount":
if r.TryDecodeAsNil() {
if x.CollisionCount != nil {
x.CollisionCount = nil
}
} else {
if x.CollisionCount == nil {
x.CollisionCount = new(int64)
}
yym19 := z.DecBinary()
_ = yym19
if false {
} else {
*((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64))
}
}
default:
z.DecStructFieldNotFound(-1, yys3)
} // end switch yys3
@@ -5968,16 +6020,16 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
var h codecSelfer1234
z, r := codec1978.GenHelperDecoder(d)
_, _, _ = h, z, r
var yyj18 int
var yyb18 bool
var yyhl18 bool = l >= 0
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
var yyj20 int
var yyb20 bool
var yyhl20 bool = l >= 0
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -5985,21 +6037,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.ObservedGeneration = 0
} else {
yyv19 := &x.ObservedGeneration
yym20 := z.DecBinary()
_ = yym20
yyv21 := &x.ObservedGeneration
yym22 := z.DecBinary()
_ = yym22
if false {
} else {
*((*int64)(yyv19)) = int64(r.DecodeInt(64))
*((*int64)(yyv21)) = int64(r.DecodeInt(64))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -6007,29 +6059,7 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.Replicas = 0
} else {
yyv21 := &x.Replicas
yym22 := z.DecBinary()
_ = yym22
if false {
} else {
*((*int32)(yyv21)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
} else {
yyb18 = r.CheckBreak()
}
if yyb18 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UpdatedReplicas = 0
} else {
yyv23 := &x.UpdatedReplicas
yyv23 := &x.Replicas
yym24 := z.DecBinary()
_ = yym24
if false {
@@ -6037,21 +6067,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv23)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.ReadyReplicas = 0
x.UpdatedReplicas = 0
} else {
yyv25 := &x.ReadyReplicas
yyv25 := &x.UpdatedReplicas
yym26 := z.DecBinary()
_ = yym26
if false {
@@ -6059,21 +6089,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv25)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.AvailableReplicas = 0
x.ReadyReplicas = 0
} else {
yyv27 := &x.AvailableReplicas
yyv27 := &x.ReadyReplicas
yym28 := z.DecBinary()
_ = yym28
if false {
@@ -6081,21 +6111,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv27)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UnavailableReplicas = 0
x.AvailableReplicas = 0
} else {
yyv29 := &x.UnavailableReplicas
yyv29 := &x.AvailableReplicas
yym30 := z.DecBinary()
_ = yym30
if false {
@@ -6103,13 +6133,35 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
*((*int32)(yyv29)) = int32(r.DecodeInt(32))
}
}
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.UnavailableReplicas = 0
} else {
yyv31 := &x.UnavailableReplicas
yym32 := z.DecBinary()
_ = yym32
if false {
} else {
*((*int32)(yyv31)) = int32(r.DecodeInt(32))
}
}
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb20 = r.CheckBreak()
}
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
@@ -6117,26 +6169,52 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder)
if r.TryDecodeAsNil() {
x.Conditions = nil
} else {
yyv31 := &x.Conditions
yym32 := z.DecBinary()
_ = yym32
yyv33 := &x.Conditions
yym34 := z.DecBinary()
_ = yym34
if false {
} else {
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv31), d)
h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv33), d)
}
}
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb20 = r.CheckBreak()
}
if yyb20 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
if x.CollisionCount != nil {
x.CollisionCount = nil
}
} else {
if x.CollisionCount == nil {
x.CollisionCount = new(int64)
}
yym36 := z.DecBinary()
_ = yym36
if false {
} else {
*((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64))
}
}
for {
yyj18++
if yyhl18 {
yyb18 = yyj18 > l
yyj20++
if yyhl20 {
yyb20 = yyj20 > l
} else {
yyb18 = r.CheckBreak()
yyb20 = r.CheckBreak()
}
if yyb18 {
if yyb20 {
break
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
z.DecStructFieldNotFound(yyj18-1, "")
z.DecStructFieldNotFound(yyj20-1, "")
}
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
}
@@ -19652,7 +19730,7 @@ func (x codecSelfer1234) decSliceDeployment(v *[]Deployment, d *codec1978.Decode
yyrg1 := len(yyv1) > 0
yyv21 := yyv1
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 960)
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 968)
if yyrt1 {
if yyrl1 <= cap(yyv1) {
yyv1 = yyv1[:yyrl1]

View File

@@ -325,6 +325,12 @@ type DeploymentStatus struct {
// +patchMergeKey=type
// +patchStrategy=merge
Conditions []DeploymentCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,6,rep,name=conditions"`
// Count of hash collisions for the Deployment. The Deployment controller uses this
// field as a collision avoidance mechanism when it needs to create the name for the
// newest ReplicaSet.
// +optional
CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"`
}
type DeploymentConditionType string

View File

@@ -186,6 +186,7 @@ var map_DeploymentStatus = map[string]string{
"availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.",
"unavailableReplicas": "Total number of unavailable pods targeted by this deployment.",
"conditions": "Represents the latest available observations of a deployment's current state.",
"collisionCount": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.",
}
func (DeploymentStatus) SwaggerDoc() map[string]string {

View File

@@ -628,6 +628,7 @@ func autoConvert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus(in *Dep
out.AvailableReplicas = in.AvailableReplicas
out.UnavailableReplicas = in.UnavailableReplicas
out.Conditions = *(*[]extensions.DeploymentCondition)(unsafe.Pointer(&in.Conditions))
out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount))
return nil
}
@@ -644,6 +645,7 @@ func autoConvert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus(in *ext
out.AvailableReplicas = in.AvailableReplicas
out.UnavailableReplicas = in.UnavailableReplicas
out.Conditions = *(*[]DeploymentCondition)(unsafe.Pointer(&in.Conditions))
out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount))
return nil
}

View File

@@ -384,6 +384,11 @@ func DeepCopy_v1beta1_DeploymentStatus(in interface{}, out interface{}, c *conve
}
}
}
if in.CollisionCount != nil {
in, out := &in.CollisionCount, &out.CollisionCount
*out = new(int64)
**out = **in
}
return nil
}
}

View File

@@ -378,6 +378,11 @@ func DeepCopy_extensions_DeploymentStatus(in interface{}, out interface{}, c *co
}
}
}
if in.CollisionCount != nil {
in, out := &in.CollisionCount, &out.CollisionCount
*out = new(int64)
**out = **in
}
return nil
}
}

View File

@@ -164,6 +164,7 @@ go_library(
"//test/e2e_federation:go_default_library",
"//test/images/net/nat:go_default_library",
"//test/utils:go_default_library",
"//vendor/github.com/davecgh/go-spew/spew:go_default_library",
"//vendor/github.com/elazarl/goproxy:go_default_library",
"//vendor/github.com/ghodss/yaml:go_default_library",
"//vendor/github.com/golang/glog:go_default_library",

View File

@@ -21,8 +21,10 @@ import (
"math/rand"
"time"
"github.com/davecgh/go-spew/spew"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
@@ -108,6 +110,9 @@ var _ = framework.KubeDescribe("Deployment", func() {
It("test Deployment ReplicaSet orphaning and adoption regarding controllerRef", func() {
testDeploymentsControllerRef(f)
})
It("deployment can avoid hash collisions", func() {
testDeploymentHashCollisionAvoidance(f)
})
// TODO: add tests that cover deployment.Spec.MinReadySeconds once we solved clock-skew issues
// See https://github.com/kubernetes/kubernetes/issues/29229
})
@@ -1359,3 +1364,47 @@ func orphanDeploymentReplicaSets(c clientset.Interface, d *extensions.Deployment
deleteOptions.Preconditions = metav1.NewUIDPreconditions(string(d.UID))
return c.Extensions().Deployments(d.Namespace).Delete(d.Name, deleteOptions)
}
func testDeploymentHashCollisionAvoidance(f *framework.Framework) {
ns := f.Namespace.Name
c := f.ClientSet
deploymentName := "test-hash-collision"
framework.Logf("Creating Deployment %q", deploymentName)
podLabels := map[string]string{"name": nginxImageName}
d := framework.NewDeployment(deploymentName, int32(0), podLabels, nginxImageName, nginxImage, extensions.RollingUpdateDeploymentStrategyType)
deployment, err := c.Extensions().Deployments(ns).Create(d)
Expect(err).NotTo(HaveOccurred())
err = framework.WaitForDeploymentRevisionAndImage(c, ns, deploymentName, "1", nginxImage)
Expect(err).NotTo(HaveOccurred())
// TODO: Switch this to do a non-cascading deletion of the Deployment, mutate the ReplicaSet
// once it has no owner reference, then recreate the Deployment if we ever proceed with
// https://github.com/kubernetes/kubernetes/issues/44237
framework.Logf("Mock a hash collision")
newRS, err := deploymentutil.GetNewReplicaSet(deployment, c)
Expect(err).NotTo(HaveOccurred())
var nilRs *extensions.ReplicaSet
Expect(newRS).NotTo(Equal(nilRs))
_, err = framework.UpdateReplicaSetWithRetries(c, ns, newRS.Name, func(update *extensions.ReplicaSet) {
*update.Spec.Template.Spec.TerminationGracePeriodSeconds = int64(5)
})
Expect(err).NotTo(HaveOccurred())
framework.Logf("Expect deployment collision counter to increment")
if err := wait.PollImmediate(time.Second, time.Minute, func() (bool, error) {
d, err := c.Extensions().Deployments(ns).Get(deploymentName, metav1.GetOptions{})
if err != nil {
framework.Logf("cannot get deployment %q: %v", deploymentName, err)
return false, nil
}
framework.Logf(spew.Sprintf("deployment status: %#v", d.Status))
return d.Status.CollisionCount != nil && *d.Status.CollisionCount == int64(1), nil
}); err != nil {
framework.Failf("Failed to increment collision counter for deployment %q: %v", deploymentName, err)
}
framework.Logf("Expect a new ReplicaSet to be created")
err = framework.WaitForDeploymentRevisionAndImage(c, ns, deploymentName, "2", nginxImage)
Expect(err).NotTo(HaveOccurred())
}

View File

@@ -3348,9 +3348,10 @@ func WatchRecreateDeployment(c clientset.Interface, d *extensions.Deployment) er
}
// WaitForDeploymentRevisionAndImage waits for the deployment's and its new RS's revision and container image to match the given revision and image.
// Note that deployment revision and its new RS revision should be updated shortly, so we only wait for 1 minute here to fail early.
// Note that deployment revision and its new RS revision should be updated shortly most of the time, but an overwhelmed RS controller
// may result in taking longer to relabel a RS.
func WaitForDeploymentRevisionAndImage(c clientset.Interface, ns, deploymentName string, revision, image string) error {
return testutil.WaitForDeploymentRevisionAndImage(c, ns, deploymentName, revision, image, Logf, Poll, pollShortTimeout)
return testutil.WaitForDeploymentRevisionAndImage(c, ns, deploymentName, revision, image, Logf, Poll, pollLongTimeout)
}
// CheckNewRSAnnotations check if the new RS's annotation is as expected
@@ -3486,16 +3487,17 @@ func WaitForPartialEvents(c clientset.Interface, ns string, objOrRef runtime.Obj
type updateDeploymentFunc func(d *extensions.Deployment)
func UpdateDeploymentWithRetries(c clientset.Interface, namespace, name string, applyUpdate updateDeploymentFunc) (deployment *extensions.Deployment, err error) {
deployments := c.Extensions().Deployments(namespace)
func UpdateDeploymentWithRetries(c clientset.Interface, namespace, name string, applyUpdate updateDeploymentFunc) (*extensions.Deployment, error) {
var deployment *extensions.Deployment
var updateErr error
pollErr := wait.Poll(10*time.Millisecond, 1*time.Minute, func() (bool, error) {
if deployment, err = deployments.Get(name, metav1.GetOptions{}); err != nil {
pollErr := wait.PollImmediate(1*time.Second, 1*time.Minute, func() (bool, error) {
var err error
if deployment, err = c.Extensions().Deployments(namespace).Get(name, metav1.GetOptions{}); err != nil {
return false, err
}
// Apply the update, then attempt to push it to the apiserver.
applyUpdate(deployment)
if deployment, err = deployments.Update(deployment); err == nil {
if deployment, err = c.Extensions().Deployments(namespace).Update(deployment); err == nil {
Logf("Updating deployment %s", name)
return true, nil
}
@@ -3513,7 +3515,7 @@ type updateRsFunc func(d *extensions.ReplicaSet)
func UpdateReplicaSetWithRetries(c clientset.Interface, namespace, name string, applyUpdate updateRsFunc) (*extensions.ReplicaSet, error) {
var rs *extensions.ReplicaSet
var updateErr error
pollErr := wait.PollImmediate(10*time.Millisecond, 1*time.Minute, func() (bool, error) {
pollErr := wait.PollImmediate(1*time.Second, 1*time.Minute, func() (bool, error) {
var err error
if rs, err = c.Extensions().ReplicaSets(namespace).Get(name, metav1.GetOptions{}); err != nil {
return false, err