Repository: akuity/kargo
Pull request #3949: chore(api): remove deprecated `phase` and `message` fields from Project and Stage
Author: login: hiddeco
Labels: name: kind/chore
description: Something that just needs to get done
name: area/ui
description: Affects the UI
name: priority/normal
description: This is the priority for most work
name: area/api-server
description: Affects Kargo's API server
Created: 2025-04-29T12:03:12Z | Merged: 2025-04-30T15:51:56Z

Supersedes: #3866 (thank you @0xMALVEE!)
Resolves: #3848


Diff:
diff --git a/api/v1alpha1/generated.pb.go b/api/v1alpha1/generated.pb.go
index a1850a2fd7..9ef0660d8c 100644
--- a/api/v1alpha1/generated.pb.go
+++ b/api/v1alpha1/generated.pb.go
@@ -2134,282 +2134,280 @@ func init() {
 }
 
 var fileDescriptor_e26b7f7bbc391025 = []byte{
-	// 4387 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x5c, 0x4d, 0x6c, 0x23, 0x47,
-	0x76, 0x9e, 0x26, 0x45, 0x4a, 0x7c, 0xd4, 0x6f, 0x8d, 0xc6, 0xd6, 0xca, 0xb1, 0x34, 0x69, 0x3b,
-	0x86, 0x1d, 0xdb, 0x54, 0x46, 0xe3, 0xb1, 0xc7, 0x33, 0xde, 0x09, 0x44, 0x6a, 0x7e, 0x34, 0xab,
-	0xf5, 0x28, 0x45, 0x79, 0xbc, 0x1e, 0x7b, 0x30, 0x29, 0x91, 0x25, 0xb2, 0x57, 0x64, 0x37, 0xdd,
-	0xd5, 0x94, 0x47, 0x49, 0x90, 0x38, 0xbf, 0x08, 0x90, 0x20, 0x31, 0x90, 0x0d, 0xbc, 0x87, 0x04,
-	0x09, 0x92, 0xd3, 0x62, 0x81, 0x5c, 0x73, 0xc8, 0xc1, 0x87, 0x5c, 0x9c, 0x64, 0x13, 0x18, 0x9b,
-	0x43, 0x1c, 0x60, 0xa1, 0xac, 0xb5, 0x40, 0xce, 0xb9, 0xe4, 0x32, 0x40, 0x80, 0xa0, 0x7e, 0xba,
-	0xbb, 0xba, 0xd9, 0x1c, 0xb1, 0xa9, 0x9f, 0x1d, 0xec, 0x4d, 0xaa, 0x57, 0xf5, 0xbd, 0xaa, 0x57,
-	0xf5, 0x5e, 0xbd, 0xf7, 0xea, 0x35, 0xe1, 0xb5, 0x86, 0xe5, 0x35, 0xbb, 0x5b, 0xa5, 0x9a, 0xd3,
-	0x5e, 0x22, 0x3b, 0x5d, 0xcb, 0xdb, 0x5b, 0xda, 0x21, 0x6e, 0xc3, 0x59, 0x22, 0x1d, 0x6b, 0x69,
-	0xf7, 0x02, 0x69, 0x75, 0x9a, 0xe4, 0xc2, 0x52, 0x83, 0xda, 0xd4, 0x25, 0x1e, 0xad, 0x97, 0x3a,
-	0xae, 0xe3, 0x39, 0xe8, 0xf9, 0x70, 0x54, 0x49, 0x8e, 0x2a, 0x89, 0x51, 0x25, 0xd2, 0xb1, 0x4a,
-	0xfe, 0xa8, 0xf9, 0x57, 0x35, 0xec, 0x86, 0xd3, 0x70, 0x96, 0xc4, 0xe0, 0xad, 0xee, 0xb6, 0xf8,
-	0x4f, 0xfc, 0x23, 0xfe, 0x92, 0xa0, 0xf3, 0xb7, 0x76, 0x2e, 0xb3, 0x92, 0x25, 0x38, 0xd3, 0x87,
-	0x1e, 0xb5, 0x99, 0xe5, 0xd8, 0xec, 0x55, 0xd2, 0xb1, 0x18, 0x75, 0x77, 0xa9, 0xbb, 0xd4, 0xd9,
-	0x69, 0x70, 0x1a, 0x8b, 0x76, 0x58, 0xda, 0xed, 0x99, 0xde, 0xfc, 0x6b, 0x21, 0x52, 0x9b, 0xd4,
-	0x9a, 0x96, 0x4d, 0xdd, 0xbd, 0x70, 0x78, 0x9b, 0x7a, 0x24, 0x69, 0xd4, 0x52, 0xbf, 0x51, 0x6e,
-	0xd7, 0xf6, 0xac, 0x36, 0xed, 0x19, 0xf0, 0xfa, 0x61, 0x03, 0x58, 0xad, 0x49, 0xdb, 0x24, 0x3e,
-	0xce, 0xfc, 0x00, 0xce, 0xae, 0xd8, 0xa4, 0xb5, 0xc7, 0x2c, 0x86, 0xbb, 0xf6, 0x8a, 0xdb, 0xe8,
-	0xb6, 0xa9, 0xed, 0xa1, 0xf3, 0x30, 0x62, 0x93, 0x36, 0x9d, 0x33, 0xce, 0x1b, 0x2f, 0x16, 0xca,
-	0xe3, 0x9f, 0xef, 0x2f, 0x9e, 0x39, 0xd8, 0x5f, 0x1c, 0x79, 0x9b, 0xb4, 0x29, 0x16, 0x14, 0xf4,
-	0x1c, 0xe4, 0x76, 0x49, 0xab, 0x4b, 0xe7, 0x32, 0xa2, 0xcb, 0x84, 0xea, 0x92, 0xbb, 0xcb, 0x1b,
-	0xb1, 0xa4, 0x99, 0xbf, 0x9b, 0x8d, 0xc0, 0x7f, 0x93, 0x7a, 0xa4, 0x4e, 0x3c, 0x82, 0xda, 0x90,
-	0x6f, 0x91, 0x2d, 0xda, 0x62, 0x73, 0xc6, 0xf9, 0xec, 0x8b, 0xc5, 0xe5, 0xeb, 0xa5, 0x41, 0x36,
-	0xb1, 0x94, 0x00, 0x55, 0x5a, 0x17, 0x38, 0xd7, 0x6d, 0xcf, 0xdd, 0x2b, 0x4f, 0xaa, 0x49, 0xe4,
-	0x65, 0x23, 0x56, 0x4c, 0xd0, 0x6f, 0x1b, 0x50, 0x24, 0xb6, 0xed, 0x78, 0xc4, 0xe3, 0xdb, 0x34,
-	0x97, 0x11, 0x4c, 0x6f, 0x0f, 0xcf, 0x74, 0x25, 0x04, 0x93, 0x9c, 0xcf, 0x2a, 0xce, 0x45, 0x8d,
-	0x82, 0x75, 0x9e, 0xf3, 0x6f, 0x42, 0x51, 0x9b, 0x2a, 0x9a, 0x86, 0xec, 0x0e, 0xdd, 0x93, 0xf2,
-	0xc5, 0xfc, 0x4f, 0x34, 0x1b, 0x11, 0xa8, 0x92, 0xe0, 0x95, 0xcc, 0x65, 0x63, 0xfe, 0x1a, 0x4c,
-	0xc7, 0x19, 0xa6, 0x19, 0x6f, 0xfe, 0x89, 0x01, 0xb3, 0xda, 0x2a, 0x30, 0xdd, 0xa6, 0x2e, 0xb5,
-	0x6b, 0x14, 0x2d, 0x41, 0x81, 0xef, 0x25, 0xeb, 0x90, 0x9a, 0xbf, 0xd5, 0x33, 0x6a, 0x21, 0x85,
-	0xb7, 0x7d, 0x02, 0x0e, 0xfb, 0x04, 0xc7, 0x22, 0xf3, 0xb8, 0x63, 0xd1, 0x69, 0x12, 0x46, 0xe7,
-	0xb2, 0xd1, 0x63, 0xb1, 0xc1, 0x1b, 0xb1, 0xa4, 0x99, 0x0f, 0xe0, 0x6b, 0xfe, 0x7c, 0x36, 0x69,
-	0xbb, 0xd3, 0x22, 0x1e, 0x0d, 0x27, 0x75, 0xf8, 0xd1, 0x3b, 0x0f, 0x23, 0x3b, 0x96, 0x5d, 0x8f,
-	0xcf, 0xe2, 0x1b, 0x96, 0x5d, 0xc7, 0x82, 0x62, 0xee, 0xc0, 0xc4, 0x4a, 0xa7, 0xe3, 0x3a, 0xbb,
-	0xb4, 0x5e, 0xf5, 0x48, 0x83, 0xa2, 0x7b, 0x00, 0x44, 0x35, 0xac, 0x78, 0x02, 0xba, 0xb8, 0xfc,
-	0x8b, 0x25, 0xa9, 0x33, 0x25, 0x5d, 0x67, 0x4a, 0x9d, 0x9d, 0x06, 0x6f, 0x60, 0x25, 0xae, 0x9a,
-	0xa5, 0xdd, 0x0b, 0xa5, 0x4d, 0xab, 0x4d, 0xcb, 0x93, 0x07, 0xfb, 0x8b, 0xb0, 0x12, 0x20, 0x60,
-	0x0d, 0xcd, 0xfc, 0x1d, 0x03, 0xce, 0xad, 0xb8, 0x0d, 0xa7, 0xb2, 0xba, 0xd2, 0xe9, 0xdc, 0xa2,
-	0xa4, 0xe5, 0x35, 0xab, 0x1e, 0xf1, 0xba, 0x0c, 0x5d, 0x83, 0x3c, 0x13, 0x7f, 0xa9, 0xc5, 0xbc,
-	0xe0, 0x9f, 0x4f, 0x49, 0x7f, 0xb4, 0xbf, 0x38, 0x9b, 0x30, 0x90, 0x62, 0x35, 0x0a, 0xbd, 0x04,
-	0xa3, 0x6d, 0xca, 0x18, 0x69, 0xf8, 0x12, 0x9f, 0x52, 0x00, 0xa3, 0xdf, 0x94, 0xcd, 0xd8, 0xa7,
-	0x9b, 0xff, 0x9c, 0x81, 0xa9, 0x00, 0x4b, 0xb1, 0x3f, 0x81, 0xed, 0xed, 0xc2, 0x78, 0x53, 0x5b,
-	0xa1, 0xd8, 0xe5, 0xe2, 0xf2, 0xd5, 0x01, 0x35, 0x29, 0x49, 0x48, 0xe5, 0x59, 0xc5, 0x66, 0x5c,
-	0x6f, 0xc5, 0x11, 0x36, 0xa8, 0x0d, 0xc0, 0xf6, 0xec, 0x9a, 0x62, 0x3a, 0x22, 0x98, 0xbe, 0x99,
-	0x92, 0x69, 0x35, 0x00, 0x28, 0x23, 0xc5, 0x12, 0xc2, 0x36, 0xac, 0x31, 0x30, 0xff, 0xce, 0x80,
-	0xb3, 0x09, 0xe3, 0xd0, 0x5b, 0xb1, 0xfd, 0x7c, 0xbe, 0x67, 0x3f, 0x51, 0xcf, 0xb0, 0x70, 0x37,
-	0x5f, 0x81, 0x31, 0x97, 0xee, 0x5a, 0xfc, 0xa6, 0x50, 0x12, 0x9e, 0x56, 0xe3, 0xc7, 0xb0, 0x6a,
-	0xc7, 0x41, 0x0f, 0xf4, 0x32, 0x14, 0xfc, 0xbf, 0xb9, 0x98, 0xb3, 0x5c, 0x99, 0xf8, 0xc6, 0xf9,
-	0x5d, 0x19, 0x0e, 0xe9, 0xe6, 0x6f, 0x41, 0xae, 0xd2, 0x24, 0xae, 0xc7, 0x4f, 0x8c, 0x4b, 0x3b,
-	0xce, 0x3b, 0x78, 0x5d, 0x4d, 0x31, 0x38, 0x31, 0x58, 0x36, 0x63, 0x9f, 0x3e, 0xc0, 0x66, 0xbf,
-	0x04, 0xa3, 0xbb, 0xd4, 0x15, 0xf3, 0xcd, 0x46, 0xc1, 0xee, 0xca, 0x66, 0xec, 0xd3, 0xcd, 0x7f,
-	0x37, 0x60, 0x56, 0xcc, 0x60, 0xd5, 0x62, 0x35, 0x67, 0x97, 0xba, 0x7b, 0x98, 0xb2, 0x6e, 0xeb,
-	0x98, 0x27, 0xb4, 0x0a, 0xd3, 0x8c, 0xb6, 0x77, 0xa9, 0x5b, 0x71, 0x6c, 0xe6, 0xb9, 0xc4, 0xb2,
-	0x3d, 0x35, 0xb3, 0x39, 0xd5, 0x7b, 0xba, 0x1a, 0xa3, 0xe3, 0x9e, 0x11, 0xe8, 0x45, 0x18, 0x53,
-	0xd3, 0xe6, 0x47, 0x89, 0x0b, 0x76, 0x9c, 0xef, 0x81, 0x5a, 0x13, 0xc3, 0x01, 0xd5, 0xfc, 0x6f,
-	0x03, 0x66, 0xc4, 0xaa, 0xaa, 0xdd, 0x2d, 0x56, 0x73, 0xad, 0x0e, 0x37, 0xc0, 0x4f, 0xe2, 0x92,
-	0xae, 0xc1, 0x64, 0xdd, 0x17, 0xfc, 0xba, 0xd5, 0xb6, 0x3c, 0xa1, 0x23, 0xb9, 0xf2, 0x53, 0x0a,
-	0x63, 0x72, 0x35, 0x42, 0xc5, 0xb1, 0xde, 0x72, 0xfb, 0x5a, 0x5d, 0xe6, 0x51, 0x77, 0xc3, 0x75,
-	0xda, 0x0e, 0x5f, 0xe7, 0x26, 0x61, 0x3b, 0xe8, 0x57, 0x61, 0xac, 0xad, 0x2e, 0x3d, 0x65, 0x35,
-	0x7f, 0x69, 0x30, 0xab, 0x79, 0x67, 0xeb, 0xdb, 0xb4, 0xe6, 0xf1, 0x0b, 0x33, 0xd4, 0xb6, 0xb0,
-	0x0d, 0x07, 0xa8, 0xe8, 0x3d, 0x18, 0x61, 0x1d, 0x5a, 0x13, 0x22, 0x2a, 0x2e, 0xbf, 0x31, 0x98,
-	0x52, 0x47, 0x26, 0x59, 0xed, 0xd0, 0x5a, 0x28, 0x5b, 0xfe, 0x1f, 0x16, 0x90, 0xe6, 0x7f, 0x1a,
-	0x30, 0x97, 0xb4, 0xaa, 0x75, 0x8b, 0x79, 0xe8, 0x83, 0x9e, 0x95, 0x95, 0x06, 0x5b, 0x19, 0x1f,
-	0x2d, 0xd6, 0x15, 0x68, 0xaf, 0xdf, 0xa2, 0xad, 0xea, 0x01, 0xe4, 0x2c, 0x8f, 0xb6, 0x7d, 0x57,
-	0xe3, 0xca, 0x60, 0xcb, 0x4a, 0x9a, 0x6c, 0x78, 0x85, 0xae, 0x71, 0x40, 0x2c, 0x71, 0xcd, 0xf7,
-	0x61, 0xbc, 0xd2, 0x75, 0x5d, 0x6a, 0x7b, 0xf2, 0x82, 0xfb, 0x06, 0xe4, 0x98, 0x65, 0x2b, 0x3b,
-	0x9f, 0xee, 0x6e, 0x2b, 0x70, 0xf0, 0x2a, 0x1f, 0x8c, 0x25, 0x86, 0xf9, 0x17, 0x59, 0x38, 0xeb,
-	0x9f, 0x18, 0x5a, 0x5f, 0x71, 0x3d, 0x6b, 0x9b, 0xd4, 0x3c, 0x86, 0xea, 0x30, 0x5e, 0x0f, 0x9b,
-	0x3d, 0x65, 0x88, 0xd3, 0xf0, 0x0a, 0x8c, 0xbd, 0x06, 0xef, 0xe1, 0x08, 0x2a, 0x7a, 0x17, 0xb2,
-	0x0d, 0xcb, 0x53, 0x9e, 0xe1, 0xe5, 0xc1, 0x24, 0x77, 0xd3, 0x8a, 0x5b, 0x9e, 0x72, 0x51, 0xb1,
-	0xca, 0xde, 0xb4, 0x3c, 0xcc, 0x11, 0xd1, 0x16, 0xe4, 0xad, 0x36, 0x69, 0xd0, 0x94, 0xbb, 0xb2,
-	0xc6, 0xc7, 0xc4, 0xd1, 0x03, 0x57, 0x53, 0x50, 0x19, 0x56, 0xc8, 0x9c, 0x47, 0x8d, 0x5b, 0x0c,
-	0x69, 0xb3, 0x07, 0xdf, 0xf9, 0x04, 0xdb, 0x19, 0xf2, 0x10, 0x54, 0x86, 0x15, 0xb2, 0xf9, 0x65,
-	0x06, 0xa6, 0x43, 0xf9, 0x55, 0x9c, 0x76, 0xdb, 0xf2, 0xd0, 0x3c, 0x64, 0xac, 0xba, 0x32, 0x48,
-	0xa0, 0x06, 0x66, 0xd6, 0x56, 0x71, 0xc6, 0xaa, 0xa3, 0x17, 0x20, 0xbf, 0xe5, 0x12, 0xbb, 0xd6,
-	0x54, 0x86, 0x28, 0x00, 0x2e, 0x8b, 0x56, 0xac, 0xa8, 0xe8, 0x59, 0xc8, 0x7a, 0xa4, 0xa1, 0xec,
-	0x4f, 0x20, 0xbf, 0x4d, 0xd2, 0xc0, 0xbc, 0x9d, 0x1b, 0x3e, 0xd6, 0x15, 0x3a, 0x2c, 0x76, 0x5e,
-	0x33, 0x7c, 0x55, 0xd9, 0x8c, 0x7d, 0x3a, 0xe7, 0x48, 0xba, 0x5e, 0xd3, 0x71, 0xe7, 0x72, 0x51,
-	0x8e, 0x2b, 0xa2, 0x15, 0x2b, 0x2a, 0x77, 0x51, 0x6a, 0x62, 0xfe, 0x1e, 0x75, 0xe7, 0xf2, 0x51,
-	0x17, 0xa5, 0xe2, 0x13, 0x70, 0xd8, 0x07, 0xdd, 0x87, 0x62, 0xcd, 0xa5, 0xc4, 0x73, 0xdc, 0x55,
-	0xe2, 0xd1, 0xb9, 0xd1, 0xd4, 0x27, 0x70, 0x8a, 0x7b, 0xe9, 0x95, 0x10, 0x02, 0xeb, 0x78, 0xe6,
-	0xdf, 0x67, 0x61, 0x2e, 0x14, 0xad, 0xd8, 0xdb, 0xd0, 0x33, 0x55, 0xe2, 0x31, 0xfa, 0x88, 0xe7,
-	0x05, 0xc8, 0xd7, 0xad, 0x06, 0x65, 0x5e, 0x5c, 0xca, 0xab, 0xa2, 0x15, 0x2b, 0x2a, 0xfa, 0x83,
-	0x58, 0x34, 0x92, 0x13, 0x07, 0xe5, 0xce, 0x60, 0x07, 0xa5, 0xdf, 0xe4, 0x86, 0x08, 0x49, 0xd0,
-	0x32, 0x40, 0xc3, 0xf2, 0xd4, 0xa5, 0xa5, 0x76, 0x3d, 0x30, 0xd6, 0x37, 0x03, 0x0a, 0xd6, 0x7a,
-	0xa1, 0x77, 0xa1, 0x20, 0xe4, 0x35, 0xa4, 0xfe, 0x0b, 0x17, 0xa6, 0xe2, 0x03, 0xe0, 0x10, 0xeb,
-	0xc8, 0x41, 0xce, 0xfb, 0x80, 0xae, 0x3f, 0xec, 0xb8, 0x94, 0xf1, 0xab, 0xfb, 0x2e, 0x71, 0x2d,
-	0xb2, 0xd5, 0xa2, 0xc7, 0x15, 0xc7, 0x7e, 0x31, 0x02, 0xa3, 0x37, 0x5c, 0x6a, 0x35, 0x9a, 0xde,
-	0x29, 0x5c, 0x89, 0xcf, 0x41, 0x8e, 0xb4, 0x2c, 0xc2, 0xc4, 0xe9, 0xd6, 0xa6, 0xb4, 0xc2, 0x1b,
-	0xb1, 0xa4, 0xa1, 0xf7, 0x21, 0xef, 0xb8, 0x56, 0xc3, 0xb2, 0xe7, 0x0a, 0x62, 0x12, 0x17, 0x07,
-	0x3b, 0x3f, 0x6a, 0x15, 0x77, 0xc4, 0xd0, 0xf0, 0x88, 0xca, 0xff, 0xb1, 0x82, 0x44, 0xf7, 0x60,
-	0x54, 0xaa, 0x9c, 0x6f, 0xc6, 0x96, 0x06, 0x36, 0xc3, 0x52, 0x6b, 0x43, 0xd3, 0x20, 0xff, 0x67,
-	0xd8, 0x07, 0x44, 0xd5, 0xc0, 0x0a, 0x8f, 0x08, 0xe8, 0x97, 0x53, 0x58, 0xe1, 0xbe, 0x66, 0xb7,
-	0x1a, 0x98, 0xdd, 0x5c, 0x1a, 0x50, 0x61, 0x58, 0xfb, 0xd9, 0x59, 0x2e, 0x62, 0xe5, 0xee, 0xe7,
-	0x87, 0x10, 0xb1, 0x8a, 0x35, 0x26, 0xa3, 0x31, 0x82, 0x1f, 0x0d, 0x98, 0xdf, 0xc9, 0xc2, 0x8c,
-	0xea, 0x59, 0x71, 0x5a, 0x2d, 0x5a, 0x13, 0xbe, 0xa5, 0xb4, 0xe2, 0xd9, 0x44, 0x2b, 0x6e, 0xf9,
-	0x3e, 0x85, 0xbc, 0x19, 0xcb, 0xa9, 0x66, 0x13, 0xf2, 0x28, 0x09, 0x3f, 0x42, 0xda, 0x88, 0x60,
-	0x97, 0x54, 0x2f, 0xe5, 0x5d, 0xa0, 0xdf, 0x37, 0xe0, 0xec, 0x2e, 0x75, 0xad, 0x6d, 0xab, 0x26,
-	0xf4, 0xf1, 0x96, 0xc5, 0x3c, 0xc7, 0xdd, 0x53, 0xf7, 0xe6, 0xeb, 0x83, 0x71, 0xbe, 0xab, 0x01,
-	0xac, 0xd9, 0xdb, 0x4e, 0xf9, 0x19, 0xc5, 0xed, 0xec, 0xdd, 0x5e, 0x68, 0x9c, 0xc4, 0x6f, 0xbe,
-	0x03, 0x10, 0xce, 0x36, 0xc1, 0x1c, 0xac, 0xeb, 0xca, 0x3b, 0xf0, 0xc4, 0xfc, 0xc5, 0xfa, 0xb6,
-	0x53, 0x37, 0x23, 0x9f, 0x19, 0x50, 0x54, 0xf4, 0x53, 0x70, 0x13, 0x71, 0xd4, 0x4d, 0x7c, 0x35,
-	0xd5, 0xfc, 0xfb, 0x78, 0x86, 0x2e, 0x4c, 0x44, 0x94, 0x1c, 0x5d, 0x52, 0xe9, 0x12, 0x69, 0x03,
-	0x7f, 0x5e, 0x4f, 0x97, 0x3c, 0xda, 0x5f, 0x9c, 0x89, 0x74, 0x0e, 0x73, 0x28, 0x87, 0xc7, 0x2e,
-	0x57, 0xc6, 0xbe, 0xfb, 0xd7, 0x8b, 0x67, 0x3e, 0xfe, 0xd1, 0xf9, 0x33, 0xe6, 0xa7, 0x59, 0x98,
-	0x8e, 0x4b, 0x75, 0x00, 0xdb, 0x1b, 0xda, 0xb0, 0xb1, 0x13, 0xb5, 0x61, 0x99, 0x93, 0xb3, 0x61,
-	0xd9, 0x93, 0xb0, 0x61, 0x23, 0xc7, 0x66, 0xc3, 0xcc, 0x7f, 0x33, 0x60, 0x32, 0xd8, 0x99, 0x0f,
-	0xbb, 0xdc, 0xff, 0x08, 0xa5, 0x6e, 0x1c, 0xbf, 0xd4, 0x1f, 0xc0, 0x28, 0x73, 0xba, 0x6e, 0x4d,
-	0x38, 0xd9, 0x1c, 0xfd, 0xb5, 0x74, 0x46, 0x53, 0x8e, 0xd5, 0x3c, 0x4b, 0xd9, 0x80, 0x7d, 0x54,
-	0xf3, 0xb3, 0x4c, 0xb0, 0x20, 0x45, 0x93, 0x8e, 0x97, 0xcb, 0xdd, 0x52, 0xbe, 0xa0, 0x31, 0xdd,
-	0xf1, 0xe2, 0xad, 0x58, 0x51, 0x91, 0x29, 0xec, 0xb9, 0xef, 0xff, 0x17, 0xca, 0xa0, 0xcc, 0xb2,
-	0xd8, 0x04, 0x49, 0x41, 0x1d, 0x98, 0x76, 0xe9, 0x87, 0x5d, 0xcb, 0xa5, 0xf5, 0xaa, 0x43, 0x76,
-	0xb8, 0xd3, 0xa2, 0x92, 0x5c, 0x03, 0xea, 0xfd, 0x6a, 0xd7, 0x15, 0x26, 0xac, 0x3c, 0xcb, 0x63,
-	0x77, 0x1c, 0xc3, 0xc2, 0x3d, 0xe8, 0xc8, 0x81, 0x59, 0xb2, 0x4b, 0xac, 0x16, 0xd9, 0xb2, 0x5a,
-	0x96, 0xb7, 0x57, 0xf5, 0x5c, 0xe2, 0xd1, 0xc6, 0x9e, 0x72, 0xb1, 0xaf, 0xaa, 0xb5, 0xcc, 0xae,
-	0x24, 0xf4, 0x79, 0xb4, 0xbf, 0xf8, 0x8c, 0x92, 0x45, 0x12, 0x19, 0x27, 0x02, 0x9b, 0xff, 0x95,
-	0x0b, 0x2c, 0x84, 0xca, 0x6b, 0xfd, 0x3a, 0x14, 0x6b, 0x32, 0x98, 0x6c, 0xed, 0xad, 0xd9, 0xea,
-	0x4c, 0xaf, 0x0e, 0x71, 0xdb, 0x95, 0x2a, 0x21, 0x4c, 0xcc, 0x0b, 0xd5, 0x28, 0x58, 0xe7, 0x86,
-	0x3e, 0x02, 0x90, 0xa6, 0x9f, 0xd6, 0xd7, 0x6c, 0x75, 0xb7, 0x55, 0x86, 0xe1, 0x7d, 0x37, 0x40,
-	0x91, 0xac, 0x03, 0x27, 0x2b, 0x24, 0x60, 0x8d, 0x15, 0x5f, 0xb5, 0x9f, 0xc5, 0xbd, 0xe1, 0xb8,
-	0xca, 0x48, 0x0c, 0xb5, 0xea, 0x95, 0x10, 0x26, 0xee, 0x7b, 0x87, 0x14, 0xac, 0x73, 0x9b, 0x77,
-	0x61, 0x3a, 0x2e, 0xab, 0x84, 0xfb, 0xed, 0x56, 0xf4, 0x7e, 0x5b, 0x1e, 0xd0, 0x22, 0x68, 0x89,
-	0x01, 0xfd, 0x1d, 0xc1, 0x85, 0xa9, 0x98, 0x8c, 0x12, 0x58, 0xae, 0x45, 0x59, 0x5e, 0x4c, 0x73,
-	0xd7, 0xab, 0x6c, 0xbb, 0xce, 0x93, 0xc1, 0x74, 0x5c, 0x3a, 0xc7, 0xc6, 0x34, 0x92, 0xe2, 0xd7,
-	0x2f, 0xf1, 0xbf, 0xcc, 0x40, 0x21, 0x30, 0xe3, 0x69, 0xf2, 0x75, 0xd2, 0xfd, 0xca, 0x1c, 0x12,
-	0x44, 0x67, 0x07, 0x09, 0xa2, 0x47, 0xfa, 0x07, 0xd1, 0x7e, 0x4e, 0x3f, 0xff, 0xf8, 0x9c, 0xbe,
-	0x16, 0x44, 0x8f, 0x0e, 0x1e, 0x44, 0x8f, 0x1d, 0x1e, 0x44, 0x9b, 0x7f, 0x63, 0x00, 0xea, 0xcd,
-	0x98, 0xa4, 0x11, 0x14, 0x89, 0x5f, 0xae, 0xaf, 0xa7, 0x0d, 0x5f, 0x0f, 0xbb, 0x63, 0xcd, 0xcf,
-	0x72, 0x30, 0x75, 0xd3, 0x1a, 0x3a, 0xf5, 0xea, 0xc1, 0xd3, 0x12, 0xa9, 0x4a, 0x95, 0xe3, 0x1b,
-	0x58, 0x56, 0xb9, 0xbf, 0x57, 0xd4, 0xd0, 0xa7, 0x2b, 0xc9, 0xdd, 0x1e, 0xf5, 0x27, 0xe1, 0x7e,
-	0xd0, 0x03, 0x1f, 0x92, 0xab, 0x30, 0xc1, 0x3c, 0xd7, 0xaa, 0x79, 0x32, 0xb9, 0xcb, 0xe6, 0x8a,
-	0xe2, 0xe6, 0x3a, 0xa7, 0xba, 0x4f, 0x54, 0x75, 0x22, 0x8e, 0xf6, 0x4d, 0xcc, 0x19, 0x8f, 0xa4,
-	0xce, 0x19, 0x2f, 0x41, 0x81, 0xb4, 0x5a, 0xce, 0x47, 0x9b, 0xa4, 0xc1, 0x54, 0x96, 0x26, 0x38,
-	0x35, 0x2b, 0x3e, 0x01, 0x87, 0x7d, 0x50, 0x09, 0xc0, 0x6a, 0xd8, 0x8e, 0x4b, 0xc5, 0x88, 0xbc,
-	0xb8, 0x42, 0xc5, 0xbb, 0xd8, 0x5a, 0xd0, 0x8a, 0xb5, 0x1e, 0xa8, 0x0a, 0xe7, 0x2c, 0x9b, 0xd1,
-	0x5a, 0xd7, 0xa5, 0xd5, 0x1d, 0xab, 0xb3, 0xb9, 0x5e, 0x15, 0x56, 0x62, 0x4f, 0x9c, 0xe6, 0xb1,
-	0xf2, 0xb3, 0x8a, 0xd9, 0xb9, 0xb5, 0xa4, 0x4e, 0x38, 0x79, 0x2c, 0x7a, 0x0d, 0xc6, 0x2d, 0xbb,
-	0xd6, 0xea, 0xd6, 0xe9, 0x06, 0xf1, 0x9a, 0x6c, 0x6e, 0x4c, 0x4c, 0x63, 0xfa, 0x60, 0x7f, 0x71,
-	0x7c, 0x4d, 0x6b, 0xc7, 0x91, 0x5e, 0x7c, 0x14, 0x7d, 0xa8, 0x8d, 0x2a, 0x84, 0xa3, 0xae, 0x3f,
-	0xd4, 0x47, 0xe9, 0xbd, 0x12, 0xb2, 0xea, 0x90, 0x2a, 0xab, 0xfe, 0xfd, 0x0c, 0xe4, 0xe5, 0xa3,
-	0x16, 0xba, 0x14, 0x7b, 0x39, 0x7a, 0xb6, 0xe7, 0xe5, 0xa8, 0x98, 0xf4, 0x00, 0x68, 0x42, 0xde,
-	0x62, 0xac, 0x1b, 0xf5, 0x58, 0xd6, 0x44, 0x0b, 0x56, 0x14, 0x91, 0x71, 0x74, 0xec, 0x6d, 0xab,
-	0xa1, 0xd2, 0x31, 0xd7, 0x34, 0x3f, 0x25, 0x2c, 0x4d, 0x78, 0x10, 0xd4, 0x2e, 0x84, 0x2e, 0x4b,
-	0xa4, 0x03, 0xf7, 0x5d, 0x6e, 0x57, 0xef, 0xbc, 0x2d, 0x79, 0x54, 0x04, 0x22, 0x56, 0xc8, 0x9c,
-	0x87, 0xd3, 0xf5, 0x3a, 0x5d, 0x4f, 0x1c, 0x94, 0x63, 0xe2, 0x71, 0x47, 0x20, 0x62, 0x85, 0x6c,
-	0x7e, 0x6a, 0xc0, 0x94, 0x94, 0x41, 0xa5, 0x49, 0x6b, 0x3b, 0x55, 0x8f, 0x76, 0x78, 0x08, 0xd1,
-	0x65, 0x94, 0xc5, 0x43, 0x88, 0x77, 0x18, 0x65, 0x58, 0x50, 0xb4, 0xd5, 0x67, 0x4e, 0x6a, 0xf5,
-	0xe6, 0x65, 0xd0, 0x36, 0x47, 0xbc, 0xca, 0xca, 0xc7, 0x49, 0x79, 0x85, 0x65, 0x43, 0x23, 0x24,
-	0x7b, 0xed, 0x61, 0x9f, 0x6e, 0x1e, 0x64, 0x20, 0x27, 0xbc, 0xfc, 0x34, 0x96, 0x2b, 0x9a, 0x96,
-	0xcb, 0x0c, 0x94, 0x96, 0x3b, 0x24, 0x73, 0x1b, 0xa6, 0x26, 0x47, 0x1e, 0x9b, 0x9a, 0x64, 0x49,
-	0x99, 0xc9, 0xb7, 0x52, 0x04, 0x37, 0xc3, 0x54, 0x46, 0x1c, 0x35, 0xf3, 0xf7, 0x13, 0x03, 0x66,
-	0x93, 0x72, 0xf4, 0x69, 0x64, 0xfe, 0x0a, 0x8c, 0x75, 0x5a, 0xc4, 0xdb, 0x76, 0xdc, 0x76, 0xfc,
-	0x6d, 0x76, 0x43, 0xb5, 0xe3, 0xa0, 0x07, 0x72, 0x01, 0x5c, 0x3f, 0xcc, 0xf5, 0x43, 0xc0, 0x6b,
-	0x47, 0xcb, 0xdf, 0x86, 0x3b, 0x1c, 0x34, 0x31, 0xac, 0x71, 0x31, 0xff, 0x28, 0x07, 0x33, 0x62,
-	0xc8, 0xb0, 0x17, 0xe2, 0x30, 0xc7, 0xaa, 0x03, 0x4f, 0x89, 0xe0, 0xb4, 0xf7, 0x0e, 0x95, 0x27,
-	0xed, 0xb2, 0x1a, 0xff, 0xd4, 0x5a, 0x62, 0xaf, 0x47, 0x7d, 0x29, 0xb8, 0x0f, 0x6e, 0xef, 0xc5,
-	0x08, 0x3f, 0x7b, 0x17, 0xa3, 0x7e, 0xd8, 0x46, 0x0f, 0x3d, 0x6c, 0x7d, 0xaf, 0xd1, 0xb1, 0x23,
-	0x5c, 0xa3, 0xbd, 0x57, 0x5b, 0x21, 0xd5, 0xd5, 0xf6, 0x57, 0x19, 0x18, 0xdd, 0x70, 0x1d, 0xf1,
-	0xd6, 0x73, 0xf2, 0x09, 0xf1, 0x77, 0x86, 0x7c, 0x23, 0xe6, 0x50, 0xd2, 0x96, 0x8b, 0x37, 0xe2,
-	0xb1, 0xe8, 0xfb, 0xb0, 0x96, 0xdf, 0xcd, 0xa6, 0x09, 0x3b, 0x14, 0xf0, 0x21, 0xf9, 0xdd, 0x1f,
-	0x18, 0x30, 0x11, 0x99, 0xc2, 0x13, 0xfc, 0x96, 0x1e, 0x93, 0x53, 0xd2, 0x5b, 0xfa, 0xbf, 0x18,
-	0x30, 0x13, 0xe9, 0x79, 0x0a, 0xd9, 0xd1, 0x6f, 0x45, 0xb3, 0xa3, 0x17, 0x87, 0x58, 0x4f, 0x9f,
-	0x1c, 0xe9, 0x9f, 0xc5, 0x57, 0xc3, 0x57, 0x8a, 0x7e, 0x13, 0x66, 0x3a, 0xfe, 0xd3, 0xfb, 0x86,
-	0xd3, 0xb2, 0x6a, 0x16, 0xf5, 0x93, 0xed, 0x97, 0x52, 0xd6, 0x25, 0x88, 0xe1, 0x7b, 0xe5, 0xaf,
-	0x29, 0xee, 0x33, 0x1b, 0x71, 0x5c, 0xdc, 0xcb, 0x4a, 0xe4, 0x9e, 0xd5, 0xac, 0x9e, 0xd8, 0xdc,
-	0xb3, 0x9a, 0x5f, 0x1f, 0xb9, 0xfe, 0xd0, 0x80, 0x71, 0x4d, 0x3d, 0x18, 0x6a, 0x02, 0x7c, 0x44,
-	0x5c, 0xda, 0x74, 0x02, 0x37, 0x6e, 0xe0, 0x8c, 0xe0, 0xbb, 0xfe, 0x38, 0x81, 0x14, 0x9e, 0xfc,
-	0xa0, 0x9d, 0x61, 0x0d, 0x1b, 0x7d, 0x4b, 0x4b, 0xee, 0x49, 0xdd, 0x1a, 0x88, 0x8b, 0xc8, 0x1d,
-	0x48, 0x0e, 0xba, 0x26, 0x6b, 0x29, 0x41, 0xf3, 0x7b, 0x99, 0x40, 0x93, 0x55, 0xbe, 0xac, 0x06,
-	0x50, 0x73, 0xec, 0xba, 0xe5, 0x05, 0xc5, 0x59, 0xc5, 0xe5, 0xa5, 0xc1, 0xb6, 0xa6, 0xe2, 0x8f,
-	0x0b, 0x17, 0x14, 0x34, 0x31, 0xac, 0xc1, 0xa2, 0x8b, 0x7e, 0x25, 0x65, 0x34, 0x62, 0x90, 0x95,
-	0x94, 0x8f, 0xf6, 0x17, 0x7d, 0x41, 0xeb, 0x95, 0x95, 0x29, 0x2a, 0x06, 0x51, 0x15, 0x72, 0xdc,
-	0x54, 0xf9, 0xe5, 0x74, 0xcb, 0xa9, 0x8d, 0x1f, 0x53, 0x95, 0x23, 0xfc, 0x4f, 0x2c, 0xb1, 0xcc,
-	0xbf, 0xcd, 0x40, 0x21, 0x38, 0xeb, 0xa7, 0x7e, 0x33, 0x5c, 0x4c, 0xa9, 0xa5, 0xfd, 0xac, 0x1d,
-	0xba, 0x1f, 0xbb, 0x19, 0xd2, 0xaa, 0xff, 0x21, 0x77, 0xc3, 0x3f, 0xca, 0xbb, 0x41, 0xf6, 0x3d,
-	0x05, 0x55, 0xdf, 0x8c, 0xaa, 0xfa, 0x52, 0xca, 0xd5, 0xf4, 0x51, 0xf6, 0x8f, 0x33, 0x30, 0x15,
-	0x33, 0x78, 0xe8, 0x39, 0x71, 0xa8, 0x1a, 0xfe, 0xa1, 0x0d, 0x06, 0xaa, 0x14, 0x9d, 0xa0, 0xa1,
-	0x5d, 0xee, 0xe3, 0x05, 0xde, 0x9f, 0xe3, 0x2a, 0x21, 0x7f, 0x7d, 0x28, 0x1b, 0xeb, 0x83, 0x94,
-	0x67, 0xa4, 0x7b, 0xa8, 0xe1, 0xe2, 0x28, 0x1b, 0xb4, 0x01, 0xb3, 0xa4, 0xeb, 0x39, 0x01, 0xc0,
-	0x75, 0x9b, 0x6c, 0xb5, 0xa8, 0xcc, 0xf7, 0x8d, 0x95, 0x7f, 0x2e, 0xc8, 0xb4, 0x27, 0xf4, 0xc1,
-	0x89, 0x23, 0xcd, 0xef, 0x19, 0xf0, 0x74, 0x9f, 0xf9, 0x0c, 0xf0, 0xfc, 0xd5, 0x82, 0x09, 0x51,
-	0xa0, 0x1e, 0xc8, 0xc1, 0x3f, 0xc5, 0x83, 0xed, 0xbc, 0x3e, 0x54, 0xae, 0x3e, 0xd2, 0x84, 0xa3,
-	0xe0, 0xe6, 0x0f, 0x32, 0x80, 0x82, 0xb9, 0xa6, 0x79, 0xa5, 0xbb, 0x0f, 0xa3, 0xdb, 0x32, 0xdd,
-	0x7d, 0xb4, 0x67, 0xd6, 0x72, 0x51, 0x7f, 0x69, 0xf6, 0x31, 0xd1, 0x7b, 0xc7, 0xa3, 0x6b, 0xd0,
-	0xab, 0x67, 0xe8, 0x1e, 0xc0, 0xb6, 0x65, 0x5b, 0xac, 0x39, 0x64, 0xb5, 0x8a, 0x70, 0xe2, 0x6f,
-	0x04, 0x08, 0x58, 0x43, 0x33, 0xff, 0x3c, 0xa3, 0xe9, 0xb0, 0x70, 0x1f, 0x06, 0x3a, 0xfb, 0x2f,
-	0x45, 0x85, 0x59, 0xe8, 0x7d, 0x82, 0x0f, 0x04, 0x73, 0x0f, 0x46, 0x76, 0x89, 0xeb, 0xbf, 0x06,
-	0x0e, 0x58, 0x08, 0xd7, 0x5b, 0x03, 0x13, 0xee, 0xe9, 0x5d, 0xe2, 0x32, 0x2c, 0x30, 0xb9, 0x6b,
-	0xc5, 0x3c, 0xda, 0xf1, 0x2f, 0xaf, 0xd4, 0x86, 0xd3, 0xa3, 0x1d, 0x7d, 0x81, 0xb4, 0x23, 0x6e,
-	0x00, 0xda, 0x61, 0xe6, 0x77, 0x46, 0x35, 0xab, 0xa0, 0xee, 0xcb, 0xdb, 0x80, 0x5a, 0x84, 0x79,
-	0xb7, 0x88, 0x5d, 0xe7, 0xba, 0x44, 0xb7, 0x5d, 0xca, 0x9a, 0x2a, 0x32, 0x9b, 0x57, 0x28, 0x68,
-	0xbd, 0xa7, 0x07, 0x4e, 0x18, 0x85, 0x2e, 0x45, 0xaf, 0xc5, 0xc5, 0xf8, 0xb5, 0x38, 0x19, 0xea,
-	0xe3, 0x90, 0x17, 0xa3, 0x76, 0xde, 0x73, 0x27, 0x70, 0xde, 0x7f, 0x03, 0x66, 0xb6, 0xe3, 0x35,
-	0x19, 0xaa, 0x8e, 0xed, 0x8d, 0x21, 0x4b, 0x3a, 0xca, 0xe7, 0x0e, 0xc2, 0x87, 0xfc, 0xb0, 0x19,
-	0xf7, 0x32, 0x42, 0x8e, 0x5f, 0xc0, 0x2f, 0x92, 0x6c, 0x32, 0x7f, 0x3a, 0xb0, 0xce, 0xc5, 0xd2,
-	0x73, 0xf1, 0xd2, 0x7d, 0x09, 0x89, 0x23, 0x0c, 0x62, 0x3a, 0x98, 0x3f, 0x4e, 0x1d, 0x44, 0x97,
-	0x82, 0x77, 0x4b, 0x3e, 0x1d, 0x11, 0xc2, 0x66, 0x7b, 0x5e, 0x1c, 0x39, 0x09, 0xeb, 0xfd, 0xd0,
-	0x27, 0x06, 0x9c, 0xe3, 0x87, 0xf5, 0xfa, 0x43, 0x5a, 0xeb, 0x72, 0xa9, 0xf8, 0xdf, 0xf5, 0xcc,
-	0x15, 0x85, 0x34, 0xae, 0x0e, 0xea, 0x3a, 0x26, 0x40, 0x84, 0xf1, 0x78, 0x22, 0x19, 0x27, 0x33,
-	0x46, 0x0f, 0xa4, 0x33, 0x46, 0x45, 0xba, 0xe3, 0xe8, 0x59, 0xcc, 0xc0, 0x31, 0x93, 0x76, 0xc7,
-	0xa3, 0xe6, 0x8f, 0xb3, 0xba, 0xb9, 0x1a, 0x2c, 0xb7, 0x7a, 0x0f, 0x46, 0x3c, 0xc2, 0x76, 0x94,
-	0x16, 0xbc, 0x35, 0x44, 0x69, 0x76, 0xa8, 0x0b, 0x22, 0xf6, 0x16, 0x4d, 0x02, 0x13, 0xcd, 0x43,
-	0x86, 0xb0, 0xf8, 0x4b, 0xdb, 0x0a, 0xc3, 0x19, 0xc2, 0xc4, 0x2b, 0xdc, 0xb6, 0xca, 0x8c, 0x84,
-	0xaf, 0x70, 0xdb, 0x38, 0x63, 0x6d, 0xa3, 0xf7, 0x20, 0xe7, 0x52, 0xcf, 0xdd, 0x53, 0xd6, 0xfc,
-	0xf2, 0x10, 0x86, 0x0b, 0xf3, 0xf1, 0x52, 0x44, 0xe2, 0x4f, 0x2c, 0x11, 0x03, 0x7b, 0x9b, 0x3f,
-	0x01, 0x7b, 0x1b, 0xa6, 0xa9, 0xb3, 0x27, 0x96, 0xa6, 0xfe, 0xbe, 0xa1, 0x5d, 0xf0, 0xc1, 0x42,
-	0xd1, 0x3b, 0x30, 0xea, 0x59, 0x6d, 0xea, 0x74, 0xbd, 0x74, 0x9e, 0x65, 0x50, 0xc8, 0x20, 0xcc,
-	0xd8, 0xa6, 0x84, 0xc0, 0x3e, 0x16, 0xba, 0x06, 0x93, 0xd4, 0x75, 0x1d, 0x77, 0xb3, 0xc9, 0xcd,
-	0xb2, 0xd3, 0x92, 0x6e, 0xd4, 0x44, 0x98, 0x41, 0xba, 0x1e, 0xa1, 0xe2, 0x58, 0x6f, 0x3f, 0x3f,
-	0xf2, 0xb3, 0xf2, 0xad, 0x81, 0xca, 0x8f, 0x9c, 0xea, 0x47, 0x06, 0x43, 0xe7, 0x47, 0x0e, 0xfd,
-	0xba, 0xe0, 0x03, 0x78, 0x2a, 0x59, 0x8f, 0x8f, 0xe5, 0xeb, 0xbc, 0x7f, 0x8a, 0xcb, 0x4a, 0xb8,
-	0x4f, 0xbe, 0xfa, 0x19, 0x27, 0xe9, 0xee, 0x64, 0x8e, 0xdb, 0xdd, 0x71, 0xf5, 0xa5, 0xa8, 0x6f,
-	0x19, 0xd1, 0x7d, 0x75, 0xce, 0x8c, 0x34, 0x5f, 0xc7, 0xf5, 0xc0, 0xf4, 0x3d, 0x6b, 0xff, 0x6a,
-	0xc0, 0xb9, 0xc4, 0xde, 0x81, 0x0c, 0x33, 0x27, 0x29, 0x43, 0xe3, 0xb8, 0x65, 0xf8, 0xdd, 0x0c,
-	0x4c, 0x63, 0xda, 0x71, 0x22, 0x2f, 0x1b, 0x1b, 0xfe, 0x57, 0x20, 0x29, 0x62, 0x82, 0x58, 0xb9,
-	0x40, 0x79, 0x34, 0xf2, 0xf9, 0x07, 0x57, 0x97, 0xb6, 0xef, 0x00, 0x0e, 0xac, 0xfe, 0x3d, 0x6f,
-	0x2e, 0xf2, 0xe6, 0x90, 0xaf, 0x37, 0x12, 0x90, 0x23, 0x8b, 0x72, 0x3b, 0x65, 0xdc, 0xdf, 0x48,
-	0x51, 0xb8, 0xd7, 0x8b, 0x2c, 0x9a, 0xb1, 0x04, 0x34, 0x3f, 0xcd, 0x80, 0x8c, 0x1f, 0x4e, 0xc1,
-	0x3a, 0xfe, 0x4a, 0xc4, 0x3a, 0x2e, 0xa5, 0xc9, 0x9f, 0xf5, 0xcb, 0xa3, 0xc4, 0x63, 0xbb, 0x0b,
-	0x29, 0x93, 0x72, 0x8f, 0xc9, 0xa1, 0xfc, 0x83, 0x01, 0x05, 0xd1, 0xef, 0x14, 0x0c, 0xed, 0x46,
-	0xd4, 0xd0, 0xbe, 0x9c, 0x62, 0x15, 0x7d, 0x0c, 0xec, 0xff, 0x64, 0xd5, 0xec, 0x83, 0xc8, 0xb1,
-	0x49, 0xdc, 0xba, 0x0a, 0x89, 0x42, 0x2d, 0xe1, 0x8d, 0x58, 0xd2, 0x02, 0xdd, 0x1e, 0x3d, 0x01,
-	0xdd, 0xfe, 0x35, 0x59, 0xf5, 0x48, 0x99, 0x47, 0xeb, 0x37, 0x82, 0xd8, 0x27, 0x9b, 0xba, 0x7c,
-	0x53, 0x95, 0x98, 0x86, 0xcf, 0x6d, 0x38, 0x86, 0x8a, 0x7b, 0xf8, 0xf0, 0x78, 0xa8, 0x13, 0x37,
-	0x66, 0x2a, 0x4e, 0x78, 0x63, 0x48, 0xcb, 0x29, 0xe3, 0xa1, 0x9e, 0x66, 0xdc, 0xcb, 0x08, 0x35,
-	0x61, 0x5c, 0x2f, 0x3c, 0x57, 0xe7, 0x74, 0x39, 0x7d, 0x85, 0xbb, 0xac, 0x26, 0xd1, 0x5b, 0x70,
-	0x04, 0xd9, 0xfc, 0x63, 0x03, 0x20, 0xcc, 0x36, 0xf3, 0x3d, 0xaf, 0x39, 0x5d, 0x5b, 0xa6, 0x01,
-	0xb2, 0xe1, 0x9e, 0x57, 0x78, 0x23, 0x96, 0x34, 0xae, 0x3f, 0x32, 0x98, 0x52, 0x87, 0xfa, 0x42,
-	0x9a, 0x38, 0x2d, 0x96, 0xd5, 0x96, 0x8d, 0x58, 0x01, 0x9a, 0xfb, 0x79, 0x28, 0x6a, 0x7a, 0x16,
-	0xcb, 0x69, 0x4f, 0x9c, 0x4c, 0x4e, 0x3b, 0x39, 0x11, 0x50, 0x1c, 0x2a, 0x11, 0x70, 0x21, 0x9a,
-	0x08, 0x78, 0x26, 0x9e, 0x08, 0x90, 0xc2, 0x8e, 0x24, 0x01, 0x18, 0x4c, 0xaa, 0x88, 0xd8, 0xff,
-	0xa0, 0x41, 0xe6, 0x56, 0x86, 0x8e, 0xbb, 0x11, 0x77, 0x74, 0x6f, 0x44, 0x20, 0x71, 0x8c, 0x05,
-	0x77, 0x94, 0x55, 0x4b, 0xb5, 0xdb, 0x6e, 0x13, 0x77, 0x6f, 0x6e, 0x5c, 0x4c, 0x38, 0x70, 0x94,
-	0x6f, 0x44, 0xa8, 0x38, 0xd6, 0x1b, 0x6d, 0x04, 0x67, 0x40, 0x16, 0xc9, 0xbf, 0x92, 0xe6, 0x0c,
-	0xc8, 0x40, 0x21, 0xba, 0xf5, 0x7a, 0x2e, 0xa4, 0x70, 0x48, 0x2e, 0xe4, 0x36, 0x20, 0x67, 0x4b,
-	0x84, 0x24, 0xf5, 0x9b, 0xf2, 0x97, 0x43, 0xb8, 0x92, 0xe4, 0xc5, 0x91, 0x0d, 0x36, 0xec, 0x4e,
-	0x4f, 0x0f, 0x9c, 0x30, 0x8a, 0x1b, 0x19, 0x15, 0x85, 0x07, 0x9a, 0xa9, 0xf2, 0x1e, 0x69, 0xa3,
-	0xb8, 0x30, 0xac, 0x14, 0x45, 0xd6, 0x95, 0x18, 0x2a, 0xee, 0xe1, 0x83, 0x3e, 0x84, 0x09, 0x7e,
-	0x84, 0x42, 0xc6, 0x70, 0x44, 0xc6, 0x2a, 0xdf, 0xaa, 0x41, 0xe2, 0x28, 0x07, 0xf3, 0x4f, 0xb3,
-	0x90, 0x9c, 0x03, 0x08, 0xbf, 0xef, 0x32, 0x1e, 0xf3, 0x7d, 0xd7, 0xbb, 0x50, 0x60, 0x1e, 0x71,
-	0xe5, 0x87, 0x76, 0x99, 0xe1, 0x3e, 0xb4, 0xab, 0xfa, 0x00, 0x38, 0xc4, 0x8a, 0x25, 0x64, 0xb2,
-	0xc7, 0x9a, 0x90, 0x59, 0x06, 0x10, 0x61, 0x9e, 0x30, 0x62, 0xe2, 0x36, 0x9b, 0x08, 0x6d, 0xc2,
-	0xf5, 0x80, 0x82, 0xb5, 0x5e, 0xe8, 0xeb, 0x81, 0x8f, 0x20, 0x6b, 0x2d, 0x7e, 0xa1, 0xa7, 0x34,
-	0xee, 0x6c, 0xc4, 0x89, 0x8c, 0xe5, 0x78, 0x07, 0xaf, 0xa7, 0x35, 0xff, 0x2f, 0x03, 0x11, 0x03,
-	0x8d, 0xfe, 0xd0, 0x80, 0x19, 0x12, 0xfb, 0x21, 0x12, 0xdf, 0xbf, 0xfd, 0xe5, 0x74, 0xbf, 0x0e,
-	0xd3, 0xf3, 0x3b, 0x26, 0xe1, 0xdb, 0x6f, 0xbc, 0x0b, 0xc3, 0xbd, 0x4c, 0xd1, 0xef, 0x19, 0x70,
-	0x96, 0xf4, 0xfe, 0xd2, 0x8c, 0xda, 0xf9, 0x37, 0x87, 0xfe, 0xa9, 0x9a, 0xf2, 0xd3, 0x07, 0xfb,
-	0x8b, 0x49, 0xbf, 0xc1, 0x83, 0x93, 0xd8, 0xa1, 0xf7, 0x61, 0x84, 0xb8, 0x0d, 0x3f, 0x2d, 0x9c,
-	0x9e, 0xad, 0xff, 0x03, 0x42, 0xa1, 0x97, 0xb1, 0xe2, 0x36, 0x18, 0x16, 0xa0, 0xe6, 0x8f, 0xb2,
-	0x30, 0x1d, 0xff, 0x28, 0x4c, 0x95, 0x5c, 0x8f, 0x24, 0x96, 0x5c, 0x73, 0x45, 0x11, 0x0f, 0x23,
-	0xf1, 0x0f, 0x21, 0xc5, 0xfb, 0x86, 0xa4, 0x05, 0x8a, 0x22, 0x3e, 0xd5, 0xc8, 0x1d, 0x41, 0x51,
-	0xc4, 0xf7, 0x19, 0x21, 0x16, 0xba, 0x1c, 0xbd, 0x60, 0xcc, 0xf8, 0x05, 0x33, 0xa3, 0xaf, 0x65,
-	0xd8, 0x64, 0x73, 0x1b, 0x8a, 0xda, 0x3e, 0x28, 0x75, 0xbc, 0x92, 0x5a, 0xee, 0xe1, 0xb1, 0x9b,
-	0x92, 0xb5, 0x76, 0x21, 0x45, 0xc7, 0x0f, 0x95, 0x5f, 0x48, 0xeb, 0x48, 0xd9, 0x58, 0x21, 0x2e,
-	0x0d, 0xcd, 0xfc, 0x0f, 0x03, 0x26, 0x22, 0xdf, 0x01, 0x70, 0x6e, 0xfe, 0xf7, 0x16, 0xc3, 0xff,
-	0xea, 0xce, 0xdd, 0x00, 0x01, 0x6b, 0x68, 0xe8, 0xdb, 0x50, 0x6c, 0x39, 0x76, 0x83, 0x32, 0xaf,
-	0xea, 0x90, 0x1d, 0xa5, 0x27, 0x69, 0x53, 0x5b, 0x73, 0x07, 0xfb, 0x8b, 0xb3, 0xeb, 0x12, 0xa6,
-	0xe2, 0xb4, 0x3b, 0x2d, 0xea, 0xc9, 0x2f, 0x73, 0xb0, 0x0e, 0x2e, 0x5e, 0xb5, 0x83, 0xb2, 0x83,
-	0x27, 0xf5, 0x55, 0x3b, 0xac, 0x97, 0x38, 0xe6, 0x57, 0xed, 0x48, 0x21, 0xc6, 0x21, 0xaf, 0xda,
-	0x41, 0xdf, 0x27, 0xf6, 0x55, 0x3b, 0x98, 0x61, 0x9f, 0xc8, 0xec, 0x7f, 0x33, 0xda, 0x2a, 0xa2,
-	0xd1, 0x59, 0xe6, 0x31, 0xd1, 0xd9, 0x07, 0x30, 0x66, 0xd9, 0x1e, 0x75, 0x77, 0x49, 0x4b, 0xa5,
-	0xa6, 0xd3, 0x9e, 0xc5, 0x60, 0xa9, 0x6b, 0x0a, 0x07, 0x07, 0x88, 0xa8, 0x05, 0xe7, 0xfc, 0xa7,
-	0x1c, 0x97, 0x92, 0xf0, 0xb1, 0x59, 0x95, 0x61, 0xbe, 0xee, 0xbf, 0x39, 0xdc, 0x48, 0xea, 0xf4,
-	0xa8, 0x1f, 0x01, 0x27, 0x83, 0x22, 0x06, 0x13, 0x4c, 0x4b, 0x4b, 0xf8, 0x37, 0xe2, 0x80, 0xcf,
-	0x60, 0xf1, 0x4c, 0x8e, 0x56, 0xbb, 0xa9, 0x83, 0xe2, 0x28, 0x0f, 0xf3, 0x13, 0x03, 0x26, 0xa3,
-	0x25, 0x3f, 0x3f, 0xf5, 0x10, 0xe9, 0x87, 0x59, 0x98, 0x8a, 0x1d, 0xfe, 0x58, 0x98, 0x54, 0x38,
-	0xcd, 0x30, 0x29, 0x3f, 0x54, 0x98, 0x94, 0xec, 0xc1, 0x8f, 0x0c, 0xe5, 0xc1, 0x5f, 0x95, 0x5e,
-	0xb4, 0x3a, 0x4c, 0x6b, 0xab, 0xea, 0x63, 0xa3, 0x60, 0x83, 0xd7, 0x75, 0x22, 0x8e, 0xf6, 0x15,
-	0x1e, 0x4e, 0xbd, 0xf7, 0x47, 0x65, 0x54, 0x08, 0xf0, 0x66, 0xda, 0xf2, 0xe9, 0x00, 0x40, 0x7a,
-	0x38, 0x09, 0x04, 0x9c, 0xc4, 0xae, 0x7c, 0xfb, 0xf3, 0xaf, 0x16, 0xce, 0x7c, 0xf1, 0xd5, 0xc2,
-	0x99, 0x2f, 0xbf, 0x5a, 0x38, 0xf3, 0xf1, 0xc1, 0x82, 0xf1, 0xf9, 0xc1, 0x82, 0xf1, 0xc5, 0xc1,
-	0x82, 0xf1, 0xe5, 0xc1, 0x82, 0xf1, 0xe3, 0x83, 0x05, 0xe3, 0x93, 0x9f, 0x2c, 0x9c, 0xb9, 0xf7,
-	0xfc, 0x20, 0x3f, 0x45, 0xf9, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xee, 0x12, 0xe4, 0x1c, 0xb1,
-	0x52, 0x00, 0x00,
+	// 4355 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7c, 0x4d, 0x6c, 0x1c, 0x47,
+	0x76, 0xbf, 0x7a, 0x86, 0x33, 0x24, 0xdf, 0x90, 0x14, 0x59, 0xa2, 0x6c, 0x2e, 0xf7, 0x6f, 0x51,
+	0xff, 0xb6, 0x63, 0xd8, 0xb1, 0x3d, 0x8c, 0x68, 0xcb, 0x96, 0x25, 0xaf, 0x02, 0xce, 0x50, 0x1f,
+	0xf4, 0x6a, 0x2d, 0xa6, 0x46, 0x96, 0xd7, 0xb2, 0x0d, 0xa5, 0x38, 0x53, 0x9c, 0xe9, 0xe5, 0x4c,
+	0xf7, 0xb8, 0xaa, 0x87, 0x16, 0x93, 0x20, 0x71, 0x3e, 0x11, 0x20, 0x41, 0x62, 0x20, 0x1b, 0x78,
+	0x0f, 0x09, 0x12, 0x24, 0xa7, 0x60, 0x81, 0x5c, 0x73, 0xc8, 0xc1, 0x87, 0x5c, 0xbc, 0xc9, 0x26,
+	0x30, 0x36, 0x87, 0x38, 0xc0, 0x82, 0x59, 0x73, 0x81, 0x9c, 0x73, 0xc9, 0x45, 0x40, 0x80, 0xa0,
+	0x3e, 0xba, 0xbb, 0xba, 0xa7, 0x47, 0x9c, 0x1e, 0x7e, 0x44, 0xd8, 0x1b, 0x59, 0xaf, 0xea, 0xf7,
+	0xaa, 0x5e, 0xd5, 0x7b, 0xf5, 0x3e, 0xaa, 0x07, 0x5e, 0x69, 0x3a, 0x7e, 0xab, 0xb7, 0x59, 0xae,
+	0x7b, 0x9d, 0x65, 0xb2, 0xdd, 0x73, 0xfc, 0xdd, 0xe5, 0x6d, 0xc2, 0x9a, 0xde, 0x32, 0xe9, 0x3a,
+	0xcb, 0x3b, 0x17, 0x48, 0xbb, 0xdb, 0x22, 0x17, 0x96, 0x9b, 0xd4, 0xa5, 0x8c, 0xf8, 0xb4, 0x51,
+	0xee, 0x32, 0xcf, 0xf7, 0xd0, 0x33, 0xd1, 0xa8, 0xb2, 0x1a, 0x55, 0x96, 0xa3, 0xca, 0xa4, 0xeb,
+	0x94, 0x83, 0x51, 0x8b, 0x2f, 0x19, 0xd8, 0x4d, 0xaf, 0xe9, 0x2d, 0xcb, 0xc1, 0x9b, 0xbd, 0x2d,
+	0xf9, 0x9f, 0xfc, 0x47, 0xfe, 0xa5, 0x40, 0x17, 0x6f, 0x6e, 0x5f, 0xe2, 0x65, 0x47, 0x72, 0xa6,
+	0x0f, 0x7c, 0xea, 0x72, 0xc7, 0x73, 0xf9, 0x4b, 0xa4, 0xeb, 0x70, 0xca, 0x76, 0x28, 0x5b, 0xee,
+	0x6e, 0x37, 0x05, 0x8d, 0xc7, 0x3b, 0x2c, 0xef, 0xf4, 0x4d, 0x6f, 0xf1, 0x95, 0x08, 0xa9, 0x43,
+	0xea, 0x2d, 0xc7, 0xa5, 0x6c, 0x37, 0x1a, 0xde, 0xa1, 0x3e, 0x49, 0x1b, 0xb5, 0x3c, 0x68, 0x14,
+	0xeb, 0xb9, 0xbe, 0xd3, 0xa1, 0x7d, 0x03, 0x5e, 0x3d, 0x68, 0x00, 0xaf, 0xb7, 0x68, 0x87, 0x24,
+	0xc7, 0xd9, 0xef, 0xc3, 0x99, 0x55, 0x97, 0xb4, 0x77, 0xb9, 0xc3, 0x71, 0xcf, 0x5d, 0x65, 0xcd,
+	0x5e, 0x87, 0xba, 0x3e, 0x3a, 0x0f, 0x63, 0x2e, 0xe9, 0xd0, 0x05, 0xeb, 0xbc, 0xf5, 0xdc, 0x64,
+	0x65, 0xea, 0xf3, 0xbd, 0xa5, 0x53, 0xfb, 0x7b, 0x4b, 0x63, 0x6f, 0x91, 0x0e, 0xc5, 0x92, 0x82,
+	0x9e, 0x86, 0xc2, 0x0e, 0x69, 0xf7, 0xe8, 0x42, 0x4e, 0x76, 0x99, 0xd6, 0x5d, 0x0a, 0x77, 0x45,
+	0x23, 0x56, 0x34, 0xfb, 0xb7, 0xf3, 0x31, 0xf8, 0x6f, 0x51, 0x9f, 0x34, 0x88, 0x4f, 0x50, 0x07,
+	0x8a, 0x6d, 0xb2, 0x49, 0xdb, 0x7c, 0xc1, 0x3a, 0x9f, 0x7f, 0xae, 0xb4, 0x72, 0xad, 0x3c, 0xcc,
+	0x26, 0x96, 0x53, 0xa0, 0xca, 0xb7, 0x24, 0xce, 0x35, 0xd7, 0x67, 0xbb, 0x95, 0x19, 0x3d, 0x89,
+	0xa2, 0x6a, 0xc4, 0x9a, 0x09, 0xfa, 0x4d, 0x0b, 0x4a, 0xc4, 0x75, 0x3d, 0x9f, 0xf8, 0x62, 0x9b,
+	0x16, 0x72, 0x92, 0xe9, 0x9b, 0xa3, 0x33, 0x5d, 0x8d, 0xc0, 0x14, 0xe7, 0x33, 0x9a, 0x73, 0xc9,
+	0xa0, 0x60, 0x93, 0xe7, 0xe2, 0xeb, 0x50, 0x32, 0xa6, 0x8a, 0x66, 0x21, 0xbf, 0x4d, 0x77, 0x95,
+	0x7c, 0xb1, 0xf8, 0x13, 0xcd, 0xc7, 0x04, 0xaa, 0x25, 0x78, 0x39, 0x77, 0xc9, 0x5a, 0xbc, 0x0a,
+	0xb3, 0x49, 0x86, 0x59, 0xc6, 0xdb, 0x7f, 0x64, 0xc1, 0xbc, 0xb1, 0x0a, 0x4c, 0xb7, 0x28, 0xa3,
+	0x6e, 0x9d, 0xa2, 0x65, 0x98, 0x14, 0x7b, 0xc9, 0xbb, 0xa4, 0x1e, 0x6c, 0xf5, 0x9c, 0x5e, 0xc8,
+	0xe4, 0x5b, 0x01, 0x01, 0x47, 0x7d, 0xc2, 0x63, 0x91, 0x7b, 0xd4, 0xb1, 0xe8, 0xb6, 0x08, 0xa7,
+	0x0b, 0xf9, 0xf8, 0xb1, 0xd8, 0x10, 0x8d, 0x58, 0xd1, 0xec, 0xfb, 0xf0, 0xb5, 0x60, 0x3e, 0x77,
+	0x68, 0xa7, 0xdb, 0x26, 0x3e, 0x8d, 0x26, 0x75, 0xf0, 0xd1, 0x3b, 0x0f, 0x63, 0xdb, 0x8e, 0xdb,
+	0x48, 0xce, 0xe2, 0x9b, 0x8e, 0xdb, 0xc0, 0x92, 0x62, 0x6f, 0xc3, 0xf4, 0x6a, 0xb7, 0xcb, 0xbc,
+	0x1d, 0xda, 0xa8, 0xf9, 0xa4, 0x49, 0xd1, 0x3d, 0x00, 0xa2, 0x1b, 0x56, 0x7d, 0x09, 0x5d, 0x5a,
+	0xf9, 0xf9, 0xb2, 0xd2, 0x99, 0xb2, 0xa9, 0x33, 0xe5, 0xee, 0x76, 0x53, 0x34, 0xf0, 0xb2, 0x50,
+	0xcd, 0xf2, 0xce, 0x85, 0xf2, 0x1d, 0xa7, 0x43, 0x2b, 0x33, 0xfb, 0x7b, 0x4b, 0xb0, 0x1a, 0x22,
+	0x60, 0x03, 0xcd, 0xfe, 0x2d, 0x0b, 0xce, 0xae, 0xb2, 0xa6, 0x57, 0x5d, 0x5b, 0xed, 0x76, 0x6f,
+	0x52, 0xd2, 0xf6, 0x5b, 0x35, 0x9f, 0xf8, 0x3d, 0x8e, 0xae, 0x42, 0x91, 0xcb, 0xbf, 0xf4, 0x62,
+	0x9e, 0x0d, 0xce, 0xa7, 0xa2, 0x3f, 0xdc, 0x5b, 0x9a, 0x4f, 0x19, 0x48, 0xb1, 0x1e, 0x85, 0x9e,
+	0x87, 0xf1, 0x0e, 0xe5, 0x9c, 0x34, 0x03, 0x89, 0x9f, 0xd6, 0x00, 0xe3, 0xdf, 0x52, 0xcd, 0x38,
+	0xa0, 0xdb, 0xff, 0x98, 0x83, 0xd3, 0x21, 0x96, 0x66, 0x7f, 0x0c, 0xdb, 0xdb, 0x83, 0xa9, 0x96,
+	0xb1, 0x42, 0xb9, 0xcb, 0xa5, 0x95, 0x2b, 0x43, 0x6a, 0x52, 0x9a, 0x90, 0x2a, 0xf3, 0x9a, 0xcd,
+	0x94, 0xd9, 0x8a, 0x63, 0x6c, 0x50, 0x07, 0x80, 0xef, 0xba, 0x75, 0xcd, 0x74, 0x4c, 0x32, 0x7d,
+	0x3d, 0x23, 0xd3, 0x5a, 0x08, 0x50, 0x41, 0x9a, 0x25, 0x44, 0x6d, 0xd8, 0x60, 0x60, 0xff, 0xad,
+	0x05, 0x67, 0x52, 0xc6, 0xa1, 0x37, 0x12, 0xfb, 0xf9, 0x4c, 0xdf, 0x7e, 0xa2, 0xbe, 0x61, 0xd1,
+	0x6e, 0xbe, 0x08, 0x13, 0x8c, 0xee, 0x38, 0xe2, 0xa6, 0xd0, 0x12, 0x9e, 0xd5, 0xe3, 0x27, 0xb0,
+	0x6e, 0xc7, 0x61, 0x0f, 0xf4, 0x02, 0x4c, 0x06, 0x7f, 0x0b, 0x31, 0xe7, 0x85, 0x32, 0x89, 0x8d,
+	0x0b, 0xba, 0x72, 0x1c, 0xd1, 0xed, 0xdf, 0x80, 0x42, 0xb5, 0x45, 0x98, 0x2f, 0x4e, 0x0c, 0xa3,
+	0x5d, 0xef, 0x6d, 0x7c, 0x4b, 0x4f, 0x31, 0x3c, 0x31, 0x58, 0x35, 0xe3, 0x80, 0x3e, 0xc4, 0x66,
+	0x3f, 0x0f, 0xe3, 0x3b, 0x94, 0xc9, 0xf9, 0xe6, 0xe3, 0x60, 0x77, 0x55, 0x33, 0x0e, 0xe8, 0xf6,
+	0xbf, 0x5a, 0x30, 0x2f, 0x67, 0xb0, 0xe6, 0xf0, 0xba, 0xb7, 0x43, 0xd9, 0x2e, 0xa6, 0xbc, 0xd7,
+	0x3e, 0xe2, 0x09, 0xad, 0xc1, 0x2c, 0xa7, 0x9d, 0x1d, 0xca, 0xaa, 0x9e, 0xcb, 0x7d, 0x46, 0x1c,
+	0xd7, 0xd7, 0x33, 0x5b, 0xd0, 0xbd, 0x67, 0x6b, 0x09, 0x3a, 0xee, 0x1b, 0x81, 0x9e, 0x83, 0x09,
+	0x3d, 0x6d, 0x71, 0x94, 0x84, 0x60, 0xa7, 0xc4, 0x1e, 0xe8, 0x35, 0x71, 0x1c, 0x52, 0xed, 0xff,
+	0xb4, 0x60, 0x4e, 0xae, 0xaa, 0xd6, 0xdb, 0xe4, 0x75, 0xe6, 0x74, 0x85, 0x01, 0x7e, 0x1c, 0x97,
+	0x74, 0x15, 0x66, 0x1a, 0x81, 0xe0, 0x6f, 0x39, 0x1d, 0xc7, 0x97, 0x3a, 0x52, 0xa8, 0x3c, 0xa1,
+	0x31, 0x66, 0xd6, 0x62, 0x54, 0x9c, 0xe8, 0xad, 0xb6, 0xaf, 0xdd, 0xe3, 0x3e, 0x65, 0x1b, 0xcc,
+	0xeb, 0x78, 0x62, 0x9d, 0x77, 0x08, 0xdf, 0x46, 0xbf, 0x0c, 0x13, 0x1d, 0x7d, 0xe9, 0x69, 0xab,
+	0xf9, 0x0b, 0xc3, 0x59, 0xcd, 0xdb, 0x9b, 0xdf, 0xa1, 0x75, 0x5f, 0x5c, 0x98, 0x91, 0xb6, 0x45,
+	0x6d, 0x38, 0x44, 0x45, 0xef, 0xc2, 0x18, 0xef, 0xd2, 0xba, 0x14, 0x51, 0x69, 0xe5, 0xb5, 0xe1,
+	0x94, 0x3a, 0x36, 0xc9, 0x5a, 0x97, 0xd6, 0x23, 0xd9, 0x8a, 0xff, 0xb0, 0x84, 0xb4, 0xff, 0xdd,
+	0x82, 0x85, 0xb4, 0x55, 0xdd, 0x72, 0xb8, 0x8f, 0xde, 0xef, 0x5b, 0x59, 0x79, 0xb8, 0x95, 0x89,
+	0xd1, 0x72, 0x5d, 0xa1, 0xf6, 0x06, 0x2d, 0xc6, 0xaa, 0xee, 0x43, 0xc1, 0xf1, 0x69, 0x27, 0x70,
+	0x35, 0x2e, 0x0f, 0xb7, 0xac, 0xb4, 0xc9, 0x46, 0x57, 0xe8, 0xba, 0x00, 0xc4, 0x0a, 0xd7, 0x7e,
+	0x0f, 0xa6, 0xaa, 0x3d, 0xc6, 0xa8, 0xeb, 0xab, 0x0b, 0xee, 0x9b, 0x50, 0xe0, 0x8e, 0xab, 0xed,
+	0x7c, 0xb6, 0xbb, 0x6d, 0x52, 0x80, 0xd7, 0xc4, 0x60, 0xac, 0x30, 0xec, 0x3f, 0xcb, 0xc3, 0x99,
+	0xe0, 0xc4, 0xd0, 0xc6, 0x2a, 0xf3, 0x9d, 0x2d, 0x52, 0xf7, 0x39, 0x6a, 0xc0, 0x54, 0x23, 0x6a,
+	0xf6, 0xb5, 0x21, 0xce, 0xc2, 0x2b, 0x34, 0xf6, 0x06, 0xbc, 0x8f, 0x63, 0xa8, 0xe8, 0x1d, 0xc8,
+	0x37, 0x1d, 0x5f, 0x7b, 0x86, 0x97, 0x86, 0x93, 0xdc, 0x0d, 0x27, 0x69, 0x79, 0x2a, 0x25, 0xcd,
+	0x2a, 0x7f, 0xc3, 0xf1, 0xb1, 0x40, 0x44, 0x9b, 0x50, 0x74, 0x3a, 0xa4, 0x49, 0x33, 0xee, 0xca,
+	0xba, 0x18, 0x93, 0x44, 0x0f, 0x5d, 0x4d, 0x49, 0xe5, 0x58, 0x23, 0x0b, 0x1e, 0x75, 0x61, 0x31,
+	0x94, 0xcd, 0x1e, 0x7e, 0xe7, 0x53, 0x6c, 0x67, 0xc4, 0x43, 0x52, 0x39, 0xd6, 0xc8, 0xf6, 0x97,
+	0x39, 0x98, 0x8d, 0xe4, 0x57, 0xf5, 0x3a, 0x1d, 0xc7, 0x47, 0x8b, 0x90, 0x73, 0x1a, 0xda, 0x20,
+	0x81, 0x1e, 0x98, 0x5b, 0x5f, 0xc3, 0x39, 0xa7, 0x81, 0x9e, 0x85, 0xe2, 0x26, 0x23, 0x6e, 0xbd,
+	0xa5, 0x0d, 0x51, 0x08, 0x5c, 0x91, 0xad, 0x58, 0x53, 0xd1, 0x53, 0x90, 0xf7, 0x49, 0x53, 0xdb,
+	0x9f, 0x50, 0x7e, 0x77, 0x48, 0x13, 0x8b, 0x76, 0x61, 0xf8, 0x78, 0x4f, 0xea, 0xb0, 0xdc, 0x79,
+	0xc3, 0xf0, 0xd5, 0x54, 0x33, 0x0e, 0xe8, 0x82, 0x23, 0xe9, 0xf9, 0x2d, 0x8f, 0x2d, 0x14, 0xe2,
+	0x1c, 0x57, 0x65, 0x2b, 0xd6, 0x54, 0xe1, 0xa2, 0xd4, 0xe5, 0xfc, 0x7d, 0xca, 0x16, 0x8a, 0x71,
+	0x17, 0xa5, 0x1a, 0x10, 0x70, 0xd4, 0x07, 0x7d, 0x00, 0xa5, 0x3a, 0xa3, 0xc4, 0xf7, 0xd8, 0x1a,
+	0xf1, 0xe9, 0xc2, 0x78, 0xe6, 0x13, 0x78, 0x5a, 0x78, 0xe9, 0xd5, 0x08, 0x02, 0x9b, 0x78, 0xf6,
+	0xdf, 0xe5, 0x61, 0x21, 0x12, 0xad, 0xdc, 0xdb, 0xc8, 0x33, 0xd5, 0xe2, 0xb1, 0x06, 0x88, 0xe7,
+	0x59, 0x28, 0x36, 0x9c, 0x26, 0xe5, 0x7e, 0x52, 0xca, 0x6b, 0xb2, 0x15, 0x6b, 0x2a, 0xfa, 0xbd,
+	0x44, 0x34, 0x52, 0x90, 0x07, 0xe5, 0xf6, 0x70, 0x07, 0x65, 0xd0, 0xe4, 0x46, 0x08, 0x49, 0xd0,
+	0x0a, 0x40, 0xd3, 0xf1, 0xf5, 0xa5, 0xa5, 0x77, 0x3d, 0x34, 0xd6, 0x37, 0x42, 0x0a, 0x36, 0x7a,
+	0xa1, 0x77, 0x60, 0x52, 0xca, 0x6b, 0x44, 0xfd, 0x97, 0x2e, 0x4c, 0x35, 0x00, 0xc0, 0x11, 0xd6,
+	0xa1, 0x83, 0x9c, 0xf7, 0x00, 0x5d, 0x7b, 0xd0, 0x65, 0x94, 0x8b, 0xab, 0xfb, 0x2e, 0x61, 0x0e,
+	0xd9, 0x6c, 0xd3, 0xa3, 0x8a, 0x63, 0xbf, 0x18, 0x83, 0xf1, 0xeb, 0x8c, 0x3a, 0xcd, 0x96, 0x7f,
+	0x02, 0x57, 0xe2, 0xd3, 0x50, 0x20, 0x6d, 0x87, 0x70, 0x79, 0xba, 0x8d, 0x29, 0xad, 0x8a, 0x46,
+	0xac, 0x68, 0xe8, 0x3d, 0x28, 0x7a, 0xcc, 0x69, 0x3a, 0xee, 0xc2, 0xa4, 0x9c, 0xc4, 0xcb, 0xc3,
+	0x9d, 0x1f, 0xbd, 0x8a, 0xdb, 0x72, 0x68, 0x74, 0x44, 0xd5, 0xff, 0x58, 0x43, 0xa2, 0x7b, 0x30,
+	0xae, 0x54, 0x2e, 0x30, 0x63, 0xcb, 0x43, 0x9b, 0x61, 0xa5, 0xb5, 0x91, 0x69, 0x50, 0xff, 0x73,
+	0x1c, 0x00, 0xa2, 0x5a, 0x68, 0x85, 0xc7, 0x24, 0xf4, 0x0b, 0x19, 0xac, 0xf0, 0x40, 0xb3, 0x5b,
+	0x0b, 0xcd, 0x6e, 0x21, 0x0b, 0xa8, 0x34, 0xac, 0x83, 0xec, 0xac, 0x10, 0xb1, 0x76, 0xf7, 0x8b,
+	0x23, 0x88, 0x58, 0xc7, 0x1a, 0x33, 0xf1, 0x18, 0x21, 0x88, 0x06, 0xec, 0xef, 0xe6, 0x61, 0x4e,
+	0xf7, 0xac, 0x7a, 0xed, 0x36, 0xad, 0x4b, 0xdf, 0x52, 0x59, 0xf1, 0x7c, 0xaa, 0x15, 0x77, 0x02,
+	0x9f, 0x42, 0xdd, 0x8c, 0x95, 0x4c, 0xb3, 0x89, 0x78, 0x94, 0xa5, 0x1f, 0xa1, 0x6c, 0x44, 0xb8,
+	0x4b, 0xba, 0x97, 0xf6, 0x2e, 0xd0, 0xef, 0x5a, 0x70, 0x66, 0x87, 0x32, 0x67, 0xcb, 0xa9, 0x4b,
+	0x7d, 0xbc, 0xe9, 0x70, 0xdf, 0x63, 0xbb, 0xfa, 0xde, 0x7c, 0x75, 0x38, 0xce, 0x77, 0x0d, 0x80,
+	0x75, 0x77, 0xcb, 0xab, 0x7c, 0x5d, 0x73, 0x3b, 0x73, 0xb7, 0x1f, 0x1a, 0xa7, 0xf1, 0x5b, 0xec,
+	0x02, 0x44, 0xb3, 0x4d, 0x31, 0x07, 0xb7, 0x4c, 0xe5, 0x1d, 0x7a, 0x62, 0xc1, 0x62, 0x03, 0xdb,
+	0x69, 0x9a, 0x91, 0xcf, 0x2c, 0x28, 0x69, 0xfa, 0x09, 0xb8, 0x89, 0x38, 0xee, 0x26, 0xbe, 0x94,
+	0x69, 0xfe, 0x03, 0x3c, 0x43, 0x06, 0xd3, 0x31, 0x25, 0x47, 0x17, 0x75, 0xba, 0x44, 0xd9, 0xc0,
+	0xff, 0x6f, 0xa6, 0x4b, 0x1e, 0xee, 0x2d, 0xcd, 0xc5, 0x3a, 0x47, 0x39, 0x94, 0x83, 0x63, 0x97,
+	0xcb, 0x13, 0xdf, 0xfb, 0xcb, 0xa5, 0x53, 0x1f, 0xff, 0xf8, 0xfc, 0x29, 0xfb, 0xd3, 0x3c, 0xcc,
+	0x26, 0xa5, 0x3a, 0x84, 0xed, 0x8d, 0x6c, 0xd8, 0xc4, 0xb1, 0xda, 0xb0, 0xdc, 0xf1, 0xd9, 0xb0,
+	0xfc, 0x71, 0xd8, 0xb0, 0xb1, 0x23, 0xb3, 0x61, 0xf6, 0xbf, 0x58, 0x30, 0x13, 0xee, 0xcc, 0x87,
+	0x3d, 0xe1, 0x7f, 0x44, 0x52, 0xb7, 0x8e, 0x5e, 0xea, 0xf7, 0x61, 0x9c, 0x7b, 0x3d, 0x56, 0x97,
+	0x4e, 0xb6, 0x40, 0x7f, 0x25, 0x9b, 0xd1, 0x54, 0x63, 0x0d, 0xcf, 0x52, 0x35, 0xe0, 0x00, 0xd5,
+	0xfe, 0x2c, 0x17, 0x2e, 0x48, 0xd3, 0x94, 0xe3, 0xc5, 0x84, 0x5b, 0x2a, 0x16, 0x34, 0x61, 0x3a,
+	0x5e, 0xa2, 0x15, 0x6b, 0x2a, 0xb2, 0xa5, 0x3d, 0x0f, 0xfc, 0xff, 0xc9, 0x0a, 0x68, 0xb3, 0x2c,
+	0x37, 0x41, 0x51, 0x50, 0x17, 0x66, 0x19, 0xfd, 0xb0, 0xe7, 0x30, 0xda, 0xa8, 0x79, 0x64, 0x5b,
+	0x38, 0x2d, 0x3a, 0xc9, 0x35, 0xa4, 0xde, 0xaf, 0xf5, 0x98, 0x34, 0x61, 0x95, 0x79, 0x11, 0xbb,
+	0xe3, 0x04, 0x16, 0xee, 0x43, 0x47, 0x1e, 0xcc, 0x93, 0x1d, 0xe2, 0xb4, 0xc9, 0xa6, 0xd3, 0x76,
+	0xfc, 0xdd, 0x9a, 0xcf, 0x88, 0x4f, 0x9b, 0xbb, 0xda, 0xc5, 0xbe, 0xa2, 0xd7, 0x32, 0xbf, 0x9a,
+	0xd2, 0xe7, 0xe1, 0xde, 0xd2, 0xd7, 0xb5, 0x2c, 0xd2, 0xc8, 0x38, 0x15, 0xd8, 0xfe, 0x8f, 0x42,
+	0x68, 0x21, 0x74, 0x5e, 0xeb, 0x57, 0xa1, 0x54, 0x57, 0xc1, 0x64, 0x7b, 0x77, 0xdd, 0xd5, 0x67,
+	0x7a, 0x6d, 0x84, 0xdb, 0xae, 0x5c, 0x8d, 0x60, 0x12, 0x5e, 0xa8, 0x41, 0xc1, 0x26, 0x37, 0xf4,
+	0x11, 0x80, 0x32, 0xfd, 0xb4, 0xb1, 0xee, 0xea, 0xbb, 0xad, 0x3a, 0x0a, 0xef, 0xbb, 0x21, 0x8a,
+	0x62, 0x1d, 0x3a, 0x59, 0x11, 0x01, 0x1b, 0xac, 0xc4, 0xaa, 0x83, 0x2c, 0xee, 0x75, 0x8f, 0x69,
+	0x23, 0x31, 0xd2, 0xaa, 0x57, 0x23, 0x98, 0xa4, 0xef, 0x1d, 0x51, 0xb0, 0xc9, 0x6d, 0x91, 0xc1,
+	0x6c, 0x52, 0x56, 0x29, 0xf7, 0xdb, 0xcd, 0xf8, 0xfd, 0xb6, 0x32, 0xa4, 0x45, 0x30, 0x12, 0x03,
+	0x66, 0x1d, 0x81, 0xc1, 0xe9, 0x84, 0x8c, 0x52, 0x58, 0xae, 0xc7, 0x59, 0xbe, 0x9c, 0xe5, 0xae,
+	0xd7, 0xd9, 0x76, 0x93, 0x27, 0x87, 0xd9, 0xa4, 0x74, 0x8e, 0x8c, 0x69, 0x2c, 0xc5, 0x6f, 0x5e,
+	0xe2, 0x7f, 0x9e, 0x83, 0xc9, 0xd0, 0x8c, 0x67, 0xc9, 0xd7, 0x29, 0xf7, 0x2b, 0x77, 0x40, 0x10,
+	0x9d, 0x1f, 0x26, 0x88, 0x1e, 0x1b, 0x1c, 0x44, 0x07, 0x39, 0xfd, 0xe2, 0xa3, 0x73, 0xfa, 0x46,
+	0x10, 0x3d, 0x3e, 0x7c, 0x10, 0x3d, 0x71, 0x70, 0x10, 0x6d, 0xff, 0x95, 0x05, 0xa8, 0x3f, 0x63,
+	0x92, 0x45, 0x50, 0x24, 0x79, 0xb9, 0xbe, 0x9a, 0x35, 0x7c, 0x3d, 0xe8, 0x8e, 0xb5, 0x3f, 0x2b,
+	0xc0, 0xe9, 0x1b, 0xce, 0xc8, 0xa9, 0x57, 0x1f, 0x9e, 0x54, 0x48, 0x35, 0xaa, 0x1d, 0xdf, 0xd0,
+	0xb2, 0xaa, 0xfd, 0xbd, 0xac, 0x87, 0x3e, 0x59, 0x4d, 0xef, 0xf6, 0x70, 0x30, 0x09, 0x0f, 0x82,
+	0x1e, 0xfa, 0x90, 0x5c, 0x81, 0x69, 0xee, 0x33, 0xa7, 0xee, 0xab, 0xe4, 0x2e, 0x5f, 0x28, 0xc9,
+	0x9b, 0xeb, 0xac, 0xee, 0x3e, 0x5d, 0x33, 0x89, 0x38, 0xde, 0x37, 0x35, 0x67, 0x3c, 0x96, 0x39,
+	0x67, 0xbc, 0x0c, 0x93, 0xa4, 0xdd, 0xf6, 0x3e, 0xba, 0x43, 0x9a, 0x5c, 0x67, 0x69, 0xc2, 0x53,
+	0xb3, 0x1a, 0x10, 0x70, 0xd4, 0x07, 0x95, 0x01, 0x9c, 0xa6, 0xeb, 0x31, 0x2a, 0x47, 0x14, 0xe5,
+	0x15, 0x2a, 0xeb, 0x62, 0xeb, 0x61, 0x2b, 0x36, 0x7a, 0xa0, 0x1a, 0x9c, 0x75, 0x5c, 0x4e, 0xeb,
+	0x3d, 0x46, 0x6b, 0xdb, 0x4e, 0xf7, 0xce, 0xad, 0x9a, 0xb4, 0x12, 0xbb, 0xf2, 0x34, 0x4f, 0x54,
+	0x9e, 0xd2, 0xcc, 0xce, 0xae, 0xa7, 0x75, 0xc2, 0xe9, 0x63, 0xd1, 0x2b, 0x30, 0xe5, 0xb8, 0xf5,
+	0x76, 0xaf, 0x41, 0x37, 0x88, 0xdf, 0xe2, 0x0b, 0x13, 0x72, 0x1a, 0xb3, 0xfb, 0x7b, 0x4b, 0x53,
+	0xeb, 0x46, 0x3b, 0x8e, 0xf5, 0x12, 0xa3, 0xe8, 0x03, 0x63, 0xd4, 0x64, 0x34, 0xea, 0xda, 0x03,
+	0x73, 0x94, 0xd9, 0x2b, 0x25, 0xab, 0x0e, 0x99, 0xb2, 0xea, 0xdf, 0xcf, 0x41, 0x51, 0x15, 0xb5,
+	0xd0, 0xc5, 0x44, 0xe5, 0xe8, 0xa9, 0xbe, 0xca, 0x51, 0x29, 0xad, 0x00, 0x68, 0x43, 0xd1, 0xe1,
+	0xbc, 0x17, 0xf7, 0x58, 0xd6, 0x65, 0x0b, 0xd6, 0x14, 0x99, 0x71, 0xf4, 0xdc, 0x2d, 0xa7, 0xa9,
+	0xd3, 0x31, 0x57, 0x0d, 0x3f, 0x25, 0x7a, 0x9a, 0x70, 0x3f, 0x7c, 0xbb, 0x10, 0xb9, 0x2c, 0xb1,
+	0x0e, 0xc2, 0x77, 0x79, 0xb3, 0x76, 0xfb, 0x2d, 0xc5, 0xa3, 0x2a, 0x11, 0xb1, 0x46, 0x16, 0x3c,
+	0xbc, 0x9e, 0xdf, 0xed, 0xf9, 0xf2, 0xa0, 0x1c, 0x11, 0x8f, 0xdb, 0x12, 0x11, 0x6b, 0x64, 0xfb,
+	0x53, 0x0b, 0x4e, 0x2b, 0x19, 0x54, 0x5b, 0xb4, 0xbe, 0x5d, 0xf3, 0x69, 0x57, 0x84, 0x10, 0x3d,
+	0x4e, 0x79, 0x32, 0x84, 0x78, 0x9b, 0x53, 0x8e, 0x25, 0xc5, 0x58, 0x7d, 0xee, 0xb8, 0x56, 0x6f,
+	0x5f, 0x02, 0x63, 0x73, 0x64, 0x55, 0x56, 0x15, 0x27, 0xd5, 0x15, 0x96, 0x8f, 0x8c, 0x90, 0xea,
+	0xb5, 0x8b, 0x03, 0xba, 0xbd, 0x9f, 0x83, 0x82, 0xf4, 0xf2, 0xb3, 0x58, 0xae, 0x78, 0x5a, 0x2e,
+	0x37, 0x54, 0x5a, 0xee, 0x80, 0xcc, 0x6d, 0x94, 0x9a, 0x1c, 0x7b, 0x64, 0x6a, 0x92, 0xa7, 0x65,
+	0x26, 0xdf, 0xc8, 0x10, 0xdc, 0x8c, 0xf2, 0x32, 0xe2, 0xb0, 0x99, 0xbf, 0x9f, 0x5a, 0x30, 0x9f,
+	0x96, 0xa3, 0xcf, 0x22, 0xf3, 0x17, 0x61, 0xa2, 0xdb, 0x26, 0xfe, 0x96, 0xc7, 0x3a, 0xc9, 0xda,
+	0xec, 0x86, 0x6e, 0xc7, 0x61, 0x0f, 0xc4, 0x00, 0x58, 0x10, 0xe6, 0x06, 0x21, 0xe0, 0xd5, 0xc3,
+	0xe5, 0x6f, 0xa3, 0x1d, 0x0e, 0x9b, 0x38, 0x36, 0xb8, 0xd8, 0x7f, 0x50, 0x80, 0x39, 0x39, 0x64,
+	0xd4, 0x0b, 0x71, 0x94, 0x63, 0xd5, 0x85, 0x27, 0x64, 0x70, 0xda, 0x7f, 0x87, 0xaa, 0x93, 0x76,
+	0x49, 0x8f, 0x7f, 0x62, 0x3d, 0xb5, 0xd7, 0xc3, 0x81, 0x14, 0x3c, 0x00, 0xb7, 0xff, 0x62, 0x84,
+	0x9f, 0xbd, 0x8b, 0xd1, 0x3c, 0x6c, 0xe3, 0x07, 0x1e, 0xb6, 0x81, 0xd7, 0xe8, 0xc4, 0x21, 0xae,
+	0xd1, 0xfe, 0xab, 0x6d, 0x32, 0xd3, 0xd5, 0xf6, 0x17, 0x39, 0x18, 0xdf, 0x60, 0x9e, 0xac, 0xf5,
+	0x1c, 0x7f, 0x42, 0xfc, 0xed, 0x11, 0x6b, 0xc4, 0x02, 0x4a, 0xd9, 0x72, 0x59, 0x23, 0x9e, 0x88,
+	0xd7, 0x87, 0x8d, 0xfc, 0x6e, 0x3e, 0x4b, 0xd8, 0xa1, 0x81, 0x0f, 0xc8, 0xef, 0xfe, 0xd0, 0x82,
+	0xe9, 0xd8, 0x14, 0x1e, 0xe3, 0x5a, 0x7a, 0x42, 0x4e, 0x69, 0xb5, 0xf4, 0x7f, 0xb2, 0x60, 0x2e,
+	0xd6, 0xf3, 0x04, 0xb2, 0xa3, 0xdf, 0x8e, 0x67, 0x47, 0x5f, 0x1e, 0x61, 0x3d, 0x03, 0x72, 0xa4,
+	0x7f, 0x92, 0x5c, 0x8d, 0x58, 0x29, 0xfa, 0x75, 0x98, 0xeb, 0x06, 0xa5, 0xf7, 0x0d, 0xaf, 0xed,
+	0xd4, 0x1d, 0x1a, 0x24, 0xdb, 0x2f, 0x66, 0x7c, 0x97, 0x20, 0x87, 0xef, 0x56, 0xbe, 0xa6, 0xb9,
+	0xcf, 0x6d, 0x24, 0x71, 0x71, 0x3f, 0x2b, 0x99, 0x7b, 0xd6, 0xb3, 0x7a, 0x6c, 0x73, 0xcf, 0x7a,
+	0x7e, 0x03, 0xe4, 0xfa, 0x23, 0x0b, 0xa6, 0x0c, 0xf5, 0xe0, 0xa8, 0x05, 0xf0, 0x11, 0x61, 0xb4,
+	0xe5, 0x85, 0x6e, 0xdc, 0xd0, 0x19, 0xc1, 0x77, 0x82, 0x71, 0x12, 0x29, 0x3a, 0xf9, 0x61, 0x3b,
+	0xc7, 0x06, 0x36, 0xfa, 0xb6, 0x91, 0xdc, 0x53, 0xba, 0x35, 0x14, 0x17, 0x99, 0x3b, 0x50, 0x1c,
+	0x4c, 0x4d, 0x36, 0x52, 0x82, 0xf6, 0x0f, 0x22, 0x4d, 0xd6, 0xf9, 0xb2, 0x3a, 0x40, 0xdd, 0x73,
+	0x1b, 0x8e, 0x1f, 0x3e, 0xce, 0x2a, 0xad, 0x2c, 0x0f, 0xb7, 0x35, 0xd5, 0x60, 0x5c, 0xb4, 0xa0,
+	0xb0, 0x89, 0x63, 0x03, 0x16, 0xd5, 0xa0, 0x20, 0x4c, 0x49, 0xf0, 0xdc, 0x6d, 0x25, 0xb3, 0x71,
+	0xe2, 0xfa, 0x65, 0x87, 0xf8, 0x13, 0x2b, 0x2c, 0xfb, 0xaf, 0x73, 0x30, 0x19, 0x9e, 0xc5, 0x13,
+	0xb7, 0xdc, 0x2f, 0x67, 0xd4, 0xa2, 0x41, 0xd6, 0x08, 0x7d, 0x90, 0xb0, 0xdc, 0x59, 0xd5, 0xf3,
+	0x00, 0xdb, 0xfd, 0x0f, 0x6a, 0xc7, 0x55, 0xdf, 0x13, 0x50, 0xc5, 0x3b, 0x71, 0x55, 0x5c, 0xce,
+	0xb8, 0x9a, 0x01, 0xca, 0xf8, 0x71, 0x0e, 0x4e, 0x27, 0x0c, 0x12, 0x7a, 0x5a, 0x1e, 0xaa, 0x66,
+	0x50, 0x94, 0x09, 0x07, 0xea, 0x14, 0x9a, 0xa4, 0xa1, 0x1d, 0xe1, 0x83, 0x85, 0xde, 0x99, 0xc7,
+	0xb4, 0x90, 0xbf, 0x31, 0x92, 0x0d, 0x0c, 0x40, 0x2a, 0x73, 0xca, 0x7d, 0x33, 0x70, 0x71, 0x9c,
+	0x0d, 0xda, 0x80, 0x79, 0xd2, 0xf3, 0xbd, 0x10, 0xe0, 0x9a, 0x4b, 0x36, 0xdb, 0x54, 0xe5, 0xe3,
+	0x26, 0x2a, 0xff, 0x2f, 0xcc, 0x84, 0xa7, 0xf4, 0xc1, 0xa9, 0x23, 0xed, 0xbf, 0xb1, 0xe0, 0xc9,
+	0x01, 0xf3, 0x19, 0xa2, 0x3c, 0xd5, 0x86, 0x69, 0xf9, 0x80, 0x3c, 0x94, 0x43, 0x70, 0x8a, 0x87,
+	0xdb, 0x79, 0x73, 0xa8, 0x5a, 0x7d, 0xac, 0x09, 0xc7, 0xc1, 0xed, 0x1f, 0xe6, 0x00, 0x85, 0x73,
+	0xcd, 0x52, 0x45, 0xfb, 0x00, 0xc6, 0xb7, 0x54, 0x3a, 0xfa, 0x70, 0x65, 0xd0, 0x4a, 0xc9, 0xac,
+	0x04, 0x07, 0x98, 0xe8, 0xdd, 0xa3, 0xd1, 0x35, 0xe8, 0xd7, 0x33, 0x74, 0x0f, 0x60, 0xcb, 0x71,
+	0x1d, 0xde, 0x1a, 0xf1, 0x35, 0x89, 0x74, 0xb2, 0xaf, 0x87, 0x08, 0xd8, 0x40, 0xb3, 0xff, 0x34,
+	0x67, 0xe8, 0xb0, 0xbc, 0xde, 0x87, 0x3a, 0xfb, 0xcf, 0xc7, 0x85, 0x39, 0xd9, 0x5f, 0x22, 0x0f,
+	0x05, 0x73, 0x0f, 0xc6, 0x76, 0x08, 0x0b, 0xaa, 0x75, 0x43, 0x3e, 0x54, 0xeb, 0x7f, 0xa3, 0x12,
+	0xed, 0xe9, 0x5d, 0xc2, 0x38, 0x96, 0x98, 0xc2, 0xf5, 0xe1, 0x3e, 0xed, 0x06, 0x97, 0x4b, 0x66,
+	0xc3, 0xe9, 0xd3, 0xae, 0xb9, 0x40, 0xda, 0x95, 0x37, 0x00, 0xed, 0x72, 0xfb, 0xbb, 0xe3, 0x86,
+	0x55, 0xd0, 0xf7, 0xd9, 0x9b, 0x80, 0xda, 0x84, 0xfb, 0x37, 0x89, 0xdb, 0x10, 0xba, 0x44, 0xb7,
+	0x18, 0xe5, 0x2d, 0x1d, 0x39, 0x2d, 0x6a, 0x14, 0x74, 0xab, 0xaf, 0x07, 0x4e, 0x19, 0x85, 0x2e,
+	0x06, 0x1f, 0x00, 0x28, 0x29, 0x2f, 0xc5, 0x3e, 0x00, 0x78, 0xb8, 0xb7, 0x34, 0x13, 0xe9, 0xa3,
+	0xf1, 0x49, 0x40, 0x86, 0xa7, 0xee, 0xe6, 0x79, 0x2f, 0x1c, 0xc3, 0x79, 0xff, 0x35, 0x98, 0xdb,
+	0x4a, 0xbe, 0x99, 0xd0, 0xef, 0xcc, 0x5e, 0x1b, 0xf1, 0xc9, 0x45, 0xe5, 0xec, 0x7e, 0x54, 0x68,
+	0x8f, 0x9a, 0x71, 0x3f, 0x23, 0xe4, 0x05, 0x0f, 0xec, 0x65, 0x12, 0x4c, 0xe5, 0x37, 0x87, 0xd6,
+	0xb9, 0x44, 0xfa, 0x2c, 0xf9, 0xb4, 0x5e, 0x41, 0xe2, 0x18, 0x83, 0x84, 0x0e, 0x16, 0x8f, 0x52,
+	0x07, 0xd1, 0xc5, 0xb0, 0xae, 0x28, 0xa6, 0x23, 0x43, 0xcc, 0x7c, 0x5f, 0x45, 0x50, 0x90, 0xb0,
+	0xd9, 0x0f, 0x7d, 0x62, 0xc1, 0x59, 0x71, 0x58, 0xaf, 0x3d, 0xa0, 0xf5, 0x9e, 0x90, 0x4a, 0xf0,
+	0xdd, 0xcd, 0x42, 0x49, 0x4a, 0xe3, 0xca, 0xb0, 0xae, 0x5d, 0x0a, 0x44, 0x14, 0x2f, 0xa7, 0x92,
+	0x71, 0x3a, 0x63, 0x74, 0x5f, 0x39, 0x63, 0x54, 0xa6, 0x23, 0x0e, 0x9f, 0x65, 0x0c, 0x1d, 0x33,
+	0x65, 0x77, 0x7c, 0x6a, 0xff, 0x24, 0x6f, 0x9a, 0xab, 0xe1, 0x72, 0x9f, 0xf7, 0x60, 0xcc, 0x27,
+	0x7c, 0x5b, 0x6b, 0xc1, 0x1b, 0x23, 0x3c, 0x9d, 0x8e, 0x74, 0x41, 0xc6, 0xc6, 0xb2, 0x49, 0x62,
+	0xa2, 0x45, 0xc8, 0x11, 0x9e, 0xac, 0x84, 0xad, 0x72, 0x9c, 0x23, 0x5c, 0x56, 0xc9, 0xb6, 0x74,
+	0xe6, 0x22, 0xaa, 0x92, 0x6d, 0xe1, 0x9c, 0xb3, 0x85, 0xde, 0x85, 0x02, 0xa3, 0x3e, 0xdb, 0xd5,
+	0xd6, 0xfc, 0xd2, 0x08, 0x86, 0x0b, 0x8b, 0xf1, 0x4a, 0x44, 0xf2, 0x4f, 0xac, 0x10, 0x43, 0x7b,
+	0x5b, 0x3c, 0x06, 0x7b, 0x1b, 0xa5, 0x91, 0xf3, 0xc7, 0x96, 0x46, 0xfe, 0xbe, 0x65, 0x5c, 0xf0,
+	0xe1, 0x42, 0xd1, 0xdb, 0x30, 0xee, 0x3b, 0x1d, 0xea, 0xf5, 0xfc, 0x6c, 0x9e, 0x65, 0xf8, 0xd0,
+	0x40, 0x9a, 0xb1, 0x3b, 0x0a, 0x02, 0x07, 0x58, 0xe8, 0x2a, 0xcc, 0x50, 0xc6, 0x3c, 0x76, 0xa7,
+	0x25, 0xcc, 0xb2, 0xd7, 0x56, 0x6e, 0xd4, 0x74, 0x94, 0xe1, 0xb9, 0x16, 0xa3, 0xe2, 0x44, 0xef,
+	0x20, 0x7f, 0xf1, 0xb3, 0xf2, 0x2d, 0x80, 0xce, 0x5f, 0x9c, 0xe8, 0x47, 0x00, 0x23, 0xe7, 0x2f,
+	0x0e, 0x7c, 0xfd, 0xff, 0x3e, 0x3c, 0x91, 0xae, 0xc7, 0x47, 0xf2, 0xf5, 0xdc, 0x0f, 0x92, 0xb2,
+	0x92, 0xee, 0x53, 0xa0, 0x7e, 0xd6, 0x71, 0xba, 0x3b, 0xb9, 0xa3, 0x76, 0x77, 0x98, 0xb9, 0x14,
+	0xfd, 0xad, 0x21, 0xfa, 0x40, 0x9f, 0x33, 0x2b, 0xcb, 0xd7, 0x6b, 0x7d, 0x30, 0x03, 0xcf, 0xda,
+	0x3f, 0x5b, 0x70, 0x36, 0xb5, 0x77, 0x28, 0xc3, 0xdc, 0x71, 0xca, 0xd0, 0x3a, 0x6a, 0x19, 0x7e,
+	0x2f, 0x07, 0xb3, 0x98, 0x76, 0xbd, 0x58, 0xe5, 0x61, 0x23, 0xf8, 0x4a, 0x23, 0x43, 0x4c, 0x90,
+	0x28, 0xe7, 0x57, 0xc6, 0x63, 0x9f, 0x67, 0x08, 0x75, 0xe9, 0x04, 0x0e, 0xe0, 0xd0, 0xea, 0xdf,
+	0x57, 0x13, 0x51, 0x37, 0x87, 0xaa, 0xae, 0x28, 0x40, 0x81, 0x2c, 0x9f, 0xc3, 0x69, 0xe3, 0xfe,
+	0x5a, 0x86, 0x87, 0x75, 0xfd, 0xc8, 0xb2, 0x19, 0x2b, 0x40, 0xfb, 0xd3, 0x1c, 0xa8, 0xf8, 0xe1,
+	0x04, 0xac, 0xe3, 0x2f, 0xc5, 0xac, 0xe3, 0x72, 0x96, 0xfc, 0xd6, 0xa0, 0x3c, 0x4a, 0x32, 0xb6,
+	0xbb, 0x90, 0x31, 0x69, 0xf6, 0x88, 0x1c, 0xca, 0xdf, 0x5b, 0x30, 0x29, 0xfb, 0x9d, 0x80, 0xa1,
+	0xdd, 0x88, 0x1b, 0xda, 0x17, 0x32, 0xac, 0x62, 0x80, 0x81, 0xfd, 0xaf, 0xbc, 0x9e, 0x7d, 0x18,
+	0x39, 0xb6, 0x08, 0x6b, 0xe8, 0x90, 0x28, 0xd2, 0x12, 0xd1, 0x88, 0x15, 0x2d, 0xd4, 0xed, 0xf1,
+	0x63, 0xd0, 0xed, 0x5f, 0x51, 0xaf, 0x12, 0x29, 0xf7, 0x69, 0xe3, 0x7a, 0x18, 0xfb, 0xe4, 0x33,
+	0x3f, 0xaf, 0xd4, 0x4f, 0x40, 0xa3, 0x72, 0x18, 0x4e, 0xa0, 0xe2, 0x3e, 0x3e, 0x22, 0x1e, 0xea,
+	0x26, 0x8d, 0x99, 0x8e, 0x13, 0x5e, 0x1b, 0xd1, 0x72, 0xaa, 0x78, 0xa8, 0xaf, 0x19, 0xf7, 0x33,
+	0x42, 0x2d, 0x98, 0x32, 0x1f, 0x86, 0xeb, 0x73, 0xba, 0x92, 0xfd, 0x05, 0xba, 0x7a, 0xed, 0x61,
+	0xb6, 0xe0, 0x18, 0xb2, 0xfd, 0x87, 0x16, 0x40, 0x94, 0x0d, 0x16, 0x7b, 0x5e, 0xf7, 0x7a, 0xae,
+	0x4a, 0x03, 0xe4, 0xa3, 0x3d, 0xaf, 0x8a, 0x46, 0xac, 0x68, 0x42, 0x7f, 0x54, 0x30, 0xa5, 0x0f,
+	0xf5, 0x85, 0x2c, 0x71, 0x5a, 0x22, 0xeb, 0xac, 0x1a, 0xb1, 0x06, 0xb4, 0x3f, 0x2e, 0x42, 0xc9,
+	0xd0, 0xb3, 0x44, 0xce, 0x79, 0xfa, 0x78, 0x72, 0xce, 0xe9, 0x89, 0x80, 0xd2, 0x48, 0x89, 0x00,
+	0x0e, 0x33, 0x3a, 0xbc, 0x0d, 0xbe, 0x1e, 0x50, 0x89, 0x92, 0x91, 0x83, 0x68, 0x24, 0xbc, 0xd6,
+	0xeb, 0x31, 0x48, 0x9c, 0x60, 0x21, 0xbc, 0x5e, 0xdd, 0x52, 0xeb, 0x75, 0x3a, 0x84, 0xed, 0x2e,
+	0x4c, 0xc9, 0xc9, 0x87, 0x5e, 0xef, 0xf5, 0x18, 0x15, 0x27, 0x7a, 0xa3, 0x8d, 0x70, 0x43, 0xd5,
+	0x8b, 0xf4, 0x17, 0xb3, 0x6c, 0xa8, 0xf2, 0xfa, 0xe3, 0xfb, 0x28, 0x44, 0xea, 0x6d, 0xca, 0xa0,
+	0xa1, 0x71, 0x43, 0xfd, 0xf6, 0x86, 0x38, 0xc6, 0x45, 0x79, 0xa8, 0x42, 0x91, 0xde, 0xee, 0xeb,
+	0x81, 0x53, 0x46, 0x09, 0x33, 0xa0, 0xe3, 0xe4, 0x50, 0x77, 0x74, 0x66, 0x22, 0x6b, 0x9c, 0x15,
+	0x05, 0x7e, 0xf2, 0x99, 0x72, 0x35, 0x81, 0x8a, 0xfb, 0xf8, 0xa0, 0x0f, 0x61, 0x5a, 0x6c, 0x72,
+	0xc4, 0x18, 0x0e, 0xc9, 0x58, 0x67, 0x44, 0x0d, 0x48, 0x1c, 0xe7, 0x60, 0xff, 0x71, 0x1e, 0xd2,
+	0xa3, 0xf4, 0xe8, 0x0b, 0x29, 0xeb, 0x11, 0x5f, 0x48, 0xbd, 0x03, 0x93, 0xdc, 0x27, 0x4c, 0x7d,
+	0xaa, 0x96, 0x1b, 0xed, 0x53, 0xb5, 0x5a, 0x00, 0x80, 0x23, 0xac, 0x44, 0xca, 0x24, 0x7f, 0xa4,
+	0x29, 0x93, 0x15, 0x00, 0x19, 0x88, 0x49, 0x33, 0x23, 0xef, 0x9b, 0xe9, 0x48, 0x6b, 0xaf, 0x85,
+	0x14, 0x6c, 0xf4, 0x42, 0xdf, 0x08, 0x6f, 0x71, 0xf5, 0x5a, 0xe1, 0xe7, 0xfa, 0x1e, 0x97, 0x9d,
+	0x89, 0xb9, 0x79, 0x89, 0x2c, 0xec, 0xf0, 0x2f, 0x52, 0xed, 0xff, 0xc9, 0x41, 0xcc, 0x84, 0xa2,
+	0xdf, 0xb7, 0x60, 0x8e, 0x24, 0x7e, 0xca, 0x23, 0xf0, 0x40, 0x7f, 0x31, 0xdb, 0xef, 0xab, 0xf4,
+	0xfd, 0x12, 0x48, 0x54, 0x3d, 0x4d, 0x76, 0xe1, 0xb8, 0x9f, 0x29, 0xfa, 0x1d, 0x0b, 0xce, 0x90,
+	0xfe, 0xdf, 0x6a, 0xd1, 0x3b, 0xff, 0xfa, 0xc8, 0x3f, 0xf6, 0x52, 0x79, 0x72, 0x7f, 0x6f, 0x29,
+	0xed, 0x57, 0x6c, 0x70, 0x1a, 0x3b, 0xf4, 0x1e, 0x8c, 0x11, 0xd6, 0x0c, 0x12, 0xb7, 0xd9, 0xd9,
+	0x06, 0x3f, 0xc1, 0x13, 0xf9, 0x01, 0xab, 0xac, 0xc9, 0xb1, 0x04, 0xb5, 0x7f, 0x9c, 0x87, 0xd9,
+	0xe4, 0x67, 0x55, 0xfa, 0xd1, 0xf2, 0x58, 0xea, 0xa3, 0x65, 0xa1, 0x28, 0xb2, 0x74, 0x91, 0xfc,
+	0x94, 0x50, 0x56, 0x20, 0x14, 0x2d, 0x54, 0x14, 0xf9, 0xb1, 0x43, 0xe1, 0x10, 0x8a, 0x22, 0xbf,
+	0x70, 0x88, 0xb0, 0xd0, 0xa5, 0x78, 0x2e, 0xd8, 0x4e, 0xe6, 0x82, 0xe7, 0xcc, 0xb5, 0x8c, 0x9a,
+	0x0e, 0xee, 0x40, 0xc9, 0xd8, 0x07, 0xad, 0x8e, 0x97, 0x33, 0xcb, 0x3d, 0x3a, 0x76, 0xa7, 0xd5,
+	0x6b, 0xb5, 0x88, 0x62, 0xe2, 0x47, 0xca, 0x2f, 0xa5, 0x75, 0xa8, 0x7c, 0xa9, 0x14, 0x97, 0x81,
+	0x66, 0xff, 0x9b, 0x05, 0xd3, 0xb1, 0x97, 0xf4, 0x82, 0x5b, 0xf0, 0xc5, 0xc2, 0xe8, 0xbf, 0x5b,
+	0x73, 0x37, 0x44, 0xc0, 0x06, 0x1a, 0xfa, 0x0e, 0x94, 0xda, 0x9e, 0xdb, 0xa4, 0xdc, 0xaf, 0x79,
+	0x64, 0x5b, 0xeb, 0x49, 0xd6, 0xe4, 0xd3, 0xc2, 0xfe, 0xde, 0xd2, 0xfc, 0x2d, 0x05, 0x53, 0xf5,
+	0x3a, 0xdd, 0x36, 0xf5, 0xd5, 0xb7, 0x2d, 0xd8, 0x04, 0x97, 0x75, 0xe7, 0xb0, 0x70, 0xff, 0xb8,
+	0xd6, 0x9d, 0xa3, 0x17, 0x07, 0x47, 0x5c, 0x77, 0x8e, 0x3d, 0x65, 0x38, 0xa0, 0xee, 0x1c, 0xf6,
+	0x7d, 0x6c, 0xeb, 0xce, 0xe1, 0x0c, 0x07, 0xc4, 0x4e, 0xff, 0x9d, 0x33, 0x56, 0x11, 0x8f, 0x9f,
+	0x72, 0x8f, 0x88, 0x9f, 0xde, 0x87, 0x09, 0xc7, 0xf5, 0x29, 0xdb, 0x21, 0x6d, 0x9d, 0x3c, 0xce,
+	0x7a, 0x16, 0xc3, 0xa5, 0xae, 0x6b, 0x1c, 0x1c, 0x22, 0xa2, 0x36, 0x9c, 0x0d, 0x8a, 0x2d, 0x8c,
+	0x92, 0xa8, 0x1c, 0xac, 0x1f, 0x32, 0xbe, 0x1a, 0x54, 0x05, 0xae, 0xa7, 0x75, 0x7a, 0x38, 0x88,
+	0x80, 0xd3, 0x41, 0x11, 0x87, 0x69, 0x6e, 0x24, 0x0e, 0x82, 0x1b, 0x71, 0xc8, 0x42, 0x55, 0x32,
+	0xd7, 0x62, 0xbc, 0x7e, 0x34, 0x41, 0x71, 0x9c, 0x87, 0xfd, 0x89, 0x05, 0x33, 0xf1, 0x47, 0x33,
+	0xff, 0xe7, 0x41, 0xcc, 0x8f, 0xf2, 0x70, 0x3a, 0x71, 0xf8, 0x13, 0x81, 0xcc, 0xe4, 0x49, 0x06,
+	0x32, 0xc5, 0x91, 0x02, 0x99, 0x74, 0x0f, 0x7e, 0x6c, 0x24, 0x0f, 0xfe, 0x8a, 0xf2, 0xa2, 0xf5,
+	0x61, 0x5a, 0x5f, 0xd3, 0x9f, 0xeb, 0x84, 0x1b, 0x7c, 0xcb, 0x24, 0xe2, 0x78, 0x5f, 0xe9, 0xe1,
+	0x34, 0xfa, 0x7f, 0x96, 0x45, 0x87, 0x00, 0xaf, 0x67, 0x7d, 0x80, 0x1c, 0x02, 0x28, 0x0f, 0x27,
+	0x85, 0x80, 0xd3, 0xd8, 0x55, 0xde, 0xfc, 0xfc, 0xab, 0x73, 0xa7, 0xbe, 0xf8, 0xea, 0xdc, 0xa9,
+	0x2f, 0xbf, 0x3a, 0x77, 0xea, 0xe3, 0xfd, 0x73, 0xd6, 0xe7, 0xfb, 0xe7, 0xac, 0x2f, 0xf6, 0xcf,
+	0x59, 0x5f, 0xee, 0x9f, 0xb3, 0x7e, 0xb2, 0x7f, 0xce, 0xfa, 0xe4, 0xa7, 0xe7, 0x4e, 0xdd, 0x7b,
+	0x66, 0x98, 0x1f, 0x73, 0xfc, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc8, 0xee, 0x9b, 0xbb, 0xf3,
+	0x51, 0x00, 0x00,
 }
 
 func (m *AnalysisRunArgument) Marshal() (dAtA []byte, err error) {
@@ -4623,16 +4621,6 @@ func (m *ProjectStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 			dAtA[i] = 0x1a
 		}
 	}
-	i -= len(m.Message)
-	copy(dAtA[i:], m.Message)
-	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message)))
-	i--
-	dAtA[i] = 0x12
-	i -= len(m.Phase)
-	copy(dAtA[i:], m.Phase)
-	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Phase)))
-	i--
-	dAtA[i] = 0xa
 	return len(dAtA) - i, nil
 }
 
@@ -5781,11 +5769,6 @@ func (m *StageStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 		i--
 		dAtA[i] = 0x52
 	}
-	i -= len(m.Message)
-	copy(dAtA[i:], m.Message)
-	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message)))
-	i--
-	dAtA[i] = 0x4a
 	if m.Health != nil {
 		{
 			size, err := m.Health.MarshalToSizedBuffer(dAtA[:i])
@@ -5827,11 +5810,6 @@ func (m *StageStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 			dAtA[i] = 0x22
 		}
 	}
-	i -= len(m.Phase)
-	copy(dAtA[i:], m.Phase)
-	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Phase)))
-	i--
-	dAtA[i] = 0xa
 	return len(dAtA) - i, nil
 }
 
@@ -7167,10 +7145,6 @@ func (m *ProjectStatus) Size() (n int) {
 	}
 	var l int
 	_ = l
-	l = len(m.Phase)
-	n += 1 + l + sovGenerated(uint64(l))
-	l = len(m.Message)
-	n += 1 + l + sovGenerated(uint64(l))
 	if len(m.Conditions) > 0 {
 		for _, e := range m.Conditions {
 			l = e.Size()
@@ -7584,8 +7558,6 @@ func (m *StageStatus) Size() (n int) {
 	}
 	var l int
 	_ = l
-	l = len(m.Phase)
-	n += 1 + l + sovGenerated(uint64(l))
 	if len(m.FreightHistory) > 0 {
 		for _, e := range m.FreightHistory {
 			l = e.Size()
@@ -7601,8 +7573,6 @@ func (m *StageStatus) Size() (n int) {
 		l = m.Health.Size()
 		n += 1 + l + sovGenerated(uint64(l))
 	}
-	l = len(m.Message)
-	n += 1 + l + sovGenerated(uint64(l))
 	if m.LastPromotion != nil {
 		l = m.LastPromotion.Size()
 		n += 1 + l + sovGenerated(uint64(l))
@@ -8481,8 +8451,6 @@ func (this *ProjectStatus) String() string {
 	}
 	repeatedStringForConditions += "}"
 	s := strings.Join([]string{`&ProjectStatus{`,
-		`Phase:` + fmt.Sprintf("%v", this.Phase) + `,`,
-		`Message:` + fmt.Sprintf("%v", this.Message) + `,`,
 		`Conditions:` + repeatedStringForConditions + `,`,
 		`Stats:` + strings.Replace(this.Stats.String(), "ProjectStats", "ProjectStats", 1) + `,`,
 		`}`,
@@ -8817,12 +8785,10 @@ func (this *StageStatus) String() string {
 	}
 	repeatedStringForConditions += "}"
 	s := strings.Join([]string{`&StageStatus{`,
-		`Phase:` + fmt.Sprintf("%v", this.Phase) + `,`,
 		`FreightHistory:` + repeatedStringForFreightHistory + `,`,
 		`ObservedGeneration:` + fmt.Sprintf("%v", this.ObservedGeneration) + `,`,
 		`CurrentPromotion:` + strings.Replace(this.CurrentPromotion.String(), "PromotionReference", "PromotionReference", 1) + `,`,
 		`Health:` + strings.Replace(this.Health.String(), "Health", "Health", 1) + `,`,
-		`Message:` + fmt.Sprintf("%v", this.Message) + `,`,
 		`LastPromotion:` + strings.Replace(this.LastPromotion.String(), "PromotionReference", "PromotionReference", 1) + `,`,
 		`LastHandledRefresh:` + fmt.Sprintf("%v", this.LastHandledRefresh) + `,`,
 		`FreightSummary:` + fmt.Sprintf("%v", this.FreightSummary) + `,`,
@@ -16221,70 +16187,6 @@ func (m *ProjectStatus) Unmarshal(dAtA []byte) error {
 			return fmt.Errorf("proto: ProjectStatus: illegal tag %d (wire type %d)", fieldNum, wire)
 		}
 		switch fieldNum {
-		case 1:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Phase", wireType)
-			}
-			var stringLen uint64
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowGenerated
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthGenerated
-			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthGenerated
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			m.Phase = ProjectPhase(dAtA[iNdEx:postIndex])
-			iNdEx = postIndex
-		case 2:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType)
-			}
-			var stringLen uint64
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowGenerated
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthGenerated
-			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthGenerated
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			m.Message = string(dAtA[iNdEx:postIndex])
-			iNdEx = postIndex
 		case 3:
 			if wireType != 2 {
 				return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType)
@@ -19483,38 +19385,6 @@ func (m *StageStatus) Unmarshal(dAtA []byte) error {
 			return fmt.Errorf("proto: StageStatus: illegal tag %d (wire type %d)", fieldNum, wire)
 		}
 		switch fieldNum {
-		case 1:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Phase", wireType)
-			}
-			var stringLen uint64
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowGenerated
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthGenerated
-			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthGenerated
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			m.Phase = StagePhase(dAtA[iNdEx:postIndex])
-			iNdEx = postIndex
 		case 4:
 			if wireType != 2 {
 				return fmt.Errorf("proto: wrong wireType = %d for field FreightHistory", wireType)
@@ -19640,38 +19510,6 @@ func (m *StageStatus) Unmarshal(dAtA []byte) error {
 				return err
 			}
 			iNdEx = postIndex
-		case 9:
-			if wireType != 2 {
-				return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType)
-			}
-			var stringLen uint64
-			for shift := uint(0); ; shift += 7 {
-				if shift >= 64 {
-					return ErrIntOverflowGenerated
-				}
-				if iNdEx >= l {
-					return io.ErrUnexpectedEOF
-				}
-				b := dAtA[iNdEx]
-				iNdEx++
-				stringLen |= uint64(b&0x7F) << shift
-				if b < 0x80 {
-					break
-				}
-			}
-			intStringLen := int(stringLen)
-			if intStringLen < 0 {
-				return ErrInvalidLengthGenerated
-			}
-			postIndex := iNdEx + intStringLen
-			if postIndex < 0 {
-				return ErrInvalidLengthGenerated
-			}
-			if postIndex > l {
-				return io.ErrUnexpectedEOF
-			}
-			m.Message = string(dAtA[iNdEx:postIndex])
-			iNdEx = postIndex
 		case 10:
 			if wireType != 2 {
 				return fmt.Errorf("proto: wrong wireType = %d for field LastPromotion", wireType)
diff --git a/api/v1alpha1/generated.proto b/api/v1alpha1/generated.proto
index d70e63f41f..c60663c8b6 100644
--- a/api/v1alpha1/generated.proto
+++ b/api/v1alpha1/generated.proto
@@ -401,9 +401,9 @@ message FreightOrigin {
 // FreightReference is a simplified representation of a piece of Freight -- not
 // a root resource type.
 message FreightReference {
-  // Name is system-assigned identifier that is derived deterministically from
-  // the contents of the Freight. i.e. Two pieces of Freight can be compared for
-  // equality by comparing their Names.
+  // Name is a system-assigned identifier derived deterministically from
+  // the contents of the Freight. I.e., two pieces of Freight can be compared
+  // for equality by comparing their Names.
   optional string name = 1;
 
   // Origin describes a kind of Freight in terms of its origin.
@@ -672,7 +672,7 @@ message HealthCheckStep {
   optional .k8s.io.apiextensions_apiserver.pkg.apis.apiextensions.v1.JSON config = 2;
 }
 
-// HealthStats contains a summary of the collective health of a some resource
+// HealthStats contains a summary of the collective health of some resource
 // type.
 message HealthStats {
   // Healthy contains the number of resources that are explicitly healthy.
@@ -873,8 +873,8 @@ message ProjectList {
   repeated Project items = 2;
 }
 
-// ProjectStats contains a summary of the of the collective state of a
-// Project's constituent resources.
+// ProjectStats contains a summary of the collective state of a Project's
+// constituent resources.
 message ProjectStats {
   // Warehouses contains a summary of the collective state of the Project's
   // Warehouses.
@@ -894,19 +894,7 @@ message ProjectStatus {
   // +listMapKey=type
   repeated .k8s.io.apimachinery.pkg.apis.meta.v1.Condition conditions = 3;
 
-  // Phase describes the Project's current phase.
-  //
-  // Deprecated: Use the Conditions field instead.
-  optional string phase = 1;
-
-  // Message is a display message about the Project, including any errors
-  // preventing the Project from being reconciled. i.e. If the Phase field has a
-  // value of CreationFailed, this field can be expected to explain why.
-  //
-  // Deprecated: Use the Conditions field instead.
-  optional string message = 2;
-
-  // Stats contains a summary of the of the collective state of a Project's
+  // Stats contains a summary of the collective state of a Project's
   // constituent resources.
   optional ProjectStats stats = 4;
 }
@@ -1316,7 +1304,7 @@ message StageSpec {
   optional Verification verification = 3;
 }
 
-// StageStats contains a summary of the collective state of the a Project's
+// StageStats contains a summary of the collective state of a Project's
 // Stages.
 message StageStats {
   // Count contains the total number of Stages in the Project.
@@ -1343,9 +1331,6 @@ message StageStatus {
   // +optional
   optional string lastHandledRefresh = 11;
 
-  // Phase describes where the Stage currently is in its lifecycle.
-  optional string phase = 1;
-
   // FreightHistory is a list of recent Freight selections that were deployed
   // to the Stage. By default, the last ten Freight selections are stored.
   // The first item in the list is the most recent Freight selection and
@@ -1367,10 +1352,6 @@ message StageStatus {
   // Health is the Stage's last observed health.
   optional Health health = 8;
 
-  // Message describes any errors that are preventing the Stage controller
-  // from assessing Stage health or from finding new Freight.
-  optional string message = 9;
-
   // ObservedGeneration represents the .metadata.generation that this Stage
   // status was reconciled against.
   optional int64 observedGeneration = 6;
@@ -1525,7 +1506,7 @@ message WarehouseSpec {
   repeated RepoSubscription subscriptions = 1;
 }
 
-// WarehouseStats contains a summary of the collective state of the a Project's
+// WarehouseStats contains a summary of the collective state of a Project's
 // Warehouses.
 message WarehouseStats {
   // Count contains the total number of Warehouses in the Project.
diff --git a/api/v1alpha1/project_config_types.go b/api/v1alpha1/project_config_types.go
index 8e4091f4ae..6f9a0f7eed 100644
--- a/api/v1alpha1/project_config_types.go
+++ b/api/v1alpha1/project_config_types.go
@@ -4,7 +4,7 @@ import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
 // +kubebuilder:object:root=true
 // +kubebuilder:resource:scope=Namespaced
-// +kubebuilder:subresource:status
+// +kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
 
 // ProjectConfig is a resource type that describes the configuration of a
 // Project.
diff --git a/api/v1alpha1/project_types.go b/api/v1alpha1/project_types.go
index 2de3c5b1ed..11d7997842 100644
--- a/api/v1alpha1/project_types.go
+++ b/api/v1alpha1/project_types.go
@@ -4,29 +4,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-type ProjectPhase string
-
-const (
-	// ProjectPhaseInitializing denotes a Project that is not yet fully
-	// initialized.
-	ProjectPhaseInitializing ProjectPhase = "Initializing"
-	// ProjectPhaseInitializationFailed denotes a Project while failed to
-	// initialize properly.
-	ProjectPhaseInitializationFailed ProjectPhase = "InitializationFailed"
-	// ProjectPhaseReady denotes a Project that is fully initialized.
-	ProjectPhaseReady ProjectPhase = "Ready"
-)
-
-// IsTerminal returns true if the ProjectPhase is a terminal one.
-func (p *ProjectPhase) IsTerminal() bool {
-	switch *p {
-	case ProjectPhaseInitializationFailed, ProjectPhaseReady:
-		return true
-	default:
-		return false
-	}
-}
-
 // +kubebuilder:object:root=true
 // +kubebuilder:resource:scope=Cluster
 // +kubebuilder:subresource:status
@@ -68,17 +45,7 @@ type ProjectStatus struct {
 	// +listType=map
 	// +listMapKey=type
 	Conditions []metav1.Condition `json:"conditions,omitempty" patchMergeKey:"type" patchStrategy:"merge" protobuf:"bytes,3,rep,name=conditions"`
-	// Phase describes the Project's current phase.
-	//
-	// Deprecated: Use the Conditions field instead.
-	Phase ProjectPhase `json:"phase,omitempty" protobuf:"bytes,1,opt,name=phase"`
-	// Message is a display message about the Project, including any errors
-	// preventing the Project from being reconciled. i.e. If the Phase field has a
-	// value of CreationFailed, this field can be expected to explain why.
-	//
-	// Deprecated: Use the Conditions field instead.
-	Message string `json:"message,omitempty" protobuf:"bytes,2,opt,name=message"`
-	// Stats contains a summary of the of the collective state of a Project's
+	// Stats contains a summary of the collective state of a Project's
 	// constituent resources.
 	Stats *ProjectStats `json:"stats,omitempty" protobuf:"bytes,4,opt,name=stats"`
 }
@@ -93,8 +60,8 @@ func (w *ProjectStatus) SetConditions(conditions []metav1.Condition) {
 	w.Conditions = conditions
 }
 
-// ProjectStats contains a summary of the of the collective state of a
-// Project's constituent resources.
+// ProjectStats contains a summary of the collective state of a Project's
+// constituent resources.
 type ProjectStats struct {
 	// Warehouses contains a summary of the collective state of the Project's
 	// Warehouses.
@@ -103,7 +70,7 @@ type ProjectStats struct {
 	Stages StageStats `json:"stages,omitempty" protobuf:"bytes,2,opt,name=stages"`
 }
 
-// WarehouseStats contains a summary of the collective state of the a Project's
+// WarehouseStats contains a summary of the collective state of a Project's
 // Warehouses.
 type WarehouseStats struct {
 	// Count contains the total number of Warehouses in the Project.
@@ -113,7 +80,7 @@ type WarehouseStats struct {
 	Health HealthStats `json:"health,omitempty" protobuf:"bytes,1,opt,name=health"`
 }
 
-// StageStats contains a summary of the collective state of the a Project's
+// StageStats contains a summary of the collective state of a Project's
 // Stages.
 type StageStats struct {
 	// Count contains the total number of Stages in the Project.
@@ -122,7 +89,7 @@ type StageStats struct {
 	Health HealthStats `json:"health,omitempty" protobuf:"bytes,1,opt,name=health"`
 }
 
-// HealthStats contains a summary of the collective health of a some resource
+// HealthStats contains a summary of the collective health of some resource
 // type.
 type HealthStats struct {
 	// Healthy contains the number of resources that are explicitly healthy.
diff --git a/api/v1alpha1/stage_types.go b/api/v1alpha1/stage_types.go
index 6fe786fdb0..d445988e2d 100644
--- a/api/v1alpha1/stage_types.go
+++ b/api/v1alpha1/stage_types.go
@@ -11,23 +11,6 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-type StagePhase string
-
-const (
-	// StagePhaseNotApplicable denotes a Stage that has no Freight.
-	StagePhaseNotApplicable StagePhase = "NotApplicable"
-	// StagePhaseSteady denotes a Stage that has Freight and is not currently
-	// being promoted or verified.
-	StagePhaseSteady StagePhase = "Steady"
-	// StagePhasePromoting denotes a Stage that is currently being promoted.
-	StagePhasePromoting StagePhase = "Promoting"
-	// StagePhaseVerifying denotes a Stage that is currently being verified.
-	StagePhaseVerifying StagePhase = "Verifying"
-	// StagePhaseFailed denotes a Stage that is in a failed state. For example,
-	// the Stage may have failed to promote or verify its Freight.
-	StagePhaseFailed StagePhase = "Failed"
-)
-
 type VerificationPhase string
 
 // Note: VerificationPhases are identical to AnalysisRunPhases. In almost all
@@ -142,7 +125,8 @@ const (
 // +kubebuilder:printcolumn:name=Shard,type=string,JSONPath=`.spec.shard`
 // +kubebuilder:printcolumn:name=Current Freight,type=string,JSONPath=`.status.freightSummary`
 // +kubebuilder:printcolumn:name=Health,type=string,JSONPath=`.status.health.status`
-// +kubebuilder:printcolumn:name=Phase,type=string,JSONPath=`.status.phase`
+// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.conditions[?(@.type==\"Ready\")].status"
+// +kubebuilder:printcolumn:name="Status",type="string",JSONPath=".status.conditions[?(@.type==\"Ready\")].message"
 // +kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp`
 
 // Stage is the Kargo API's main type.
@@ -358,8 +342,6 @@ type StageStatus struct {
 	// determine whether the request to refresh the resource has been handled.
 	// +optional
 	LastHandledRefresh string `json:"lastHandledRefresh,omitempty" protobuf:"bytes,11,opt,name=lastHandledRefresh"`
-	// Phase describes where the Stage currently is in its lifecycle.
-	Phase StagePhase `json:"phase,omitempty" protobuf:"bytes,1,opt,name=phase"`
 	// FreightHistory is a list of recent Freight selections that were deployed
 	// to the Stage. By default, the last ten Freight selections are stored.
 	// The first item in the list is the most recent Freight selection and
@@ -378,9 +360,6 @@ type StageStatus struct {
 	FreightSummary string `json:"freightSummary,omitempty" protobuf:"bytes,12,opt,name=freightSummary"`
 	// Health is the Stage's last observed health.
 	Health *Health `json:"health,omitempty" protobuf:"bytes,8,opt,name=health"`
-	// Message describes any errors that are preventing the Stage controller
-	// from assessing Stage health or from finding new Freight.
-	Message string `json:"message,omitempty" protobuf:"bytes,9,opt,name=message"`
 	// ObservedGeneration represents the .metadata.generation that this Stage
 	// status was reconciled against.
 	ObservedGeneration int64 `json:"observedGeneration,omitempty" protobuf:"varint,6,opt,name=observedGeneration"`
@@ -390,10 +369,12 @@ type StageStatus struct {
 	LastPromotion *PromotionReference `json:"lastPromotion,omitempty" protobuf:"bytes,10,opt,name=lastPromotion"`
 }
 
+// GetConditions implements the conditions.Getter interface.
 func (w *StageStatus) GetConditions() []metav1.Condition {
 	return w.Conditions
 }
 
+// SetConditions implements the conditions.Setter interface.
 func (w *StageStatus) SetConditions(conditions []metav1.Condition) {
 	w.Conditions = conditions
 }
@@ -401,9 +382,9 @@ func (w *StageStatus) SetConditions(conditions []metav1.Condition) {
 // FreightReference is a simplified representation of a piece of Freight -- not
 // a root resource type.
 type FreightReference struct {
-	// Name is system-assigned identifier that is derived deterministically from
-	// the contents of the Freight. i.e. Two pieces of Freight can be compared for
-	// equality by comparing their Names.
+	// Name is a system-assigned identifier derived deterministically from
+	// the contents of the Freight. I.e., two pieces of Freight can be compared
+	// for equality by comparing their Names.
 	Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"`
 	// Origin describes a kind of Freight in terms of its origin.
 	Origin FreightOrigin `json:"origin,omitempty" protobuf:"bytes,8,opt,name=origin"`
diff --git a/api/v1alpha1/warehouse_types.go b/api/v1alpha1/warehouse_types.go
index 4a59e5c1b9..55c332d581 100644
--- a/api/v1alpha1/warehouse_types.go
+++ b/api/v1alpha1/warehouse_types.go
@@ -360,10 +360,12 @@ type WarehouseStatus struct {
 	DiscoveredArtifacts *DiscoveredArtifacts `json:"discoveredArtifacts,omitempty" protobuf:"bytes,7,opt,name=discoveredArtifacts"`
 }
 
+// GetConditions implements the conditions.Getter interface.
 func (w *WarehouseStatus) GetConditions() []metav1.Condition {
 	return w.Conditions
 }
 
+// SetConditions implements the conditions.Setter interface.
 func (w *WarehouseStatus) SetConditions(conditions []metav1.Condition) {
 	w.Conditions = conditions
 }
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_projectconfigs.yaml b/charts/kargo/resources/crds/kargo.akuity.io_projectconfigs.yaml
index 80fdc73ed1..eec3b04328 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_projectconfigs.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_projectconfigs.yaml
@@ -14,7 +14,11 @@ spec:
     singular: projectconfig
   scope: Namespaced
   versions:
-  - name: v1alpha1
+  - additionalPrinterColumns:
+    - jsonPath: .metadata.creationTimestamp
+      name: Age
+      type: date
+    name: v1alpha1
     schema:
       openAPIV3Schema:
         description: |-
@@ -143,5 +147,4 @@ spec:
         type: object
     served: true
     storage: true
-    subresources:
-      status: {}
+    subresources: {}
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_projects.yaml b/charts/kargo/resources/crds/kargo.akuity.io_projects.yaml
index caa8bb101d..5debfc4799 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_projects.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_projects.yaml
@@ -220,23 +220,9 @@ spec:
                 x-kubernetes-list-map-keys:
                 - type
                 x-kubernetes-list-type: map
-              message:
-                description: |-
-                  Message is a display message about the Project, including any errors
-                  preventing the Project from being reconciled. i.e. If the Phase field has a
-                  value of CreationFailed, this field can be expected to explain why.
-
-                  Deprecated: Use the Conditions field instead.
-                type: string
-              phase:
-                description: |-
-                  Phase describes the Project's current phase.
-
-                  Deprecated: Use the Conditions field instead.
-                type: string
               stats:
                 description: |-
-                  Stats contains a summary of the of the collective state of a Project's
+                  Stats contains a summary of the collective state of a Project's
                   constituent resources.
                 properties:
                   stages:
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml
index e207c0ca2f..cd732b0987 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_promotions.yaml
@@ -364,9 +364,9 @@ spec:
                     type: array
                   name:
                     description: |-
-                      Name is system-assigned identifier that is derived deterministically from
-                      the contents of the Freight. i.e. Two pieces of Freight can be compared for
-                      equality by comparing their Names.
+                      Name is a system-assigned identifier derived deterministically from
+                      the contents of the Freight. I.e., two pieces of Freight can be compared
+                      for equality by comparing their Names.
                     type: string
                   origin:
                     description: Origin describes a kind of Freight in terms of its
@@ -507,9 +507,9 @@ spec:
                           type: array
                         name:
                           description: |-
-                            Name is system-assigned identifier that is derived deterministically from
-                            the contents of the Freight. i.e. Two pieces of Freight can be compared for
-                            equality by comparing their Names.
+                            Name is a system-assigned identifier derived deterministically from
+                            the contents of the Freight. I.e., two pieces of Freight can be compared
+                            for equality by comparing their Names.
                           type: string
                         origin:
                           description: Origin describes a kind of Freight in terms
diff --git a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml
index 18ca691557..d35aff2f5f 100644
--- a/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml
+++ b/charts/kargo/resources/crds/kargo.akuity.io_stages.yaml
@@ -24,8 +24,11 @@ spec:
     - jsonPath: .status.health.status
       name: Health
       type: string
-    - jsonPath: .status.phase
-      name: Phase
+    - jsonPath: .status.conditions[?(@.type=="Ready")].status
+      name: Ready
+      type: string
+    - jsonPath: .status.conditions[?(@.type=="Ready")].message
+      name: Status
       type: string
     - jsonPath: .metadata.creationTimestamp
       name: Age
@@ -605,9 +608,9 @@ spec:
                         type: array
                       name:
                         description: |-
-                          Name is system-assigned identifier that is derived deterministically from
-                          the contents of the Freight. i.e. Two pieces of Freight can be compared for
-                          equality by comparing their Names.
+                          Name is a system-assigned identifier derived deterministically from
+                          the contents of the Freight. I.e., two pieces of Freight can be compared
+                          for equality by comparing their Names.
                         type: string
                       origin:
                         description: Origin describes a kind of Freight in terms of
@@ -754,9 +757,9 @@ spec:
                             type: array
                           name:
                             description: |-
-                              Name is system-assigned identifier that is derived deterministically from
-                              the contents of the Freight. i.e. Two pieces of Freight can be compared for
-                              equality by comparing their Names.
+                              Name is a system-assigned identifier derived deterministically from
+                              the contents of the Freight. I.e., two pieces of Freight can be compared
+                              for equality by comparing their Names.
                             type: string
                           origin:
                             description: Origin describes a kind of Freight in terms
@@ -899,9 +902,9 @@ spec:
                                   type: array
                                 name:
                                   description: |-
-                                    Name is system-assigned identifier that is derived deterministically from
-                                    the contents of the Freight. i.e. Two pieces of Freight can be compared for
-                                    equality by comparing their Names.
+                                    Name is a system-assigned identifier derived deterministically from
+                                    the contents of the Freight. I.e., two pieces of Freight can be compared
+                                    for equality by comparing their Names.
                                   type: string
                                 origin:
                                   description: Origin describes a kind of Freight
@@ -1205,9 +1208,9 @@ spec:
                             type: array
                           name:
                             description: |-
-                              Name is system-assigned identifier that is derived deterministically from
-                              the contents of the Freight. i.e. Two pieces of Freight can be compared for
-                              equality by comparing their Names.
+                              Name is a system-assigned identifier derived deterministically from
+                              the contents of the Freight. I.e., two pieces of Freight can be compared
+                              for equality by comparing their Names.
                             type: string
                           origin:
                             description: Origin describes a kind of Freight in terms
@@ -1454,9 +1457,9 @@ spec:
                         type: array
                       name:
                         description: |-
-                          Name is system-assigned identifier that is derived deterministically from
-                          the contents of the Freight. i.e. Two pieces of Freight can be compared for
-                          equality by comparing their Names.
+                          Name is a system-assigned identifier derived deterministically from
+                          the contents of the Freight. I.e., two pieces of Freight can be compared
+                          for equality by comparing their Names.
                         type: string
                       origin:
                         description: Origin describes a kind of Freight in terms of
@@ -1603,9 +1606,9 @@ spec:
                             type: array
                           name:
                             description: |-
-                              Name is system-assigned identifier that is derived deterministically from
-                              the contents of the Freight. i.e. Two pieces of Freight can be compared for
-                              equality by comparing their Names.
+                              Name is a system-assigned identifier derived deterministically from
+                              the contents of the Freight. I.e., two pieces of Freight can be compared
+                              for equality by comparing their Names.
                             type: string
                           origin:
                             description: Origin describes a kind of Freight in terms
@@ -1748,9 +1751,9 @@ spec:
                                   type: array
                                 name:
                                   description: |-
-                                    Name is system-assigned identifier that is derived deterministically from
-                                    the contents of the Freight. i.e. Two pieces of Freight can be compared for
-                                    equality by comparing their Names.
+                                    Name is a system-assigned identifier derived deterministically from
+                                    the contents of the Freight. I.e., two pieces of Freight can be compared
+                                    for equality by comparing their Names.
                                   type: string
                                 origin:
                                   description: Origin describes a kind of Freight
@@ -1929,20 +1932,12 @@ spec:
                 required:
                 - name
                 type: object
-              message:
-                description: |-
-                  Message describes any errors that are preventing the Stage controller
-                  from assessing Stage health or from finding new Freight.
-                type: string
               observedGeneration:
                 description: |-
                   ObservedGeneration represents the .metadata.generation that this Stage
                   status was reconciled against.
                 format: int64
                 type: integer
-              phase:
-                description: Phase describes where the Stage currently is in its lifecycle.
-                type: string
             type: object
         required:
         - spec
diff --git a/internal/cli/cmd/get/stages.go b/internal/cli/cmd/get/stages.go
index ee66feeba7..28eaf0cc39 100644
--- a/internal/cli/cmd/get/stages.go
+++ b/internal/cli/cmd/get/stages.go
@@ -22,6 +22,7 @@ import (
 	"github.com/akuity/kargo/internal/cli/kubernetes"
 	"github.com/akuity/kargo/internal/cli/option"
 	"github.com/akuity/kargo/internal/cli/templates"
+	"github.com/akuity/kargo/internal/conditions"
 )
 
 type getStagesOptions struct {
@@ -167,17 +168,26 @@ func newStageTable(list *metav1.List) *metav1.Table {
 	rows := make([]metav1.TableRow, len(list.Items))
 	for i, item := range list.Items {
 		stage := item.Object.(*kargoapi.Stage) // nolint: forcetypeassert
+
 		var health string
 		if stage.Status.Health != nil {
 			health = string(stage.Status.Health.Status)
 		}
+
+		var ready, status = string(metav1.ConditionUnknown), ""
+		if readyCond := conditions.Get(&stage.Status, kargoapi.ConditionTypeReady); readyCond != nil {
+			ready = string(readyCond.Status)
+			status = readyCond.Message
+		}
+
 		rows[i] = metav1.TableRow{
 			Cells: []any{
 				stage.Name,
 				stage.Spec.Shard,
 				stage.Status.FreightSummary,
 				health,
-				stage.Status.Phase,
+				ready,
+				status,
 				duration.HumanDuration(time.Since(stage.CreationTimestamp.Time)),
 			},
 			Object: list.Items[i],
@@ -189,7 +199,8 @@ func newStageTable(list *metav1.List) *metav1.Table {
 			{Name: "Shard", Type: "string"},
 			{Name: "Current Freight", Type: "string"},
 			{Name: "Health", Type: "string"},
-			{Name: "Phase", Type: "string"},
+			{Name: "Ready", Type: "string"},
+			{Name: "Status", Type: "string"},
 			{Name: "Age", Type: "string"},
 		},
 		Rows: rows,
diff --git a/internal/controller/management/projects/projects.go b/internal/controller/management/projects/projects.go
index 95ba213480..3f5bdd1a6d 100644
--- a/internal/controller/management/projects/projects.go
+++ b/internal/controller/management/projects/projects.go
@@ -271,19 +271,6 @@ func (r *reconciler) reconcile(
 		// Returns updated status, whether to stop the loop, and possibly an error
 		reconcile func() (kargoapi.ProjectStatus, bool, error)
 	}{
-		{
-			name: "migrate phase to conditions",
-			reconcile: func() (kargoapi.ProjectStatus, bool, error) {
-				// TODO(krancour): Remove this migration code when the Phase field is
-				// removed from ProjectStatus.
-				if newStatus, migrated := migratePhaseToConditions(project); migrated {
-					logger.Debug("migrated Project phase to conditions")
-					requestRequeue = true
-					return newStatus, true, nil // Stop the loop
-				}
-				return status, false, nil // Continue
-			},
-		},
 		{
 			name: "migrate spec to ProjectConfig",
 			reconcile: func() (kargoapi.ProjectStatus, bool, error) {
@@ -884,74 +871,6 @@ func (r *reconciler) patchProjectStatus(
 	)
 }
 
-// migratePhaseToConditions migrates the Project's Phase and Message fields to
-// Conditions. It returns the updated ProjectStatus and a boolean indicating
-// whether the ProjectStatus was updated.
-func migratePhaseToConditions(project *kargoapi.Project) (kargoapi.ProjectStatus, bool) {
-	status := *project.Status.DeepCopy()
-	if project.Status.Phase == "" { // nolint:staticcheck
-		status.Message = ""                         // nolint:staticcheck
-		return status, project.Status.Message != "" // nolint:staticcheck
-	}
-
-	switch project.Status.Phase { // nolint:staticcheck
-	case kargoapi.ProjectPhaseInitializing:
-		conditions.Set(&status, &metav1.Condition{
-			Type:               kargoapi.ConditionTypeReconciling,
-			Status:             metav1.ConditionTrue,
-			Reason:             "Syncing",
-			Message:            "Ensuring project namespace and permissions",
-			ObservedGeneration: project.GetGeneration(),
-		})
-		conditions.Set(&status, &metav1.Condition{
-			Type:               kargoapi.ConditionTypeReady,
-			Status:             metav1.ConditionFalse,
-			Reason:             "Syncing",
-			Message:            "Ensuring project namespace and permissions",
-			ObservedGeneration: project.GetGeneration(),
-		})
-	case kargoapi.ProjectPhaseInitializationFailed:
-		// If the Project is in the InitializationFailed phase, it means that the
-		// namespace already exists but is not labeled as a Project namespace.
-		conditions.Set(&status, &metav1.Condition{
-			Type:   kargoapi.ConditionTypeStalled,
-			Status: metav1.ConditionTrue,
-			Reason: "ExistingNamespaceMissingLabel",
-			Message: fmt.Sprintf(
-				"Namespace %q already exists but is not labeled as a Project namespace using label %q",
-				project.Name,
-				kargoapi.ProjectLabelKey,
-			),
-			ObservedGeneration: project.GetGeneration(),
-		})
-		conditions.Set(&status, &metav1.Condition{
-			Type:   kargoapi.ConditionTypeReady,
-			Status: metav1.ConditionFalse,
-			Reason: "ExistingNamespaceMissingLabel",
-			Message: fmt.Sprintf(
-				"Namespace %q already exists but is not labeled as a Project namespace using label %q",
-				project.Name,
-				kargoapi.ProjectLabelKey,
-			),
-			ObservedGeneration: project.GetGeneration(),
-		})
-	case kargoapi.ProjectPhaseReady:
-		conditions.Set(&status, &metav1.Condition{
-			Type:               kargoapi.ConditionTypeReady,
-			Status:             metav1.ConditionTrue,
-			Reason:             "Synced",
-			Message:            "Project is synced and ready for use",
-			ObservedGeneration: project.GetGeneration(),
-		})
-	}
-
-	// Clear the phase and message now that we've migrated them to conditions.
-	status.Phase = ""   // nolint:staticcheck
-	status.Message = "" // nolint:staticcheck
-
-	return status, true
-}
-
 // migrateSpecToProjectConfig migrates the Project's Spec to a dedicated
 // ProjectConfig resource if necessary. It returns a boolean indicating whether
 // the Project resource was updated.
diff --git a/internal/controller/management/projects/projects_test.go b/internal/controller/management/projects/projects_test.go
index 6e003e0106..0e54ecf856 100644
--- a/internal/controller/management/projects/projects_test.go
+++ b/internal/controller/management/projects/projects_test.go
@@ -198,42 +198,6 @@ func TestReconciler_reconcile(t *testing.T) {
 			err error,
 		)
 	}{
-		{
-			name:       "success migrating phase to conditions",
-			reconciler: &reconciler{},
-			project: &kargoapi.Project{
-				ObjectMeta: metav1.ObjectMeta{Name: testProject},
-				Status: kargoapi.ProjectStatus{
-					Phase: kargoapi.ProjectPhaseInitializing,
-				},
-			},
-			assertions: func(
-				t *testing.T,
-				status kargoapi.ProjectStatus,
-				requeue bool,
-				_ client.Client,
-				err error,
-			) {
-				require.NoError(t, err)
-
-				// Phase should be cleared
-				require.Empty(t, status.Phase) // nolint:staticcheck
-
-				// Conditions should be set
-				reconciling := conditions.Get(&status, kargoapi.ConditionTypeReconciling)
-				require.NotNil(t, reconciling)
-				require.Equal(t, metav1.ConditionTrue, reconciling.Status)
-				require.Equal(t, "Syncing", reconciling.Reason)
-
-				ready := conditions.Get(&status, kargoapi.ConditionTypeReady)
-				require.NotNil(t, ready)
-				require.Equal(t, metav1.ConditionFalse, ready.Status)
-				require.Equal(t, "Syncing", ready.Reason)
-
-				// Immediate requeue should be requested
-				require.True(t, requeue)
-			},
-		},
 		{
 			name:       "error migrating spec to ProjectConfig",
 			reconciler: &reconciler{},
@@ -876,12 +840,8 @@ func TestReconciler_ensureNamespace(t *testing.T) {
 			},
 		},
 		{
-			name: "namespace does not exist; success creating it",
-			project: &kargoapi.Project{
-				Status: kargoapi.ProjectStatus{
-					Phase: kargoapi.ProjectPhaseInitializing,
-				},
-			},
+			name:    "namespace does not exist; success creating it",
+			project: &kargoapi.Project{},
 			reconciler: &reconciler{
 				getNamespaceFn: func(
 					context.Context,
@@ -1352,152 +1312,6 @@ func TestReconciler_ensureDefaultProjectRoles(t *testing.T) {
 	}
 }
 
-func TestReconciler_migratePhaseToConditions(t *testing.T) {
-	tests := []struct {
-		name       string
-		project    *kargoapi.Project
-		assertions func(t *testing.T, status kargoapi.ProjectStatus, ok bool)
-	}{
-		{
-			name: "Empty Phase",
-			project: &kargoapi.Project{
-				Status: kargoapi.ProjectStatus{
-					Phase:   "",
-					Message: "Some message",
-				},
-			},
-			assertions: func(t *testing.T, status kargoapi.ProjectStatus, ok bool) {
-				require.True(t, ok)
-				require.Empty(t, status.Phase)   // nolint:staticcheck
-				require.Empty(t, status.Message) // nolint:staticcheck
-				require.Empty(t, status.Conditions)
-			},
-		},
-		{
-			name: "Initializing Phase",
-			project: &kargoapi.Project{
-				ObjectMeta: metav1.ObjectMeta{
-					Generation: 1,
-				},
-				Status: kargoapi.ProjectStatus{
-					Phase: kargoapi.ProjectPhaseInitializing,
-				},
-			},
-			assertions: func(t *testing.T, status kargoapi.ProjectStatus, ok bool) {
-				require.True(t, ok)
-				require.Empty(t, status.Phase)   // nolint:staticcheck
-				require.Empty(t, status.Message) // nolint:staticcheck
-				require.Len(t, status.Conditions, 2)
-
-				reconcilingCondition := conditions.Get(&status, kargoapi.ConditionTypeReconciling)
-				require.NotNil(t, reconcilingCondition)
-				require.Equal(t, metav1.ConditionTrue, reconcilingCondition.Status)
-				require.Equal(t, "Syncing", reconcilingCondition.Reason)
-				require.Equal(
-					t,
-					"Ensuring project namespace and permissions",
-					reconcilingCondition.Message,
-				)
-				require.Equal(t, int64(1), reconcilingCondition.ObservedGeneration)
-
-				readyCondition := conditions.Get(&status, kargoapi.ConditionTypeReady)
-				require.NotNil(t, readyCondition)
-				require.Equal(t, metav1.ConditionFalse, readyCondition.Status)
-				require.Equal(t, "Syncing", readyCondition.Reason)
-				require.Equal(
-					t,
-					"Ensuring project namespace and permissions",
-					readyCondition.Message,
-				)
-				require.Equal(t, int64(1), readyCondition.ObservedGeneration)
-			},
-		},
-		{
-			name: "InitializationFailed Phase",
-			project: &kargoapi.Project{
-				ObjectMeta: metav1.ObjectMeta{
-					Name:       "test-project",
-					Generation: 2,
-				},
-				Status: kargoapi.ProjectStatus{
-					Phase: kargoapi.ProjectPhaseInitializationFailed,
-				},
-			},
-			assertions: func(t *testing.T, status kargoapi.ProjectStatus, ok bool) {
-				require.True(t, ok)
-				require.Empty(t, status.Phase)   // nolint:staticcheck
-				require.Empty(t, status.Message) // nolint:staticcheck
-				require.Len(t, status.Conditions, 2)
-
-				stalledCondition := conditions.Get(&status, kargoapi.ConditionTypeStalled)
-				require.NotNil(t, stalledCondition)
-				require.Equal(t, metav1.ConditionTrue, stalledCondition.Status)
-				require.Equal(t, "ExistingNamespaceMissingLabel", stalledCondition.Reason)
-				require.Contains(
-					t,
-					stalledCondition.Message,
-					"already exists but is not labeled as a Project namespace using label",
-				)
-				require.Equal(t, int64(2), stalledCondition.ObservedGeneration)
-
-				readyCondition := conditions.Get(&status, kargoapi.ConditionTypeReady)
-				require.NotNil(t, readyCondition)
-				require.Equal(t, metav1.ConditionFalse, readyCondition.Status)
-				require.Equal(t, "ExistingNamespaceMissingLabel", readyCondition.Reason)
-				require.Equal(t, int64(2), readyCondition.ObservedGeneration)
-			},
-		},
-		{
-			name: "Ready Phase",
-			project: &kargoapi.Project{
-				ObjectMeta: metav1.ObjectMeta{
-					Generation: 3,
-				},
-				Status: kargoapi.ProjectStatus{
-					Phase: kargoapi.ProjectPhaseReady,
-				},
-			},
-			assertions: func(t *testing.T, status kargoapi.ProjectStatus, ok bool) {
-				require.True(t, ok)
-				require.Empty(t, status.Phase)   // nolint:staticcheck
-				require.Empty(t, status.Message) // nolint:staticcheck
-				require.Len(t, status.Conditions, 1)
-
-				readyCondition := conditions.Get(&status, kargoapi.ConditionTypeReady)
-				require.NotNil(t, readyCondition)
-				require.Equal(t, metav1.ConditionTrue, readyCondition.Status)
-				require.Equal(t, "Synced", readyCondition.Reason)
-				require.Equal(t, "Project is synced and ready for use", readyCondition.Message)
-				require.Equal(t, int64(3), readyCondition.ObservedGeneration)
-			},
-		},
-		{
-			name: "Unknown Phase",
-			project: &kargoapi.Project{
-				ObjectMeta: metav1.ObjectMeta{
-					Generation: 4,
-				},
-				Status: kargoapi.ProjectStatus{
-					Phase: "UnknownPhase",
-				},
-			},
-			assertions: func(t *testing.T, status kargoapi.ProjectStatus, ok bool) {
-				require.True(t, ok)
-				require.Empty(t, status.Phase)   // nolint:staticcheck
-				require.Empty(t, status.Message) // nolint:staticcheck
-				require.Empty(t, status.Conditions)
-			},
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			status, ok := migratePhaseToConditions(tt.project)
-			tt.assertions(t, status, ok)
-		})
-	}
-}
-
 func TestMigrateSpecToProjectConfig(t *testing.T) {
 	const testProject = "fake-project"
 	testScheme := runtime.NewScheme()
diff --git a/internal/controller/stages/control_flow_stages.go b/internal/controller/stages/control_flow_stages.go
index 7e1daee352..31858311b5 100644
--- a/internal/controller/stages/control_flow_stages.go
+++ b/internal/controller/stages/control_flow_stages.go
@@ -6,6 +6,7 @@ import (
 	"time"
 
 	corev1 "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/fields"
 	kerrors "k8s.io/apimachinery/pkg/util/errors"
 	"k8s.io/client-go/tools/record"
@@ -18,6 +19,7 @@ import (
 	rollouts "github.com/akuity/kargo/api/stubs/rollouts/v1alpha1"
 	kargoapi "github.com/akuity/kargo/api/v1alpha1"
 	"github.com/akuity/kargo/internal/api"
+	"github.com/akuity/kargo/internal/conditions"
 	"github.com/akuity/kargo/internal/controller"
 	"github.com/akuity/kargo/internal/indexer"
 	"github.com/akuity/kargo/internal/kargo"
@@ -265,7 +267,21 @@ func (r *ControlFlowStageReconciler) reconcile(
 	logger.Debug("getting available Freight")
 	freight, err := api.ListFreightAvailableToStage(ctx, r.client, stage)
 	if err != nil {
-		newStatus.Message = err.Error()
+		conditions.Set(
+			&newStatus,
+			&metav1.Condition{
+				Type:    kargoapi.ConditionTypeReconciling,
+				Status:  metav1.ConditionTrue,
+				Reason:  "RetryAfterFreightRetrievalFailed",
+				Message: err.Error(),
+			},
+			&metav1.Condition{
+				Type:    kargoapi.ConditionTypeReady,
+				Status:  metav1.ConditionFalse,
+				Reason:  "FreightRetrievalFailed",
+				Message: err.Error(),
+			},
+		)
 		return newStatus, err
 	}
 
@@ -276,11 +292,32 @@ func (r *ControlFlowStageReconciler) reconcile(
 			logger.Debug("verified Freight", "count", newlyVerified)
 		}
 		if err != nil {
-			newStatus.Message = err.Error()
+			conditions.Set(
+				&newStatus,
+				&metav1.Condition{
+					Type:    kargoapi.ConditionTypeReconciling,
+					Status:  metav1.ConditionTrue,
+					Reason:  "RetryAfterVerificationFailed",
+					Message: err.Error(),
+				},
+				&metav1.Condition{
+					Type:    kargoapi.ConditionTypeReady,
+					Status:  metav1.ConditionFalse,
+					Reason:  "FreightVerificationFailed",
+					Message: err.Error(),
+				},
+			)
 			return newStatus, err
 		}
 	}
 
+	// Mark the Stage as Ready and remove any reconciling condition.
+	conditions.Set(&newStatus, &metav1.Condition{
+		Type:   kargoapi.ConditionTypeReady,
+		Status: metav1.ConditionTrue,
+	})
+	conditions.Delete(&newStatus, kargoapi.ConditionTypeReconciling)
+
 	return newStatus, nil
 }
 
@@ -291,28 +328,30 @@ func (r *ControlFlowStageReconciler) initializeStatus(stage *kargoapi.Stage) kar
 	newStatus := stage.Status.DeepCopy()
 
 	// Update the status with the new observed generation and phase.
-	newStatus.Phase = kargoapi.StagePhaseNotApplicable
 	if stage.Generation > stage.Status.ObservedGeneration {
 		newStatus.ObservedGeneration = stage.Generation
 	}
 
-	// Reset any previous error message.
-	newStatus.Message = ""
-
 	// Record the current refresh token as having been handled.
 	if token, ok := api.RefreshAnnotationValue(stage.GetAnnotations()); ok {
 		newStatus.LastHandledRefresh = token
 	}
 
+	// Only keep the conditions that are relevant to this Stage type.
+	var condCopy []metav1.Condition
+	for _, c := range []string{kargoapi.ConditionTypeReady, kargoapi.ConditionTypeReconciling} {
+		if cond := conditions.Get(newStatus, c); cond != nil {
+			condCopy = append(condCopy, *cond)
+		}
+	}
+	newStatus.Conditions = condCopy
+
 	// Clear all the fields that are not relevant to this Stage type.
 	newStatus.FreightHistory = nil
 	newStatus.Health = nil
 	newStatus.CurrentPromotion = nil
 	newStatus.LastPromotion = nil
 	newStatus.FreightSummary = "N/A"
-	// TODO(hidde): We might want to introduce simple conditions for control
-	// flow Stages at some point, but for now we just clear them.
-	newStatus.Conditions = nil
 
 	return *newStatus
 }
diff --git a/internal/controller/stages/control_flow_stages_test.go b/internal/controller/stages/control_flow_stages_test.go
index 73b3655023..71f7db4ab8 100644
--- a/internal/controller/stages/control_flow_stages_test.go
+++ b/internal/controller/stages/control_flow_stages_test.go
@@ -22,6 +22,7 @@ import (
 
 	rollouts "github.com/akuity/kargo/api/stubs/rollouts/v1alpha1"
 	kargoapi "github.com/akuity/kargo/api/v1alpha1"
+	"github.com/akuity/kargo/internal/conditions"
 	"github.com/akuity/kargo/internal/indexer"
 	fakeevent "github.com/akuity/kargo/internal/kubernetes/event/fake"
 )
@@ -198,7 +199,6 @@ func TestControlFlowStageReconciler_Reconcile(t *testing.T) {
 				stage := &kargoapi.Stage{}
 				err = c.Get(context.Background(), testStage, stage)
 				require.NoError(t, err)
-				assert.Contains(t, stage.Status.Message, "something went wrong")
 			},
 		},
 		{
@@ -271,8 +271,6 @@ func TestControlFlowStageReconciler_Reconcile(t *testing.T) {
 				stage := &kargoapi.Stage{}
 				err = c.Get(context.Background(), testStage, stage)
 				require.NoError(t, err)
-				assert.Equal(t, kargoapi.StagePhaseNotApplicable, stage.Status.Phase)
-				assert.Empty(t, stage.Status.Message)
 			},
 		},
 	}
@@ -363,8 +361,11 @@ func TestControlFlowStageReconciler_reconcile(t *testing.T) {
 			},
 			assertions: func(t *testing.T, status kargoapi.StageStatus, _ client.Client, err error) {
 				require.NoError(t, err)
-				assert.Equal(t, kargoapi.StagePhaseNotApplicable, status.Phase)
-				assert.Empty(t, status.Message)
+
+				require.Len(t, status.Conditions, 1)
+				readyCond := conditions.Get(&status, kargoapi.ConditionTypeReady)
+				require.NotNil(t, readyCond)
+				assert.Equal(t, metav1.ConditionTrue, readyCond.Status)
 			},
 		},
 		{
@@ -390,8 +391,6 @@ func TestControlFlowStageReconciler_reconcile(t *testing.T) {
 			},
 			assertions: func(t *testing.T, status kargoapi.StageStatus, c client.Client, err error) {
 				require.NoError(t, err)
-				assert.Equal(t, kargoapi.StagePhaseNotApplicable, status.Phase)
-				assert.Empty(t, status.Message)
 				updatedFreight := &kargoapi.Freight{}
 				err = c.Get(
 					context.Background(),
@@ -403,6 +402,11 @@ func TestControlFlowStageReconciler_reconcile(t *testing.T) {
 				)
 				require.NoError(t, err)
 				assert.Contains(t, updatedFreight.Status.VerifiedIn, testStage)
+
+				require.Len(t, status.Conditions, 1)
+				readyCond := conditions.Get(&status, kargoapi.ConditionTypeReady)
+				require.NotNil(t, readyCond)
+				assert.Equal(t, metav1.ConditionTrue, readyCond.Status)
 			},
 		},
 		{
@@ -425,7 +429,20 @@ func TestControlFlowStageReconciler_reconcile(t *testing.T) {
 			},
 			assertions: func(t *testing.T, status kargoapi.StageStatus, _ client.Client, err error) {
 				require.ErrorContains(t, err, "something went wrong")
-				assert.Contains(t, status.Message, "something went wrong")
+
+				require.Len(t, status.Conditions, 2)
+
+				readyCond := conditions.Get(&status, kargoapi.ConditionTypeReady)
+				require.NotNil(t, readyCond)
+				assert.Equal(t, metav1.ConditionFalse, readyCond.Status)
+				assert.Equal(t, "FreightRetrievalFailed", readyCond.Reason)
+				assert.Contains(t, readyCond.Message, "something went wrong")
+
+				recCond := conditions.Get(&status, kargoapi.ConditionTypeReconciling)
+				require.NotNil(t, recCond)
+				assert.Equal(t, metav1.ConditionTrue, recCond.Status)
+				assert.Equal(t, "RetryAfterFreightRetrievalFailed", recCond.Reason)
+				assert.Contains(t, recCond.Message, "something went wrong")
 			},
 		},
 		{
@@ -463,7 +480,20 @@ func TestControlFlowStageReconciler_reconcile(t *testing.T) {
 			},
 			assertions: func(t *testing.T, status kargoapi.StageStatus, _ client.Client, err error) {
 				require.ErrorContains(t, err, "failed to verify 1 Freight")
-				assert.Contains(t, status.Message, "failed to verify 1 Freight")
+
+				require.Len(t, status.Conditions, 2)
+
+				readyCond := conditions.Get(&status, kargoapi.ConditionTypeReady)
+				require.NotNil(t, readyCond)
+				assert.Equal(t, metav1.ConditionFalse, readyCond.Status)
+				assert.Equal(t, "FreightVerificationFailed", readyCond.Reason)
+				assert.Contains(t, readyCond.Message, "failed to verify 1 Freight")
+
+				recCond := conditions.Get(&status, kargoapi.ConditionTypeReconciling)
+				require.NotNil(t, recCond)
+				assert.Equal(t, metav1.ConditionTrue, recCond.Status)
+				assert.Equal(t, "RetryAfterVerificationFailed", recCond.Reason)
+				assert.Contains(t, recCond.Message, "failed to verify 1 Freight")
 			},
 		},
 		{
@@ -509,8 +539,12 @@ func TestControlFlowStageReconciler_reconcile(t *testing.T) {
 			},
 			assertions: func(t *testing.T, status kargoapi.StageStatus, _ client.Client, err error) {
 				require.NoError(t, err)
-				assert.Equal(t, kargoapi.StagePhaseNotApplicable, status.Phase)
-				assert.Empty(t, status.Message)
+
+				require.Len(t, status.Conditions, 1)
+
+				readyCond := conditions.Get(&status, kargoapi.ConditionTypeReady)
+				require.NotNil(t, readyCond)
+				assert.Equal(t, metav1.ConditionTrue, readyCond.Status)
 			},
 		},
 		{
@@ -527,9 +561,7 @@ func TestControlFlowStageReconciler_reconcile(t *testing.T) {
 			objects: []client.Object{testWarehouse},
 			assertions: func(t *testing.T, status kargoapi.StageStatus, _ client.Client, err error) {
 				require.NoError(t, err)
-				assert.Equal(t, kargoapi.StagePhaseNotApplicable, status.Phase)
 				assert.Equal(t, "refresh-token", status.LastHandledRefresh)
-				assert.Empty(t, status.Message)
 			},
 		},
 		{
@@ -549,6 +581,29 @@ func TestControlFlowStageReconciler_reconcile(t *testing.T) {
 				assert.Equal(t, int64(2), status.ObservedGeneration)
 			},
 		},
+		{
+			name: "removes reconciling condition",
+			stage: &kargoapi.Stage{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      testStage,
+					Namespace: testProject,
+				},
+				Status: kargoapi.StageStatus{
+					Conditions: []metav1.Condition{
+						{
+							Type:   kargoapi.ConditionTypeReconciling,
+							Status: metav1.ConditionTrue,
+						},
+					},
+				},
+			},
+			assertions: func(t *testing.T, status kargoapi.StageStatus, _ client.Client, err error) {
+				require.NoError(t, err)
+				assert.Len(t, status.Conditions, 1)
+				assert.Equal(t, kargoapi.ConditionTypeReady, status.Conditions[0].Type)
+				assert.Equal(t, metav1.ConditionTrue, status.Conditions[0].Status)
+			},
+		},
 	}
 
 	scheme := runtime.NewScheme()
@@ -598,32 +653,49 @@ func TestControlFlowStageReconciler_initializeStatus(t *testing.T) {
 				},
 			},
 			assertions: func(t *testing.T, newStatus kargoapi.StageStatus) {
-				assert.Equal(t, kargoapi.StagePhaseNotApplicable, newStatus.Phase)
 				assert.Equal(t, int64(2), newStatus.ObservedGeneration)
 			},
 		},
 		{
-			name: "resets previous message",
+			name: "records refresh token",
 			stage: &kargoapi.Stage{
-				Status: kargoapi.StageStatus{
-					Message: "previous message",
+				ObjectMeta: metav1.ObjectMeta{
+					Annotations: map[string]string{
+						kargoapi.AnnotationKeyRefresh: "refresh-token",
+					},
 				},
 			},
 			assertions: func(t *testing.T, newStatus kargoapi.StageStatus) {
-				assert.Empty(t, newStatus.Message)
+				assert.Equal(t, "refresh-token", newStatus.LastHandledRefresh)
 			},
 		},
 		{
-			name: "records refresh token",
+			name: "clears irrelevant conditions for Stage type",
 			stage: &kargoapi.Stage{
-				ObjectMeta: metav1.ObjectMeta{
-					Annotations: map[string]string{
-						kargoapi.AnnotationKeyRefresh: "refresh-token",
+				Status: kargoapi.StageStatus{
+					Conditions: []metav1.Condition{
+						{
+							// Should be kept
+							Type:   kargoapi.ConditionTypeReady,
+							Status: metav1.ConditionTrue,
+						},
+						{
+							// Should be kept
+							Type:   kargoapi.ConditionTypeReconciling,
+							Status: metav1.ConditionTrue,
+						},
+						{
+							// Should be cleared
+							Type:   kargoapi.ConditionTypeHealthy,
+							Status: metav1.ConditionTrue,
+						},
 					},
 				},
 			},
 			assertions: func(t *testing.T, newStatus kargoapi.StageStatus) {
-				assert.Equal(t, "refresh-token", newStatus.LastHandledRefresh)
+				assert.Len(t, newStatus.Conditions, 2)
+				assert.Equal(t, kargoapi.ConditionTypeReady, newStatus.Conditions[0].Type)
+				assert.Equal(t, kargoapi.ConditionTypeReconciling, newStatus.Conditions[1].Type)
 			},
 		},
 		{
diff --git a/internal/controller/stages/regular_stages.go b/internal/controller/stages/regular_stages.go
index 2097c186ad..78074afe23 100644
--- a/internal/controller/stages/regular_stages.go
+++ b/internal/controller/stages/regular_stages.go
@@ -1966,7 +1966,7 @@ func (r *RegularStageReconciler) clearAnalysisRuns(ctx context.Context, stage *k
 }
 
 // summarizeConditions summarizes the conditions of the given Stage. It sets the
-// Ready condition based on the Promoting, Healthy and Verified conditions.
+// Ready condition based on the Promoting, Healthy, and Verified conditions.
 // If there is an error, the Ready condition is set to False until the error is
 // resolved.
 func summarizeConditions(stage *kargoapi.Stage, newStatus *kargoapi.StageStatus, err error) {
@@ -1986,23 +1986,10 @@ func summarizeConditions(stage *kargoapi.Stage, newStatus *kargoapi.StageStatus,
 			Reason:             "RetryAfterError",
 			ObservedGeneration: stage.Generation,
 		})
-
-		// Backwards compatibility: set the Phase and Message.
-		// TODO: Remove this in a future release.
-		newStatus.Phase = kargoapi.StagePhaseFailed
-		newStatus.Message = err.Error()
-
 		return
 	}
 
-	// By default, the Stage is steady unless we find a more specific condition.
-	// TODO: Remove this in a future release.
-	newStatus.Phase = kargoapi.StagePhaseSteady
-
-	// Backwards compatibility: clear the Message field of the Status
-	// and set the Freight summary.
-	// TODO: Remove this in a future release.
-	newStatus.Message = ""
+	// Set the Freight summary.
 	newStatus.FreightSummary = buildFreightSummary(len(stage.Spec.RequestedFreight), newStatus.FreightHistory.Current())
 
 	// If we are currently Promoting, then we are not Ready.
@@ -2015,11 +2002,6 @@ func summarizeConditions(stage *kargoapi.Stage, newStatus *kargoapi.StageStatus,
 			Message:            promoCond.Message,
 			ObservedGeneration: stage.Generation,
 		})
-
-		// Backwards compatibility: set Phase to Promoting.
-		// TODO: Remove this in a future release.
-		newStatus.Phase = kargoapi.StagePhasePromoting
-
 		return
 	}
 
@@ -2034,11 +2016,6 @@ func summarizeConditions(stage *kargoapi.Stage, newStatus *kargoapi.StageStatus,
 			Message:            lastPromo.Status.Message,
 			ObservedGeneration: stage.Generation,
 		})
-
-		// Backwards compatibility: set Phase to Failed.
-		// TODO: Remove this in a future release.
-		newStatus.Phase = kargoapi.StagePhaseFailed
-
 		return
 	}
 
@@ -2055,25 +2032,14 @@ func summarizeConditions(stage *kargoapi.Stage, newStatus *kargoapi.StageStatus,
 		if healthCond != nil {
 			readyCond.Reason = healthCond.Reason
 			readyCond.Message = healthCond.Message
-
-			if healthCond.Status == metav1.ConditionFalse {
-				// Backwards compatibility: set Phase to Failed on health failure.
-				// TODO: Remove this in a future release.
-				newStatus.Phase = kargoapi.StagePhaseFailed
-			}
 		}
 		conditions.Set(newStatus, readyCond)
-
 		return
 	}
 
 	// If we are not verified, then we are not Ready.
 	verificationCond := conditions.Get(newStatus, kargoapi.ConditionTypeVerified)
 	if verificationCond == nil || verificationCond.Status != metav1.ConditionTrue {
-		// Backwards compatibility: set Phase to Verifying.
-		// TODO: Remove this in a future release.
-		newStatus.Phase = kargoapi.StagePhaseVerifying
-
 		readyCond := &metav1.Condition{
 			Type:               kargoapi.ConditionTypeReady,
 			Status:             metav1.ConditionFalse,
@@ -2084,15 +2050,8 @@ func summarizeConditions(stage *kargoapi.Stage, newStatus *kargoapi.StageStatus,
 		if verificationCond != nil {
 			readyCond.Reason = verificationCond.Reason
 			readyCond.Message = verificationCond.Message
-
-			// Backwards compatibility: set Phase to Failed on verification failure.
-			// TODO: Remove this in a future release.
-			if verificationCond.Status == metav1.ConditionFalse {
-				newStatus.Phase = kargoapi.StagePhaseFailed
-			}
 		}
 		conditions.Set(newStatus, readyCond)
-
 		return
 	}
 
@@ -2110,10 +2069,6 @@ func summarizeConditions(stage *kargoapi.Stage, newStatus *kargoapi.StageStatus,
 	// If we are Ready, then we can also mark the current generation as
 	// observed.
 	newStatus.ObservedGeneration = stage.Generation
-
-	// Backwards compatibility: set Phase to Steady.
-	// TODO: Remove this in a future release.
-	newStatus.Phase = kargoapi.StagePhaseSteady
 }
 
 func buildFreightSummary(requested int, current *kargoapi.FreightCollection) string {
diff --git a/internal/controller/stages/regular_stages_test.go b/internal/controller/stages/regular_stages_test.go
index 8322ca30b8..2ec7a97888 100644
--- a/internal/controller/stages/regular_stages_test.go
+++ b/internal/controller/stages/regular_stages_test.go
@@ -211,7 +211,6 @@ func TestRegularStageReconciler_Reconcile(t *testing.T) {
 					Name:      "test-stage",
 				}, stage)
 				require.NoError(t, err)
-				assert.Contains(t, stage.Status.Message, "something went wrong")
 			},
 		},
 		{
@@ -335,7 +334,6 @@ func TestRegularStageReconciler_Reconcile(t *testing.T) {
 					Name:      "test-stage",
 				}, stage)
 				require.NoError(t, err)
-				assert.Equal(t, kargoapi.StagePhaseSteady, stage.Status.Phase)
 
 				readyCond := conditions.Get(&stage.Status, kargoapi.ConditionTypeReady)
 				require.NotNil(t, readyCond)
@@ -5844,9 +5842,6 @@ func Test_summarizeConditions(t *testing.T) {
 				assert.Equal(t, metav1.ConditionTrue, reconcileCond.Status)
 				assert.Equal(t, "RetryAfterError", reconcileCond.Reason)
 				assert.Equal(t, int64(1), reconcileCond.ObservedGeneration)
-
-				assert.Equal(t, kargoapi.StagePhaseFailed, status.Phase)
-				assert.Equal(t, "something went wrong", status.Message)
 			},
 		},
 		{
@@ -5873,8 +5868,6 @@ func Test_summarizeConditions(t *testing.T) {
 				assert.Equal(t, "Promoting", readyCond.Reason)
 				assert.Equal(t, "Stage is promoting", readyCond.Message)
 				assert.Equal(t, int64(1), readyCond.ObservedGeneration)
-
-				assert.Equal(t, kargoapi.StagePhasePromoting, status.Phase)
 			},
 		},
 		{
@@ -5899,8 +5892,6 @@ func Test_summarizeConditions(t *testing.T) {
 				assert.Equal(t, "LastPromotionFailed", readyCond.Reason)
 				assert.Equal(t, "Promotion failed due to error", readyCond.Message)
 				assert.Equal(t, int64(1), readyCond.ObservedGeneration)
-
-				assert.Equal(t, kargoapi.StagePhaseFailed, status.Phase)
 			},
 		},
 		{
@@ -5928,8 +5919,6 @@ func Test_summarizeConditions(t *testing.T) {
 				assert.Equal(t, "HealthCheckFailed", readyCond.Reason)
 				assert.Equal(t, "Health check failed", readyCond.Message)
 				assert.Equal(t, int64(1), readyCond.ObservedGeneration)
-
-				assert.Equal(t, kargoapi.StagePhaseFailed, status.Phase)
 			},
 		},
 		{
@@ -5947,8 +5936,6 @@ func Test_summarizeConditions(t *testing.T) {
 				assert.Equal(t, "Unhealthy", readyCond.Reason)
 				assert.Equal(t, "Stage is not healthy", readyCond.Message)
 				assert.Equal(t, int64(1), readyCond.ObservedGeneration)
-
-				assert.Equal(t, kargoapi.StagePhaseSteady, status.Phase)
 			},
 		},
 		{
@@ -5975,8 +5962,6 @@ func Test_summarizeConditions(t *testing.T) {
 				assert.Equal(t, "HealthCheckPending", readyCond.Reason)
 				assert.Equal(t, "Health check in progress", readyCond.Message)
 				assert.Equal(t, int64(1), readyCond.ObservedGeneration)
-
-				assert.Equal(t, kargoapi.StagePhaseSteady, status.Phase)
 			},
 		},
 		{
@@ -6009,8 +5994,6 @@ func Test_summarizeConditions(t *testing.T) {
 				assert.Equal(t, "VerificationPending", readyCond.Reason)
 				assert.Equal(t, "Verification is pending", readyCond.Message)
 				assert.Equal(t, int64(1), readyCond.ObservedGeneration)
-
-				assert.Equal(t, kargoapi.StagePhaseVerifying, status.Phase)
 			},
 		},
 		{
@@ -6043,8 +6026,6 @@ func Test_summarizeConditions(t *testing.T) {
 				assert.Equal(t, "VerificationError", readyCond.Reason)
 				assert.Equal(t, "Verification failed", readyCond.Message)
 				assert.Equal(t, int64(1), readyCond.ObservedGeneration)
-
-				assert.Equal(t, kargoapi.StagePhaseFailed, status.Phase)
 			},
 		},
 		{
@@ -6070,7 +6051,6 @@ func Test_summarizeConditions(t *testing.T) {
 				assert.Equal(t, metav1.ConditionFalse, readyCond.Status)
 				assert.Equal(t, "PendingVerification", readyCond.Reason)
 				assert.Equal(t, "Stage is not verified", readyCond.Message)
-				assert.Equal(t, kargoapi.StagePhaseVerifying, status.Phase)
 			},
 		},
 		{
@@ -6105,7 +6085,6 @@ func Test_summarizeConditions(t *testing.T) {
 				assert.Equal(t, "Stage is verified", readyCond.Message)
 				assert.Equal(t, int64(1), readyCond.ObservedGeneration)
 
-				assert.Equal(t, kargoapi.StagePhaseSteady, status.Phase)
 				assert.Equal(t, int64(1), status.ObservedGeneration)
 			},
 		},
@@ -6146,12 +6125,11 @@ func Test_summarizeConditions(t *testing.T) {
 				reconcileCond := conditions.Get(status, kargoapi.ConditionTypeReconciling)
 				assert.Nil(t, reconcileCond, "Reconciling condition should be deleted when ready")
 
-				assert.Equal(t, kargoapi.StagePhaseSteady, status.Phase)
 				assert.Equal(t, int64(1), status.ObservedGeneration)
 			},
 		},
 		{
-			name: "freight summary updated and message cleared",
+			name: "freight summary updated",
 			stage: &kargoapi.Stage{
 				ObjectMeta: metav1.ObjectMeta{
 					Generation: 1,
@@ -6161,7 +6139,6 @@ func Test_summarizeConditions(t *testing.T) {
 				},
 			},
 			status: &kargoapi.StageStatus{
-				Message: "Previous error message",
 				FreightHistory: kargoapi.FreightHistory{
 					&kargoapi.FreightCollection{
 						Freight: map[string]kargoapi.FreightReference{
@@ -6185,7 +6162,6 @@ func Test_summarizeConditions(t *testing.T) {
 				},
 			},
 			assertions: func(t *testing.T, status *kargoapi.StageStatus) {
-				assert.Empty(t, status.Message, "Message should be cleared")
 				assert.Equal(t, "1/2 Fulfilled", status.FreightSummary)
 			},
 		},
diff --git a/ui/src/features/common/stage-phase/stage-phase-icon.tsx b/ui/src/features/common/stage-phase/stage-phase-icon.tsx
deleted file mode 100644
index 01b9bf44cc..0000000000
--- a/ui/src/features/common/stage-phase/stage-phase-icon.tsx
+++ /dev/null
@@ -1,59 +0,0 @@
-import {
-  faCircle,
-  faCircleMinus,
-  faMagnifyingGlass,
-  faTimesCircle,
-  IconDefinition
-} from '@fortawesome/free-solid-svg-icons';
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import { Tooltip } from 'antd';
-import classNames from 'classnames';
-
-import styles from './styles.module.less';
-import { TruckIcon } from './truck-icon/truck-icon';
-import { StagePhase } from './utils';
-
-export const StagePhaseIcon = (props: { phase: StagePhase; className?: string }) => {
-  let icon: IconDefinition = faCircleMinus;
-
-  switch (props.phase) {
-    case StagePhase.Steady:
-      icon = faCircle;
-      break;
-
-    case StagePhase.Verifying:
-      icon = faMagnifyingGlass;
-      break;
-
-    case StagePhase.Failed:
-      icon = faTimesCircle;
-      break;
-  }
-
-  return (
-    <Tooltip
-      title={
-        <>
-          <b>Stage phase:</b> {props.phase}
-        </>
-      }
-    >
-      {props.phase === StagePhase.Promoting ? (
-        <>
-          <TruckIcon />
-        </>
-      ) : (
-        <FontAwesomeIcon
-          icon={icon}
-          className={classNames(props.className, {
-            'text-gray-400': props.phase === StagePhase.NotApplicable,
-            'text-red-400': props.phase === StagePhase.Failed,
-            'text-green-400': props.phase === StagePhase.Steady,
-            'text-blue-500': props.phase === StagePhase.Verifying,
-            [styles.magnifyingGlass]: props.phase === StagePhase.Verifying
-          })}
-        />
-      )}
-    </Tooltip>
-  );
-};
diff --git a/ui/src/features/common/stage-phase/utils.ts b/ui/src/features/common/stage-phase/utils.ts
deleted file mode 100644
index 0a905e4ae0..0000000000
--- a/ui/src/features/common/stage-phase/utils.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-// in par with stage_types.go
-export enum StagePhase {
-  NotApplicable = 'NotApplicable',
-  Steady = 'Steady',
-  Promoting = 'Promoting',
-  Verifying = 'Verifying',
-  Failed = 'Failed'
-}
diff --git a/ui/src/features/common/stage-status/stage-condition-icon.tsx b/ui/src/features/common/stage-status/stage-condition-icon.tsx
new file mode 100644
index 0000000000..14721976c6
--- /dev/null
+++ b/ui/src/features/common/stage-status/stage-condition-icon.tsx
@@ -0,0 +1,139 @@
+import {
+  faCircle,
+  faCircleMinus,
+  faMagnifyingGlass,
+  faTimesCircle,
+  faSync,
+  IconDefinition
+} from '@fortawesome/free-solid-svg-icons';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { Tooltip } from 'antd';
+import classNames from 'classnames';
+import { memo, useMemo } from 'react';
+
+import { StageConditionType, StageConditionStatus } from '@ui/features/common/stage-status/utils';
+import type { Condition } from '@ui/gen/k8s.io/apimachinery/pkg/apis/meta/v1/generated_pb';
+
+import styles from './styles.module.less';
+import { TruckIcon } from './truck-icon/truck-icon';
+
+interface IconState {
+  icon: IconDefinition;
+  tooltipTitle: string;
+  tooltipMessage: string;
+  iconClass: string;
+}
+
+export const StageConditionIcon = memo(
+  ({ conditions, className }: { conditions: Condition[]; className?: string }) => {
+    const { iconState, isPromoting } = useMemo(() => {
+      const hasCondition = (
+        type: StageConditionType,
+        status: StageConditionStatus
+      ): { condition: Condition | undefined; isActive: boolean } => {
+        const condition = conditions.find((c) => c.type === type);
+        return {
+          condition,
+          isActive: condition?.status === status
+        };
+      };
+
+      const { condition: promotingCondition, isActive: isPromoting } = hasCondition(
+        StageConditionType.Promoting,
+        StageConditionStatus.True
+      );
+
+      const { condition: reconcilingCondition, isActive: isReconciling } = hasCondition(
+        StageConditionType.Reconciling,
+        StageConditionStatus.True
+      );
+
+      const { condition: readyCondition, isActive: isReady } = hasCondition(
+        StageConditionType.Ready,
+        StageConditionStatus.True
+      );
+
+      const isFailed = readyCondition?.status === StageConditionStatus.False;
+
+      const { condition: verifiedCondition, isActive: isVerifying } = hasCondition(
+        StageConditionType.Verified,
+        StageConditionStatus.Unknown
+      );
+
+      // Default state
+      let iconState: IconState = {
+        icon: faCircleMinus,
+        tooltipTitle: '',
+        tooltipMessage: '',
+        iconClass: 'text-gray-400'
+      };
+
+      // Priority: Promoting > Verifying > Reconciling > Failed > Ready
+      if (isPromoting) {
+        iconState = {
+          icon: faCircleMinus,
+          tooltipTitle: 'Promoting',
+          tooltipMessage: promotingCondition?.message ?? '',
+          iconClass: 'text-gray-400'
+        };
+      } else if (isVerifying) {
+        iconState = {
+          icon: faMagnifyingGlass,
+          tooltipTitle: 'Verifying',
+          tooltipMessage: verifiedCondition?.message ?? '',
+          iconClass: `text-blue-500 ${styles.magnifyingGlass}`
+        };
+      } else if (isReconciling) {
+        iconState = {
+          icon: faSync,
+          tooltipTitle: 'Reconciling',
+          tooltipMessage: reconcilingCondition?.message ?? '',
+          iconClass: `text-yellow-500 ${styles.rotate}`
+        };
+      } else if (isFailed) {
+        iconState = {
+          icon: faTimesCircle,
+          tooltipTitle: 'Failed',
+          tooltipMessage: readyCondition?.message ?? '',
+          iconClass: 'text-red-400'
+        };
+      } else if (isReady) {
+        iconState = {
+          icon: faCircle,
+          tooltipTitle: 'Ready',
+          tooltipMessage: readyCondition?.message ?? '',
+          iconClass: 'text-green-400'
+        };
+      }
+
+      return { iconState, isPromoting };
+    }, [conditions]); // Only recalculate when conditions changes
+
+    const tooltipContent = useMemo(
+      () => (
+        <>
+          {iconState.tooltipTitle && (
+            <>
+              <b>Stage Status:</b> {iconState.tooltipTitle}
+            </>
+          )}
+          {iconState.tooltipMessage && <div>{iconState.tooltipMessage}</div>}
+        </>
+      ),
+      [iconState.tooltipTitle, iconState.tooltipMessage] // Only recalculate when tooltip content changes
+    );
+
+    return (
+      <Tooltip title={tooltipContent}>
+        {isPromoting ? (
+          <TruckIcon />
+        ) : (
+          <FontAwesomeIcon
+            icon={iconState.icon}
+            className={classNames(className, iconState.iconClass)}
+          />
+        )}
+      </Tooltip>
+    );
+  }
+);
diff --git a/ui/src/features/common/stage-phase/styles.module.less b/ui/src/features/common/stage-status/styles.module.less
similarity index 100%
rename from ui/src/features/common/stage-phase/styles.module.less
rename to ui/src/features/common/stage-status/styles.module.less
diff --git a/ui/src/features/common/stage-phase/truck-icon/styles.module.less b/ui/src/features/common/stage-status/truck-icon/styles.module.less
similarity index 100%
rename from ui/src/features/common/stage-phase/truck-icon/styles.module.less
rename to ui/src/features/common/stage-status/truck-icon/styles.module.less
diff --git a/ui/src/features/common/stage-phase/truck-icon/truck-icon.tsx b/ui/src/features/common/stage-status/truck-icon/truck-icon.tsx
similarity index 100%
rename from ui/src/features/common/stage-phase/truck-icon/truck-icon.tsx
rename to ui/src/features/common/stage-status/truck-icon/truck-icon.tsx
diff --git a/ui/src/features/common/stage-status/utils.ts b/ui/src/features/common/stage-status/utils.ts
new file mode 100644
index 0000000000..2c2c132256
--- /dev/null
+++ b/ui/src/features/common/stage-status/utils.ts
@@ -0,0 +1,12 @@
+export const enum StageConditionType {
+  Promoting = 'Promoting',
+  Reconciling = 'Reconciling',
+  Ready = 'Ready',
+  Verified = 'Verified'
+}
+
+export const enum StageConditionStatus {
+  True = 'True',
+  False = 'False',
+  Unknown = 'Unknown'
+}
diff --git a/ui/src/features/project/pipelines/nodes/stage-node.tsx b/ui/src/features/project/pipelines/nodes/stage-node.tsx
index 2eff65f682..54687d6603 100644
--- a/ui/src/features/project/pipelines/nodes/stage-node.tsx
+++ b/ui/src/features/project/pipelines/nodes/stage-node.tsx
@@ -21,6 +21,7 @@ import { generatePath, useNavigate } from 'react-router-dom';
 import { paths } from '@ui/config/paths';
 import { HealthStatusIcon } from '@ui/features/common/health-status/health-status-icon';
 import { PromotionStatusIcon } from '@ui/features/common/promotion-status/promotion-status-icon';
+import { StageConditionType, StageConditionStatus } from '@ui/features/common/stage-status/utils';
 import { getCurrentFreight, selectFreightByWarehouse } from '@ui/features/common/utils';
 import { willStagePromotionOpenPR } from '@ui/features/promotion-directives/utils';
 import { getColors } from '@ui/features/stage/utils';
@@ -29,6 +30,7 @@ import {
   promoteToStage
 } from '@ui/gen/api/service/v1alpha1/service-KargoService_connectquery';
 import { Freight, Stage } from '@ui/gen/api/v1alpha1/generated_pb';
+import type { Condition } from '@ui/gen/k8s.io/apimachinery/pkg/apis/meta/v1/generated_pb';
 import { timestampDate } from '@ui/utils/connectrpc-utils';
 import { useLocalStorage } from '@ui/utils/use-local-storage';
 
@@ -228,6 +230,13 @@ export const StageNode = (props: StageNodeProps) => {
     return false;
   };
 
+  const isVerifying = (stage: Stage): boolean => {
+    const verifiedCondition = stage.status?.conditions?.find(
+      (c: Condition) => c.type === StageConditionType.Verified
+    );
+    return verifiedCondition?.status === StageConditionStatus.Unknown;
+  };
+
   return (
     <div
       className={classNames(styles.stageNode, {
@@ -273,7 +282,7 @@ export const StageNode = (props: StageNodeProps) => {
             >
               <FontAwesomeIcon icon={faGear} spin={true} />
             </Tooltip>
-          ) : props.stage.status?.phase === 'Verifying' ? (
+          ) : isVerifying(props.stage) ? (
             <Tooltip title='Verifying Current Freight'>
               <FontAwesomeIcon icon={faCircleNotch} spin={true} />
             </Tooltip>
diff --git a/ui/src/features/stage/stage-details.tsx b/ui/src/features/stage/stage-details.tsx
index 0077b58a36..69b167696b 100644
--- a/ui/src/features/stage/stage-details.tsx
+++ b/ui/src/features/stage/stage-details.tsx
@@ -16,8 +16,7 @@ import { paths } from '@ui/config/paths';
 import { useExtensionsContext } from '@ui/extensions/extensions-context';
 import { Description } from '@ui/features/common/description';
 import { HealthStatusIcon } from '@ui/features/common/health-status/health-status-icon';
-import { StagePhaseIcon } from '@ui/features/common/stage-phase/stage-phase-icon';
-import { StagePhase } from '@ui/features/common/stage-phase/utils';
+import { StageConditionIcon } from '@ui/features/common/stage-status/stage-condition-icon';
 import { useImages } from '@ui/features/project/pipelines/utils/useImages';
 import {
   getConfig,
@@ -96,6 +95,8 @@ export const StageDetails = ({ stage }: { stage: Stage }) => {
 
   const { stageTabs } = useExtensionsContext();
 
+  const stageConditions = useMemo(() => stage.status?.conditions || [], [stage.status?.conditions]);
+
   return (
     <Drawer
       open={!!stageName}
@@ -109,7 +110,7 @@ export const StageDetails = ({ stage }: { stage: Stage }) => {
                 {stage.metadata?.name}
               </Typography.Title>
               <Flex gap={4}>
-                <StagePhaseIcon phase={stage.status?.phase as StagePhase} />
+                <StageConditionIcon conditions={stageConditions} />
                 {!!stage.status?.health && <HealthStatusIcon health={stage.status?.health} />}
               </Flex>
             </Flex>
diff --git a/ui/src/gen/api/v1alpha1/generated_pb.ts b/ui/src/gen/api/v1alpha1/generated_pb.ts
index cf567d624d..34765ba2d8 100644
--- a/ui/src/gen/api/v1alpha1/generated_pb.ts
+++ b/ui/src/gen/api/v1alpha1/generated_pb.ts
@@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf";
  * Describes the file api/v1alpha1/generated.proto.
  */
 export const file_api_v1alpha1_generated: GenFile = /*@__PURE__*/
-  fileDesc("ChxhcGkvdjFhbHBoYTEvZ2VuZXJhdGVkLnByb3RvEiRnaXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEiMgoTQW5hbHlzaXNSdW5Bcmd1bWVudBIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIrACChNBbmFseXNpc1J1bk1ldGFkYXRhElUKBmxhYmVscxgBIAMoCzJFLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bk1ldGFkYXRhLkxhYmVsc0VudHJ5El8KC2Fubm90YXRpb25zGAIgAygLMkouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuQW5ub3RhdGlvbnNFbnRyeRotCgtMYWJlbHNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGjIKEEFubm90YXRpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJGChRBbmFseXNpc1J1blJlZmVyZW5jZRIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRINCgVwaGFzZRgDIAEoCSI3ChlBbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlEgwKBG5hbWUYASABKAkSDAoEa2luZBgCIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKnAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkkKBWl0ZW1zGAIgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrIkkKDEN1cnJlbnRTdGFnZRI5CgVzaW5jZRgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIrYCChNEaXNjb3ZlcmVkQXJ0aWZhY3RzEkAKDGRpc2NvdmVyZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkUKA2dpdBgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXREaXNjb3ZlcnlSZXN1bHQSSgoGaW1hZ2VzGAIgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlRGlzY292ZXJ5UmVzdWx0EkoKBmNoYXJ0cxgDIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydERpc2NvdmVyeVJlc3VsdCKwAQoQRGlzY292ZXJlZENvbW1pdBIKCgJpZBgBIAEoCRIOCgZicmFuY2gYAiABKAkSCwoDdGFnGAMgASgJEg8KB3N1YmplY3QYBCABKAkSDgoGYXV0aG9yGAUgASgJEhEKCWNvbW1pdHRlchgGIAEoCRI/CgtjcmVhdG9yRGF0ZRgHIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIqQCChhEaXNjb3ZlcmVkSW1hZ2VSZWZlcmVuY2USCwoDdGFnGAEgASgJEg4KBmRpZ2VzdBgCIAEoCRJkCgthbm5vdGF0aW9ucxgFIAMoCzJPLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkSW1hZ2VSZWZlcmVuY2UuQW5ub3RhdGlvbnNFbnRyeRISCgpnaXRSZXBvVVJMGAMgASgJEj0KCWNyZWF0ZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lGjIKEEFubm90YXRpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIxChJFeHByZXNzaW9uVmFyaWFibGUSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyKYAQoORnJlaWdodFNvdXJjZXMSDgoGZGlyZWN0GAEgASgIEg4KBnN0YWdlcxgCIAMoCRJIChByZXF1aXJlZFNvYWtUaW1lGAMgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEhwKFGF2YWlsYWJpbGl0eVN0cmF0ZWd5GAQgASgJItcECg1GcmVpZ2h0U3RhdHVzElkKC2N1cnJlbnRseUluGAMgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQ3VycmVudGx5SW5FbnRyeRJXCgp2ZXJpZmllZEluGAEgAygLMkMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuVmVyaWZpZWRJbkVudHJ5ElkKC2FwcHJvdmVkRm9yGAIgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQXBwcm92ZWRGb3JFbnRyeRpmChBDdXJyZW50bHlJbkVudHJ5EgsKA2tleRgBIAEoCRJBCgV2YWx1ZRgCIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DdXJyZW50U3RhZ2U6AjgBGmYKD1ZlcmlmaWVkSW5FbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpZWRTdGFnZToCOAEaZwoQQXBwcm92ZWRGb3JFbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXBwcm92ZWRTdGFnZToCOAEieQoJR2l0Q29tbWl0Eg8KB3JlcG9VUkwYASABKAkSCgoCaWQYAiABKAkSDgoGYnJhbmNoGAMgASgJEgsKA3RhZxgEIAEoCRIPCgdtZXNzYWdlGAYgASgJEg4KBmF1dGhvchgHIAEoCRIRCgljb21taXR0ZXIYCCABKAkibgoSR2l0RGlzY292ZXJ5UmVzdWx0Eg8KB3JlcG9VUkwYASABKAkSRwoHY29tbWl0cxgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQ29tbWl0Io4CCg9HaXRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIfChdjb21taXRTZWxlY3Rpb25TdHJhdGVneRgCIAEoCRIOCgZicmFuY2gYAyABKAkSFQoNc3RyaWN0U2VtdmVycxgLIAEoCBIYChBzZW12ZXJDb25zdHJhaW50GAQgASgJEhEKCWFsbG93VGFncxgFIAEoCRISCgppZ25vcmVUYWdzGAYgAygJEh0KFWluc2VjdXJlU2tpcFRMU1ZlcmlmeRgHIAEoCBIUCgxpbmNsdWRlUGF0aHMYCCADKAkSFAoMZXhjbHVkZVBhdGhzGAkgAygJEhYKDmRpc2NvdmVyeUxpbWl0GAogASgFIsgBCgZIZWFsdGgSDgoGc3RhdHVzGAEgASgJEg4KBmlzc3VlcxgCIAMoCRJOCgZjb25maWcYBCABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OEk4KBm91dHB1dBgFIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibwoPSGVhbHRoQ2hlY2tTdGVwEgwKBHVzZXMYASABKAkSTgoGY29uZmlnGAIgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiIeCgtIZWFsdGhTdGF0cxIPCgdoZWFsdGh5GAEgASgDItABCgVJbWFnZRIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSCwoDdGFnGAMgASgJEg4KBmRpZ2VzdBgEIAEoCRJRCgthbm5vdGF0aW9ucxgFIAMoCzI8LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZS5Bbm5vdGF0aW9uc0VudHJ5GjIKEEFubm90YXRpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASKNAQoUSW1hZ2VEaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIQCghwbGF0Zm9ybRgCIAEoCRJSCgpyZWZlcmVuY2VzGAMgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRJbWFnZVJlZmVyZW5jZSL5AQoRSW1hZ2VTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRISCgpnaXRSZXBvVVJMGAIgASgJEh4KFmltYWdlU2VsZWN0aW9uU3RyYXRlZ3kYAyABKAkSFQoNc3RyaWN0U2VtdmVycxgKIAEoCBIYChBzZW12ZXJDb25zdHJhaW50GAQgASgJEhEKCWFsbG93VGFncxgFIAEoCRISCgppZ25vcmVUYWdzGAYgAygJEhAKCHBsYXRmb3JtGAcgASgJEh0KFWluc2VjdXJlU2tpcFRMU1ZlcmlmeRgIIAEoCBIWCg5kaXNjb3ZlcnlMaW1pdBgJIAEoBSLZAQoHUHJvamVjdBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdENvbmZpZ1NwZWMSQwoGc3RhdHVzGAMgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RTdGF0dXMimgEKDVByb2plY3RDb25maWcSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJFCgRzcGVjGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RDb25maWdTcGVjIpkBChFQcm9qZWN0Q29uZmlnTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRJCCgVpdGVtcxgCIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0Q29uZmlnImUKEVByb2plY3RDb25maWdTcGVjElAKEXByb21vdGlvblBvbGljaWVzGAEgAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblBvbGljeSKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCKaAQoMUHJvamVjdFN0YXRzEkgKCndhcmVob3VzZXMYASABKAsyNC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlU3RhdHMSQAoGc3RhZ2VzGAIgASgLMjAuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3RhdHMitwEKDVByb2plY3RTdGF0dXMSQwoKY29uZGl0aW9ucxgDIAMoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Db25kaXRpb24SDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJBCgVzdGF0cxgEIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0U3RhdHMi2QEKCVByb21vdGlvbhJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkEKBHNwZWMYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3BlYxJFCgZzdGF0dXMYAyABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RhdHVzIpEBCg1Qcm9tb3Rpb25MaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEj4KBWl0ZW1zGAIgAygLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvbiKUAQoPUHJvbW90aW9uUG9saWN5Eg0KBXN0YWdlGAEgASgJElQKDXN0YWdlU2VsZWN0b3IYAyABKAsyPS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUG9saWN5U2VsZWN0b3ISHAoUYXV0b1Byb21vdGlvbkVuYWJsZWQYAiABKAgicwoXUHJvbW90aW9uUG9saWN5U2VsZWN0b3ISDAoEbmFtZRgBIAEoCRJKCg1sYWJlbFNlbGVjdG9yGAIgASgLMjMuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxhYmVsU2VsZWN0b3Ii8gEKElByb21vdGlvblJlZmVyZW5jZRIMCgRuYW1lGAEgASgJEkcKB2ZyZWlnaHQYAiABKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFJlZmVyZW5jZRJFCgZzdGF0dXMYAyABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RhdHVzEj4KCmZpbmlzaGVkQXQYBCABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSK7AQoNUHJvbW90aW9uU3BlYxINCgVzdGFnZRgBIAEoCRIPCgdmcmVpZ2h0GAIgASgJEkYKBHZhcnMYBCADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRXhwcmVzc2lvblZhcmlhYmxlEkIKBXN0ZXBzGAMgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAitwQKD1Byb21vdGlvblN0YXR1cxIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBCABKAkSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJHCgdmcmVpZ2h0GAUgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USUgoRZnJlaWdodENvbGxlY3Rpb24YByABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SSwoMaGVhbHRoQ2hlY2tzGAggAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aENoZWNrU3RlcBI+CgpmaW5pc2hlZEF0GAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSEwoLY3VycmVudFN0ZXAYCSABKAMSWgoVc3RlcEV4ZWN1dGlvbk1ldGFkYXRhGAsgAygLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0ZXBFeGVjdXRpb25NZXRhZGF0YRJNCgVzdGF0ZRgKIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04i4gIKDVByb21vdGlvblN0ZXASDAoEdXNlcxgBIAEoCRJKCgR0YXNrGAUgASgLMjwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tSZWZlcmVuY2USCgoCYXMYAiABKAkSCgoCaWYYByABKAkSRwoFcmV0cnkYBCABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcFJldHJ5EkYKBHZhcnMYBiADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRXhwcmVzc2lvblZhcmlhYmxlEk4KBmNvbmZpZxgDIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibQoSUHJvbW90aW9uU3RlcFJldHJ5Ej8KB3RpbWVvdXQYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SFgoOZXJyb3JUaHJlc2hvbGQYAiABKA0imgEKDVByb21vdGlvblRhc2sSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJFCgRzcGVjGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRhc2tTcGVjIpkBChFQcm9tb3Rpb25UYXNrTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRJCCgVpdGVtcxgCIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrIjQKFlByb21vdGlvblRhc2tSZWZlcmVuY2USDAoEbmFtZRgBIAEoCRIMCgRraW5kGAIgASgJIp8BChFQcm9tb3Rpb25UYXNrU3BlYxJGCgR2YXJzGAEgAygLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkV4cHJlc3Npb25WYXJpYWJsZRJCCgVzdGVwcxgCIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwIl4KEVByb21vdGlvblRlbXBsYXRlEkkKBHNwZWMYASABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGVtcGxhdGVTcGVjIqMBChVQcm9tb3Rpb25UZW1wbGF0ZVNwZWMSRgoEdmFycxgCIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5FeHByZXNzaW9uVmFyaWFibGUSQgoFc3RlcHMYASADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCLmAQoQUmVwb1N1YnNjcmlwdGlvbhJCCgNnaXQYASABKAsyNS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0U3Vic2NyaXB0aW9uEkYKBWltYWdlGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlU3Vic2NyaXB0aW9uEkYKBWNoYXJ0GAMgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNoYXJ0U3Vic2NyaXB0aW9uIs0BCgVTdGFnZRJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEj0KBHNwZWMYAiABKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2VTcGVjEkEKBnN0YXR1cxgDIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZVN0YXR1cyKJAQoJU3RhZ2VMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEjoKBWl0ZW1zGAIgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlItACCglTdGFnZVNwZWMSDQoFc2hhcmQYBCABKAkSRgoEdmFycxgHIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5FeHByZXNzaW9uVmFyaWFibGUSTgoQcmVxdWVzdGVkRnJlaWdodBgFIAMoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVxdWVzdBJSChFwcm9tb3Rpb25UZW1wbGF0ZRgGIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UZW1wbGF0ZRJICgx2ZXJpZmljYXRpb24YAyABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpY2F0aW9uIl4KClN0YWdlU3RhdHMSDQoFY291bnQYAiABKAMSQQoGaGVhbHRoGAEgASgLMjEuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aFN0YXRzIvYDCgtTdGFnZVN0YXR1cxJDCgpjb25kaXRpb25zGA0gAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYCyABKAkSDQoFcGhhc2UYASABKAkSTwoOZnJlaWdodEhpc3RvcnkYBCADKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodENvbGxlY3Rpb24SFgoOZnJlaWdodFN1bW1hcnkYDCABKAkSPAoGaGVhbHRoGAggASgLMiwuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aBIPCgdtZXNzYWdlGAkgASgJEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgGIAEoAxJSChBjdXJyZW50UHJvbW90aW9uGAcgASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZRJPCg1sYXN0UHJvbW90aW9uGAogASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblJlZmVyZW5jZSLaAQoVU3RlcEV4ZWN1dGlvbk1ldGFkYXRhEg0KBWFsaWFzGAEgASgJEj0KCXN0YXJ0ZWRBdBgCIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEj4KCmZpbmlzaGVkQXQYAyABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRISCgplcnJvckNvdW50GAQgASgNEg4KBnN0YXR1cxgFIAEoCRIPCgdtZXNzYWdlGAYgASgJIosCCgxWZXJpZmljYXRpb24SWgoRYW5hbHlzaXNUZW1wbGF0ZXMYASADKAsyPy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNUZW1wbGF0ZVJlZmVyZW5jZRJWChNhbmFseXNpc1J1bk1ldGFkYXRhGAIgASgLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGESRwoEYXJncxgDIAMoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bkFyZ3VtZW50Ip0CChBWZXJpZmljYXRpb25JbmZvEgoKAmlkGAQgASgJEg0KBWFjdG9yGAcgASgJEj0KCXN0YXJ0VGltZRgFIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSTwoLYW5hbHlzaXNSdW4YAyABKAsyOi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5SZWZlcmVuY2USPgoKZmluaXNoVGltZRgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIpQBCg1WZXJpZmllZFN0YWdlEj4KCnZlcmlmaWVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZRJDCgtsb25nZXN0U29haxgCIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5EdXJhdGlvbiLZAQoJV2FyZWhvdXNlEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESQQoEc3BlYxgCIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTcGVjEkUKBnN0YXR1cxgDIAEoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2VTdGF0dXMikQEKDVdhcmVob3VzZUxpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPgoFaXRlbXMYAiADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlIs4BCg1XYXJlaG91c2VTcGVjEg0KBXNoYXJkGAIgASgJEkAKCGludGVydmFsGAQgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEh0KFWZyZWlnaHRDcmVhdGlvblBvbGljeRgDIAEoCRJNCg1zdWJzY3JpcHRpb25zGAEgAygLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlJlcG9TdWJzY3JpcHRpb24iYgoOV2FyZWhvdXNlU3RhdHMSDQoFY291bnQYAiABKAMSQQoGaGVhbHRoGAEgASgLMjEuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkhlYWx0aFN0YXRzIv0BCg9XYXJlaG91c2VTdGF0dXMSQwoKY29uZGl0aW9ucxgJIAMoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Db25kaXRpb24SGgoSbGFzdEhhbmRsZWRSZWZyZXNoGAYgASgJEhoKEm9ic2VydmVkR2VuZXJhdGlvbhgEIAEoAxIVCg1sYXN0RnJlaWdodElEGAggASgJElYKE2Rpc2NvdmVyZWRBcnRpZmFjdHMYByABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRGlzY292ZXJlZEFydGlmYWN0c0KXAgooY29tLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMUIOR2VuZXJhdGVkUHJvdG9QAVokZ2l0aHViLmNvbS9ha3VpdHkva2FyZ28vYXBpL3YxYWxwaGExogIFR0NBS0GqAiRHaXRodWIuQ29tLkFrdWl0eS5LYXJnby5BcGkuVjFhbHBoYTHKAiRHaXRodWJcQ29tXEFrdWl0eVxLYXJnb1xBcGlcVjFhbHBoYTHiAjBHaXRodWJcQ29tXEFrdWl0eVxLYXJnb1xBcGlcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAilHaXRodWI6OkNvbTo6QWt1aXR5OjpLYXJnbzo6QXBpOjpWMWFscGhhMQ", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]);
+  fileDesc("ChxhcGkvdjFhbHBoYTEvZ2VuZXJhdGVkLnByb3RvEiRnaXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEiMgoTQW5hbHlzaXNSdW5Bcmd1bWVudBIMCgRuYW1lGAEgASgJEg0KBXZhbHVlGAIgASgJIrACChNBbmFseXNpc1J1bk1ldGFkYXRhElUKBmxhYmVscxgBIAMoCzJFLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1bk1ldGFkYXRhLkxhYmVsc0VudHJ5El8KC2Fubm90YXRpb25zGAIgAygLMkouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuTWV0YWRhdGEuQW5ub3RhdGlvbnNFbnRyeRotCgtMYWJlbHNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGjIKEEFubm90YXRpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJGChRBbmFseXNpc1J1blJlZmVyZW5jZRIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRINCgVwaGFzZRgDIAEoCSI3ChlBbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlEgwKBG5hbWUYASABKAkSDAoEa2luZBgCIAEoCSJPCg1BcHByb3ZlZFN0YWdlEj4KCmFwcHJvdmVkQXQYASABKAsyKi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuVGltZSI4ChVBcmdvQ0RBcHBIZWFsdGhTdGF0dXMSDgoGc3RhdHVzGAEgASgJEg8KB21lc3NhZ2UYAiABKAki1AEKD0FyZ29DREFwcFN0YXR1cxIRCgluYW1lc3BhY2UYASABKAkSDAoEbmFtZRgCIAEoCRJRCgxoZWFsdGhTdGF0dXMYAyABKAsyOy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwSGVhbHRoU3RhdHVzEk0KCnN5bmNTdGF0dXMYBCABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXJnb0NEQXBwU3luY1N0YXR1cyJKChNBcmdvQ0RBcHBTeW5jU3RhdHVzEg4KBnN0YXR1cxgBIAEoCRIQCghyZXZpc2lvbhgCIAEoCRIRCglyZXZpc2lvbnMYAyADKAkiNwoFQ2hhcnQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAkiYQoUQ2hhcnREaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSEAoIdmVyc2lvbnMYBCADKAkiZAoRQ2hhcnRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKEHNlbXZlckNvbnN0cmFpbnQYAyABKAkSFgoOZGlzY292ZXJ5TGltaXQYBCABKAUioQEKFENsdXN0ZXJQcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKnAQoYQ2x1c3RlclByb21vdGlvblRhc2tMaXN0EkAKCG1ldGFkYXRhGAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkxpc3RNZXRhEkkKBWl0ZW1zGAIgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkNsdXN0ZXJQcm9tb3Rpb25UYXNrIkkKDEN1cnJlbnRTdGFnZRI5CgVzaW5jZRgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIrYCChNEaXNjb3ZlcmVkQXJ0aWZhY3RzEkAKDGRpc2NvdmVyZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkUKA2dpdBgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXREaXNjb3ZlcnlSZXN1bHQSSgoGaW1hZ2VzGAIgAygLMjouZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlRGlzY292ZXJ5UmVzdWx0EkoKBmNoYXJ0cxgDIAMoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydERpc2NvdmVyeVJlc3VsdCKwAQoQRGlzY292ZXJlZENvbW1pdBIKCgJpZBgBIAEoCRIOCgZicmFuY2gYAiABKAkSCwoDdGFnGAMgASgJEg8KB3N1YmplY3QYBCABKAkSDgoGYXV0aG9yGAUgASgJEhEKCWNvbW1pdHRlchgGIAEoCRI/CgtjcmVhdG9yRGF0ZRgHIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lIqQCChhEaXNjb3ZlcmVkSW1hZ2VSZWZlcmVuY2USCwoDdGFnGAEgASgJEg4KBmRpZ2VzdBgCIAEoCRJkCgthbm5vdGF0aW9ucxgFIAMoCzJPLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkSW1hZ2VSZWZlcmVuY2UuQW5ub3RhdGlvbnNFbnRyeRISCgpnaXRSZXBvVVJMGAMgASgJEj0KCWNyZWF0ZWRBdBgEIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lGjIKEEFubm90YXRpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIxChJFeHByZXNzaW9uVmFyaWFibGUSDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKiAwoHRnJlaWdodBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEg0KBWFsaWFzGAcgASgJEkMKBm9yaWdpbhgJIAEoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0T3JpZ2luEkAKB2NvbW1pdHMYAyADKAsyLy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuR2l0Q29tbWl0EjsKBmltYWdlcxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZRI7CgZjaGFydHMYBSADKAsyKy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQ2hhcnQSQwoGc3RhdHVzGAYgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMirQIKEUZyZWlnaHRDb2xsZWN0aW9uEgoKAmlkGAMgASgJElEKBWl0ZW1zGAEgAygLMkIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uLkl0ZW1zRW50cnkSUwoTdmVyaWZpY2F0aW9uSGlzdG9yeRgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5WZXJpZmljYXRpb25JbmZvGmQKCkl0ZW1zRW50cnkSCwoDa2V5GAEgASgJEkUKBXZhbHVlGAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2U6AjgBIo0BCgtGcmVpZ2h0TGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI8CgVpdGVtcxgCIAMoCzItLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0IisKDUZyZWlnaHRPcmlnaW4SDAoEa2luZBgBIAEoCRIMCgRuYW1lGAIgASgJIqECChBGcmVpZ2h0UmVmZXJlbmNlEgwKBG5hbWUYASABKAkSQwoGb3JpZ2luGAggASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SQAoHY29tbWl0cxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5HaXRDb21taXQSOwoGaW1hZ2VzGAMgAygLMisuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkltYWdlEjsKBmNoYXJ0cxgEIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydCKcAQoORnJlaWdodFJlcXVlc3QSQwoGb3JpZ2luGAEgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRPcmlnaW4SRQoHc291cmNlcxgCIAEoCzI0LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0U291cmNlcyKYAQoORnJlaWdodFNvdXJjZXMSDgoGZGlyZWN0GAEgASgIEg4KBnN0YWdlcxgCIAMoCRJIChByZXF1aXJlZFNvYWtUaW1lGAMgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEhwKFGF2YWlsYWJpbGl0eVN0cmF0ZWd5GAQgASgJItcECg1GcmVpZ2h0U3RhdHVzElkKC2N1cnJlbnRseUluGAMgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQ3VycmVudGx5SW5FbnRyeRJXCgp2ZXJpZmllZEluGAEgAygLMkMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuVmVyaWZpZWRJbkVudHJ5ElkKC2FwcHJvdmVkRm9yGAIgAygLMkQuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRTdGF0dXMuQXBwcm92ZWRGb3JFbnRyeRpmChBDdXJyZW50bHlJbkVudHJ5EgsKA2tleRgBIAEoCRJBCgV2YWx1ZRgCIAEoCzIyLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DdXJyZW50U3RhZ2U6AjgBGmYKD1ZlcmlmaWVkSW5FbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuVmVyaWZpZWRTdGFnZToCOAEaZwoQQXBwcm92ZWRGb3JFbnRyeRILCgNrZXkYASABKAkSQgoFdmFsdWUYAiABKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQXBwcm92ZWRTdGFnZToCOAEieQoJR2l0Q29tbWl0Eg8KB3JlcG9VUkwYASABKAkSCgoCaWQYAiABKAkSDgoGYnJhbmNoGAMgASgJEgsKA3RhZxgEIAEoCRIPCgdtZXNzYWdlGAYgASgJEg4KBmF1dGhvchgHIAEoCRIRCgljb21taXR0ZXIYCCABKAkibgoSR2l0RGlzY292ZXJ5UmVzdWx0Eg8KB3JlcG9VUkwYASABKAkSRwoHY29tbWl0cxgCIAMoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQ29tbWl0Io4CCg9HaXRTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRIfChdjb21taXRTZWxlY3Rpb25TdHJhdGVneRgCIAEoCRIOCgZicmFuY2gYAyABKAkSFQoNc3RyaWN0U2VtdmVycxgLIAEoCBIYChBzZW12ZXJDb25zdHJhaW50GAQgASgJEhEKCWFsbG93VGFncxgFIAEoCRISCgppZ25vcmVUYWdzGAYgAygJEh0KFWluc2VjdXJlU2tpcFRMU1ZlcmlmeRgHIAEoCBIUCgxpbmNsdWRlUGF0aHMYCCADKAkSFAoMZXhjbHVkZVBhdGhzGAkgAygJEhYKDmRpc2NvdmVyeUxpbWl0GAogASgFIsgBCgZIZWFsdGgSDgoGc3RhdHVzGAEgASgJEg4KBmlzc3VlcxgCIAMoCRJOCgZjb25maWcYBCABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OEk4KBm91dHB1dBgFIAEoCzI+Lms4cy5pby5hcGlleHRlbnNpb25zX2FwaXNlcnZlci5wa2cuYXBpcy5hcGlleHRlbnNpb25zLnYxLkpTT04ibwoPSGVhbHRoQ2hlY2tTdGVwEgwKBHVzZXMYASABKAkSTgoGY29uZmlnGAIgASgLMj4uazhzLmlvLmFwaWV4dGVuc2lvbnNfYXBpc2VydmVyLnBrZy5hcGlzLmFwaWV4dGVuc2lvbnMudjEuSlNPTiIeCgtIZWFsdGhTdGF0cxIPCgdoZWFsdGh5GAEgASgDItABCgVJbWFnZRIPCgdyZXBvVVJMGAEgASgJEhIKCmdpdFJlcG9VUkwYAiABKAkSCwoDdGFnGAMgASgJEg4KBmRpZ2VzdBgEIAEoCRJRCgthbm5vdGF0aW9ucxgFIAMoCzI8LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZS5Bbm5vdGF0aW9uc0VudHJ5GjIKEEFubm90YXRpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASKNAQoUSW1hZ2VEaXNjb3ZlcnlSZXN1bHQSDwoHcmVwb1VSTBgBIAEoCRIQCghwbGF0Zm9ybRgCIAEoCRJSCgpyZWZlcmVuY2VzGAMgAygLMj4uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkRpc2NvdmVyZWRJbWFnZVJlZmVyZW5jZSL5AQoRSW1hZ2VTdWJzY3JpcHRpb24SDwoHcmVwb1VSTBgBIAEoCRISCgpnaXRSZXBvVVJMGAIgASgJEh4KFmltYWdlU2VsZWN0aW9uU3RyYXRlZ3kYAyABKAkSFQoNc3RyaWN0U2VtdmVycxgKIAEoCBIYChBzZW12ZXJDb25zdHJhaW50GAQgASgJEhEKCWFsbG93VGFncxgFIAEoCRISCgppZ25vcmVUYWdzGAYgAygJEhAKCHBsYXRmb3JtGAcgASgJEh0KFWluc2VjdXJlU2tpcFRMU1ZlcmlmeRgIIAEoCBIWCg5kaXNjb3ZlcnlMaW1pdBgJIAEoBSLZAQoHUHJvamVjdBJCCghtZXRhZGF0YRgBIAEoCzIwLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5PYmplY3RNZXRhEkUKBHNwZWMYAiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdENvbmZpZ1NwZWMSQwoGc3RhdHVzGAMgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RTdGF0dXMimgEKDVByb2plY3RDb25maWcSQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJFCgRzcGVjGAIgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb2plY3RDb25maWdTcGVjIpkBChFQcm9qZWN0Q29uZmlnTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRJCCgVpdGVtcxgCIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9qZWN0Q29uZmlnImUKEVByb2plY3RDb25maWdTcGVjElAKEXByb21vdGlvblBvbGljaWVzGAEgAygLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblBvbGljeSKNAQoLUHJvamVjdExpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESPAoFaXRlbXMYAiADKAsyLS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdCKaAQoMUHJvamVjdFN0YXRzEkgKCndhcmVob3VzZXMYASABKAsyNC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuV2FyZWhvdXNlU3RhdHMSQAoGc3RhZ2VzGAIgASgLMjAuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3RhdHMilwEKDVByb2plY3RTdGF0dXMSQwoKY29uZGl0aW9ucxgDIAMoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Db25kaXRpb24SQQoFc3RhdHMYBCABKAsyMi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvamVjdFN0YXRzItkBCglQcm9tb3Rpb24SQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cyKRAQoNUHJvbW90aW9uTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb24ilAEKD1Byb21vdGlvblBvbGljeRINCgVzdGFnZRgBIAEoCRJUCg1zdGFnZVNlbGVjdG9yGAMgASgLMj0uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblBvbGljeVNlbGVjdG9yEhwKFGF1dG9Qcm9tb3Rpb25FbmFibGVkGAIgASgIInMKF1Byb21vdGlvblBvbGljeVNlbGVjdG9yEgwKBG5hbWUYASABKAkSSgoNbGFiZWxTZWxlY3RvchgCIAEoCzIzLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MYWJlbFNlbGVjdG9yIvIBChJQcm9tb3Rpb25SZWZlcmVuY2USDAoEbmFtZRgBIAEoCRJHCgdmcmVpZ2h0GAIgASgLMjYuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRSZWZlcmVuY2USRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0YXR1cxI+CgpmaW5pc2hlZEF0GAQgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUiuwEKDVByb21vdGlvblNwZWMSDQoFc3RhZ2UYASABKAkSDwoHZnJlaWdodBgCIAEoCRJGCgR2YXJzGAQgAygLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkV4cHJlc3Npb25WYXJpYWJsZRJCCgVzdGVwcxgDIAMoCzIzLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25TdGVwIrcECg9Qcm9tb3Rpb25TdGF0dXMSGgoSbGFzdEhhbmRsZWRSZWZyZXNoGAQgASgJEg0KBXBoYXNlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSRwoHZnJlaWdodBgFIAEoCzI2LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5GcmVpZ2h0UmVmZXJlbmNlElIKEWZyZWlnaHRDb2xsZWN0aW9uGAcgASgLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uEksKDGhlYWx0aENoZWNrcxgIIAMoCzI1LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5IZWFsdGhDaGVja1N0ZXASPgoKZmluaXNoZWRBdBgGIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhMKC2N1cnJlbnRTdGVwGAkgASgDEloKFXN0ZXBFeGVjdXRpb25NZXRhZGF0YRgLIAMoCzI7LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGVwRXhlY3V0aW9uTWV0YWRhdGESTQoFc3RhdGUYCiABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIuICCg1Qcm9tb3Rpb25TdGVwEgwKBHVzZXMYASABKAkSSgoEdGFzaxgFIAEoCzI8LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrUmVmZXJlbmNlEgoKAmFzGAIgASgJEgoKAmlmGAcgASgJEkcKBXJldHJ5GAQgASgLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXBSZXRyeRJGCgR2YXJzGAYgAygLMjguZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkV4cHJlc3Npb25WYXJpYWJsZRJOCgZjb25maWcYAyABKAsyPi5rOHMuaW8uYXBpZXh0ZW5zaW9uc19hcGlzZXJ2ZXIucGtnLmFwaXMuYXBpZXh0ZW5zaW9ucy52MS5KU09OIm0KElByb21vdGlvblN0ZXBSZXRyeRI/Cgd0aW1lb3V0GAEgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uEhYKDmVycm9yVGhyZXNob2xkGAIgASgNIpoBCg1Qcm9tb3Rpb25UYXNrEkIKCG1ldGFkYXRhGAEgASgLMjAuazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLk9iamVjdE1ldGESRQoEc3BlYxgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5Qcm9tb3Rpb25UYXNrU3BlYyKZAQoRUHJvbW90aW9uVGFza0xpc3QSQAoIbWV0YWRhdGEYASABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuTGlzdE1ldGESQgoFaXRlbXMYAiADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGFzayI0ChZQcm9tb3Rpb25UYXNrUmVmZXJlbmNlEgwKBG5hbWUYASABKAkSDAoEa2luZBgCIAEoCSKfAQoRUHJvbW90aW9uVGFza1NwZWMSRgoEdmFycxgBIAMoCzI4LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5FeHByZXNzaW9uVmFyaWFibGUSQgoFc3RlcHMYAiADKAsyMy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uU3RlcCJeChFQcm9tb3Rpb25UZW1wbGF0ZRJJCgRzcGVjGAEgASgLMjsuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblRlbXBsYXRlU3BlYyKjAQoVUHJvbW90aW9uVGVtcGxhdGVTcGVjEkYKBHZhcnMYAiADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRXhwcmVzc2lvblZhcmlhYmxlEkIKBXN0ZXBzGAEgAygLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlByb21vdGlvblN0ZXAi5gEKEFJlcG9TdWJzY3JpcHRpb24SQgoDZ2l0GAEgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkdpdFN1YnNjcmlwdGlvbhJGCgVpbWFnZRgCIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5JbWFnZVN1YnNjcmlwdGlvbhJGCgVjaGFydBgDIAEoCzI3LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5DaGFydFN1YnNjcmlwdGlvbiLNAQoFU3RhZ2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRI9CgRzcGVjGAIgASgLMi8uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlN0YWdlU3BlYxJBCgZzdGF0dXMYAyABKAsyMS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuU3RhZ2VTdGF0dXMiiQEKCVN0YWdlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI6CgVpdGVtcxgCIAMoCzIrLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5TdGFnZSLQAgoJU3RhZ2VTcGVjEg0KBXNoYXJkGAQgASgJEkYKBHZhcnMYByADKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRXhwcmVzc2lvblZhcmlhYmxlEk4KEHJlcXVlc3RlZEZyZWlnaHQYBSADKAsyNC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuRnJlaWdodFJlcXVlc3QSUgoRcHJvbW90aW9uVGVtcGxhdGUYBiABKAsyNy5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uVGVtcGxhdGUSSAoMdmVyaWZpY2F0aW9uGAMgASgLMjIuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLlZlcmlmaWNhdGlvbiJeCgpTdGFnZVN0YXRzEg0KBWNvdW50GAIgASgDEkEKBmhlYWx0aBgBIAEoCzIxLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5IZWFsdGhTdGF0cyLWAwoLU3RhZ2VTdGF0dXMSQwoKY29uZGl0aW9ucxgNIAMoCzIvLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5Db25kaXRpb24SGgoSbGFzdEhhbmRsZWRSZWZyZXNoGAsgASgJEk8KDmZyZWlnaHRIaXN0b3J5GAQgAygLMjcuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkZyZWlnaHRDb2xsZWN0aW9uEhYKDmZyZWlnaHRTdW1tYXJ5GAwgASgJEjwKBmhlYWx0aBgIIAEoCzIsLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5IZWFsdGgSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAYgASgDElIKEGN1cnJlbnRQcm9tb3Rpb24YByABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlEk8KDWxhc3RQcm9tb3Rpb24YCiABKAsyOC5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUHJvbW90aW9uUmVmZXJlbmNlItoBChVTdGVwRXhlY3V0aW9uTWV0YWRhdGESDQoFYWxpYXMYASABKAkSPQoJc3RhcnRlZEF0GAIgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSPgoKZmluaXNoZWRBdBgDIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEhIKCmVycm9yQ291bnQYBCABKA0SDgoGc3RhdHVzGAUgASgJEg8KB21lc3NhZ2UYBiABKAkiiwIKDFZlcmlmaWNhdGlvbhJaChFhbmFseXNpc1RlbXBsYXRlcxgBIAMoCzI/LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1RlbXBsYXRlUmVmZXJlbmNlElYKE2FuYWx5c2lzUnVuTWV0YWRhdGEYAiABKAsyOS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuQW5hbHlzaXNSdW5NZXRhZGF0YRJHCgRhcmdzGAMgAygLMjkuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLkFuYWx5c2lzUnVuQXJndW1lbnQinQIKEFZlcmlmaWNhdGlvbkluZm8SCgoCaWQYBCABKAkSDQoFYWN0b3IYByABKAkSPQoJc3RhcnRUaW1lGAUgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUSDQoFcGhhc2UYASABKAkSDwoHbWVzc2FnZRgCIAEoCRJPCgthbmFseXNpc1J1bhgDIAEoCzI6LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5BbmFseXNpc1J1blJlZmVyZW5jZRI+CgpmaW5pc2hUaW1lGAYgASgLMiouazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLlRpbWUilAEKDVZlcmlmaWVkU3RhZ2USPgoKdmVyaWZpZWRBdBgBIAEoCzIqLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5UaW1lEkMKC2xvbmdlc3RTb2FrGAIgASgLMi4uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkR1cmF0aW9uItkBCglXYXJlaG91c2USQgoIbWV0YWRhdGEYASABKAsyMC5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuT2JqZWN0TWV0YRJBCgRzcGVjGAIgASgLMjMuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVNwZWMSRQoGc3RhdHVzGAMgASgLMjUuZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExLldhcmVob3VzZVN0YXR1cyKRAQoNV2FyZWhvdXNlTGlzdBJACghtZXRhZGF0YRgBIAEoCzIuLms4cy5pby5hcGltYWNoaW5lcnkucGtnLmFwaXMubWV0YS52MS5MaXN0TWV0YRI+CgVpdGVtcxgCIAMoCzIvLmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5XYXJlaG91c2UizgEKDVdhcmVob3VzZVNwZWMSDQoFc2hhcmQYAiABKAkSQAoIaW50ZXJ2YWwYBCABKAsyLi5rOHMuaW8uYXBpbWFjaGluZXJ5LnBrZy5hcGlzLm1ldGEudjEuRHVyYXRpb24SHQoVZnJlaWdodENyZWF0aW9uUG9saWN5GAMgASgJEk0KDXN1YnNjcmlwdGlvbnMYASADKAsyNi5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuUmVwb1N1YnNjcmlwdGlvbiJiCg5XYXJlaG91c2VTdGF0cxINCgVjb3VudBgCIAEoAxJBCgZoZWFsdGgYASABKAsyMS5naXRodWIuY29tLmFrdWl0eS5rYXJnby5hcGkudjFhbHBoYTEuSGVhbHRoU3RhdHMi/QEKD1dhcmVob3VzZVN0YXR1cxJDCgpjb25kaXRpb25zGAkgAygLMi8uazhzLmlvLmFwaW1hY2hpbmVyeS5wa2cuYXBpcy5tZXRhLnYxLkNvbmRpdGlvbhIaChJsYXN0SGFuZGxlZFJlZnJlc2gYBiABKAkSGgoSb2JzZXJ2ZWRHZW5lcmF0aW9uGAQgASgDEhUKDWxhc3RGcmVpZ2h0SUQYCCABKAkSVgoTZGlzY292ZXJlZEFydGlmYWN0cxgHIAEoCzI5LmdpdGh1Yi5jb20uYWt1aXR5LmthcmdvLmFwaS52MWFscGhhMS5EaXNjb3ZlcmVkQXJ0aWZhY3RzQpcCCihjb20uZ2l0aHViLmNvbS5ha3VpdHkua2FyZ28uYXBpLnYxYWxwaGExQg5HZW5lcmF0ZWRQcm90b1ABWiRnaXRodWIuY29tL2FrdWl0eS9rYXJnby9hcGkvdjFhbHBoYTGiAgVHQ0FLQaoCJEdpdGh1Yi5Db20uQWt1aXR5LkthcmdvLkFwaS5WMWFscGhhMcoCJEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMeICMEdpdGh1YlxDb21cQWt1aXR5XEthcmdvXEFwaVxWMWFscGhhMVxHUEJNZXRhZGF0YeoCKUdpdGh1Yjo6Q29tOjpBa3VpdHk6OkthcmdvOjpBcGk6OlYxYWxwaGEx", [file_k8s_io_apiextensions_apiserver_pkg_apis_apiextensions_v1_generated, file_k8s_io_apimachinery_pkg_apis_meta_v1_generated, file_k8s_io_apimachinery_pkg_runtime_generated, file_k8s_io_apimachinery_pkg_runtime_schema_generated]);
 
 /**
  * AnalysisRunArgument represents an argument to be added to an AnalysisRun.
@@ -911,9 +911,9 @@ export const FreightOriginSchema: GenMessage<FreightOrigin> = /*@__PURE__*/
  */
 export type FreightReference = Message<"github.com.akuity.kargo.api.v1alpha1.FreightReference"> & {
   /**
-   * Name is system-assigned identifier that is derived deterministically from
-   * the contents of the Freight. i.e. Two pieces of Freight can be compared for
-   * equality by comparing their Names.
+   * Name is a system-assigned identifier derived deterministically from
+   * the contents of the Freight. I.e., two pieces of Freight can be compared
+   * for equality by comparing their Names.
    *
    * @generated from field: optional string name = 1;
    */
@@ -1436,7 +1436,7 @@ export const HealthCheckStepSchema: GenMessage<HealthCheckStep> = /*@__PURE__*/
   messageDesc(file_api_v1alpha1_generated, 30);
 
 /**
- * HealthStats contains a summary of the collective health of a some resource
+ * HealthStats contains a summary of the collective health of some resource
  * type.
  *
  * @generated from message github.com.akuity.kargo.api.v1alpha1.HealthStats
@@ -1846,8 +1846,8 @@ export const ProjectListSchema: GenMessage<ProjectList> = /*@__PURE__*/
   messageDesc(file_api_v1alpha1_generated, 39);
 
 /**
- * ProjectStats contains a summary of the of the collective state of a
- * Project's constituent resources.
+ * ProjectStats contains a summary of the collective state of a Project's
+ * constituent resources.
  *
  * @generated from message github.com.akuity.kargo.api.v1alpha1.ProjectStats
  */
@@ -1894,27 +1894,7 @@ export type ProjectStatus = Message<"github.com.akuity.kargo.api.v1alpha1.Projec
   conditions: Condition[];
 
   /**
-   * Phase describes the Project's current phase.
-   *
-   * Deprecated: Use the Conditions field instead.
-   *
-   * @generated from field: optional string phase = 1;
-   */
-  phase: string;
-
-  /**
-   * Message is a display message about the Project, including any errors
-   * preventing the Project from being reconciled. i.e. If the Phase field has a
-   * value of CreationFailed, this field can be expected to explain why.
-   *
-   * Deprecated: Use the Conditions field instead.
-   *
-   * @generated from field: optional string message = 2;
-   */
-  message: string;
-
-  /**
-   * Stats contains a summary of the of the collective state of a Project's
+   * Stats contains a summary of the collective state of a Project's
    * constituent resources.
    *
    * @generated from field: optional github.com.akuity.kargo.api.v1alpha1.ProjectStats stats = 4;
@@ -2776,7 +2756,7 @@ export const StageSpecSchema: GenMessage<StageSpec> = /*@__PURE__*/
   messageDesc(file_api_v1alpha1_generated, 60);
 
 /**
- * StageStats contains a summary of the collective state of the a Project's
+ * StageStats contains a summary of the collective state of a Project's
  * Stages.
  *
  * @generated from message github.com.akuity.kargo.api.v1alpha1.StageStats
@@ -2833,13 +2813,6 @@ export type StageStatus = Message<"github.com.akuity.kargo.api.v1alpha1.StageSta
    */
   lastHandledRefresh: string;
 
-  /**
-   * Phase describes where the Stage currently is in its lifecycle.
-   *
-   * @generated from field: optional string phase = 1;
-   */
-  phase: string;
-
   /**
    * FreightHistory is a list of recent Freight selections that were deployed
    * to the Stage. By default, the last ten Freight selections are stored.
@@ -2873,14 +2846,6 @@ export type StageStatus = Message<"github.com.akuity.kargo.api.v1alpha1.StageSta
    */
   health?: Health;
 
-  /**
-   * Message describes any errors that are preventing the Stage controller
-   * from assessing Stage health or from finding new Freight.
-   *
-   * @generated from field: optional string message = 9;
-   */
-  message: string;
-
   /**
    * ObservedGeneration represents the .metadata.generation that this Stage
    * status was reconciled against.
@@ -3237,7 +3202,7 @@ export const WarehouseSpecSchema: GenMessage<WarehouseSpec> = /*@__PURE__*/
   messageDesc(file_api_v1alpha1_generated, 69);
 
 /**
- * WarehouseStats contains a summary of the collective state of the a Project's
+ * WarehouseStats contains a summary of the collective state of a Project's
  * Warehouses.
  *
  * @generated from message github.com.akuity.kargo.api.v1alpha1.WarehouseStats
diff --git a/ui/src/gen/schema/projects.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/projects.kargo.akuity.io_v1alpha1.json
index 280371ebb9..b41a4b727f 100644
--- a/ui/src/gen/schema/projects.kargo.akuity.io_v1alpha1.json
+++ b/ui/src/gen/schema/projects.kargo.akuity.io_v1alpha1.json
@@ -156,16 +156,8 @@
           ],
           "x-kubernetes-list-type": "map"
         },
-        "message": {
-          "description": "Message is a display message about the Project, including any errors\npreventing the Project from being reconciled. i.e. If the Phase field has a\nvalue of CreationFailed, this field can be expected to explain why.\n\nDeprecated: Use the Conditions field instead.",
-          "type": "string"
-        },
-        "phase": {
-          "description": "Phase describes the Project's current phase.\n\nDeprecated: Use the Conditions field instead.",
-          "type": "string"
-        },
         "stats": {
-          "description": "Stats contains a summary of the of the collective state of a Project's\nconstituent resources.",
+          "description": "Stats contains a summary of the collective state of a Project's\nconstituent resources.",
           "properties": {
             "stages": {
               "description": "Stages contains a summary of the collective state of the Project's Stages.",
diff --git a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json
index 9207aeaa10..c7db83d4f0 100644
--- a/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json
+++ b/ui/src/gen/schema/promotions.kargo.akuity.io_v1alpha1.json
@@ -271,7 +271,7 @@
               "type": "array"
             },
             "name": {
-              "description": "Name is system-assigned identifier that is derived deterministically from\nthe contents of the Freight. i.e. Two pieces of Freight can be compared for\nequality by comparing their Names.",
+              "description": "Name is a system-assigned identifier derived deterministically from\nthe contents of the Freight. I.e., two pieces of Freight can be compared\nfor equality by comparing their Names.",
               "type": "string"
             },
             "origin": {
@@ -403,7 +403,7 @@
                     "type": "array"
                   },
                   "name": {
-                    "description": "Name is system-assigned identifier that is derived deterministically from\nthe contents of the Freight. i.e. Two pieces of Freight can be compared for\nequality by comparing their Names.",
+                    "description": "Name is a system-assigned identifier derived deterministically from\nthe contents of the Freight. I.e., two pieces of Freight can be compared\nfor equality by comparing their Names.",
                     "type": "string"
                   },
                   "origin": {
diff --git a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json
index 5db161ae16..63ce1ebc6d 100644
--- a/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json
+++ b/ui/src/gen/schema/stages.kargo.akuity.io_v1alpha1.json
@@ -493,7 +493,7 @@
                   "type": "array"
                 },
                 "name": {
-                  "description": "Name is system-assigned identifier that is derived deterministically from\nthe contents of the Freight. i.e. Two pieces of Freight can be compared for\nequality by comparing their Names.",
+                  "description": "Name is a system-assigned identifier derived deterministically from\nthe contents of the Freight. I.e., two pieces of Freight can be compared\nfor equality by comparing their Names.",
                   "type": "string"
                 },
                 "origin": {
@@ -636,7 +636,7 @@
                       "type": "array"
                     },
                     "name": {
-                      "description": "Name is system-assigned identifier that is derived deterministically from\nthe contents of the Freight. i.e. Two pieces of Freight can be compared for\nequality by comparing their Names.",
+                      "description": "Name is a system-assigned identifier derived deterministically from\nthe contents of the Freight. I.e., two pieces of Freight can be compared\nfor equality by comparing their Names.",
                       "type": "string"
                     },
                     "origin": {
@@ -768,7 +768,7 @@
                             "type": "array"
                           },
                           "name": {
-                            "description": "Name is system-assigned identifier that is derived deterministically from\nthe contents of the Freight. i.e. Two pieces of Freight can be compared for\nequality by comparing their Names.",
+                            "description": "Name is a system-assigned identifier derived deterministically from\nthe contents of the Freight. I.e., two pieces of Freight can be compared\nfor equality by comparing their Names.",
                             "type": "string"
                           },
                           "origin": {
@@ -1056,7 +1056,7 @@
                       "type": "array"
                     },
                     "name": {
-                      "description": "Name is system-assigned identifier that is derived deterministically from\nthe contents of the Freight. i.e. Two pieces of Freight can be compared for\nequality by comparing their Names.",
+                      "description": "Name is a system-assigned identifier derived deterministically from\nthe contents of the Freight. I.e., two pieces of Freight can be compared\nfor equality by comparing their Names.",
                       "type": "string"
                     },
                     "origin": {
@@ -1291,7 +1291,7 @@
                   "type": "array"
                 },
                 "name": {
-                  "description": "Name is system-assigned identifier that is derived deterministically from\nthe contents of the Freight. i.e. Two pieces of Freight can be compared for\nequality by comparing their Names.",
+                  "description": "Name is a system-assigned identifier derived deterministically from\nthe contents of the Freight. I.e., two pieces of Freight can be compared\nfor equality by comparing their Names.",
                   "type": "string"
                 },
                 "origin": {
@@ -1434,7 +1434,7 @@
                       "type": "array"
                     },
                     "name": {
-                      "description": "Name is system-assigned identifier that is derived deterministically from\nthe contents of the Freight. i.e. Two pieces of Freight can be compared for\nequality by comparing their Names.",
+                      "description": "Name is a system-assigned identifier derived deterministically from\nthe contents of the Freight. I.e., two pieces of Freight can be compared\nfor equality by comparing their Names.",
                       "type": "string"
                     },
                     "origin": {
@@ -1566,7 +1566,7 @@
                             "type": "array"
                           },
                           "name": {
-                            "description": "Name is system-assigned identifier that is derived deterministically from\nthe contents of the Freight. i.e. Two pieces of Freight can be compared for\nequality by comparing their Names.",
+                            "description": "Name is a system-assigned identifier derived deterministically from\nthe contents of the Freight. I.e., two pieces of Freight can be compared\nfor equality by comparing their Names.",
                             "type": "string"
                           },
                           "origin": {
@@ -1747,20 +1747,12 @@
           ],
           "type": "object"
         },
-        "message": {
-          "description": "Message describes any errors that are preventing the Stage controller\nfrom assessing Stage health or from finding new Freight.",
-          "type": "string"
-        },
         "observedGeneration": {
           "description": "ObservedGeneration represents the .metadata.generation that this Stage\nstatus was reconciled against.",
           "format": "int64",
           "maximum": 9223372036854776000,
           "minimum": -9223372036854776000,
           "type": "integer"
-        },
-        "phase": {
-          "description": "Phase describes where the Stage currently is in its lifecycle.",
-          "type": "string"
         }
       },
       "type": "object"


Reviews:
user: login: Marvin9
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-30T11:30:52Z
user: login: hiddeco
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-30T12:05:19Z
user: login: rpelczar
body: I don't like that we have to hardcode enums, but I assume we don't have a simple solution for now.

We also might need some performance improvements - for the project with >100 stages, we will have a lot of unnecessary calculations. If you have time, you can check this out - https://react.dev/reference/react/useMemo and try to improve, otherwise we can do this optimization later.
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-30T12:38:59Z
user: login: krancour
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-30T15:23:45Z

Review comments:
diff_hunk: @@ -0,0 +1,135 @@
+import {
+  faCircle,
+  faCircleMinus,
+  faMagnifyingGlass,
+  faTimesCircle,
+  faSync,
+  IconDefinition
+} from '@fortawesome/free-solid-svg-icons';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { Tooltip } from 'antd';
+import classNames from 'classnames';
+
+import { StageConditionType, StageConditionStatus } from '@ui/features/common/stage-status/utils';
+import type { Condition } from '@ui/gen/k8s.io/apimachinery/pkg/apis/meta/v1/generated_pb';
+
+import styles from './styles.module.less';
+import { TruckIcon } from './truck-icon/truck-icon';
+
+interface IconState {
+  icon: IconDefinition;
+  tooltipTitle: string;
+  tooltipMessage: string;
+  iconClass: string;
+}
+
+export const StageConditionIcon = ({
+  conditions,
+  className
+}: {
+  conditions: Condition[];
+  className?: string;
+}) => {
+  const hasCondition = (
+    type: StageConditionType,
+    status: StageConditionStatus
+  ): { condition: Condition | undefined; isActive: boolean } => {
+    const condition = conditions.find((c) => c.type === type);
+    return {
+      condition,
+      isActive: condition?.status === status
+    };
+  };
+
+  const { condition: promotingCondition, isActive: isPromoting } = hasCondition(
+    StageConditionType.Promoting,
+    StageConditionStatus.True
+  );
+
+  const { condition: reconcilingCondition, isActive: isReconciling } = hasCondition(
+    StageConditionType.Reconciling,
+    StageConditionStatus.True
+  );
+
+  const { condition: readyCondition, isActive: isReady } = hasCondition(
+    StageConditionType.Ready,
+    StageConditionStatus.True
+  );
+
+  const isFailed = readyCondition?.status === StageConditionStatus.False;
+
+  const { condition: verifiedCondition, isActive: isVerifying } = hasCondition(
+    StageConditionType.Verified,
+    StageConditionStatus.Unknown
+  );
+
+  // Default state
+  let iconState: IconState = {
+    icon: faCircleMinus,
+    tooltipTitle: '',
+    tooltipMessage: '',
+    iconClass: 'text-gray-400'
+  };
+
+  // Priority: Promoting > Verifying > Reconciling > Failed > Ready
path: ui/src/features/common/stage-status/stage-condition-icon.tsx
user: login: Marvin9
body: Curious how can multiple condition exist at the same time?
created_at: 2025-04-30T11:30:51Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,135 @@
+import {
+  faCircle,
+  faCircleMinus,
+  faMagnifyingGlass,
+  faTimesCircle,
+  faSync,
+  IconDefinition
+} from '@fortawesome/free-solid-svg-icons';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { Tooltip } from 'antd';
+import classNames from 'classnames';
+
+import { StageConditionType, StageConditionStatus } from '@ui/features/common/stage-status/utils';
+import type { Condition } from '@ui/gen/k8s.io/apimachinery/pkg/apis/meta/v1/generated_pb';
+
+import styles from './styles.module.less';
+import { TruckIcon } from './truck-icon/truck-icon';
+
+interface IconState {
+  icon: IconDefinition;
+  tooltipTitle: string;
+  tooltipMessage: string;
+  iconClass: string;
+}
+
+export const StageConditionIcon = ({
+  conditions,
+  className
+}: {
+  conditions: Condition[];
+  className?: string;
+}) => {
+  const hasCondition = (
+    type: StageConditionType,
+    status: StageConditionStatus
+  ): { condition: Condition | undefined; isActive: boolean } => {
+    const condition = conditions.find((c) => c.type === type);
+    return {
+      condition,
+      isActive: condition?.status === status
+    };
+  };
+
+  const { condition: promotingCondition, isActive: isPromoting } = hasCondition(
+    StageConditionType.Promoting,
+    StageConditionStatus.True
+  );
+
+  const { condition: reconcilingCondition, isActive: isReconciling } = hasCondition(
+    StageConditionType.Reconciling,
+    StageConditionStatus.True
+  );
+
+  const { condition: readyCondition, isActive: isReady } = hasCondition(
+    StageConditionType.Ready,
+    StageConditionStatus.True
+  );
+
+  const isFailed = readyCondition?.status === StageConditionStatus.False;
+
+  const { condition: verifiedCondition, isActive: isVerifying } = hasCondition(
+    StageConditionType.Verified,
+    StageConditionStatus.Unknown
+  );
+
+  // Default state
+  let iconState: IconState = {
+    icon: faCircleMinus,
+    tooltipTitle: '',
+    tooltipMessage: '',
+    iconClass: 'text-gray-400'
+  };
+
+  // Priority: Promoting > Verifying > Reconciling > Failed > Ready
path: ui/src/features/common/stage-status/stage-condition-icon.tsx
user: login: hiddeco
body: Conditions are a slice of things true for the object, instead of a singular phase. Depending on the condition type and polarity, it's either permanently or temporarily present on the resource (see `api/v1alpha1/conditions.go`).

This follows the Kubernetes pattern where conditions represent different aspects of a resource's state rather than mutually exclusive phases. For example, a `Pod` can be both `PodScheduled=True `and `Ready=False` simultaneously — meaning it's been scheduled to a node but isn't ready to serve traffic yet.

created_at: 2025-04-30T12:05:19Z
author_association: COLLABORATOR

PR comments:
user: login: netlify[bot]
created_at: 2025-04-29T12:04:24Z
body: ### <span aria-hidden="true">✅</span> Deploy Preview for *docs-kargo-io* ready!


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | d4333df1de31af99a9500dc11f97baacd6422145 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/docs-kargo-io/deploys/68123f3b498d6d0008f9174d |
|<span aria-hidden="true">😎</span> Deploy Preview | [https://deploy-preview-3949.docs.kargo.io](https://deploy-preview-3949.docs.kargo.io) |
|<span aria-hidden="true">📱</span> Preview on mobile | <details><summary> Toggle QR Code... </summary><br /><br />![QR Code](https://app.netlify.com/qr-code/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJodHRwczovL2RlcGxveS1wcmV2aWV3LTM5NDkuZG9jcy5rYXJnby5pbyJ9.vqUW7cecnDgbAti0GB1A3SFonl3JkF11tsH1ZNhEVII)<br /><br />_Use your smartphone camera to open QR code link._</details> |
---
<!-- [docs-kargo-io Preview](https://deploy-preview-3949.docs.kargo.io) -->
_To edit notification comments on pull requests, go to your [Netlify site configuration](https://app.netlify.com/sites/docs-kargo-io/configuration/notifications#deploy-webhooks)._
author_association: NONE
user: login: codecov[bot]
created_at: 2025-04-29T12:08:05Z
body: ## [Codecov](https://app.codecov.io/gh/akuity/kargo/pull/3949?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity) Report
Attention: Patch coverage is `81.13208%` with `10 lines` in your changes missing coverage. Please review.
> Project coverage is 53.14%. Comparing base [(`0a6fa50`)](https://app.codecov.io/gh/akuity/kargo/commit/0a6fa508f25f6e1eab6f974d2df6cf6b119f08ef?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity) to head [(`d4333df`)](https://app.codecov.io/gh/akuity/kargo/commit/d4333df1de31af99a9500dc11f97baacd6422145?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity).
> Report is 1 commits behind head on main.

| [Files with missing lines](https://app.codecov.io/gh/akuity/kargo/pull/3949?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity) | Patch % | Lines |
|---|---|---|
| [internal/cli/cmd/get/stages.go](https://app.codecov.io/gh/akuity/kargo/pull/3949?src=pr&el=tree&filepath=internal%2Fcli%2Fcmd%2Fget%2Fstages.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity#diff-aW50ZXJuYWwvY2xpL2NtZC9nZXQvc3RhZ2VzLmdv) | 0.00% | [10 Missing :warning: ](https://app.codecov.io/gh/akuity/kargo/pull/3949?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity) |

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main    #3949      +/-   ##
==========================================
- Coverage   53.27%   53.14%   -0.13%     
==========================================
  Files         312      312              
  Lines       28340    28267      -73     
==========================================
- Hits        15098    15023      -75     
- Misses      12451    12453       +2     
  Partials      791      791              
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/akuity/kargo/pull/3949?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=akuity).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
- :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
author_association: NONE